1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_chart2.hxx"
26
27 #include "tp_3D_SceneIllumination.hxx"
28 #include "tp_3D_SceneIllumination.hrc"
29 #include "ResId.hxx"
30 #include "Strings.hrc"
31 #include "Bitmaps.hrc"
32 #include "Bitmaps_HC.hrc"
33 #include "CommonConverters.hxx"
34 #include "NoWarningThisInCTOR.hxx"
35
36 #ifndef _SVX_DIALOGS_HRC
37 #include "svx/dialogs.hrc"
38 #endif
39 // header for define SVX_RES
40 #include <svx/dialmgr.hxx>
41 #include <rtl/math.hxx>
42
43 // header for class SvColorDialog
44 #include <svtools/colrdlg.hxx>
45
46 // header for define RET_OK
47 #include <vcl/msgbox.hxx>
48
49 #include <svx/svx3ditems.hxx>
50 #include <svx/svddef.hxx>
51
52 //.............................................................................
53 namespace chart
54 {
55 //.............................................................................
56
57 using namespace ::com::sun::star;
58 using namespace ::com::sun::star::chart2;
59
LightButton(Window * pParent,const ResId & rResId,sal_Int32 nLightNumber)60 LightButton::LightButton( Window* pParent, const ResId& rResId, sal_Int32 nLightNumber )
61 : ImageButton( pParent, rResId )
62 , m_bLightOn(false)
63 {
64 SetModeImage( Image( SVX_RES(RID_SVXIMAGE_LIGHT_OFF) ), BMP_COLOR_NORMAL );
65 SetModeImage( Image( SVX_RES(RID_SVXIMAGE_LIGHT_OFF_H) ), BMP_COLOR_HIGHCONTRAST );
66
67 String aTipHelpStr( SchResId(STR_TIP_LIGHTSOURCE_X) );
68 rtl::OUString aTipHelp( aTipHelpStr );
69 const rtl::OUString aReplacementStr( RTL_CONSTASCII_USTRINGPARAM( "%LIGHTNUMBER" ));
70 sal_Int32 nIndex = aTipHelp.indexOf( aReplacementStr );
71 if( nIndex != -1 )
72 {
73 aTipHelp = aTipHelp.replaceAt(nIndex, aReplacementStr.getLength(),
74 rtl::OUString::valueOf( nLightNumber ) );
75 }
76 this->SetQuickHelpText( String( aTipHelp ) );
77 }
~LightButton()78 LightButton::~LightButton()
79 {
80 }
switchLightOn(bool bOn)81 void LightButton::switchLightOn(bool bOn)
82 {
83 if( m_bLightOn==bOn )
84 return;
85 m_bLightOn = bOn;
86 if(m_bLightOn)
87 {
88 SetModeImage( Image( SVX_RES(RID_SVXIMAGE_LIGHT_ON) ), BMP_COLOR_NORMAL );
89 SetModeImage( Image( SVX_RES(RID_SVXIMAGE_LIGHT_ON_H) ), BMP_COLOR_HIGHCONTRAST );
90 }
91 else
92 {
93 SetModeImage( Image( SVX_RES(RID_SVXIMAGE_LIGHT_OFF) ), BMP_COLOR_NORMAL );
94 SetModeImage( Image( SVX_RES(RID_SVXIMAGE_LIGHT_OFF_H) ), BMP_COLOR_HIGHCONTRAST );
95 }
96 }
isLightOn() const97 bool LightButton::isLightOn() const
98 {
99 return m_bLightOn;
100 }
101
102 //-----------------------------------------------------------------------------
103
ColorButton(Window * pParent,const ResId & rResId)104 ColorButton::ColorButton( Window* pParent, const ResId& rResId )
105 : ImageButton( pParent, rResId )
106 {
107 SetModeImage( Image( SVX_RES(RID_SVXIMAGE_COLORDLG) ), BMP_COLOR_NORMAL );
108 SetModeImage( Image( SVX_RES(RID_SVXIMAGE_COLORDLG_H) ), BMP_COLOR_HIGHCONTRAST );
109
110 this->SetQuickHelpText( String( SchResId(STR_TIP_CHOOSECOLOR) ) );
111 }
~ColorButton()112 ColorButton::~ColorButton()
113 {
114 }
115
116 //-----------------------------------------------------------------------------
117
118 struct LightSource
119 {
120 long nDiffuseColor;
121 ::com::sun::star::drawing::Direction3D aDirection;
122 bool bIsEnabled;
123
LightSourcechart::LightSource124 LightSource() :
125 nDiffuseColor( 0xcccccc ),
126 aDirection( 1.0, 1.0, -1.0 ),
127 bIsEnabled( false )
128 {}
129 };
130
131 struct LightSourceInfo
132 {
133 LightButton* pButton;
134 LightSource aLightSource;
135
136 LightSourceInfo();
137 void initButtonFromSource();
138 };
139
LightSourceInfo()140 LightSourceInfo::LightSourceInfo()
141 : pButton(0)
142 , aLightSource()
143 {
144 aLightSource.nDiffuseColor = 0xffffff; // white
145 aLightSource.aDirection = drawing::Direction3D(1,1,1);
146 aLightSource.bIsEnabled = sal_False;
147 }
initButtonFromSource()148 void LightSourceInfo::initButtonFromSource()
149 {
150 if(!pButton)
151 return;
152 pButton->SetModeImage( Image( SVX_RES( aLightSource.bIsEnabled ? RID_SVXIMAGE_LIGHT_ON : RID_SVXIMAGE_LIGHT_OFF ) ), BMP_COLOR_NORMAL );
153 pButton->SetModeImage( Image( SVX_RES( aLightSource.bIsEnabled ? RID_SVXIMAGE_LIGHT_ON_H : RID_SVXIMAGE_LIGHT_OFF_H ) ), BMP_COLOR_HIGHCONTRAST );
154 }
155
156 //-----------------------------------------------------------------------------
157
158 namespace
159 {
lcl_makeColorName(Color rColor)160 rtl::OUString lcl_makeColorName( Color rColor )
161 {
162 String aStr(SVX_RES(RID_SVXFLOAT3D_FIX_R));
163 aStr += String::CreateFromInt32((sal_Int32)rColor.GetRed());
164 aStr += sal_Unicode(' ');
165 aStr += String(SVX_RES(RID_SVXFLOAT3D_FIX_G));
166 aStr += String::CreateFromInt32((sal_Int32)rColor.GetGreen());
167 aStr += sal_Unicode(' ');
168 aStr += String(SVX_RES(RID_SVXFLOAT3D_FIX_B));
169 aStr += String::CreateFromInt32((sal_Int32)rColor.GetBlue());
170 return aStr;
171 }
lcl_selectColor(ColorListBox & rListBox,const Color & rColor)172 void lcl_selectColor( ColorListBox& rListBox, const Color& rColor )
173 {
174 rListBox.SetNoSelection();
175 rListBox.SelectEntry( rColor );
176 if( rListBox.GetSelectEntryCount() == 0 )
177 {
178 sal_uInt16 nPos = rListBox.InsertEntry( rColor, lcl_makeColorName( rColor ) );
179 rListBox.SelectEntryPos( nPos );
180 }
181 }
182
lcl_getLightSourceFromProperties(const uno::Reference<beans::XPropertySet> & xSceneProperties,sal_Int32 nIndex)183 ::chart::LightSource lcl_getLightSourceFromProperties(
184 const uno::Reference< beans::XPropertySet > & xSceneProperties,
185 sal_Int32 nIndex )
186 {
187 ::chart::LightSource aResult;
188 if( 0 <= nIndex && nIndex < 8 )
189 {
190 ::rtl::OUString aColorPropertyPrefix( RTL_CONSTASCII_USTRINGPARAM("D3DSceneLightColor"));
191 ::rtl::OUString aDirectionPropertyPrefix( RTL_CONSTASCII_USTRINGPARAM("D3DSceneLightDirection"));
192 ::rtl::OUString aEnabledPropertyPrefix( RTL_CONSTASCII_USTRINGPARAM("D3DSceneLightOn"));
193 ::rtl::OUString aIndex( ::rtl::OUString::valueOf( nIndex + 1 ));
194
195 try
196 {
197 xSceneProperties->getPropertyValue( aColorPropertyPrefix + aIndex ) >>= aResult.nDiffuseColor;
198 xSceneProperties->getPropertyValue( aDirectionPropertyPrefix + aIndex ) >>= aResult.aDirection;
199 xSceneProperties->getPropertyValue( aEnabledPropertyPrefix + aIndex ) >>= aResult.bIsEnabled;
200 }
201 catch( const uno::Exception & ex )
202 {
203 (void)(ex); // no warning in non-debug builds
204 OSL_ENSURE( false, ::rtl::OUStringToOString(
205 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Property Exception caught. Message: " )) +
206 ex.Message, RTL_TEXTENCODING_ASCII_US ).getStr());
207 }
208 }
209 return aResult;
210 }
211
lcl_setLightSource(const uno::Reference<beans::XPropertySet> & xSceneProperties,const::chart::LightSource & rLightSource,sal_Int32 nIndex)212 void lcl_setLightSource(
213 const uno::Reference< beans::XPropertySet > & xSceneProperties,
214 const ::chart::LightSource & rLightSource,
215 sal_Int32 nIndex )
216 {
217 if( 0 <= nIndex && nIndex < 8 )
218 {
219 ::rtl::OUString aColorPropertyPrefix( RTL_CONSTASCII_USTRINGPARAM("D3DSceneLightColor"));
220 ::rtl::OUString aDirectionPropertyPrefix( RTL_CONSTASCII_USTRINGPARAM("D3DSceneLightDirection"));
221 ::rtl::OUString aEnabledPropertyPrefix( RTL_CONSTASCII_USTRINGPARAM("D3DSceneLightOn"));
222 ::rtl::OUString aIndex( ::rtl::OUString::valueOf( nIndex + 1 ));
223
224 try
225 {
226 xSceneProperties->setPropertyValue( aColorPropertyPrefix + aIndex,
227 uno::makeAny( rLightSource.nDiffuseColor ));
228 xSceneProperties->setPropertyValue( aDirectionPropertyPrefix + aIndex,
229 uno::makeAny( rLightSource.aDirection ));
230 xSceneProperties->setPropertyValue( aEnabledPropertyPrefix + aIndex,
231 uno::makeAny( rLightSource.bIsEnabled ));
232 }
233 catch( const uno::Exception & ex )
234 {
235 (void)(ex); // no warning in non-debug builds
236 OSL_ENSURE( false, ::rtl::OUStringToOString(
237 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Property Exception caught. Message: " )) +
238 ex.Message, RTL_TEXTENCODING_ASCII_US ).getStr());
239 }
240 }
241 }
242
lcl_getAmbientColor(const uno::Reference<beans::XPropertySet> & xSceneProperties)243 Color lcl_getAmbientColor(
244 const uno::Reference< beans::XPropertySet > & xSceneProperties )
245 {
246 sal_Int32 nResult = 0x000000;
247 try
248 {
249 xSceneProperties->getPropertyValue(
250 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("D3DSceneAmbientColor"))) >>= nResult;
251 }
252 catch( const uno::Exception & ex )
253 {
254 (void)(ex); // no warning in non-debug builds
255 OSL_ENSURE( false, ::rtl::OUStringToOString(
256 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Property Exception caught. Message: " )) +
257 ex.Message, RTL_TEXTENCODING_ASCII_US ).getStr());
258 }
259 return Color( nResult );
260 }
261
lcl_setAmbientColor(const uno::Reference<beans::XPropertySet> & xSceneProperties,const Color & rColor)262 void lcl_setAmbientColor(
263 const uno::Reference< beans::XPropertySet > & xSceneProperties,
264 const Color & rColor )
265 {
266 try
267 {
268 xSceneProperties->setPropertyValue(
269 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("D3DSceneAmbientColor")),
270 uno::makeAny( rColor.GetColor()));
271 }
272 catch( const uno::Exception & ex )
273 {
274 (void)(ex); // no warning in non-debug builds
275 OSL_ENSURE( false, ::rtl::OUStringToOString(
276 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Property Exception caught. Message: " )) +
277 ex.Message, RTL_TEXTENCODING_ASCII_US ).getStr());
278 }
279 }
280 }
281
282 //-----------------------------------------------------------------------------
283
ThreeD_SceneIllumination_TabPage(Window * pWindow,const uno::Reference<beans::XPropertySet> & xSceneProperties,const uno::Reference<frame::XModel> & xChartModel,XColorListSharedPtr aColorTable)284 ThreeD_SceneIllumination_TabPage::ThreeD_SceneIllumination_TabPage( Window* pWindow
285 , const uno::Reference< beans::XPropertySet > & xSceneProperties
286 , const uno::Reference< frame::XModel >& xChartModel
287 , XColorListSharedPtr aColorTable )
288 : TabPage ( pWindow, SchResId( TP_3D_SCENEILLUMINATION ) )
289 , m_aFT_LightSource( this, SchResId( FT_LIGHTSOURCE ) )
290 , m_aBtn_Light1( this, SchResId( BTN_LIGHT_1 ), 1 )
291 , m_aBtn_Light2( this, SchResId( BTN_LIGHT_2 ), 2 )
292 , m_aBtn_Light3( this, SchResId( BTN_LIGHT_3 ), 3 )
293 , m_aBtn_Light4( this, SchResId( BTN_LIGHT_4 ), 4 )
294 , m_aBtn_Light5( this, SchResId( BTN_LIGHT_5 ), 5 )
295 , m_aBtn_Light6( this, SchResId( BTN_LIGHT_6 ), 6 )
296 , m_aBtn_Light7( this, SchResId( BTN_LIGHT_7 ), 7 )
297 , m_aBtn_Light8( this, SchResId( BTN_LIGHT_8 ), 8 )
298 , m_aLB_LightSource( this, SchResId( LB_LIGHTSOURCE ) )
299 , m_aBtn_LightSource_Color( this, SchResId( BTN_LIGHTSOURCE_COLOR ) )
300 , m_aFT_AmbientLight( this, SchResId( FT_AMBIENTLIGHT ) )
301 , m_aLB_AmbientLight( this, SchResId( LB_AMBIENTLIGHT ) )
302 , m_aBtn_AmbientLight_Color( this, SchResId( BTN_AMBIENT_COLOR ) )
303 , m_aCtl_Preview( this, SchResId( CTL_LIGHT_PREVIEW ) )
304 , m_pLightSourceInfoList(0)
305 , m_xSceneProperties( xSceneProperties )
306 , m_aTimerTriggeredControllerLock( xChartModel )
307 , m_bInCommitToModel( false )
308 , m_aModelChangeListener( LINK( this, ThreeD_SceneIllumination_TabPage, fillControlsFromModel ) )
309 , m_xChartModel( xChartModel )
310 {
311 FreeResource();
312
313 if(aColorTable.get())
314 {
315 m_aLB_AmbientLight.Fill( aColorTable );
316 m_aLB_LightSource.Fill( aColorTable );
317 }
318 m_aLB_AmbientLight.SetDropDownLineCount(10);
319 m_aLB_LightSource.SetDropDownLineCount(10);
320
321 m_pLightSourceInfoList = new LightSourceInfo[8];
322 m_pLightSourceInfoList[0].pButton = &m_aBtn_Light1;
323 m_pLightSourceInfoList[1].pButton = &m_aBtn_Light2;
324 m_pLightSourceInfoList[2].pButton = &m_aBtn_Light3;
325 m_pLightSourceInfoList[3].pButton = &m_aBtn_Light4;
326 m_pLightSourceInfoList[4].pButton = &m_aBtn_Light5;
327 m_pLightSourceInfoList[5].pButton = &m_aBtn_Light6;
328 m_pLightSourceInfoList[6].pButton = &m_aBtn_Light7;
329 m_pLightSourceInfoList[7].pButton = &m_aBtn_Light8;
330
331 fillControlsFromModel(0);
332
333 m_aBtn_Light1.SetClickHdl( LINK( this, ThreeD_SceneIllumination_TabPage, ClickLightSourceButtonHdl ) );
334 m_aBtn_Light2.SetClickHdl( LINK( this, ThreeD_SceneIllumination_TabPage, ClickLightSourceButtonHdl ) );
335 m_aBtn_Light3.SetClickHdl( LINK( this, ThreeD_SceneIllumination_TabPage, ClickLightSourceButtonHdl ) );
336 m_aBtn_Light4.SetClickHdl( LINK( this, ThreeD_SceneIllumination_TabPage, ClickLightSourceButtonHdl ) );
337 m_aBtn_Light5.SetClickHdl( LINK( this, ThreeD_SceneIllumination_TabPage, ClickLightSourceButtonHdl ) );
338 m_aBtn_Light6.SetClickHdl( LINK( this, ThreeD_SceneIllumination_TabPage, ClickLightSourceButtonHdl ) );
339 m_aBtn_Light7.SetClickHdl( LINK( this, ThreeD_SceneIllumination_TabPage, ClickLightSourceButtonHdl ) );
340 m_aBtn_Light8.SetClickHdl( LINK( this, ThreeD_SceneIllumination_TabPage, ClickLightSourceButtonHdl ) );
341
342 m_aLB_AmbientLight.SetSelectHdl( LINK( this, ThreeD_SceneIllumination_TabPage, SelectColorHdl ) );
343 m_aLB_LightSource.SetSelectHdl( LINK( this, ThreeD_SceneIllumination_TabPage, SelectColorHdl ) );
344
345 m_aBtn_AmbientLight_Color.SetClickHdl( LINK( this, ThreeD_SceneIllumination_TabPage, ColorDialogHdl ) );
346 m_aBtn_LightSource_Color.SetClickHdl( LINK( this, ThreeD_SceneIllumination_TabPage, ColorDialogHdl ) );
347
348 m_aCtl_Preview.SetUserInteractiveChangeCallback( LINK( this, ThreeD_SceneIllumination_TabPage, PreviewChangeHdl ) );
349 m_aCtl_Preview.SetUserSelectionChangeCallback( LINK( this, ThreeD_SceneIllumination_TabPage, PreviewSelectHdl ) );
350
351 ClickLightSourceButtonHdl(&m_aBtn_Light2);
352
353 //m_aDelyedModelChangeTimer.SetTimeout( 4*EDIT_UPDATEDATA_TIMEOUT );
354
355 m_aModelChangeListener.startListening( uno::Reference< util::XModifyBroadcaster >(m_xSceneProperties, uno::UNO_QUERY) );
356 m_aBtn_Light1.SetAccessibleRelationLabeledBy(&m_aFT_LightSource);
357 m_aBtn_Light2.SetAccessibleRelationLabeledBy(&m_aFT_LightSource);
358 m_aBtn_Light3.SetAccessibleRelationLabeledBy(&m_aFT_LightSource);
359 m_aBtn_Light4.SetAccessibleRelationLabeledBy(&m_aFT_LightSource);
360 m_aBtn_Light5.SetAccessibleRelationLabeledBy(&m_aFT_LightSource);
361 m_aBtn_Light6.SetAccessibleRelationLabeledBy(&m_aFT_LightSource);
362 m_aBtn_Light7.SetAccessibleRelationLabeledBy(&m_aFT_LightSource);
363 m_aBtn_Light8.SetAccessibleRelationLabeledBy(&m_aFT_LightSource);
364 m_aCtl_Preview.SetAccessibleName(String(SchResId( STR_LIGHT_PREVIEW )));
365 }
366
~ThreeD_SceneIllumination_TabPage()367 ThreeD_SceneIllumination_TabPage::~ThreeD_SceneIllumination_TabPage()
368 {
369 delete[] m_pLightSourceInfoList;
370 }
371
commitPendingChanges()372 void ThreeD_SceneIllumination_TabPage::commitPendingChanges()
373 {
374 }
375
IMPL_LINK(ThreeD_SceneIllumination_TabPage,fillControlsFromModel,void *,EMPTYARG)376 IMPL_LINK( ThreeD_SceneIllumination_TabPage, fillControlsFromModel, void *, EMPTYARG )
377 {
378 if( m_bInCommitToModel )//don't read own changes
379 return 0;
380
381 sal_Int32 nL=0;
382 for( nL=0; nL<8; nL++)
383 m_pLightSourceInfoList[nL].aLightSource = lcl_getLightSourceFromProperties( m_xSceneProperties, nL );
384 for( nL=0; nL<8; nL++)
385 m_pLightSourceInfoList[nL].initButtonFromSource();
386
387 lcl_selectColor( m_aLB_AmbientLight, lcl_getAmbientColor( m_xSceneProperties ));
388
389 this->updatePreview();
390
391 return 0;
392 }
393
applyLightSourceToModel(sal_uInt32 nLightNumber)394 void ThreeD_SceneIllumination_TabPage::applyLightSourceToModel( sal_uInt32 nLightNumber )
395 {
396 ControllerLockGuard aGuard( m_xChartModel );
397 m_bInCommitToModel = true;
398 sal_Int32 nIndex( nLightNumber );
399 lcl_setLightSource( m_xSceneProperties, m_pLightSourceInfoList[nIndex].aLightSource, nIndex );
400 m_bInCommitToModel = false;
401 }
402
applyLightSourcesToModel()403 void ThreeD_SceneIllumination_TabPage::applyLightSourcesToModel()
404 {
405 m_aTimerTriggeredControllerLock.startTimer();
406 ControllerLockGuard aGuard( m_xChartModel );
407 for( sal_Int32 nL=0; nL<8; nL++)
408 applyLightSourceToModel( nL );
409 m_aTimerTriggeredControllerLock.startTimer();
410 }
411
IMPL_LINK(ThreeD_SceneIllumination_TabPage,PreviewChangeHdl,void *,EMPTYARG)412 IMPL_LINK( ThreeD_SceneIllumination_TabPage, PreviewChangeHdl, void*, EMPTYARG )
413 {
414 m_aTimerTriggeredControllerLock.startTimer();
415
416 //update m_pLightSourceInfoList from preview
417 const SfxItemSet a3DLightAttributes(m_aCtl_Preview.GetSvx3DLightControl().Get3DAttributes());
418 LightSourceInfo* pInfo = &m_pLightSourceInfoList[0];
419
420 pInfo->aLightSource.nDiffuseColor = ((const Svx3DLightcolor1Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTCOLOR_1)).GetValue().GetColor();
421 pInfo->aLightSource.bIsEnabled = ((const Svx3DLightOnOff1Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTON_1)).GetValue();
422 pInfo->aLightSource.aDirection = B3DVectorToDirection3D(((const Svx3DLightDirection1Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_1)).GetValue());
423
424 pInfo = &m_pLightSourceInfoList[1];
425 pInfo->aLightSource.nDiffuseColor = ((const Svx3DLightcolor2Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTCOLOR_2)).GetValue().GetColor();
426 pInfo->aLightSource.bIsEnabled = ((const Svx3DLightOnOff2Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTON_2)).GetValue();
427 pInfo->aLightSource.aDirection = B3DVectorToDirection3D(((const Svx3DLightDirection2Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_2)).GetValue());
428
429 pInfo = &m_pLightSourceInfoList[2];
430 pInfo->aLightSource.nDiffuseColor = ((const Svx3DLightcolor3Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTCOLOR_3)).GetValue().GetColor();
431 pInfo->aLightSource.bIsEnabled = ((const Svx3DLightOnOff3Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTON_3)).GetValue();
432 pInfo->aLightSource.aDirection = B3DVectorToDirection3D(((const Svx3DLightDirection3Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_3)).GetValue());
433
434 pInfo = &m_pLightSourceInfoList[3];
435 pInfo->aLightSource.nDiffuseColor = ((const Svx3DLightcolor4Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTCOLOR_4)).GetValue().GetColor();
436 pInfo->aLightSource.bIsEnabled = ((const Svx3DLightOnOff4Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTON_4)).GetValue();
437 pInfo->aLightSource.aDirection = B3DVectorToDirection3D(((const Svx3DLightDirection4Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_4)).GetValue());
438
439 pInfo = &m_pLightSourceInfoList[4];
440 pInfo->aLightSource.nDiffuseColor = ((const Svx3DLightcolor5Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTCOLOR_5)).GetValue().GetColor();
441 pInfo->aLightSource.bIsEnabled = ((const Svx3DLightOnOff5Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTON_5)).GetValue();
442 pInfo->aLightSource.aDirection = B3DVectorToDirection3D(((const Svx3DLightDirection5Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_5)).GetValue());
443
444 pInfo = &m_pLightSourceInfoList[5];
445 pInfo->aLightSource.nDiffuseColor = ((const Svx3DLightcolor6Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTCOLOR_6)).GetValue().GetColor();
446 pInfo->aLightSource.bIsEnabled = ((const Svx3DLightOnOff6Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTON_6)).GetValue();
447 pInfo->aLightSource.aDirection = B3DVectorToDirection3D(((const Svx3DLightDirection6Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_6)).GetValue());
448
449 pInfo = &m_pLightSourceInfoList[6];
450 pInfo->aLightSource.nDiffuseColor = ((const Svx3DLightcolor7Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTCOLOR_7)).GetValue().GetColor();
451 pInfo->aLightSource.bIsEnabled = ((const Svx3DLightOnOff7Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTON_7)).GetValue();
452 pInfo->aLightSource.aDirection = B3DVectorToDirection3D(((const Svx3DLightDirection7Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_7)).GetValue());
453
454 pInfo = &m_pLightSourceInfoList[7];
455 pInfo->aLightSource.nDiffuseColor = ((const Svx3DLightcolor8Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTCOLOR_8)).GetValue().GetColor();
456 pInfo->aLightSource.bIsEnabled = ((const Svx3DLightOnOff8Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTON_8)).GetValue();
457 pInfo->aLightSource.aDirection = B3DVectorToDirection3D(((const Svx3DLightDirection8Item&)a3DLightAttributes.Get(SDRATTR_3DSCENE_LIGHTDIRECTION_8)).GetValue());
458
459 applyLightSourcesToModel();
460
461 return 0;
462 }
463
IMPL_LINK(ThreeD_SceneIllumination_TabPage,PreviewSelectHdl,void *,EMPTYARG)464 IMPL_LINK( ThreeD_SceneIllumination_TabPage, PreviewSelectHdl, void*, EMPTYARG )
465 {
466 sal_uInt32 nLightNumber = m_aCtl_Preview.GetSvx3DLightControl().GetSelectedLight();
467 if(nLightNumber<8)
468 {
469 LightButton* pButton = m_pLightSourceInfoList[nLightNumber].pButton;
470 if(!pButton->IsChecked())
471 ClickLightSourceButtonHdl(pButton);
472
473 applyLightSourcesToModel();
474 }
475 return 0;
476 }
477
IMPL_LINK(ThreeD_SceneIllumination_TabPage,ColorDialogHdl,Button *,pButton)478 IMPL_LINK( ThreeD_SceneIllumination_TabPage, ColorDialogHdl, Button*, pButton )
479 {
480 bool bIsAmbientLight = (pButton==&m_aBtn_AmbientLight_Color);
481 ColorLB* pListBox = ( bIsAmbientLight ? &m_aLB_AmbientLight : &m_aLB_LightSource);
482
483 SvColorDialog aColorDlg( this );
484 aColorDlg.SetColor( pListBox->GetSelectEntryColor() );
485 if( aColorDlg.Execute() == RET_OK )
486 {
487 Color aColor( aColorDlg.GetColor());
488 lcl_selectColor( *pListBox, aColor );
489 if( bIsAmbientLight )
490 {
491 m_bInCommitToModel = true;
492 lcl_setAmbientColor( m_xSceneProperties, aColor );
493 m_bInCommitToModel = false;
494 }
495 else
496 {
497 //get active lightsource:
498 LightSourceInfo* pInfo = 0;
499 sal_Int32 nL=0;
500 for( nL=0; nL<8; nL++)
501 {
502 pInfo = &m_pLightSourceInfoList[nL];
503 if(pInfo->pButton->IsChecked())
504 break;
505 pInfo = 0;
506 }
507 if(pInfo)
508 applyLightSourceToModel( nL );
509 }
510 SelectColorHdl( pListBox );
511 }
512 return 0;
513 }
514
IMPL_LINK(ThreeD_SceneIllumination_TabPage,SelectColorHdl,ColorLB *,pListBox)515 IMPL_LINK( ThreeD_SceneIllumination_TabPage, SelectColorHdl, ColorLB*, pListBox )
516 {
517 if(pListBox==&m_aLB_AmbientLight)
518 {
519 m_bInCommitToModel = true;
520 lcl_setAmbientColor( m_xSceneProperties, pListBox->GetSelectEntryColor().GetColor());
521 m_bInCommitToModel = false;
522 }
523 else if(pListBox==&m_aLB_LightSource)
524 {
525 //get active lightsource:
526 LightSourceInfo* pInfo = 0;
527 sal_Int32 nL=0;
528 for( nL=0; nL<8; nL++)
529 {
530 pInfo = &m_pLightSourceInfoList[nL];
531 if(pInfo->pButton->IsChecked())
532 break;
533 pInfo = 0;
534 }
535 if(pInfo)
536 {
537 pInfo->aLightSource.nDiffuseColor = pListBox->GetSelectEntryColor().GetColor();
538 applyLightSourceToModel( nL );
539 }
540 }
541 this->updatePreview();
542 return 0;
543 }
544
IMPL_LINK(ThreeD_SceneIllumination_TabPage,ClickLightSourceButtonHdl,LightButton *,pButton)545 IMPL_LINK( ThreeD_SceneIllumination_TabPage, ClickLightSourceButtonHdl, LightButton*, pButton )
546 {
547 if( !pButton )
548 return 0;
549
550 LightSourceInfo* pInfo = 0;
551 sal_Int32 nL=0;
552 for( nL=0; nL<8; nL++)
553 {
554 if( m_pLightSourceInfoList[nL].pButton == pButton )
555 {
556 pInfo = &m_pLightSourceInfoList[nL];
557 break;
558 }
559 }
560
561 //update light button
562 bool bIsChecked = pButton->IsChecked();
563 if(bIsChecked)
564 {
565 pButton->switchLightOn(!pButton->isLightOn());
566 if(pInfo)
567 {
568 pInfo->aLightSource.bIsEnabled=pButton->isLightOn();
569 applyLightSourceToModel( nL );
570 }
571 }
572 else
573 {
574 ControllerLockGuard aGuard( m_xChartModel );
575 for( nL=0; nL<8; nL++)
576 {
577 LightButton* pLightButton = m_pLightSourceInfoList[nL].pButton;
578 pLightButton->Check( pLightButton == pButton );
579 }
580 }
581
582 //update color list box
583 if(pInfo)
584 {
585 lcl_selectColor( m_aLB_LightSource, pInfo->aLightSource.nDiffuseColor );
586 }
587 this->updatePreview();
588 return 0;
589 }
590
updatePreview()591 void ThreeD_SceneIllumination_TabPage::updatePreview()
592 {
593 SfxItemSet aItemSet(m_aCtl_Preview.GetSvx3DLightControl().Get3DAttributes());
594 LightSourceInfo* pInfo = &m_pLightSourceInfoList[0];
595
596 // AmbientColor
597 aItemSet.Put(Svx3DAmbientcolorItem(m_aLB_AmbientLight.GetSelectEntryColor()));
598
599 aItemSet.Put(Svx3DLightcolor1Item(pInfo->aLightSource.nDiffuseColor));
600 aItemSet.Put(Svx3DLightOnOff1Item(pInfo->aLightSource.bIsEnabled));
601 aItemSet.Put(Svx3DLightDirection1Item(Direction3DToB3DVector(pInfo->aLightSource.aDirection)));
602
603 pInfo = &m_pLightSourceInfoList[1];
604 aItemSet.Put(Svx3DLightcolor2Item(pInfo->aLightSource.nDiffuseColor));
605 aItemSet.Put(Svx3DLightOnOff2Item(pInfo->aLightSource.bIsEnabled));
606 aItemSet.Put(Svx3DLightDirection2Item(Direction3DToB3DVector(pInfo->aLightSource.aDirection)));
607
608 pInfo = &m_pLightSourceInfoList[2];
609 aItemSet.Put(Svx3DLightcolor3Item(pInfo->aLightSource.nDiffuseColor));
610 aItemSet.Put(Svx3DLightOnOff3Item(pInfo->aLightSource.bIsEnabled));
611 aItemSet.Put(Svx3DLightDirection3Item(Direction3DToB3DVector(pInfo->aLightSource.aDirection)));
612
613 pInfo = &m_pLightSourceInfoList[3];
614 aItemSet.Put(Svx3DLightcolor4Item(pInfo->aLightSource.nDiffuseColor));
615 aItemSet.Put(Svx3DLightOnOff4Item(pInfo->aLightSource.bIsEnabled));
616 aItemSet.Put(Svx3DLightDirection4Item(Direction3DToB3DVector(pInfo->aLightSource.aDirection)));
617
618 pInfo = &m_pLightSourceInfoList[4];
619 aItemSet.Put(Svx3DLightcolor5Item(pInfo->aLightSource.nDiffuseColor));
620 aItemSet.Put(Svx3DLightOnOff5Item(pInfo->aLightSource.bIsEnabled));
621 aItemSet.Put(Svx3DLightDirection5Item(Direction3DToB3DVector(pInfo->aLightSource.aDirection)));
622
623 pInfo = &m_pLightSourceInfoList[5];
624 aItemSet.Put(Svx3DLightcolor6Item(pInfo->aLightSource.nDiffuseColor));
625 aItemSet.Put(Svx3DLightOnOff6Item(pInfo->aLightSource.bIsEnabled));
626 aItemSet.Put(Svx3DLightDirection6Item(Direction3DToB3DVector(pInfo->aLightSource.aDirection)));
627
628 pInfo = &m_pLightSourceInfoList[6];
629 aItemSet.Put(Svx3DLightcolor7Item(pInfo->aLightSource.nDiffuseColor));
630 aItemSet.Put(Svx3DLightOnOff7Item(pInfo->aLightSource.bIsEnabled));
631 aItemSet.Put(Svx3DLightDirection7Item(Direction3DToB3DVector(pInfo->aLightSource.aDirection)));
632
633 pInfo = &m_pLightSourceInfoList[7];
634 aItemSet.Put(Svx3DLightcolor8Item(pInfo->aLightSource.nDiffuseColor));
635 aItemSet.Put(Svx3DLightOnOff8Item(pInfo->aLightSource.bIsEnabled));
636 aItemSet.Put(Svx3DLightDirection8Item(Direction3DToB3DVector(pInfo->aLightSource.aDirection)));
637
638 // set lights and ambient light
639 m_aCtl_Preview.GetSvx3DLightControl().Set3DAttributes(aItemSet);
640
641 // select light
642 for(sal_uInt32 a(0); a < 8; a++)
643 {
644 if(m_pLightSourceInfoList[a].pButton->IsChecked())
645 {
646 m_aCtl_Preview.GetSvx3DLightControl().SelectLight(a);
647 m_aCtl_Preview.CheckSelection();
648 break;
649 }
650 }
651 }
652
653 //.............................................................................
654 } //namespace chart
655 //.............................................................................
656