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