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