xref: /aoo41x/main/svx/source/dialog/dlgctl3d.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_svx.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <svx/dlgctl3d.hxx>
32*cdf0e10cSrcweir #include <svx/dialogs.hrc>
33*cdf0e10cSrcweir #include <svx/view3d.hxx>
34*cdf0e10cSrcweir #include <svx/fmmodel.hxx>
35*cdf0e10cSrcweir #include <svl/itempool.hxx>
36*cdf0e10cSrcweir #include <svx/fmpage.hxx>
37*cdf0e10cSrcweir #include <svx/polysc3d.hxx>
38*cdf0e10cSrcweir #include <svx/sphere3d.hxx>
39*cdf0e10cSrcweir #include <svx/cube3d.hxx>
40*cdf0e10cSrcweir #include <vcl/svapp.hxx>
41*cdf0e10cSrcweir #include <svx/helperhittest3d.hxx>
42*cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygontools.hxx>
43*cdf0e10cSrcweir #include <svx/polygn3d.hxx>
44*cdf0e10cSrcweir #include <svx/xlnclit.hxx>
45*cdf0e10cSrcweir #include <svx/xlnwtit.hxx>
46*cdf0e10cSrcweir #include "helpid.hrc"
47*cdf0e10cSrcweir #include <algorithm>
48*cdf0e10cSrcweir #include <svx/dialmgr.hxx>
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
51*cdf0e10cSrcweir 
52*cdf0e10cSrcweir Svx3DPreviewControl::Svx3DPreviewControl(Window* pParent, const ResId& rResId)
53*cdf0e10cSrcweir :   Control(pParent, rResId),
54*cdf0e10cSrcweir     mpModel(0),
55*cdf0e10cSrcweir     mpFmPage(0),
56*cdf0e10cSrcweir     mp3DView(0),
57*cdf0e10cSrcweir     mpScene(0),
58*cdf0e10cSrcweir     mp3DObj(0),
59*cdf0e10cSrcweir     mnObjectType(PREVIEW_OBJECTTYPE_SPHERE)
60*cdf0e10cSrcweir {
61*cdf0e10cSrcweir 	Construct();
62*cdf0e10cSrcweir 
63*cdf0e10cSrcweir 	// do not paint background self, DrawingLayer paints this buffered and as page
64*cdf0e10cSrcweir 	SetControlBackground();
65*cdf0e10cSrcweir     SetBackground();
66*cdf0e10cSrcweir }
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir Svx3DPreviewControl::Svx3DPreviewControl(Window* pParent, WinBits nStyle)
69*cdf0e10cSrcweir :   Control(pParent, nStyle),
70*cdf0e10cSrcweir     mpModel(0),
71*cdf0e10cSrcweir     mpFmPage(0),
72*cdf0e10cSrcweir     mp3DView(0),
73*cdf0e10cSrcweir     mpScene(0),
74*cdf0e10cSrcweir     mp3DObj(0),
75*cdf0e10cSrcweir     mnObjectType(PREVIEW_OBJECTTYPE_SPHERE)
76*cdf0e10cSrcweir {
77*cdf0e10cSrcweir 	Construct();
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir 	// do not paint background self, DrawingLayer paints this buffered and as page
80*cdf0e10cSrcweir 	SetControlBackground();
81*cdf0e10cSrcweir     SetBackground();
82*cdf0e10cSrcweir }
83*cdf0e10cSrcweir 
84*cdf0e10cSrcweir Svx3DPreviewControl::~Svx3DPreviewControl()
85*cdf0e10cSrcweir {
86*cdf0e10cSrcweir 	delete mp3DView;
87*cdf0e10cSrcweir 	delete mpModel;
88*cdf0e10cSrcweir }
89*cdf0e10cSrcweir 
90*cdf0e10cSrcweir void Svx3DPreviewControl::Construct()
91*cdf0e10cSrcweir {
92*cdf0e10cSrcweir     // Do never mirror the preview window.  This explicitly includes right
93*cdf0e10cSrcweir     // to left writing environments.
94*cdf0e10cSrcweir     EnableRTL (sal_False);
95*cdf0e10cSrcweir 	SetMapMode( MAP_100TH_MM );
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir 	// Model
98*cdf0e10cSrcweir 	mpModel = new FmFormModel();
99*cdf0e10cSrcweir 	mpModel->GetItemPool().FreezeIdRanges();
100*cdf0e10cSrcweir 
101*cdf0e10cSrcweir 	// Page
102*cdf0e10cSrcweir 	mpFmPage = new FmFormPage( *mpModel, NULL );
103*cdf0e10cSrcweir 	mpModel->InsertPage( mpFmPage, 0 );
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir 	// 3D View
106*cdf0e10cSrcweir 	mp3DView = new E3dView( mpModel, this );
107*cdf0e10cSrcweir 	mp3DView->SetBufferedOutputAllowed(true);
108*cdf0e10cSrcweir 	mp3DView->SetBufferedOverlayAllowed(true);
109*cdf0e10cSrcweir 
110*cdf0e10cSrcweir 	// 3D Scene
111*cdf0e10cSrcweir 	mpScene = new E3dPolyScene(mp3DView->Get3DDefaultAttributes());
112*cdf0e10cSrcweir 
113*cdf0e10cSrcweir 	// initially create object
114*cdf0e10cSrcweir 	SetObjectType(PREVIEW_OBJECTTYPE_SPHERE);
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir 	// camera and perspective
117*cdf0e10cSrcweir 	Camera3D& rCamera  = (Camera3D&) mpScene->GetCamera();
118*cdf0e10cSrcweir 	const basegfx::B3DRange& rVolume = mpScene->GetBoundVolume();
119*cdf0e10cSrcweir 	double fW = rVolume.getWidth();
120*cdf0e10cSrcweir 	double fH = rVolume.getHeight();
121*cdf0e10cSrcweir 	double fCamZ = rVolume.getMaxZ() + ((fW + fH) / 2.0);
122*cdf0e10cSrcweir 
123*cdf0e10cSrcweir 	rCamera.SetAutoAdjustProjection(sal_False);
124*cdf0e10cSrcweir 	rCamera.SetViewWindow(- fW / 2, - fH / 2, fW, fH);
125*cdf0e10cSrcweir 	basegfx::B3DPoint aLookAt;
126*cdf0e10cSrcweir 	double fDefaultCamPosZ = mp3DView->GetDefaultCamPosZ();
127*cdf0e10cSrcweir 	basegfx::B3DPoint aCamPos(0.0, 0.0, fCamZ < fDefaultCamPosZ ? fDefaultCamPosZ : fCamZ);
128*cdf0e10cSrcweir 	rCamera.SetPosAndLookAt(aCamPos, aLookAt);
129*cdf0e10cSrcweir 	double fDefaultCamFocal = mp3DView->GetDefaultCamFocal();
130*cdf0e10cSrcweir 	rCamera.SetFocalLength(fDefaultCamFocal);
131*cdf0e10cSrcweir 	rCamera.SetDefaults(basegfx::B3DPoint(0.0, 0.0, fDefaultCamPosZ), aLookAt, fDefaultCamFocal);
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir 	mpScene->SetCamera( rCamera );
134*cdf0e10cSrcweir 	mpFmPage->InsertObject( mpScene );
135*cdf0e10cSrcweir 
136*cdf0e10cSrcweir 	basegfx::B3DHomMatrix aRotation;
137*cdf0e10cSrcweir 	aRotation.rotate(DEG2RAD( 25 ), 0.0, 0.0);
138*cdf0e10cSrcweir 	aRotation.rotate(0.0, DEG2RAD( 40 ), 0.0);
139*cdf0e10cSrcweir 	mpScene->SetTransform(aRotation * mpScene->GetTransform());
140*cdf0e10cSrcweir 
141*cdf0e10cSrcweir 	// invalidate SnapRects of objects
142*cdf0e10cSrcweir 	mpScene->SetRectsDirty();
143*cdf0e10cSrcweir 
144*cdf0e10cSrcweir 	SfxItemSet aSet( mpModel->GetItemPool(),
145*cdf0e10cSrcweir 		XATTR_LINESTYLE, XATTR_LINESTYLE,
146*cdf0e10cSrcweir 		XATTR_FILL_FIRST, XATTR_FILLBITMAP,
147*cdf0e10cSrcweir 		0, 0 );
148*cdf0e10cSrcweir 	aSet.Put( XLineStyleItem( XLINE_NONE ) );
149*cdf0e10cSrcweir 	aSet.Put( XFillStyleItem( XFILL_SOLID ) );
150*cdf0e10cSrcweir 	aSet.Put( XFillColorItem( String(), Color( COL_WHITE ) ) );
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir     mpScene->SetMergedItemSet(aSet);
153*cdf0e10cSrcweir 
154*cdf0e10cSrcweir 	// PageView
155*cdf0e10cSrcweir 	SdrPageView* pPageView = mp3DView->ShowSdrPage( mpFmPage );
156*cdf0e10cSrcweir 	mp3DView->hideMarkHandles();
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir 	// mark scene
159*cdf0e10cSrcweir 	mp3DView->MarkObj( mpScene, pPageView );
160*cdf0e10cSrcweir }
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir void Svx3DPreviewControl::Resize()
163*cdf0e10cSrcweir {
164*cdf0e10cSrcweir 	// size of page
165*cdf0e10cSrcweir 	Size aSize( GetSizePixel() );
166*cdf0e10cSrcweir 	aSize = PixelToLogic( aSize );
167*cdf0e10cSrcweir 	mpFmPage->SetSize( aSize );
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir 	// set size
170*cdf0e10cSrcweir 	Size aObjSize( aSize.Width()*5/6, aSize.Height()*5/6 );
171*cdf0e10cSrcweir 	Point aObjPoint( (aSize.Width() - aObjSize.Width()) / 2,
172*cdf0e10cSrcweir 		(aSize.Height() - aObjSize.Height()) / 2);
173*cdf0e10cSrcweir 	Rectangle aRect( aObjPoint, aObjSize);
174*cdf0e10cSrcweir 	mpScene->SetSnapRect( aRect );
175*cdf0e10cSrcweir }
176*cdf0e10cSrcweir 
177*cdf0e10cSrcweir void Svx3DPreviewControl::Paint(const Rectangle& rRect)
178*cdf0e10cSrcweir {
179*cdf0e10cSrcweir 	mp3DView->CompleteRedraw(this, Region(rRect));
180*cdf0e10cSrcweir }
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir void Svx3DPreviewControl::MouseButtonDown(const MouseEvent& rMEvt)
183*cdf0e10cSrcweir {
184*cdf0e10cSrcweir 	Control::MouseButtonDown(rMEvt);
185*cdf0e10cSrcweir 
186*cdf0e10cSrcweir     if( rMEvt.IsShift() && rMEvt.IsMod1() )
187*cdf0e10cSrcweir 	{
188*cdf0e10cSrcweir         if(PREVIEW_OBJECTTYPE_SPHERE == GetObjectType())
189*cdf0e10cSrcweir         {
190*cdf0e10cSrcweir             SetObjectType(PREVIEW_OBJECTTYPE_CUBE);
191*cdf0e10cSrcweir         }
192*cdf0e10cSrcweir         else
193*cdf0e10cSrcweir         {
194*cdf0e10cSrcweir             SetObjectType(PREVIEW_OBJECTTYPE_SPHERE);
195*cdf0e10cSrcweir         }
196*cdf0e10cSrcweir 	}
197*cdf0e10cSrcweir }
198*cdf0e10cSrcweir 
199*cdf0e10cSrcweir void Svx3DPreviewControl::SetObjectType(sal_uInt16 nType)
200*cdf0e10cSrcweir {
201*cdf0e10cSrcweir 	if( mnObjectType != nType || !mp3DObj)
202*cdf0e10cSrcweir 	{
203*cdf0e10cSrcweir 		SfxItemSet aSet(mpModel->GetItemPool(), SDRATTR_START, SDRATTR_END, 0, 0);
204*cdf0e10cSrcweir 		mnObjectType = nType;
205*cdf0e10cSrcweir 
206*cdf0e10cSrcweir 		if( mp3DObj )
207*cdf0e10cSrcweir 		{
208*cdf0e10cSrcweir 			aSet.Put(mp3DObj->GetMergedItemSet());
209*cdf0e10cSrcweir 			mpScene->Remove3DObj( mp3DObj );
210*cdf0e10cSrcweir 			delete mp3DObj;
211*cdf0e10cSrcweir 			mp3DObj = NULL;
212*cdf0e10cSrcweir 		}
213*cdf0e10cSrcweir 
214*cdf0e10cSrcweir 		switch( nType )
215*cdf0e10cSrcweir 		{
216*cdf0e10cSrcweir 			case PREVIEW_OBJECTTYPE_SPHERE:
217*cdf0e10cSrcweir 			{
218*cdf0e10cSrcweir 				mp3DObj = new E3dSphereObj(
219*cdf0e10cSrcweir 					mp3DView->Get3DDefaultAttributes(),
220*cdf0e10cSrcweir 					basegfx::B3DPoint( 0, 0, 0 ),
221*cdf0e10cSrcweir 					basegfx::B3DVector( 5000, 5000, 5000 ));
222*cdf0e10cSrcweir 			}
223*cdf0e10cSrcweir 			break;
224*cdf0e10cSrcweir 
225*cdf0e10cSrcweir 			case PREVIEW_OBJECTTYPE_CUBE:
226*cdf0e10cSrcweir 			{
227*cdf0e10cSrcweir 				mp3DObj = new E3dCubeObj(
228*cdf0e10cSrcweir 					mp3DView->Get3DDefaultAttributes(),
229*cdf0e10cSrcweir 					basegfx::B3DPoint( -2500, -2500, -2500 ),
230*cdf0e10cSrcweir 					basegfx::B3DVector( 5000, 5000, 5000 ));
231*cdf0e10cSrcweir 			}
232*cdf0e10cSrcweir 			break;
233*cdf0e10cSrcweir 		}
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir 		mpScene->Insert3DObj( mp3DObj );
236*cdf0e10cSrcweir 		mp3DObj->SetMergedItemSet(aSet);
237*cdf0e10cSrcweir 
238*cdf0e10cSrcweir         Resize();
239*cdf0e10cSrcweir 	}
240*cdf0e10cSrcweir }
241*cdf0e10cSrcweir 
242*cdf0e10cSrcweir SfxItemSet Svx3DPreviewControl::Get3DAttributes() const
243*cdf0e10cSrcweir {
244*cdf0e10cSrcweir 	return mp3DObj->GetMergedItemSet();
245*cdf0e10cSrcweir }
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir void Svx3DPreviewControl::Set3DAttributes( const SfxItemSet& rAttr )
248*cdf0e10cSrcweir {
249*cdf0e10cSrcweir 	mp3DObj->SetMergedItemSet(rAttr, true);
250*cdf0e10cSrcweir 	Resize();
251*cdf0e10cSrcweir }
252*cdf0e10cSrcweir 
253*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
254*cdf0e10cSrcweir 
255*cdf0e10cSrcweir #define RADIUS_LAMP_PREVIEW_SIZE	(4500.0)
256*cdf0e10cSrcweir #define RADIUS_LAMP_SMALL			(600.0)
257*cdf0e10cSrcweir #define RADIUS_LAMP_BIG				(1000.0)
258*cdf0e10cSrcweir #define NO_LIGHT_SELECTED           (0xffffffff)
259*cdf0e10cSrcweir #define MAX_NUMBER_LIGHTS              (8)
260*cdf0e10cSrcweir 
261*cdf0e10cSrcweir Svx3DLightControl::Svx3DLightControl(Window* pParent, const ResId& rResId)
262*cdf0e10cSrcweir :   Svx3DPreviewControl(pParent, rResId),
263*cdf0e10cSrcweir     maUserInteractiveChangeCallback(),
264*cdf0e10cSrcweir     maUserSelectionChangeCallback(),
265*cdf0e10cSrcweir     maChangeCallback(),
266*cdf0e10cSrcweir     maSelectionChangeCallback(),
267*cdf0e10cSrcweir     maSelectedLight(NO_LIGHT_SELECTED),
268*cdf0e10cSrcweir 	mpExpansionObject(0),
269*cdf0e10cSrcweir 	mpLampBottomObject(0),
270*cdf0e10cSrcweir 	mpLampShaftObject(0),
271*cdf0e10cSrcweir 	maLightObjects(MAX_NUMBER_LIGHTS, (E3dObject*)0),
272*cdf0e10cSrcweir 	mfRotateX(-20.0),
273*cdf0e10cSrcweir 	mfRotateY(45.0),
274*cdf0e10cSrcweir 	mfRotateZ(0.0),
275*cdf0e10cSrcweir 	maActionStartPoint(),
276*cdf0e10cSrcweir 	mnInteractionStartDistance(5 * 5 * 2),
277*cdf0e10cSrcweir 	mfSaveActionStartHor(0.0),
278*cdf0e10cSrcweir 	mfSaveActionStartVer(0.0),
279*cdf0e10cSrcweir 	mfSaveActionStartRotZ(0.0),
280*cdf0e10cSrcweir 	mbMouseMoved(false),
281*cdf0e10cSrcweir     mbGeometrySelected(false)
282*cdf0e10cSrcweir {
283*cdf0e10cSrcweir 	Construct2();
284*cdf0e10cSrcweir }
285*cdf0e10cSrcweir 
286*cdf0e10cSrcweir Svx3DLightControl::Svx3DLightControl(Window* pParent, WinBits nStyle)
287*cdf0e10cSrcweir :   Svx3DPreviewControl(pParent, nStyle),
288*cdf0e10cSrcweir     maUserInteractiveChangeCallback(),
289*cdf0e10cSrcweir     maUserSelectionChangeCallback(),
290*cdf0e10cSrcweir     maChangeCallback(),
291*cdf0e10cSrcweir     maSelectionChangeCallback(),
292*cdf0e10cSrcweir     maSelectedLight(NO_LIGHT_SELECTED),
293*cdf0e10cSrcweir 	mpExpansionObject(0),
294*cdf0e10cSrcweir 	mpLampBottomObject(0),
295*cdf0e10cSrcweir 	mpLampShaftObject(0),
296*cdf0e10cSrcweir 	maLightObjects(MAX_NUMBER_LIGHTS, (E3dObject*)0),
297*cdf0e10cSrcweir 	mfRotateX(-20.0),
298*cdf0e10cSrcweir 	mfRotateY(45.0),
299*cdf0e10cSrcweir 	mfRotateZ(0.0),
300*cdf0e10cSrcweir 	maActionStartPoint(),
301*cdf0e10cSrcweir 	mnInteractionStartDistance(5 * 5 * 2),
302*cdf0e10cSrcweir 	mfSaveActionStartHor(0.0),
303*cdf0e10cSrcweir 	mfSaveActionStartVer(0.0),
304*cdf0e10cSrcweir 	mfSaveActionStartRotZ(0.0),
305*cdf0e10cSrcweir 	mbMouseMoved(false),
306*cdf0e10cSrcweir     mbGeometrySelected(false)
307*cdf0e10cSrcweir {
308*cdf0e10cSrcweir 	Construct2();
309*cdf0e10cSrcweir }
310*cdf0e10cSrcweir 
311*cdf0e10cSrcweir Svx3DLightControl::~Svx3DLightControl()
312*cdf0e10cSrcweir {
313*cdf0e10cSrcweir 	// SdrObjects like mpExpansionObject and mpLampBottomObject/mpLampShaftObject get deleted
314*cdf0e10cSrcweir 	// with deletion of the DrawingLayer and model
315*cdf0e10cSrcweir }
316*cdf0e10cSrcweir 
317*cdf0e10cSrcweir void Svx3DLightControl::Construct2()
318*cdf0e10cSrcweir {
319*cdf0e10cSrcweir 	{
320*cdf0e10cSrcweir 		// hide all page stuff, use control background (normally gray)
321*cdf0e10cSrcweir 		const Color aDialogColor(Application::GetSettings().GetStyleSettings().GetDialogColor());
322*cdf0e10cSrcweir 		mp3DView->SetPageVisible(false);
323*cdf0e10cSrcweir 		mp3DView->SetApplicationBackgroundColor(aDialogColor);
324*cdf0e10cSrcweir 		mp3DView->SetApplicationDocumentColor(aDialogColor);
325*cdf0e10cSrcweir 	}
326*cdf0e10cSrcweir 
327*cdf0e10cSrcweir 	{
328*cdf0e10cSrcweir 		// create invisible expansion object
329*cdf0e10cSrcweir 		const double fMaxExpansion(RADIUS_LAMP_BIG + RADIUS_LAMP_PREVIEW_SIZE);
330*cdf0e10cSrcweir 		mpExpansionObject = new E3dCubeObj(
331*cdf0e10cSrcweir 			mp3DView->Get3DDefaultAttributes(),
332*cdf0e10cSrcweir 			basegfx::B3DPoint(-fMaxExpansion, -fMaxExpansion, -fMaxExpansion),
333*cdf0e10cSrcweir 			basegfx::B3DVector(2.0 * fMaxExpansion, 2.0 * fMaxExpansion, 2.0 * fMaxExpansion));
334*cdf0e10cSrcweir 		mpScene->Insert3DObj( mpExpansionObject );
335*cdf0e10cSrcweir 		SfxItemSet aSet(mpModel->GetItemPool());
336*cdf0e10cSrcweir 		aSet.Put( XLineStyleItem( XLINE_NONE ) );
337*cdf0e10cSrcweir 		aSet.Put( XFillStyleItem( XFILL_NONE ) );
338*cdf0e10cSrcweir 		mpExpansionObject->SetMergedItemSet(aSet);
339*cdf0e10cSrcweir 	}
340*cdf0e10cSrcweir 
341*cdf0e10cSrcweir 	{
342*cdf0e10cSrcweir 		// create lamp control object (Yellow lined object)
343*cdf0e10cSrcweir 		// base circle
344*cdf0e10cSrcweir 		const basegfx::B2DPolygon a2DCircle(basegfx::tools::createPolygonFromCircle(basegfx::B2DPoint(0.0, 0.0), RADIUS_LAMP_PREVIEW_SIZE));
345*cdf0e10cSrcweir 		basegfx::B3DPolygon a3DCircle(basegfx::tools::createB3DPolygonFromB2DPolygon(a2DCircle));
346*cdf0e10cSrcweir 		basegfx::B3DHomMatrix aTransform;
347*cdf0e10cSrcweir 
348*cdf0e10cSrcweir 		aTransform.rotate(F_PI2, 0.0, 0.0);
349*cdf0e10cSrcweir 		aTransform.translate(0.0, -RADIUS_LAMP_PREVIEW_SIZE, 0.0);
350*cdf0e10cSrcweir 		a3DCircle.transform(aTransform);
351*cdf0e10cSrcweir 
352*cdf0e10cSrcweir 		// create object for it
353*cdf0e10cSrcweir 		mpLampBottomObject = new E3dPolygonObj(
354*cdf0e10cSrcweir 			mp3DView->Get3DDefaultAttributes(),
355*cdf0e10cSrcweir 			basegfx::B3DPolyPolygon(a3DCircle),
356*cdf0e10cSrcweir 			true);
357*cdf0e10cSrcweir 		mpScene->Insert3DObj( mpLampBottomObject );
358*cdf0e10cSrcweir 
359*cdf0e10cSrcweir 		// half circle with stand
360*cdf0e10cSrcweir 		basegfx::B2DPolygon a2DHalfCircle;
361*cdf0e10cSrcweir 		a2DHalfCircle.append(basegfx::B2DPoint(RADIUS_LAMP_PREVIEW_SIZE, 0.0));
362*cdf0e10cSrcweir 		a2DHalfCircle.append(basegfx::B2DPoint(RADIUS_LAMP_PREVIEW_SIZE, -RADIUS_LAMP_PREVIEW_SIZE));
363*cdf0e10cSrcweir 		a2DHalfCircle.append(basegfx::tools::createPolygonFromEllipseSegment(
364*cdf0e10cSrcweir 			basegfx::B2DPoint(0.0, 0.0), RADIUS_LAMP_PREVIEW_SIZE, RADIUS_LAMP_PREVIEW_SIZE, F_2PI - F_PI2, F_PI2));
365*cdf0e10cSrcweir 		basegfx::B3DPolygon a3DHalfCircle(basegfx::tools::createB3DPolygonFromB2DPolygon(a2DHalfCircle));
366*cdf0e10cSrcweir 
367*cdf0e10cSrcweir 		// create object for it
368*cdf0e10cSrcweir 		mpLampShaftObject = new E3dPolygonObj(
369*cdf0e10cSrcweir 			mp3DView->Get3DDefaultAttributes(),
370*cdf0e10cSrcweir 			basegfx::B3DPolyPolygon(a3DHalfCircle),
371*cdf0e10cSrcweir 			true);
372*cdf0e10cSrcweir 		mpScene->Insert3DObj( mpLampShaftObject );
373*cdf0e10cSrcweir 
374*cdf0e10cSrcweir 		// initially invisible
375*cdf0e10cSrcweir 		SfxItemSet aSet(mpModel->GetItemPool());
376*cdf0e10cSrcweir 		aSet.Put( XLineStyleItem( XLINE_NONE ) );
377*cdf0e10cSrcweir 		aSet.Put( XFillStyleItem( XFILL_NONE ) );
378*cdf0e10cSrcweir 
379*cdf0e10cSrcweir 		mpLampBottomObject->SetMergedItemSet(aSet);
380*cdf0e10cSrcweir 		mpLampShaftObject->SetMergedItemSet(aSet);
381*cdf0e10cSrcweir 	}
382*cdf0e10cSrcweir 
383*cdf0e10cSrcweir 	{
384*cdf0e10cSrcweir 		// change camera settings
385*cdf0e10cSrcweir 		Camera3D& rCamera  = (Camera3D&) mpScene->GetCamera();
386*cdf0e10cSrcweir 		const basegfx::B3DRange& rVolume = mpScene->GetBoundVolume();
387*cdf0e10cSrcweir 		double fW = rVolume.getWidth();
388*cdf0e10cSrcweir 		double fH = rVolume.getHeight();
389*cdf0e10cSrcweir 		double fCamZ = rVolume.getMaxZ() + ((fW + fH) / 2.0);
390*cdf0e10cSrcweir 
391*cdf0e10cSrcweir 		rCamera.SetAutoAdjustProjection(sal_False);
392*cdf0e10cSrcweir 		rCamera.SetViewWindow(- fW / 2, - fH / 2, fW, fH);
393*cdf0e10cSrcweir 		basegfx::B3DPoint aLookAt;
394*cdf0e10cSrcweir 		double fDefaultCamPosZ = mp3DView->GetDefaultCamPosZ();
395*cdf0e10cSrcweir 		basegfx::B3DPoint aCamPos(0.0, 0.0, fCamZ < fDefaultCamPosZ ? fDefaultCamPosZ : fCamZ);
396*cdf0e10cSrcweir 		rCamera.SetPosAndLookAt(aCamPos, aLookAt);
397*cdf0e10cSrcweir 		double fDefaultCamFocal = mp3DView->GetDefaultCamFocal();
398*cdf0e10cSrcweir 		rCamera.SetFocalLength(fDefaultCamFocal);
399*cdf0e10cSrcweir 		rCamera.SetDefaults(basegfx::B3DPoint(0.0, 0.0, fDefaultCamPosZ), aLookAt, fDefaultCamFocal);
400*cdf0e10cSrcweir 
401*cdf0e10cSrcweir 		mpScene->SetCamera( rCamera );
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir 		basegfx::B3DHomMatrix aNeutral;
404*cdf0e10cSrcweir 		mpScene->SetTransform(aNeutral);
405*cdf0e10cSrcweir 	}
406*cdf0e10cSrcweir 
407*cdf0e10cSrcweir 	// invalidate SnapRects of objects
408*cdf0e10cSrcweir 	mpScene->SetRectsDirty();
409*cdf0e10cSrcweir }
410*cdf0e10cSrcweir 
411*cdf0e10cSrcweir void Svx3DLightControl::ConstructLightObjects()
412*cdf0e10cSrcweir {
413*cdf0e10cSrcweir 	for(sal_uInt32 a(0); a < MAX_NUMBER_LIGHTS; a++)
414*cdf0e10cSrcweir 	{
415*cdf0e10cSrcweir 		// get rid of evtl. existing light object
416*cdf0e10cSrcweir 		if(maLightObjects[a])
417*cdf0e10cSrcweir 		{
418*cdf0e10cSrcweir 			mpScene->Remove3DObj(maLightObjects[a]);
419*cdf0e10cSrcweir 			delete maLightObjects[a];
420*cdf0e10cSrcweir 			maLightObjects[a] = 0;
421*cdf0e10cSrcweir 		}
422*cdf0e10cSrcweir 
423*cdf0e10cSrcweir 		if(GetLightOnOff(a))
424*cdf0e10cSrcweir 		{
425*cdf0e10cSrcweir 			const bool bIsSelectedLight(a == maSelectedLight);
426*cdf0e10cSrcweir 			basegfx::B3DVector aDirection(GetLightDirection(a));
427*cdf0e10cSrcweir 			aDirection.normalize();
428*cdf0e10cSrcweir 			aDirection *= RADIUS_LAMP_PREVIEW_SIZE;
429*cdf0e10cSrcweir 
430*cdf0e10cSrcweir 			const double fLampSize(bIsSelectedLight ? RADIUS_LAMP_BIG : RADIUS_LAMP_SMALL);
431*cdf0e10cSrcweir 			E3dObject* pNewLight = new E3dSphereObj(
432*cdf0e10cSrcweir 				mp3DView->Get3DDefaultAttributes(),
433*cdf0e10cSrcweir 				basegfx::B3DPoint( 0, 0, 0 ),
434*cdf0e10cSrcweir 				basegfx::B3DVector( fLampSize, fLampSize, fLampSize));
435*cdf0e10cSrcweir 			mpScene->Insert3DObj(pNewLight);
436*cdf0e10cSrcweir 
437*cdf0e10cSrcweir 			basegfx::B3DHomMatrix aTransform;
438*cdf0e10cSrcweir 			aTransform.translate(aDirection.getX(), aDirection.getY(), aDirection.getZ());
439*cdf0e10cSrcweir 			pNewLight->SetTransform(aTransform);
440*cdf0e10cSrcweir 
441*cdf0e10cSrcweir 			SfxItemSet aSet(mpModel->GetItemPool());
442*cdf0e10cSrcweir 			aSet.Put( XLineStyleItem( XLINE_NONE ) );
443*cdf0e10cSrcweir 			aSet.Put( XFillStyleItem( XFILL_SOLID ) );
444*cdf0e10cSrcweir 			aSet.Put( XFillColorItem(String(), GetLightColor(a)));
445*cdf0e10cSrcweir 			pNewLight->SetMergedItemSet(aSet);
446*cdf0e10cSrcweir 
447*cdf0e10cSrcweir 			maLightObjects[a] = pNewLight;
448*cdf0e10cSrcweir 		}
449*cdf0e10cSrcweir 	}
450*cdf0e10cSrcweir }
451*cdf0e10cSrcweir 
452*cdf0e10cSrcweir void Svx3DLightControl::AdaptToSelectedLight()
453*cdf0e10cSrcweir {
454*cdf0e10cSrcweir 	if(NO_LIGHT_SELECTED == maSelectedLight)
455*cdf0e10cSrcweir 	{
456*cdf0e10cSrcweir 		// make mpLampBottomObject/mpLampShaftObject invisible
457*cdf0e10cSrcweir 		SfxItemSet aSet(mpModel->GetItemPool());
458*cdf0e10cSrcweir 		aSet.Put( XLineStyleItem( XLINE_NONE ) );
459*cdf0e10cSrcweir 		aSet.Put( XFillStyleItem( XFILL_NONE ) );
460*cdf0e10cSrcweir 		mpLampBottomObject->SetMergedItemSet(aSet);
461*cdf0e10cSrcweir 		mpLampShaftObject->SetMergedItemSet(aSet);
462*cdf0e10cSrcweir 	}
463*cdf0e10cSrcweir 	else
464*cdf0e10cSrcweir 	{
465*cdf0e10cSrcweir 		basegfx::B3DVector aDirection(GetLightDirection(maSelectedLight));
466*cdf0e10cSrcweir 		aDirection.normalize();
467*cdf0e10cSrcweir 
468*cdf0e10cSrcweir 		// make mpLampBottomObject/mpLampShaftObject visible (yellow hairline)
469*cdf0e10cSrcweir 		SfxItemSet aSet(mpModel->GetItemPool());
470*cdf0e10cSrcweir 		aSet.Put( XLineStyleItem( XLINE_SOLID ) );
471*cdf0e10cSrcweir 		aSet.Put( XLineColorItem(String(), COL_YELLOW));
472*cdf0e10cSrcweir 		aSet.Put( XLineWidthItem(0));
473*cdf0e10cSrcweir 		aSet.Put( XFillStyleItem( XFILL_NONE ) );
474*cdf0e10cSrcweir 		mpLampBottomObject->SetMergedItemSet(aSet);
475*cdf0e10cSrcweir 		mpLampShaftObject->SetMergedItemSet(aSet);
476*cdf0e10cSrcweir 
477*cdf0e10cSrcweir 		// adapt transformation of mpLampShaftObject
478*cdf0e10cSrcweir 		basegfx::B3DHomMatrix aTransform;
479*cdf0e10cSrcweir 		double fRotateY(0.0);
480*cdf0e10cSrcweir 
481*cdf0e10cSrcweir 		if(!basegfx::fTools::equalZero(aDirection.getZ()) || !basegfx::fTools::equalZero(aDirection.getX()))
482*cdf0e10cSrcweir 		{
483*cdf0e10cSrcweir 			fRotateY = atan2(-aDirection.getZ(), aDirection.getX());
484*cdf0e10cSrcweir 		}
485*cdf0e10cSrcweir 
486*cdf0e10cSrcweir 		aTransform.rotate(0.0, fRotateY, 0.0);
487*cdf0e10cSrcweir 		mpLampShaftObject->SetTransform(aTransform);
488*cdf0e10cSrcweir 
489*cdf0e10cSrcweir 		// adapt transformation of selected light
490*cdf0e10cSrcweir 		E3dObject* pSelectedLight = maLightObjects[sal_Int32(maSelectedLight)];
491*cdf0e10cSrcweir 
492*cdf0e10cSrcweir 		if(pSelectedLight)
493*cdf0e10cSrcweir 		{
494*cdf0e10cSrcweir 			aTransform.identity();
495*cdf0e10cSrcweir 			aTransform.translate(
496*cdf0e10cSrcweir 				aDirection.getX() * RADIUS_LAMP_PREVIEW_SIZE,
497*cdf0e10cSrcweir 				aDirection.getY() * RADIUS_LAMP_PREVIEW_SIZE,
498*cdf0e10cSrcweir 				aDirection.getZ() * RADIUS_LAMP_PREVIEW_SIZE);
499*cdf0e10cSrcweir 			pSelectedLight->SetTransform(aTransform);
500*cdf0e10cSrcweir 		}
501*cdf0e10cSrcweir 	}
502*cdf0e10cSrcweir }
503*cdf0e10cSrcweir 
504*cdf0e10cSrcweir void Svx3DLightControl::TrySelection(Point aPosPixel)
505*cdf0e10cSrcweir {
506*cdf0e10cSrcweir 	if(mpScene)
507*cdf0e10cSrcweir 	{
508*cdf0e10cSrcweir 		const Point aPosLogic(PixelToLogic(aPosPixel));
509*cdf0e10cSrcweir 		const basegfx::B2DPoint aPoint(aPosLogic.X(), aPosLogic.Y());
510*cdf0e10cSrcweir 		std::vector< const E3dCompoundObject* > aResult;
511*cdf0e10cSrcweir 		getAllHit3DObjectsSortedFrontToBack(aPoint, *mpScene, aResult);
512*cdf0e10cSrcweir 
513*cdf0e10cSrcweir 		if(!aResult.empty())
514*cdf0e10cSrcweir 		{
515*cdf0e10cSrcweir 			// exclude expansion object which will be part of
516*cdf0e10cSrcweir             // the hits. It's invisible, but for HitTest, it's included
517*cdf0e10cSrcweir 			const E3dCompoundObject* pResult = 0;
518*cdf0e10cSrcweir 
519*cdf0e10cSrcweir             for(sal_uInt32 b(0); !pResult && b < aResult.size(); b++)
520*cdf0e10cSrcweir             {
521*cdf0e10cSrcweir                 if(aResult[b] && aResult[b] != mpExpansionObject)
522*cdf0e10cSrcweir                 {
523*cdf0e10cSrcweir                     pResult = aResult[b];
524*cdf0e10cSrcweir                 }
525*cdf0e10cSrcweir             }
526*cdf0e10cSrcweir 
527*cdf0e10cSrcweir 			if(pResult == mp3DObj)
528*cdf0e10cSrcweir 			{
529*cdf0e10cSrcweir 				if(!mbGeometrySelected)
530*cdf0e10cSrcweir 				{
531*cdf0e10cSrcweir 					mbGeometrySelected = true;
532*cdf0e10cSrcweir 					maSelectedLight = NO_LIGHT_SELECTED;
533*cdf0e10cSrcweir 					ConstructLightObjects();
534*cdf0e10cSrcweir 					AdaptToSelectedLight();
535*cdf0e10cSrcweir 					Invalidate();
536*cdf0e10cSrcweir 
537*cdf0e10cSrcweir 					if(maSelectionChangeCallback.IsSet())
538*cdf0e10cSrcweir 					{
539*cdf0e10cSrcweir 						maSelectionChangeCallback.Call(this);
540*cdf0e10cSrcweir 					}
541*cdf0e10cSrcweir 				}
542*cdf0e10cSrcweir 			}
543*cdf0e10cSrcweir 			else
544*cdf0e10cSrcweir 			{
545*cdf0e10cSrcweir 				sal_uInt32 aNewSelectedLight(NO_LIGHT_SELECTED);
546*cdf0e10cSrcweir 
547*cdf0e10cSrcweir 				for(sal_uInt32 a(0); a < MAX_NUMBER_LIGHTS; a++)
548*cdf0e10cSrcweir 				{
549*cdf0e10cSrcweir 					if(maLightObjects[a] && maLightObjects[a] == pResult)
550*cdf0e10cSrcweir 					{
551*cdf0e10cSrcweir 						aNewSelectedLight = a;
552*cdf0e10cSrcweir 					}
553*cdf0e10cSrcweir 				}
554*cdf0e10cSrcweir 
555*cdf0e10cSrcweir 				if(aNewSelectedLight != maSelectedLight)
556*cdf0e10cSrcweir 				{
557*cdf0e10cSrcweir 					SelectLight(aNewSelectedLight);
558*cdf0e10cSrcweir 
559*cdf0e10cSrcweir 					if(maSelectionChangeCallback.IsSet())
560*cdf0e10cSrcweir 					{
561*cdf0e10cSrcweir 						maSelectionChangeCallback.Call(this);
562*cdf0e10cSrcweir 					}
563*cdf0e10cSrcweir 				}
564*cdf0e10cSrcweir 			}
565*cdf0e10cSrcweir 		}
566*cdf0e10cSrcweir 	}
567*cdf0e10cSrcweir }
568*cdf0e10cSrcweir 
569*cdf0e10cSrcweir void Svx3DLightControl::Paint(const Rectangle& rRect)
570*cdf0e10cSrcweir {
571*cdf0e10cSrcweir     Svx3DPreviewControl::Paint(rRect);
572*cdf0e10cSrcweir }
573*cdf0e10cSrcweir 
574*cdf0e10cSrcweir void Svx3DLightControl::MouseButtonDown( const MouseEvent& rMEvt )
575*cdf0e10cSrcweir {
576*cdf0e10cSrcweir 	bool bCallParent(true);
577*cdf0e10cSrcweir 
578*cdf0e10cSrcweir 	// switch state
579*cdf0e10cSrcweir 	if(rMEvt.IsLeft())
580*cdf0e10cSrcweir 	{
581*cdf0e10cSrcweir 		if(IsSelectionValid() || mbGeometrySelected)
582*cdf0e10cSrcweir 		{
583*cdf0e10cSrcweir 			mbMouseMoved = false;
584*cdf0e10cSrcweir 			bCallParent = false;
585*cdf0e10cSrcweir 			maActionStartPoint = rMEvt.GetPosPixel();
586*cdf0e10cSrcweir 			StartTracking();
587*cdf0e10cSrcweir 		}
588*cdf0e10cSrcweir 		else
589*cdf0e10cSrcweir 		{
590*cdf0e10cSrcweir 			// Einfacher Click ohne viel Bewegen, versuche eine
591*cdf0e10cSrcweir 			// Selektion
592*cdf0e10cSrcweir 			TrySelection(rMEvt.GetPosPixel());
593*cdf0e10cSrcweir 			bCallParent = false;
594*cdf0e10cSrcweir 		}
595*cdf0e10cSrcweir 	}
596*cdf0e10cSrcweir 
597*cdf0e10cSrcweir 	// call parent
598*cdf0e10cSrcweir 	if(bCallParent)
599*cdf0e10cSrcweir 	{
600*cdf0e10cSrcweir 		Svx3DPreviewControl::MouseButtonDown(rMEvt);
601*cdf0e10cSrcweir 	}
602*cdf0e10cSrcweir }
603*cdf0e10cSrcweir 
604*cdf0e10cSrcweir void Svx3DLightControl::Tracking( const TrackingEvent& rTEvt )
605*cdf0e10cSrcweir {
606*cdf0e10cSrcweir 	if(rTEvt.IsTrackingEnded())
607*cdf0e10cSrcweir 	{
608*cdf0e10cSrcweir 		if(rTEvt.IsTrackingCanceled())
609*cdf0e10cSrcweir 		{
610*cdf0e10cSrcweir 			if(mbMouseMoved)
611*cdf0e10cSrcweir 			{
612*cdf0e10cSrcweir 				// interrupt tracking
613*cdf0e10cSrcweir 				mbMouseMoved = false;
614*cdf0e10cSrcweir 
615*cdf0e10cSrcweir 				if(mbGeometrySelected)
616*cdf0e10cSrcweir 				{
617*cdf0e10cSrcweir 					SetRotation(mfSaveActionStartVer, mfSaveActionStartHor, mfSaveActionStartRotZ);
618*cdf0e10cSrcweir 				}
619*cdf0e10cSrcweir 				else
620*cdf0e10cSrcweir 				{
621*cdf0e10cSrcweir 					SetPosition(mfSaveActionStartHor, mfSaveActionStartVer);
622*cdf0e10cSrcweir 				}
623*cdf0e10cSrcweir 
624*cdf0e10cSrcweir 				if(maChangeCallback.IsSet())
625*cdf0e10cSrcweir 				{
626*cdf0e10cSrcweir 					maChangeCallback.Call(this);
627*cdf0e10cSrcweir 				}
628*cdf0e10cSrcweir 			}
629*cdf0e10cSrcweir 		}
630*cdf0e10cSrcweir 		else
631*cdf0e10cSrcweir 		{
632*cdf0e10cSrcweir 			const MouseEvent& rMEvt = rTEvt.GetMouseEvent();
633*cdf0e10cSrcweir 
634*cdf0e10cSrcweir 			if(mbMouseMoved)
635*cdf0e10cSrcweir 			{
636*cdf0e10cSrcweir 				// was change dinteractively
637*cdf0e10cSrcweir 			}
638*cdf0e10cSrcweir 			else
639*cdf0e10cSrcweir 			{
640*cdf0e10cSrcweir 				// simple click without much movement, try selection
641*cdf0e10cSrcweir 				TrySelection(rMEvt.GetPosPixel());
642*cdf0e10cSrcweir 			}
643*cdf0e10cSrcweir 		}
644*cdf0e10cSrcweir 	}
645*cdf0e10cSrcweir 	else
646*cdf0e10cSrcweir 	{
647*cdf0e10cSrcweir 		const MouseEvent& rMEvt = rTEvt.GetMouseEvent();
648*cdf0e10cSrcweir 		Point aDeltaPos = rMEvt.GetPosPixel() - maActionStartPoint;
649*cdf0e10cSrcweir 
650*cdf0e10cSrcweir 		if(!mbMouseMoved)
651*cdf0e10cSrcweir 		{
652*cdf0e10cSrcweir 			if(sal_Int32(aDeltaPos.X() * aDeltaPos.X() + aDeltaPos.Y() * aDeltaPos.Y()) > mnInteractionStartDistance)
653*cdf0e10cSrcweir 			{
654*cdf0e10cSrcweir 				if(mbGeometrySelected)
655*cdf0e10cSrcweir 				{
656*cdf0e10cSrcweir 					GetRotation(mfSaveActionStartVer, mfSaveActionStartHor, mfSaveActionStartRotZ);
657*cdf0e10cSrcweir 				}
658*cdf0e10cSrcweir 				else
659*cdf0e10cSrcweir 				{
660*cdf0e10cSrcweir 					// intercation start, save values
661*cdf0e10cSrcweir 					GetPosition(mfSaveActionStartHor, mfSaveActionStartVer);
662*cdf0e10cSrcweir 				}
663*cdf0e10cSrcweir 
664*cdf0e10cSrcweir 				mbMouseMoved = true;
665*cdf0e10cSrcweir 			}
666*cdf0e10cSrcweir 		}
667*cdf0e10cSrcweir 
668*cdf0e10cSrcweir 		if(mbMouseMoved)
669*cdf0e10cSrcweir 		{
670*cdf0e10cSrcweir 			if(mbGeometrySelected)
671*cdf0e10cSrcweir 			{
672*cdf0e10cSrcweir 				double fNewRotX = mfSaveActionStartVer - ((double)aDeltaPos.Y() * F_PI180);
673*cdf0e10cSrcweir 				double fNewRotY = mfSaveActionStartHor + ((double)aDeltaPos.X() * F_PI180);
674*cdf0e10cSrcweir 
675*cdf0e10cSrcweir 				// cut horizontal
676*cdf0e10cSrcweir 				while(fNewRotY < 0.0)
677*cdf0e10cSrcweir 				{
678*cdf0e10cSrcweir 					fNewRotY += F_2PI;
679*cdf0e10cSrcweir 				}
680*cdf0e10cSrcweir 
681*cdf0e10cSrcweir 				while(fNewRotY >= F_2PI)
682*cdf0e10cSrcweir 				{
683*cdf0e10cSrcweir 					fNewRotY -= F_2PI;
684*cdf0e10cSrcweir 				}
685*cdf0e10cSrcweir 
686*cdf0e10cSrcweir 				// cut vertical
687*cdf0e10cSrcweir 				if(fNewRotX < -F_PI2)
688*cdf0e10cSrcweir 				{
689*cdf0e10cSrcweir 					fNewRotX = -F_PI2;
690*cdf0e10cSrcweir 				}
691*cdf0e10cSrcweir 
692*cdf0e10cSrcweir 				if(fNewRotX > F_PI2)
693*cdf0e10cSrcweir 				{
694*cdf0e10cSrcweir 					fNewRotX = F_PI2;
695*cdf0e10cSrcweir 				}
696*cdf0e10cSrcweir 
697*cdf0e10cSrcweir 				SetRotation(fNewRotX, fNewRotY, mfSaveActionStartRotZ);
698*cdf0e10cSrcweir 
699*cdf0e10cSrcweir 				if(maChangeCallback.IsSet())
700*cdf0e10cSrcweir 				{
701*cdf0e10cSrcweir 					maChangeCallback.Call(this);
702*cdf0e10cSrcweir 				}
703*cdf0e10cSrcweir 			}
704*cdf0e10cSrcweir 			else
705*cdf0e10cSrcweir 			{
706*cdf0e10cSrcweir 				// interaction in progress
707*cdf0e10cSrcweir 				double fNewPosHor = mfSaveActionStartHor + ((double)aDeltaPos.X());
708*cdf0e10cSrcweir 				double fNewPosVer = mfSaveActionStartVer - ((double)aDeltaPos.Y());
709*cdf0e10cSrcweir 
710*cdf0e10cSrcweir 				// cut horizontal
711*cdf0e10cSrcweir 				while(fNewPosHor < 0.0)
712*cdf0e10cSrcweir 				{
713*cdf0e10cSrcweir 					fNewPosHor += 360.0;
714*cdf0e10cSrcweir 				}
715*cdf0e10cSrcweir 
716*cdf0e10cSrcweir 				while(fNewPosHor >= 360.0)
717*cdf0e10cSrcweir 				{
718*cdf0e10cSrcweir 					fNewPosHor -= 360.0;
719*cdf0e10cSrcweir 				}
720*cdf0e10cSrcweir 
721*cdf0e10cSrcweir 				// cut vertical
722*cdf0e10cSrcweir 				if(fNewPosVer < -90.0)
723*cdf0e10cSrcweir 				{
724*cdf0e10cSrcweir 					fNewPosVer = -90.0;
725*cdf0e10cSrcweir 				}
726*cdf0e10cSrcweir 
727*cdf0e10cSrcweir 				if(fNewPosVer > 90.0)
728*cdf0e10cSrcweir 				{
729*cdf0e10cSrcweir 					fNewPosVer = 90.0;
730*cdf0e10cSrcweir 				}
731*cdf0e10cSrcweir 
732*cdf0e10cSrcweir 				SetPosition(fNewPosHor, fNewPosVer);
733*cdf0e10cSrcweir 
734*cdf0e10cSrcweir 				if(maChangeCallback.IsSet())
735*cdf0e10cSrcweir 				{
736*cdf0e10cSrcweir 					maChangeCallback.Call(this);
737*cdf0e10cSrcweir 				}
738*cdf0e10cSrcweir 			}
739*cdf0e10cSrcweir 		}
740*cdf0e10cSrcweir 	}
741*cdf0e10cSrcweir }
742*cdf0e10cSrcweir 
743*cdf0e10cSrcweir void Svx3DLightControl::Resize()
744*cdf0e10cSrcweir {
745*cdf0e10cSrcweir 	// set size of page
746*cdf0e10cSrcweir 	const Size aSize(PixelToLogic(GetSizePixel()));
747*cdf0e10cSrcweir 	mpFmPage->SetSize(aSize);
748*cdf0e10cSrcweir 
749*cdf0e10cSrcweir 	// set position and size of scene
750*cdf0e10cSrcweir 	mpScene->SetSnapRect(Rectangle(Point(0, 0), aSize));
751*cdf0e10cSrcweir }
752*cdf0e10cSrcweir 
753*cdf0e10cSrcweir void Svx3DLightControl::SetObjectType(sal_uInt16 nType)
754*cdf0e10cSrcweir {
755*cdf0e10cSrcweir 	// call parent
756*cdf0e10cSrcweir 	Svx3DPreviewControl::SetObjectType(nType);
757*cdf0e10cSrcweir 
758*cdf0e10cSrcweir 	// apply object rotation
759*cdf0e10cSrcweir 	if(mp3DObj)
760*cdf0e10cSrcweir 	{
761*cdf0e10cSrcweir 		basegfx::B3DHomMatrix aObjectRotation;
762*cdf0e10cSrcweir 		aObjectRotation.rotate(mfRotateX, mfRotateY, mfRotateZ);
763*cdf0e10cSrcweir 		mp3DObj->SetTransform(aObjectRotation);
764*cdf0e10cSrcweir 	}
765*cdf0e10cSrcweir }
766*cdf0e10cSrcweir 
767*cdf0e10cSrcweir bool Svx3DLightControl::IsSelectionValid()
768*cdf0e10cSrcweir {
769*cdf0e10cSrcweir 	if((NO_LIGHT_SELECTED != maSelectedLight) && (GetLightOnOff(maSelectedLight)))
770*cdf0e10cSrcweir 	{
771*cdf0e10cSrcweir 		return true;
772*cdf0e10cSrcweir 	}
773*cdf0e10cSrcweir 
774*cdf0e10cSrcweir 	return false;
775*cdf0e10cSrcweir }
776*cdf0e10cSrcweir 
777*cdf0e10cSrcweir void Svx3DLightControl::GetPosition(double& rHor, double& rVer)
778*cdf0e10cSrcweir {
779*cdf0e10cSrcweir 	if(IsSelectionValid())
780*cdf0e10cSrcweir 	{
781*cdf0e10cSrcweir 		basegfx::B3DVector aDirection(GetLightDirection(maSelectedLight));
782*cdf0e10cSrcweir 		aDirection.normalize();
783*cdf0e10cSrcweir 		rHor = atan2(-aDirection.getX(), -aDirection.getZ()) + F_PI; // 0..2PI
784*cdf0e10cSrcweir 		rVer = atan2(aDirection.getY(), aDirection.getXZLength()); // -PI2..PI2
785*cdf0e10cSrcweir 		rHor /= F_PI180; // 0..360.0
786*cdf0e10cSrcweir 		rVer /= F_PI180; // -90.0..90.0
787*cdf0e10cSrcweir 	}
788*cdf0e10cSrcweir 	if(IsGeometrySelected())
789*cdf0e10cSrcweir 	{
790*cdf0e10cSrcweir 		rHor = mfRotateY / F_PI180; // 0..360.0
791*cdf0e10cSrcweir 		rVer = mfRotateX / F_PI180; // -90.0..90.0
792*cdf0e10cSrcweir 	}
793*cdf0e10cSrcweir }
794*cdf0e10cSrcweir 
795*cdf0e10cSrcweir void Svx3DLightControl::SetPosition(double fHor, double fVer)
796*cdf0e10cSrcweir {
797*cdf0e10cSrcweir 	if(IsSelectionValid())
798*cdf0e10cSrcweir 	{
799*cdf0e10cSrcweir 		// set selected light's direction
800*cdf0e10cSrcweir 		fHor = (fHor * F_PI180) - F_PI; // -PI..PI
801*cdf0e10cSrcweir 		fVer *= F_PI180; // -PI2..PI2
802*cdf0e10cSrcweir 		basegfx::B3DVector aDirection(cos(fVer) * -sin(fHor), sin(fVer), cos(fVer) * -cos(fHor));
803*cdf0e10cSrcweir 		aDirection.normalize();
804*cdf0e10cSrcweir 
805*cdf0e10cSrcweir 		if(!aDirection.equal(GetLightDirection(maSelectedLight)))
806*cdf0e10cSrcweir 		{
807*cdf0e10cSrcweir 			// set changed light direction at SdrScene
808*cdf0e10cSrcweir 			SfxItemSet aSet(mpModel->GetItemPool());
809*cdf0e10cSrcweir 
810*cdf0e10cSrcweir             switch(maSelectedLight)
811*cdf0e10cSrcweir             {
812*cdf0e10cSrcweir                 case 0: aSet.Put(Svx3DLightDirection1Item(aDirection)); break;
813*cdf0e10cSrcweir                 case 1: aSet.Put(Svx3DLightDirection2Item(aDirection)); break;
814*cdf0e10cSrcweir                 case 2: aSet.Put(Svx3DLightDirection3Item(aDirection)); break;
815*cdf0e10cSrcweir                 case 3: aSet.Put(Svx3DLightDirection4Item(aDirection)); break;
816*cdf0e10cSrcweir                 case 4: aSet.Put(Svx3DLightDirection5Item(aDirection)); break;
817*cdf0e10cSrcweir                 case 5: aSet.Put(Svx3DLightDirection6Item(aDirection)); break;
818*cdf0e10cSrcweir                 case 6: aSet.Put(Svx3DLightDirection7Item(aDirection)); break;
819*cdf0e10cSrcweir                 default:
820*cdf0e10cSrcweir                 case 7: aSet.Put(Svx3DLightDirection8Item(aDirection)); break;
821*cdf0e10cSrcweir             }
822*cdf0e10cSrcweir 
823*cdf0e10cSrcweir             mpScene->SetMergedItemSet(aSet);
824*cdf0e10cSrcweir 
825*cdf0e10cSrcweir 			// correct 3D light's and LampFrame's geometries
826*cdf0e10cSrcweir 			AdaptToSelectedLight();
827*cdf0e10cSrcweir 			Invalidate();
828*cdf0e10cSrcweir 		}
829*cdf0e10cSrcweir 	}
830*cdf0e10cSrcweir 	if(IsGeometrySelected())
831*cdf0e10cSrcweir 	{
832*cdf0e10cSrcweir 		if(mfRotateX != fVer || mfRotateY != fHor)
833*cdf0e10cSrcweir 		{
834*cdf0e10cSrcweir 			mfRotateX = fVer * F_PI180;
835*cdf0e10cSrcweir 			mfRotateY = fHor * F_PI180;
836*cdf0e10cSrcweir 
837*cdf0e10cSrcweir 			if(mp3DObj)
838*cdf0e10cSrcweir 			{
839*cdf0e10cSrcweir 				basegfx::B3DHomMatrix aObjectRotation;
840*cdf0e10cSrcweir 				aObjectRotation.rotate(mfRotateX, mfRotateY, mfRotateZ);
841*cdf0e10cSrcweir 				mp3DObj->SetTransform(aObjectRotation);
842*cdf0e10cSrcweir 
843*cdf0e10cSrcweir 				Invalidate();
844*cdf0e10cSrcweir 			}
845*cdf0e10cSrcweir 		}
846*cdf0e10cSrcweir 	}
847*cdf0e10cSrcweir }
848*cdf0e10cSrcweir 
849*cdf0e10cSrcweir void Svx3DLightControl::SetRotation(double fRotX, double fRotY, double fRotZ)
850*cdf0e10cSrcweir {
851*cdf0e10cSrcweir 	if(IsGeometrySelected())
852*cdf0e10cSrcweir 	{
853*cdf0e10cSrcweir 		if(fRotX != mfRotateX || fRotY != mfRotateY || fRotZ != mfRotateZ)
854*cdf0e10cSrcweir 		{
855*cdf0e10cSrcweir 			mfRotateX = fRotX;
856*cdf0e10cSrcweir 			mfRotateY = fRotY;
857*cdf0e10cSrcweir 			mfRotateZ = fRotZ;
858*cdf0e10cSrcweir 
859*cdf0e10cSrcweir 			if(mp3DObj)
860*cdf0e10cSrcweir 			{
861*cdf0e10cSrcweir 				basegfx::B3DHomMatrix aObjectRotation;
862*cdf0e10cSrcweir 				aObjectRotation.rotate(mfRotateX, mfRotateY, mfRotateZ);
863*cdf0e10cSrcweir 				mp3DObj->SetTransform(aObjectRotation);
864*cdf0e10cSrcweir 
865*cdf0e10cSrcweir 				Invalidate();
866*cdf0e10cSrcweir 			}
867*cdf0e10cSrcweir 		}
868*cdf0e10cSrcweir 	}
869*cdf0e10cSrcweir }
870*cdf0e10cSrcweir 
871*cdf0e10cSrcweir void Svx3DLightControl::GetRotation(double& rRotX, double& rRotY, double& rRotZ)
872*cdf0e10cSrcweir {
873*cdf0e10cSrcweir 	rRotX = mfRotateX;
874*cdf0e10cSrcweir 	rRotY = mfRotateY;
875*cdf0e10cSrcweir 	rRotZ = mfRotateZ;
876*cdf0e10cSrcweir }
877*cdf0e10cSrcweir 
878*cdf0e10cSrcweir void Svx3DLightControl::Set3DAttributes( const SfxItemSet& rAttr )
879*cdf0e10cSrcweir {
880*cdf0e10cSrcweir     // call parent
881*cdf0e10cSrcweir     Svx3DPreviewControl::Set3DAttributes(rAttr);
882*cdf0e10cSrcweir 
883*cdf0e10cSrcweir     if(maSelectedLight != NO_LIGHT_SELECTED && !GetLightOnOff(maSelectedLight))
884*cdf0e10cSrcweir     {
885*cdf0e10cSrcweir         // selected light is no more active, select new one
886*cdf0e10cSrcweir 		maSelectedLight = NO_LIGHT_SELECTED;
887*cdf0e10cSrcweir     }
888*cdf0e10cSrcweir 
889*cdf0e10cSrcweir     // local updates
890*cdf0e10cSrcweir 	ConstructLightObjects();
891*cdf0e10cSrcweir 	AdaptToSelectedLight();
892*cdf0e10cSrcweir 	Invalidate();
893*cdf0e10cSrcweir }
894*cdf0e10cSrcweir 
895*cdf0e10cSrcweir void Svx3DLightControl::SelectLight(sal_uInt32 nLightNumber)
896*cdf0e10cSrcweir {
897*cdf0e10cSrcweir     if(nLightNumber > 7)
898*cdf0e10cSrcweir     {
899*cdf0e10cSrcweir         nLightNumber = NO_LIGHT_SELECTED;
900*cdf0e10cSrcweir     }
901*cdf0e10cSrcweir 
902*cdf0e10cSrcweir 	if(NO_LIGHT_SELECTED != nLightNumber)
903*cdf0e10cSrcweir 	{
904*cdf0e10cSrcweir 		if(!GetLightOnOff(nLightNumber))
905*cdf0e10cSrcweir 		{
906*cdf0e10cSrcweir 			nLightNumber = NO_LIGHT_SELECTED;
907*cdf0e10cSrcweir 		}
908*cdf0e10cSrcweir 	}
909*cdf0e10cSrcweir 
910*cdf0e10cSrcweir 	if(nLightNumber != maSelectedLight)
911*cdf0e10cSrcweir 	{
912*cdf0e10cSrcweir 		maSelectedLight = nLightNumber;
913*cdf0e10cSrcweir 		mbGeometrySelected = false;
914*cdf0e10cSrcweir 		ConstructLightObjects();
915*cdf0e10cSrcweir 		AdaptToSelectedLight();
916*cdf0e10cSrcweir 		Invalidate();
917*cdf0e10cSrcweir 	}
918*cdf0e10cSrcweir }
919*cdf0e10cSrcweir 
920*cdf0e10cSrcweir bool Svx3DLightControl::GetLightOnOff(sal_uInt32 nNum) const
921*cdf0e10cSrcweir {
922*cdf0e10cSrcweir     if(nNum <= 7)
923*cdf0e10cSrcweir     {
924*cdf0e10cSrcweir         const SfxItemSet aLightItemSet(Get3DAttributes());
925*cdf0e10cSrcweir 
926*cdf0e10cSrcweir         switch(nNum)
927*cdf0e10cSrcweir         {
928*cdf0e10cSrcweir             case 0 : return ((const Svx3DLightOnOff1Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTON_1)).GetValue();
929*cdf0e10cSrcweir             case 1 : return ((const Svx3DLightOnOff2Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTON_2)).GetValue();
930*cdf0e10cSrcweir             case 2 : return ((const Svx3DLightOnOff3Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTON_3)).GetValue();
931*cdf0e10cSrcweir             case 3 : return ((const Svx3DLightOnOff4Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTON_4)).GetValue();
932*cdf0e10cSrcweir             case 4 : return ((const Svx3DLightOnOff5Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTON_5)).GetValue();
933*cdf0e10cSrcweir             case 5 : return ((const Svx3DLightOnOff6Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTON_6)).GetValue();
934*cdf0e10cSrcweir             case 6 : return ((const Svx3DLightOnOff7Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTON_7)).GetValue();
935*cdf0e10cSrcweir             case 7 : return ((const Svx3DLightOnOff8Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTON_8)).GetValue();
936*cdf0e10cSrcweir         }
937*cdf0e10cSrcweir     }
938*cdf0e10cSrcweir 
939*cdf0e10cSrcweir     return false;
940*cdf0e10cSrcweir }
941*cdf0e10cSrcweir 
942*cdf0e10cSrcweir Color Svx3DLightControl::GetLightColor(sal_uInt32 nNum) const
943*cdf0e10cSrcweir {
944*cdf0e10cSrcweir     if(nNum <= 7)
945*cdf0e10cSrcweir     {
946*cdf0e10cSrcweir         const SfxItemSet aLightItemSet(Get3DAttributes());
947*cdf0e10cSrcweir 
948*cdf0e10cSrcweir         switch(nNum)
949*cdf0e10cSrcweir         {
950*cdf0e10cSrcweir             case 0 : return ((const Svx3DLightcolor1Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_1)).GetValue();
951*cdf0e10cSrcweir             case 1 : return ((const Svx3DLightcolor2Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_2)).GetValue();
952*cdf0e10cSrcweir             case 2 : return ((const Svx3DLightcolor3Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_3)).GetValue();
953*cdf0e10cSrcweir             case 3 : return ((const Svx3DLightcolor4Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_4)).GetValue();
954*cdf0e10cSrcweir             case 4 : return ((const Svx3DLightcolor5Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_5)).GetValue();
955*cdf0e10cSrcweir             case 5 : return ((const Svx3DLightcolor6Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_6)).GetValue();
956*cdf0e10cSrcweir             case 6 : return ((const Svx3DLightcolor7Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_7)).GetValue();
957*cdf0e10cSrcweir             case 7 : return ((const Svx3DLightcolor8Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTCOLOR_8)).GetValue();
958*cdf0e10cSrcweir         }
959*cdf0e10cSrcweir     }
960*cdf0e10cSrcweir 
961*cdf0e10cSrcweir     return Color(COL_BLACK);
962*cdf0e10cSrcweir }
963*cdf0e10cSrcweir 
964*cdf0e10cSrcweir basegfx::B3DVector Svx3DLightControl::GetLightDirection(sal_uInt32 nNum) const
965*cdf0e10cSrcweir {
966*cdf0e10cSrcweir     if(nNum <= 7)
967*cdf0e10cSrcweir     {
968*cdf0e10cSrcweir         const SfxItemSet aLightItemSet(Get3DAttributes());
969*cdf0e10cSrcweir 
970*cdf0e10cSrcweir         switch(nNum)
971*cdf0e10cSrcweir         {
972*cdf0e10cSrcweir             case 0 : return ((const Svx3DLightDirection1Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_1)).GetValue();
973*cdf0e10cSrcweir             case 1 : return ((const Svx3DLightDirection2Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_2)).GetValue();
974*cdf0e10cSrcweir             case 2 : return ((const Svx3DLightDirection3Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_3)).GetValue();
975*cdf0e10cSrcweir             case 3 : return ((const Svx3DLightDirection4Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_4)).GetValue();
976*cdf0e10cSrcweir             case 4 : return ((const Svx3DLightDirection5Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_5)).GetValue();
977*cdf0e10cSrcweir             case 5 : return ((const Svx3DLightDirection6Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_6)).GetValue();
978*cdf0e10cSrcweir             case 6 : return ((const Svx3DLightDirection7Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_7)).GetValue();
979*cdf0e10cSrcweir             case 7 : return ((const Svx3DLightDirection8Item&)aLightItemSet.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_8)).GetValue();
980*cdf0e10cSrcweir         }
981*cdf0e10cSrcweir     }
982*cdf0e10cSrcweir 
983*cdf0e10cSrcweir     return basegfx::B3DVector();
984*cdf0e10cSrcweir }
985*cdf0e10cSrcweir 
986*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
987*cdf0e10cSrcweir 
988*cdf0e10cSrcweir SvxLightCtl3D::SvxLightCtl3D( Window* pParent, const ResId& rResId)
989*cdf0e10cSrcweir :	Control(pParent, rResId),
990*cdf0e10cSrcweir 	maLightControl(this, 0),
991*cdf0e10cSrcweir 	maHorScroller(this, WB_HORZ | WB_DRAG),
992*cdf0e10cSrcweir 	maVerScroller(this, WB_VERT | WB_DRAG),
993*cdf0e10cSrcweir 	maSwitcher(this, 0)
994*cdf0e10cSrcweir {
995*cdf0e10cSrcweir 	// init members
996*cdf0e10cSrcweir 	Init();
997*cdf0e10cSrcweir }
998*cdf0e10cSrcweir 
999*cdf0e10cSrcweir SvxLightCtl3D::SvxLightCtl3D( Window* pParent, WinBits nStyle )
1000*cdf0e10cSrcweir :	Control(pParent, nStyle),
1001*cdf0e10cSrcweir 	maLightControl(this, 0),
1002*cdf0e10cSrcweir 	maHorScroller(this, WB_HORZ | WB_DRAG),
1003*cdf0e10cSrcweir 	maVerScroller(this, WB_VERT | WB_DRAG),
1004*cdf0e10cSrcweir 	maSwitcher(this, 0)
1005*cdf0e10cSrcweir {
1006*cdf0e10cSrcweir 	// init members
1007*cdf0e10cSrcweir 	Init();
1008*cdf0e10cSrcweir }
1009*cdf0e10cSrcweir 
1010*cdf0e10cSrcweir void SvxLightCtl3D::Init()
1011*cdf0e10cSrcweir {
1012*cdf0e10cSrcweir 	// #i58240# set HelpIDs for scrollbars and switcher
1013*cdf0e10cSrcweir 	maHorScroller.SetHelpId(HID_CTRL3D_HSCROLL);
1014*cdf0e10cSrcweir 	maVerScroller.SetHelpId(HID_CTRL3D_VSCROLL);
1015*cdf0e10cSrcweir 	maSwitcher.SetHelpId(HID_CTRL3D_SWITCHER);
1016*cdf0e10cSrcweir 	maSwitcher.SetAccessibleName(String(SVX_RES(STR_SWITCH)));
1017*cdf0e10cSrcweir 
1018*cdf0e10cSrcweir 	// Light preview
1019*cdf0e10cSrcweir 	maLightControl.Show();
1020*cdf0e10cSrcweir 	maLightControl.SetChangeCallback( LINK(this, SvxLightCtl3D, InternalInteractiveChange) );
1021*cdf0e10cSrcweir 	maLightControl.SetSelectionChangeCallback( LINK(this, SvxLightCtl3D, InternalSelectionChange) );
1022*cdf0e10cSrcweir 
1023*cdf0e10cSrcweir 	// Horiz Scrollbar
1024*cdf0e10cSrcweir 	maHorScroller.Show();
1025*cdf0e10cSrcweir 	maHorScroller.SetRange(Range(0, 36000));
1026*cdf0e10cSrcweir 	maHorScroller.SetLineSize(100);
1027*cdf0e10cSrcweir 	maHorScroller.SetPageSize(1000);
1028*cdf0e10cSrcweir 	maHorScroller.SetScrollHdl( LINK(this, SvxLightCtl3D, ScrollBarMove) );
1029*cdf0e10cSrcweir 
1030*cdf0e10cSrcweir 	// Vert Scrollbar
1031*cdf0e10cSrcweir 	maVerScroller.Show();
1032*cdf0e10cSrcweir 	maVerScroller.SetRange(Range(0, 18000));
1033*cdf0e10cSrcweir 	maVerScroller.SetLineSize(100);
1034*cdf0e10cSrcweir 	maVerScroller.SetPageSize(1000);
1035*cdf0e10cSrcweir 	maVerScroller.SetScrollHdl( LINK(this, SvxLightCtl3D, ScrollBarMove) );
1036*cdf0e10cSrcweir 
1037*cdf0e10cSrcweir 	// Switch Button
1038*cdf0e10cSrcweir 	maSwitcher.Show();
1039*cdf0e10cSrcweir 	maSwitcher.SetClickHdl( LINK(this, SvxLightCtl3D, ButtonPress) );
1040*cdf0e10cSrcweir 
1041*cdf0e10cSrcweir 	// check selection
1042*cdf0e10cSrcweir 	CheckSelection();
1043*cdf0e10cSrcweir 
1044*cdf0e10cSrcweir 	// new layout
1045*cdf0e10cSrcweir 	NewLayout();
1046*cdf0e10cSrcweir }
1047*cdf0e10cSrcweir 
1048*cdf0e10cSrcweir SvxLightCtl3D::~SvxLightCtl3D()
1049*cdf0e10cSrcweir {
1050*cdf0e10cSrcweir }
1051*cdf0e10cSrcweir 
1052*cdf0e10cSrcweir void SvxLightCtl3D::Resize()
1053*cdf0e10cSrcweir {
1054*cdf0e10cSrcweir 	// call parent
1055*cdf0e10cSrcweir 	Control::Resize();
1056*cdf0e10cSrcweir 
1057*cdf0e10cSrcweir 	// new layout
1058*cdf0e10cSrcweir 	NewLayout();
1059*cdf0e10cSrcweir }
1060*cdf0e10cSrcweir 
1061*cdf0e10cSrcweir void SvxLightCtl3D::NewLayout()
1062*cdf0e10cSrcweir {
1063*cdf0e10cSrcweir 	// Layout members
1064*cdf0e10cSrcweir 	const Size aSize(GetOutputSizePixel());
1065*cdf0e10cSrcweir 	const sal_Int32 nScrollSize(maHorScroller.GetSizePixel().Height());
1066*cdf0e10cSrcweir 
1067*cdf0e10cSrcweir 	// Preview control
1068*cdf0e10cSrcweir 	Point aPoint(0, 0);
1069*cdf0e10cSrcweir 	Size aDestSize(aSize.Width() - nScrollSize, aSize.Height() - nScrollSize);
1070*cdf0e10cSrcweir 	maLightControl.SetPosSizePixel(aPoint, aDestSize);
1071*cdf0e10cSrcweir 
1072*cdf0e10cSrcweir 	// hor scrollbar
1073*cdf0e10cSrcweir 	aPoint.Y() = aSize.Height() - nScrollSize;
1074*cdf0e10cSrcweir 	aDestSize.Height() = nScrollSize;
1075*cdf0e10cSrcweir 	maHorScroller.SetPosSizePixel(aPoint, aDestSize);
1076*cdf0e10cSrcweir 
1077*cdf0e10cSrcweir 	// vert scrollbar
1078*cdf0e10cSrcweir 	aPoint.X() = aSize.Width() - nScrollSize;
1079*cdf0e10cSrcweir 	aPoint.Y() = 0;
1080*cdf0e10cSrcweir 	aDestSize.Width() = nScrollSize;
1081*cdf0e10cSrcweir 	aDestSize.Height() = aSize.Height() - nScrollSize;
1082*cdf0e10cSrcweir 	maVerScroller.SetPosSizePixel(aPoint, aDestSize);
1083*cdf0e10cSrcweir 
1084*cdf0e10cSrcweir 	// button
1085*cdf0e10cSrcweir 	aPoint.Y() = aSize.Height() - nScrollSize;
1086*cdf0e10cSrcweir 	aDestSize.Height() = nScrollSize;
1087*cdf0e10cSrcweir 	maSwitcher.SetPosSizePixel(aPoint, aDestSize);
1088*cdf0e10cSrcweir }
1089*cdf0e10cSrcweir 
1090*cdf0e10cSrcweir void SvxLightCtl3D::CheckSelection()
1091*cdf0e10cSrcweir {
1092*cdf0e10cSrcweir 	const bool bSelectionValid(maLightControl.IsSelectionValid() || maLightControl.IsGeometrySelected());
1093*cdf0e10cSrcweir 	maHorScroller.Enable(bSelectionValid);
1094*cdf0e10cSrcweir 	maVerScroller.Enable(bSelectionValid);
1095*cdf0e10cSrcweir 
1096*cdf0e10cSrcweir 	if(bSelectionValid)
1097*cdf0e10cSrcweir 	{
1098*cdf0e10cSrcweir 		double fHor, fVer;
1099*cdf0e10cSrcweir 		maLightControl.GetPosition(fHor, fVer);
1100*cdf0e10cSrcweir 		maHorScroller.SetThumbPos( sal_Int32(fHor * 100.0) );
1101*cdf0e10cSrcweir 		maVerScroller.SetThumbPos( 18000 - sal_Int32((fVer + 90.0) * 100.0) );
1102*cdf0e10cSrcweir 	}
1103*cdf0e10cSrcweir }
1104*cdf0e10cSrcweir 
1105*cdf0e10cSrcweir void SvxLightCtl3D::move( double fDeltaHor, double fDeltaVer )
1106*cdf0e10cSrcweir {
1107*cdf0e10cSrcweir 	double fHor, fVer;
1108*cdf0e10cSrcweir 
1109*cdf0e10cSrcweir 	maLightControl.GetPosition(fHor, fVer);
1110*cdf0e10cSrcweir 	fHor += fDeltaHor;
1111*cdf0e10cSrcweir 	fVer += fDeltaVer;
1112*cdf0e10cSrcweir 
1113*cdf0e10cSrcweir 	if( fVer > 90.0 )
1114*cdf0e10cSrcweir 		return;
1115*cdf0e10cSrcweir 
1116*cdf0e10cSrcweir 	if ( fVer < -90.0 )
1117*cdf0e10cSrcweir 		return;
1118*cdf0e10cSrcweir 
1119*cdf0e10cSrcweir 	maLightControl.SetPosition(fHor, fVer);
1120*cdf0e10cSrcweir 	maHorScroller.SetThumbPos( sal_Int32(fHor * 100.0) );
1121*cdf0e10cSrcweir 	maVerScroller.SetThumbPos( 18000 - sal_Int32((fVer + 90.0) * 100.0) );
1122*cdf0e10cSrcweir 
1123*cdf0e10cSrcweir 	if(maUserInteractiveChangeCallback.IsSet())
1124*cdf0e10cSrcweir     {
1125*cdf0e10cSrcweir 		maUserInteractiveChangeCallback.Call(this);
1126*cdf0e10cSrcweir     }
1127*cdf0e10cSrcweir }
1128*cdf0e10cSrcweir 
1129*cdf0e10cSrcweir void SvxLightCtl3D::KeyInput( const KeyEvent& rKEvt )
1130*cdf0e10cSrcweir {
1131*cdf0e10cSrcweir     const KeyCode aCode(rKEvt.GetKeyCode());
1132*cdf0e10cSrcweir 
1133*cdf0e10cSrcweir     if( aCode.GetModifier() )
1134*cdf0e10cSrcweir     {
1135*cdf0e10cSrcweir         Control::KeyInput( rKEvt );
1136*cdf0e10cSrcweir         return;
1137*cdf0e10cSrcweir     }
1138*cdf0e10cSrcweir 
1139*cdf0e10cSrcweir     switch ( aCode.GetCode() )
1140*cdf0e10cSrcweir     {
1141*cdf0e10cSrcweir         case KEY_SPACE:
1142*cdf0e10cSrcweir         {
1143*cdf0e10cSrcweir             break;
1144*cdf0e10cSrcweir         }
1145*cdf0e10cSrcweir         case KEY_LEFT:
1146*cdf0e10cSrcweir         {
1147*cdf0e10cSrcweir             move(  -4.0,  0.0 ); // #i58242# changed move direction in X
1148*cdf0e10cSrcweir             break;
1149*cdf0e10cSrcweir         }
1150*cdf0e10cSrcweir         case KEY_RIGHT:
1151*cdf0e10cSrcweir         {
1152*cdf0e10cSrcweir             move( 4.0,  0.0 ); // #i58242# changed move direction in X
1153*cdf0e10cSrcweir             break;
1154*cdf0e10cSrcweir         }
1155*cdf0e10cSrcweir         case KEY_UP:
1156*cdf0e10cSrcweir         {
1157*cdf0e10cSrcweir             move(  0.0,  4.0 );
1158*cdf0e10cSrcweir             break;
1159*cdf0e10cSrcweir         }
1160*cdf0e10cSrcweir         case KEY_DOWN:
1161*cdf0e10cSrcweir         {
1162*cdf0e10cSrcweir             move(  0.0, -4.0 );
1163*cdf0e10cSrcweir             break;
1164*cdf0e10cSrcweir         }
1165*cdf0e10cSrcweir         case KEY_PAGEUP:
1166*cdf0e10cSrcweir 		{
1167*cdf0e10cSrcweir             sal_Int32 nLight(maLightControl.GetSelectedLight() - 1);
1168*cdf0e10cSrcweir 
1169*cdf0e10cSrcweir 			while((nLight >= 0) && !maLightControl.GetLightOnOff(nLight))
1170*cdf0e10cSrcweir             {
1171*cdf0e10cSrcweir 				nLight--;
1172*cdf0e10cSrcweir             }
1173*cdf0e10cSrcweir 
1174*cdf0e10cSrcweir             if(nLight < 0)
1175*cdf0e10cSrcweir             {
1176*cdf0e10cSrcweir                 nLight = 7;
1177*cdf0e10cSrcweir 
1178*cdf0e10cSrcweir                 while((nLight >= 0) && !maLightControl.GetLightOnOff(nLight))
1179*cdf0e10cSrcweir                 {
1180*cdf0e10cSrcweir 				    nLight--;
1181*cdf0e10cSrcweir                 }
1182*cdf0e10cSrcweir             }
1183*cdf0e10cSrcweir 
1184*cdf0e10cSrcweir             if(nLight >= 0)
1185*cdf0e10cSrcweir             {
1186*cdf0e10cSrcweir 				maLightControl.SelectLight(nLight);
1187*cdf0e10cSrcweir 				CheckSelection();
1188*cdf0e10cSrcweir 
1189*cdf0e10cSrcweir 				if(maUserSelectionChangeCallback.IsSet())
1190*cdf0e10cSrcweir                 {
1191*cdf0e10cSrcweir 					maUserSelectionChangeCallback.Call(this);
1192*cdf0e10cSrcweir                 }
1193*cdf0e10cSrcweir             }
1194*cdf0e10cSrcweir 
1195*cdf0e10cSrcweir             break;
1196*cdf0e10cSrcweir 		}
1197*cdf0e10cSrcweir         case KEY_PAGEDOWN:
1198*cdf0e10cSrcweir 		{
1199*cdf0e10cSrcweir             sal_Int32 nLight(maLightControl.GetSelectedLight() - 1);
1200*cdf0e10cSrcweir 
1201*cdf0e10cSrcweir             while(nLight <= 7 && !maLightControl.GetLightOnOff(nLight))
1202*cdf0e10cSrcweir             {
1203*cdf0e10cSrcweir                 nLight++;
1204*cdf0e10cSrcweir             }
1205*cdf0e10cSrcweir 
1206*cdf0e10cSrcweir             if(nLight > 7)
1207*cdf0e10cSrcweir             {
1208*cdf0e10cSrcweir                 nLight = 0;
1209*cdf0e10cSrcweir 
1210*cdf0e10cSrcweir                 while(nLight <= 7 && !maLightControl.GetLightOnOff(nLight))
1211*cdf0e10cSrcweir                 {
1212*cdf0e10cSrcweir                     nLight++;
1213*cdf0e10cSrcweir                 }
1214*cdf0e10cSrcweir             }
1215*cdf0e10cSrcweir 
1216*cdf0e10cSrcweir             if(nLight <= 7)
1217*cdf0e10cSrcweir             {
1218*cdf0e10cSrcweir 				maLightControl.SelectLight(nLight);
1219*cdf0e10cSrcweir 				CheckSelection();
1220*cdf0e10cSrcweir 
1221*cdf0e10cSrcweir 				if(maUserSelectionChangeCallback.IsSet())
1222*cdf0e10cSrcweir                 {
1223*cdf0e10cSrcweir 					maUserSelectionChangeCallback.Call(this);
1224*cdf0e10cSrcweir                 }
1225*cdf0e10cSrcweir             }
1226*cdf0e10cSrcweir 
1227*cdf0e10cSrcweir             break;
1228*cdf0e10cSrcweir 		}
1229*cdf0e10cSrcweir 		default:
1230*cdf0e10cSrcweir         {
1231*cdf0e10cSrcweir 	        Control::KeyInput( rKEvt );
1232*cdf0e10cSrcweir 			break;
1233*cdf0e10cSrcweir         }
1234*cdf0e10cSrcweir     }
1235*cdf0e10cSrcweir }
1236*cdf0e10cSrcweir 
1237*cdf0e10cSrcweir void SvxLightCtl3D::GetFocus()
1238*cdf0e10cSrcweir {
1239*cdf0e10cSrcweir 	Control::GetFocus();
1240*cdf0e10cSrcweir 
1241*cdf0e10cSrcweir 	if(HasFocus() && IsEnabled())
1242*cdf0e10cSrcweir 	{
1243*cdf0e10cSrcweir 		CheckSelection();
1244*cdf0e10cSrcweir 
1245*cdf0e10cSrcweir 		Size aFocusSize = maLightControl.GetOutputSizePixel();
1246*cdf0e10cSrcweir 
1247*cdf0e10cSrcweir 		aFocusSize.Width() -= 4;
1248*cdf0e10cSrcweir 		aFocusSize.Height() -= 4;
1249*cdf0e10cSrcweir 
1250*cdf0e10cSrcweir 		Rectangle aFocusRect( Point( 2, 2 ), aFocusSize );
1251*cdf0e10cSrcweir 
1252*cdf0e10cSrcweir 		aFocusRect = maLightControl.PixelToLogic( aFocusRect );
1253*cdf0e10cSrcweir 
1254*cdf0e10cSrcweir 		maLightControl.ShowFocus( aFocusRect );
1255*cdf0e10cSrcweir 	}
1256*cdf0e10cSrcweir }
1257*cdf0e10cSrcweir 
1258*cdf0e10cSrcweir void SvxLightCtl3D::LoseFocus()
1259*cdf0e10cSrcweir {
1260*cdf0e10cSrcweir 	Control::LoseFocus();
1261*cdf0e10cSrcweir 
1262*cdf0e10cSrcweir 	maLightControl.HideFocus();
1263*cdf0e10cSrcweir }
1264*cdf0e10cSrcweir 
1265*cdf0e10cSrcweir IMPL_LINK( SvxLightCtl3D, ScrollBarMove, void*, EMPTYARG)
1266*cdf0e10cSrcweir {
1267*cdf0e10cSrcweir 	const sal_Int32 nHor(maHorScroller.GetThumbPos());
1268*cdf0e10cSrcweir 	const sal_Int32 nVer(maVerScroller.GetThumbPos());
1269*cdf0e10cSrcweir 
1270*cdf0e10cSrcweir 	maLightControl.SetPosition(
1271*cdf0e10cSrcweir 		((double)nHor) / 100.0,
1272*cdf0e10cSrcweir 		((double)((18000 - nVer) - 9000)) / 100.0);
1273*cdf0e10cSrcweir 
1274*cdf0e10cSrcweir 	if(maUserInteractiveChangeCallback.IsSet())
1275*cdf0e10cSrcweir     {
1276*cdf0e10cSrcweir 		maUserInteractiveChangeCallback.Call(this);
1277*cdf0e10cSrcweir     }
1278*cdf0e10cSrcweir 
1279*cdf0e10cSrcweir 	return 0;
1280*cdf0e10cSrcweir }
1281*cdf0e10cSrcweir 
1282*cdf0e10cSrcweir IMPL_LINK( SvxLightCtl3D, ButtonPress, void*, EMPTYARG)
1283*cdf0e10cSrcweir {
1284*cdf0e10cSrcweir     if(PREVIEW_OBJECTTYPE_SPHERE == GetSvx3DLightControl().GetObjectType())
1285*cdf0e10cSrcweir     {
1286*cdf0e10cSrcweir         GetSvx3DLightControl().SetObjectType(PREVIEW_OBJECTTYPE_CUBE);
1287*cdf0e10cSrcweir     }
1288*cdf0e10cSrcweir     else
1289*cdf0e10cSrcweir     {
1290*cdf0e10cSrcweir         GetSvx3DLightControl().SetObjectType(PREVIEW_OBJECTTYPE_SPHERE);
1291*cdf0e10cSrcweir     }
1292*cdf0e10cSrcweir 
1293*cdf0e10cSrcweir 	return 0;
1294*cdf0e10cSrcweir }
1295*cdf0e10cSrcweir 
1296*cdf0e10cSrcweir IMPL_LINK( SvxLightCtl3D, InternalInteractiveChange, void*, EMPTYARG)
1297*cdf0e10cSrcweir {
1298*cdf0e10cSrcweir 	double fHor, fVer;
1299*cdf0e10cSrcweir 
1300*cdf0e10cSrcweir 	maLightControl.GetPosition(fHor, fVer);
1301*cdf0e10cSrcweir 	maHorScroller.SetThumbPos( sal_Int32(fHor * 100.0) );
1302*cdf0e10cSrcweir 	maVerScroller.SetThumbPos( 18000 - sal_Int32((fVer + 90.0) * 100.0) );
1303*cdf0e10cSrcweir 
1304*cdf0e10cSrcweir 	if(maUserInteractiveChangeCallback.IsSet())
1305*cdf0e10cSrcweir     {
1306*cdf0e10cSrcweir 		maUserInteractiveChangeCallback.Call(this);
1307*cdf0e10cSrcweir     }
1308*cdf0e10cSrcweir 
1309*cdf0e10cSrcweir 	return 0;
1310*cdf0e10cSrcweir }
1311*cdf0e10cSrcweir 
1312*cdf0e10cSrcweir IMPL_LINK( SvxLightCtl3D, InternalSelectionChange, void*, EMPTYARG)
1313*cdf0e10cSrcweir {
1314*cdf0e10cSrcweir 	CheckSelection();
1315*cdf0e10cSrcweir 
1316*cdf0e10cSrcweir 	if(maUserSelectionChangeCallback.IsSet())
1317*cdf0e10cSrcweir     {
1318*cdf0e10cSrcweir 		maUserSelectionChangeCallback.Call(this);
1319*cdf0e10cSrcweir     }
1320*cdf0e10cSrcweir 
1321*cdf0e10cSrcweir 	return 0;
1322*cdf0e10cSrcweir }
1323*cdf0e10cSrcweir 
1324*cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////////
1325*cdf0e10cSrcweir // eof
1326