/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



#ifndef _E3D_VIEW3D_HXX
#define _E3D_VIEW3D_HXX

#include <svx/svdview.hxx>
#include <svx/def3d.hxx>
#include <svx/deflt3d.hxx>
#include <basegfx/point/b2dpoint.hxx>
#include "svx/svxdllapi.h"

//************************************************************
//   Vorausdeklarationen
//************************************************************

class E3dObject;
class E3dScene;
class SceneList;
class Impl3DMirrorConstructOverlay;

/*************************************************************************
|*
|* Ableitung von SdrView zur Bearbeitung von 3D-Objekten
|*
\************************************************************************/

class SVX_DLLPUBLIC E3dView : public SdrView
{
protected:
	E3dDefaultAttributes		a3DDefaultAttr;
	MouseEvent					aMouseEvent;					// Die Parameter der letzten Events (Mouse, Keyboard)
	Color						aDefaultLightColor;             // dito mit den Farben
	Color						aDefaultAmbientColor;

	double						fDefaultScaleX;                 // Verzerrungen
	double						fDefaultScaleY;
	double						fDefaultScaleZ;
	double						fDefaultRotateX;                // und Drehungen
	double						fDefaultRotateY;
	double						fDefaultRotateZ;
	double						fDefaultExtrusionDeepth;        // Extrusionstiefe
	double						fDefaultLightIntensity;         // Intensitaeten der beiden (notwendigen) Licht-
	double						fDefaultAmbientIntensity;       // quellen
	long						nHDefaultSegments;              // wieviele HSegmente braucht mein Lathe-Ojekt
	long						nVDefaultSegments;              // wieviele VSegmente braucht mein Lathe-Ojekt

	E3dDragConstraint			eDragConstraint;

	// Migrate selections
	Impl3DMirrorConstructOverlay*					mpMirrorOverlay;

	sal_Bool						bDoubleSided;

	void InitView();

	void ImpCreate3DObject(E3dScene* pScene, SdrObject* pObj, sal_Bool bExtrude, double fDepth, basegfx::B2DHomMatrix& rLatheMat);
	void ImpCreateSingle3DObjectFlat(E3dScene* pScene, SdrObject* pObj, sal_Bool bExtrude, double fDepth, basegfx::B2DHomMatrix& rLatheMat);
	void ImpChangeSomeAttributesFor3DConversion(SdrObject* pObj);
	void ImpChangeSomeAttributesFor3DConversion2(SdrObject* pObj);

	void InitScene(E3dScene* pScene, double fW, double fH, double fCamZ);
	void ImpIsConvertTo3DPossible(SdrObject* pObj, sal_Bool& rAny3D, sal_Bool& rGroupSelected) const;
	void BreakSingle3DObj(E3dObject* pObj);

public:
	TYPEINFO();
	E3dView(SdrModel* pModel, OutputDevice* pOut = 0L);
	virtual ~E3dView();

	// Alle markierten Objekte auf dem angegebenen OutputDevice ausgeben.
	virtual void DrawMarkedObj(OutputDevice& rOut) const;

	// Zugriff auf die Default-Attribute
	E3dDefaultAttributes& Get3DDefaultAttributes() { return a3DDefaultAttr; }
	virtual sal_Bool BegDragObj(const Point& rPnt, OutputDevice* pOut = NULL, SdrHdl* pHdl = NULL, short nMinMov = -3, SdrDragMethod* pForcedMeth = NULL);
	virtual	void CheckPossibilities();

	// Event setzen/rausruecken
	void SetMouseEvent(const MouseEvent& rNew) { aMouseEvent = rNew; }
	const MouseEvent& GetMouseEvent() { return aMouseEvent; }

	// Model holen ueberladen, da bei einzelnen 3D Objekten noch eine Szene
	// untergeschoben werden muss
	virtual SdrModel* GetMarkedObjModel() const;

	// Bei Paste muss - falls in eine Scene eingefuegt wird - die
	// Objekte der Szene eingefuegt werden, die Szene selbst aber nicht
	using SdrView::Paste;
	virtual sal_Bool Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLst=NULL, sal_uInt32 nOptions=0);

	// #83403# Service routine used from local Clone() and from SdrCreateView::EndCreateObj(...)
	sal_Bool ImpCloneAll3DObjectsToDestScene(E3dScene* pSrcScene, E3dScene* pDstScene, Point aOffset);

	sal_Bool HasMarkedScene();
	E3dScene* GetMarkedScene();

	sal_Bool IsConvertTo3DObjPossible() const;
	void ConvertMarkedObjTo3D(sal_Bool bExtrude=sal_True, basegfx::B2DPoint aPnt1 = basegfx::B2DPoint(0.0, 0.0), basegfx::B2DPoint aPnt2 = basegfx::B2DPoint(0.0, 1.0));

	// Nachtraeglichhe Korrekturmoeglichkeit um alle Extrudes in einer
	// bestimmten Tiefensortierung anzulegen
	void DoDepthArrange(E3dScene* pScene, double fDepth);
	void ConvertMarkedToPolyObj(sal_Bool bLineToArea);
	E3dScene* SetCurrent3DObj(E3dObject* p3DObj);
	void Start3DCreation();

	// migration of overlay
	sal_Bool Is3DRotationCreationActive() const { return (0L != mpMirrorOverlay); }

	virtual void MovAction(const Point& rPnt);
	void End3DCreation(sal_Bool bUseDefaultValuesForMirrorAxes=sal_False);
	void ResetCreationActive();

	double GetDefaultCamPosZ();

	double &DefaultScaleX ()
	{
		return fDefaultScaleX;
	}

	double DefaultScaleX () const
	{
		return fDefaultScaleX;
	}

	double &DefaultScaleY ()
	{
		return fDefaultScaleY;
	}

	double DefaultScaleY () const
	{
		return fDefaultScaleY;
	}

	double &DefaultScaleZ ()
	{
		return fDefaultScaleZ;
	}

	double DefaultScaleZ () const
	{
		return fDefaultScaleZ;
	}

	double &DefaultRotateX ()
	{
		return fDefaultRotateX;
	}

	double DefaultRotateX () const
	{
		return fDefaultRotateX;
	}

	double &DefaultRotateY ()
	{
		return fDefaultRotateY;
	}

	double DefaultRotateY () const
	{
		return fDefaultRotateY;
	}

	double &DefaultRotateZ ()
	{
		return fDefaultRotateZ;
	}

	double DefaultRotateZ () const
	{
		return fDefaultRotateZ;
	}

	double &DefaultExtrusionDeepth ()
	{
		return fDefaultExtrusionDeepth;
	}

	double DefaultExtrusionDeepth () const
	{
		return fDefaultExtrusionDeepth;
	}

	double GetDefaultCamFocal();

	double &DefaultLightIntensity ()
	{
		return fDefaultLightIntensity;
	}

	double DefaultLightIntensity () const
	{
		return fDefaultLightIntensity;
	}

	double &DefaultAmbientIntensity ()
	{
		return fDefaultAmbientIntensity;
	}

	double DefaultAmbientIntensity () const
	{
		return fDefaultAmbientIntensity;
	}

	const Color &DefaultLightColor () const
	{
		return aDefaultLightColor;
	}

	Color DefaultLightColor ()
	{
		return aDefaultLightColor;
	}

	const Color &DefaultAmbientColor () const
	{
		return aDefaultAmbientColor;
	}

	Color DefaultAmbientColor ()
	{
		return aDefaultAmbientColor;
	}

	long GetHDefaultSegments() const { return nHDefaultSegments; }
	void SetHDefaultSegments(long nSegs) { nHDefaultSegments = nSegs; }

	long GetVDefaultSegments() const { return nVDefaultSegments; }
	void SetVDefaultSegments(long nSegs) { nVDefaultSegments = nSegs; }

	sal_Bool IsBreak3DObjPossible() const;
	void Break3DObj();

	sal_Bool DoubleSided () const
	{
		return bDoubleSided;
	}

	sal_Bool &DoubleSided ()
	{
		return bDoubleSided;
	}

	void MergeScenes();
	SfxItemSet Get3DAttributes(E3dScene* pInScene = NULL, sal_Bool bOnly3DAttr=sal_False) const;
	void Set3DAttributes(const SfxItemSet& rAttr, E3dScene* pInScene = NULL, sal_Bool bOnly3DAttr=sal_False);
};

#endif			// _E3D_VIEW3D_HXX
