xref: /trunk/main/svx/source/dialog/dlgctl3d.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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