xref: /AOO41X/main/svx/source/tbxctrls/extrusioncontrols.cxx (revision d3e0dd8eb215533c15e891ee35bd141abe9397ee)
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_svx.hxx"
26 
27 // include ---------------------------------------------------------------
28 
29 #include <string> // HACK: prevent conflict between STLPORT and Workshop headers
30 
31 #include <vos/mutex.hxx>
32 
33 #include <svtools/toolbarmenu.hxx>
34 #include <vcl/toolbox.hxx>
35 #include <sfx2/app.hxx>
36 #include <sfx2/dispatch.hxx>
37 #include <sfx2/objsh.hxx>
38 #include <svl/eitem.hxx>
39 #include <vcl/settings.hxx>
40 #include <svl/intitem.hxx>
41 #include <editeng/colritem.hxx>
42 #include <tools/urlobj.hxx>
43 
44 #include <svx/dialogs.hrc>
45 #include <svx/svdtrans.hxx>
46 #include <svx/sdasitm.hxx>
47 #include <svx/dialmgr.hxx>
48 #include "svx/extrusioncolorcontrol.hxx"
49 
50 //#include "chrtitem.hxx"
51 #include "helpid.hrc"
52 #include "extrusioncontrols.hxx"
53 #include "extrusioncontrols.hrc"
54 #include "colorwindow.hxx"
55 #include "extrusiondepthdialog.hxx"
56 
57 ////////////
58 
59 using ::rtl::OUString;
60 //using ::svtools::ToolbarMenu;
61 
62 using namespace ::com::sun::star;
63 using namespace ::com::sun::star::uno;
64 using namespace ::com::sun::star::lang;
65 using namespace ::com::sun::star::beans;
66 using namespace ::com::sun::star::util;
67 using namespace ::com::sun::star::graphic;
68 
69 namespace svx
70 {
71 
72 /*************************************************************************
73 |*
74 |* ExtrusionDirectionWindow
75 |*
76 \************************************************************************/
77 
78 static sal_Int32 gSkewList[] = { 135, 90, 45, 180, 0, -360, -135, -90, -45 };
79 
ExtrusionDirectionWindow(svt::ToolboxController & rController,const::com::sun::star::uno::Reference<::com::sun::star::frame::XFrame> & rFrame,Window * pParentWindow)80 ExtrusionDirectionWindow::ExtrusionDirectionWindow( svt::ToolboxController& rController, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, Window* pParentWindow )
81 : ToolbarMenu( rFrame, pParentWindow, SVX_RES( RID_SVXFLOAT_EXTRUSION_DIRECTION ))
82 , mrController( rController )
83 , maImgPerspective( SVX_RES( IMG_PERSPECTIVE ) )
84 , maImgPerspectiveH( SVX_RES( IMG_PERSPECTIVE_H ) )
85 , maImgParallel( SVX_RES( IMG_PARALLEL ) )
86 , maImgParallelH( SVX_RES( IMG_PARALLEL_H ) )
87 , msExtrusionDirection( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionDirection" ) )
88 , msExtrusionProjection( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionProjection" ) )
89 {
90     SetHelpId( HID_MENU_EXTRUSION_DIRECTION );
91 
92     sal_uInt16 i;
93     for( i = DIRECTION_NW; i <= DIRECTION_SE; i++ )
94     {
95         maImgDirection[i] = Image( SVX_RES( IMG_DIRECTION + i ) );
96         maImgDirectionH[i] = Image( SVX_RES( IMG_DIRECTION_H + i ) );
97     }
98 
99     SetSelectHdl( LINK( this, ExtrusionDirectionWindow, SelectHdl ) );
100     mpDirectionSet = createEmptyValueSetControl();
101     mpDirectionSet->SetHelpId( HID_VALUESET_EXTRUSION_DIRECTION );
102 
103     mpDirectionSet->SetSelectHdl( LINK( this, ExtrusionDirectionWindow, SelectHdl ) );
104     mpDirectionSet->SetColCount( 3 );
105     mpDirectionSet->EnableFullItemMode( sal_False );
106 
107     bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
108 
109     for( i = DIRECTION_NW; i <= DIRECTION_SE; i++ )
110     {
111         String aText( SVX_RES( STR_DIRECTION + i ) );
112         mpDirectionSet->InsertItem( i+1, bHighContrast ? maImgDirectionH[ i ] : maImgDirection[ i ], aText );
113     }
114 
115     mpDirectionSet->SetOutputSizePixel( Size( 72, 72 ) );
116 
117     appendEntry( 2, mpDirectionSet );
118     appendSeparator();
119     appendEntry( 0, String( SVX_RES( STR_PERSPECTIVE ) ), bHighContrast ? maImgPerspectiveH : maImgPerspective );
120     appendEntry( 1, String( SVX_RES( STR_PARALLEL ) ), bHighContrast ? maImgParallelH : maImgParallel );
121 
122     SetOutputSizePixel( getMenuSize() );
123 
124     FreeResource();
125 
126     AddStatusListener( msExtrusionDirection );
127     AddStatusListener( msExtrusionProjection );
128 }
129 
DataChanged(const DataChangedEvent & rDCEvt)130 void ExtrusionDirectionWindow::DataChanged( const DataChangedEvent& rDCEvt )
131 {
132     ToolbarMenu::DataChanged( rDCEvt );
133 
134     if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
135     {
136         bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
137 
138         for( sal_uInt16 i = DIRECTION_NW; i <= DIRECTION_SE; i++ )
139         {
140             mpDirectionSet->SetItemImage( i+1, bHighContrast ? maImgDirectionH[ i ] : maImgDirection[ i ] );
141         }
142 
143         setEntryImage( 0, bHighContrast ? maImgPerspectiveH : maImgPerspective );
144         setEntryImage( 1, bHighContrast ? maImgParallelH : maImgParallel );
145     }
146 }
147 
148 // -----------------------------------------------------------------------
149 
implSetDirection(sal_Int32 nSkew,bool bEnabled)150 void ExtrusionDirectionWindow::implSetDirection( sal_Int32 nSkew, bool bEnabled )
151 {
152     if( mpDirectionSet )
153     {
154         sal_uInt16 nItemId;
155         for( nItemId = DIRECTION_NW; nItemId <= DIRECTION_SE; nItemId++ )
156         {
157             if( gSkewList[nItemId] == nSkew )
158                 break;
159         }
160 
161         if( nItemId <= DIRECTION_SE )
162         {
163             mpDirectionSet->SelectItem( nItemId+1 );
164         }
165         else
166         {
167             mpDirectionSet->SetNoSelection();
168         }
169     }
170     enableEntry( 2, bEnabled );
171 }
172 
173 // -----------------------------------------------------------------------
174 
implSetProjection(sal_Int32 nProjection,bool bEnabled)175 void ExtrusionDirectionWindow::implSetProjection( sal_Int32 nProjection, bool bEnabled )
176 {
177     checkEntry( 0, (nProjection == 0) && bEnabled );
178     checkEntry( 1, (nProjection == 1 ) && bEnabled );
179     enableEntry( 0, bEnabled );
180     enableEntry( 1, bEnabled );
181 }
182 
183 // -----------------------------------------------------------------------
184 
statusChanged(const::com::sun::star::frame::FeatureStateEvent & Event)185 void SAL_CALL ExtrusionDirectionWindow::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException )
186 {
187     if( Event.FeatureURL.Main.equals( msExtrusionDirection ) )
188     {
189         if( !Event.IsEnabled )
190         {
191             implSetDirection( -1, false );
192         }
193         else
194         {
195             sal_Int32 nValue = 0;
196             if( Event.State >>= nValue )
197                 implSetDirection( nValue, true );
198         }
199     }
200     else if( Event.FeatureURL.Main.equals( msExtrusionProjection ) )
201     {
202         if( !Event.IsEnabled )
203         {
204             implSetProjection( -1, false );
205         }
206         else
207         {
208             sal_Int32 nValue = 0;
209             if( Event.State >>= nValue )
210                 implSetProjection( nValue, true );
211         }
212     }
213 }
214 
215 // -----------------------------------------------------------------------
216 
IMPL_LINK(ExtrusionDirectionWindow,SelectHdl,void *,pControl)217 IMPL_LINK( ExtrusionDirectionWindow, SelectHdl, void *, pControl )
218 {
219     if ( IsInPopupMode() )
220         EndPopupMode();
221 
222     if( pControl == mpDirectionSet )
223     {
224         Sequence< PropertyValue > aArgs( 1 );
225         aArgs[0].Name = msExtrusionDirection.copy(5);
226         aArgs[0].Value <<= (sal_Int32)gSkewList[mpDirectionSet->GetSelectItemId()-1];
227 
228         mrController.dispatchCommand( msExtrusionDirection, aArgs );
229     }
230     else
231     {
232         int nProjection = getSelectedEntryId();
233         if( (nProjection >= 0) && (nProjection < 2 ) )
234         {
235             Sequence< PropertyValue > aArgs( 1 );
236             aArgs[0].Name = msExtrusionProjection.copy(5);
237             aArgs[0].Value <<= (sal_Int32)nProjection;
238 
239             mrController.dispatchCommand( msExtrusionProjection, aArgs );
240             implSetProjection( nProjection, true );
241         }
242     }
243 
244     return 0;
245 }
246 
247 // =======================================================================
248 // ExtrusionDirectionControl
249 // =======================================================================
250 
ExtrusionDirectionControl(const Reference<lang::XMultiServiceFactory> & rServiceManager)251 ExtrusionDirectionControl::ExtrusionDirectionControl( const Reference< lang::XMultiServiceFactory >& rServiceManager )
252 : svt::PopupWindowController( rServiceManager, Reference< frame::XFrame >(), OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionDirectionFloater" ) ) )
253 {
254 }
255 
256 // -----------------------------------------------------------------------
257 
createPopupWindow(::Window * pParent)258 ::Window* ExtrusionDirectionControl::createPopupWindow( ::Window* pParent )
259 {
260     return new ExtrusionDirectionWindow( *this, m_xFrame, pParent );
261 }
262 
263 // -----------------------------------------------------------------------
264 // XServiceInfo
265 // -----------------------------------------------------------------------
266 
ExtrusionDirectionControl_getImplementationName()267 OUString SAL_CALL ExtrusionDirectionControl_getImplementationName()
268 {
269     return OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.ExtrusionDirectionController" ));
270 }
271 
272 // --------------------------------------------------------------------
273 
ExtrusionDirectionControl_getSupportedServiceNames()274 Sequence< OUString > SAL_CALL ExtrusionDirectionControl_getSupportedServiceNames() throw( RuntimeException )
275 {
276     Sequence< OUString > aSNS( 1 );
277     aSNS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ));
278     return aSNS;
279 }
280 
281 // --------------------------------------------------------------------
282 
ExtrusionDirectionControl_createInstance(const Reference<XMultiServiceFactory> & rSMgr)283 Reference< XInterface > SAL_CALL SAL_CALL ExtrusionDirectionControl_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
284 {
285     return *new ExtrusionDirectionControl( rSMgr );
286 }
287 
288 // --------------------------------------------------------------------
289 
getImplementationName()290 OUString SAL_CALL ExtrusionDirectionControl::getImplementationName(  ) throw (RuntimeException)
291 {
292     return ExtrusionDirectionControl_getImplementationName();
293 }
294 
295 // --------------------------------------------------------------------
296 
getSupportedServiceNames()297 Sequence< OUString > SAL_CALL ExtrusionDirectionControl::getSupportedServiceNames(  ) throw (RuntimeException)
298 {
299     return ExtrusionDirectionControl_getSupportedServiceNames();
300 }
301 
302 // ####################################################################
303 
ExtrusionDepthDialog(Window * pParent,double fDepth,FieldUnit eDefaultUnit)304 ExtrusionDepthDialog::ExtrusionDepthDialog( Window* pParent, double fDepth, FieldUnit eDefaultUnit )
305 :   ModalDialog( pParent, SVX_RES( RID_SVX_MDLG_EXTRUSION_DEPTH ) ),
306     maFLDepth( this, SVX_RES( FL_DEPTH ) ),
307     maMtrDepth( this, SVX_RES( MTR_DEPTH ) ),
308     maOKButton( this, SVX_RES( BTN_OK ) ),
309     maCancelButton( this, SVX_RES( BTN_CANCEL ) ),
310     maHelpButton( this, SVX_RES( BTN_HELP ) )
311 {
312     bool bMetric = IsMetric( eDefaultUnit );
313     maMtrDepth.SetUnit( bMetric ? FUNIT_CM : FUNIT_INCH );
314     maMtrDepth.SetValue( (int) fDepth * 100, FUNIT_100TH_MM );
315 
316     FreeResource();
317 }
318 
~ExtrusionDepthDialog()319 ExtrusionDepthDialog::~ExtrusionDepthDialog()
320 {
321 }
322 
getDepth() const323 double ExtrusionDepthDialog::getDepth() const
324 {
325 //  bool bMetric = IsMetric( meDefaultUnit );
326     return (double)( maMtrDepth.GetValue( FUNIT_100TH_MM ) ) / 100.0;
327 }
328 
329 // ####################################################################
330 
331 double aDepthListInch[] = { 0, 1270,2540,5080,10160 };
332 double aDepthListMM[] = { 0, 1000, 2500, 5000, 10000 };
333 
ExtrusionDepthWindow(svt::ToolboxController & rController,const::com::sun::star::uno::Reference<::com::sun::star::frame::XFrame> & rFrame,Window * pParentWindow)334 ExtrusionDepthWindow::ExtrusionDepthWindow( svt::ToolboxController& rController, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, Window* pParentWindow )
335 : ToolbarMenu( rFrame, pParentWindow, SVX_RES( RID_SVXFLOAT_EXTRUSION_DEPTH ))
336 , mrController( rController )
337 , maImgDepth0( SVX_RES( IMG_DEPTH_0 ) )
338 , maImgDepth1( SVX_RES( IMG_DEPTH_1 ) )
339 , maImgDepth2( SVX_RES( IMG_DEPTH_2 ) )
340 , maImgDepth3( SVX_RES( IMG_DEPTH_3 ) )
341 , maImgDepth4( SVX_RES( IMG_DEPTH_4 ) )
342 , maImgDepthInfinity( SVX_RES( IMG_DEPTH_INFINITY ) )
343 , maImgDepth0h( SVX_RES( IMG_DEPTH_0_H ) )
344 , maImgDepth1h( SVX_RES( IMG_DEPTH_1_H ) )
345 , maImgDepth2h( SVX_RES( IMG_DEPTH_2_H ) )
346 , maImgDepth3h( SVX_RES( IMG_DEPTH_3_H ) )
347 , maImgDepth4h( SVX_RES( IMG_DEPTH_4_H ) )
348 , maImgDepthInfinityh( SVX_RES( IMG_DEPTH_INFINITY_H ) )
349 , mfDepth( -1.0 )
350 , msExtrusionDepth( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionDepth" ) )
351 , msMetricUnit( RTL_CONSTASCII_USTRINGPARAM( ".uno:MetricUnit" ) )
352 {
353     SetHelpId( HID_MENU_EXTRUSION_DEPTH );
354 
355     SetSelectHdl( LINK( this, ExtrusionDepthWindow, SelectHdl ) );
356 
357     bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
358 
359     String aEmpty;
360     appendEntry( 0, aEmpty, bHighContrast ? maImgDepth0h : maImgDepth0 );
361     appendEntry( 1, aEmpty, bHighContrast ? maImgDepth1h : maImgDepth1 );
362     appendEntry( 2, aEmpty, bHighContrast ? maImgDepth2h : maImgDepth2 );
363     appendEntry( 3, aEmpty, bHighContrast ? maImgDepth3h : maImgDepth3 );
364     appendEntry( 4, aEmpty, bHighContrast ? maImgDepth4h : maImgDepth4 );
365     appendEntry( 5, String( SVX_RES( STR_INFINITY ) ), bHighContrast ? maImgDepthInfinityh : maImgDepthInfinity );
366     appendEntry( 6, String( SVX_RES( STR_CUSTOM ) ) );
367 
368     SetOutputSizePixel( getMenuSize() );
369 
370     FreeResource();
371 
372     AddStatusListener( msExtrusionDepth );
373     AddStatusListener( msMetricUnit );
374 }
375 
376 // -----------------------------------------------------------------------
377 
implSetDepth(double fDepth)378 void ExtrusionDepthWindow::implSetDepth( double fDepth )
379 {
380     mfDepth = fDepth;
381     int i;
382     for( i = 0; i < 7; i++ )
383     {
384         if( i == 5 )
385         {
386             checkEntry( i, fDepth >= 338666 );
387         }
388         else if( i != 6 )
389         {
390             checkEntry( i, (fDepth == (IsMetric( meUnit ) ? aDepthListMM[i] : aDepthListInch[i]) ) );
391         }
392     }
393 }
394 
395 // -----------------------------------------------------------------------
396 
implFillStrings(FieldUnit eUnit)397 void ExtrusionDepthWindow::implFillStrings( FieldUnit eUnit )
398 {
399     meUnit = eUnit;
400     sal_uInt16 nResource = IsMetric( eUnit ) ? RID_SVXSTR_DEPTH_0 : RID_SVXSTR_DEPTH_0_INCH;
401 
402     for( int i = 0; i < 5; i++ )
403     {
404         String aStr( SVX_RES( nResource + i ) );
405         setEntryText( i, aStr );
406     };
407 }
408 
409 // -----------------------------------------------------------------------
410 
statusChanged(const::com::sun::star::frame::FeatureStateEvent & Event)411 void SAL_CALL ExtrusionDepthWindow::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException )
412 {
413     if( Event.FeatureURL.Main.equals( msExtrusionDepth ) )
414     {
415         if( !Event.IsEnabled )
416         {
417             implSetDepth( 0 );
418         }
419         else
420         {
421             double fValue = 0.0;
422             if( Event.State >>= fValue )
423                 implSetDepth( fValue );
424         }
425     }
426     else if( Event.FeatureURL.Main.equals( msMetricUnit ) )
427     {
428         if( Event.IsEnabled )
429         {
430             sal_Int32 nValue = 0;
431             if( Event.State >>= nValue )
432             {
433                 implFillStrings( static_cast<FieldUnit>(nValue) );
434                 if( mfDepth >= 0.0 )
435                     implSetDepth( mfDepth );
436             }
437         }
438     }
439 }
440 
441 // -----------------------------------------------------------------------
442 
DataChanged(const DataChangedEvent & rDCEvt)443 void ExtrusionDepthWindow::DataChanged( const DataChangedEvent& rDCEvt )
444 {
445     ToolbarMenu::DataChanged( rDCEvt );
446 
447     if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
448     {
449         bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
450 
451         setEntryImage( 0, bHighContrast ? maImgDepth0h : maImgDepth0 );
452         setEntryImage( 1, bHighContrast ? maImgDepth1h : maImgDepth1 );
453         setEntryImage( 2, bHighContrast ? maImgDepth2h : maImgDepth2 );
454         setEntryImage( 3, bHighContrast ? maImgDepth3h : maImgDepth3 );
455         setEntryImage( 4, bHighContrast ? maImgDepth4h : maImgDepth4 );
456         setEntryImage( 5, bHighContrast ? maImgDepthInfinityh : maImgDepthInfinity );
457     }
458 }
459 
460 
461 // -----------------------------------------------------------------------
462 
IMPL_LINK(ExtrusionDepthWindow,SelectHdl,void *,EMPTYARG)463 IMPL_LINK( ExtrusionDepthWindow, SelectHdl, void *, EMPTYARG )
464 {
465     int nSelected = getSelectedEntryId();
466     if( nSelected != -1 )
467     {
468         if( nSelected == 6 )
469         {
470             if ( IsInPopupMode() )
471                 EndPopupMode();
472 
473             const rtl::OUString aCommand( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionDepthDialog" ));
474 
475             Any a;
476             Sequence< PropertyValue > aArgs( 2 );
477             aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Depth" ));
478             aArgs[0].Value <<= mfDepth;
479             aArgs[1].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Metric" ));
480             aArgs[1].Value <<= static_cast<sal_Int32>( meUnit );
481 
482             mrController.dispatchCommand( aCommand, aArgs );
483         }
484         else
485         {
486             double fDepth;
487 
488             if( nSelected == 5 )
489             {
490                 fDepth = 338666.6;
491             }
492             else
493             {
494                 fDepth = IsMetric( meUnit ) ? aDepthListMM[nSelected] : aDepthListInch[nSelected];
495             }
496 
497             Sequence< PropertyValue > aArgs( 1 );
498             aArgs[0].Name = msExtrusionDepth.copy(5);
499             aArgs[0].Value <<= fDepth;
500 
501             mrController.dispatchCommand( msExtrusionDepth,  aArgs );
502             implSetDepth( fDepth );
503 
504             if ( IsInPopupMode() )
505                 EndPopupMode();
506         }
507     }
508     return 0;
509 }
510 
511 // =======================================================================
512 // ExtrusionDirectionControl
513 // =======================================================================
514 
ExtrusionDepthController(const Reference<lang::XMultiServiceFactory> & rServiceManager)515 ExtrusionDepthController::ExtrusionDepthController( const Reference< lang::XMultiServiceFactory >& rServiceManager )
516 : svt::PopupWindowController( rServiceManager, Reference< frame::XFrame >(), OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionDepthFloater" ) ) )
517 {
518 }
519 
520 // -----------------------------------------------------------------------
521 
createPopupWindow(::Window * pParent)522 ::Window* ExtrusionDepthController::createPopupWindow( ::Window* pParent )
523 {
524     return new ExtrusionDepthWindow( *this, m_xFrame, pParent );
525 }
526 
527 
528 // -----------------------------------------------------------------------
529 // XServiceInfo
530 // -----------------------------------------------------------------------
531 
ExtrusionDepthController_getImplementationName()532 OUString SAL_CALL ExtrusionDepthController_getImplementationName()
533 {
534     return OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.ExtrusionDepthController" ));
535 }
536 
537 // --------------------------------------------------------------------
538 
ExtrusionDepthController_getSupportedServiceNames()539 Sequence< OUString > SAL_CALL ExtrusionDepthController_getSupportedServiceNames() throw( RuntimeException )
540 {
541     Sequence< OUString > aSNS( 1 );
542     aSNS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ));
543     return aSNS;
544 }
545 
546 // --------------------------------------------------------------------
547 
ExtrusionDepthController_createInstance(const Reference<XMultiServiceFactory> & rSMgr)548 Reference< XInterface > SAL_CALL SAL_CALL ExtrusionDepthController_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
549 {
550     return *new ExtrusionDepthController( rSMgr );
551 }
552 
553 // --------------------------------------------------------------------
554 
getImplementationName()555 OUString SAL_CALL ExtrusionDepthController::getImplementationName(  ) throw (RuntimeException)
556 {
557     return ExtrusionDepthController_getImplementationName();
558 }
559 
560 // --------------------------------------------------------------------
561 
getSupportedServiceNames()562 Sequence< OUString > SAL_CALL ExtrusionDepthController::getSupportedServiceNames(  ) throw (RuntimeException)
563 {
564     return ExtrusionDepthController_getSupportedServiceNames();
565 }
566 
567 
568 // ####################################################################
569 
570 // -------------------------------------------------------------------------
571 
ExtrusionLightingWindow(svt::ToolboxController & rController,const::com::sun::star::uno::Reference<::com::sun::star::frame::XFrame> & rFrame,Window * pParentWindow)572 ExtrusionLightingWindow::ExtrusionLightingWindow( svt::ToolboxController& rController, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, Window* pParentWindow )
573 : ToolbarMenu( rFrame, pParentWindow, SVX_RES( RID_SVXFLOAT_EXTRUSION_LIGHTING ))
574 , mrController( rController )
575 , maImgBright( SVX_RES( IMG_LIGHTING_BRIGHT ) )
576 , maImgNormal( SVX_RES( IMG_LIGHTING_NORMAL ) )
577 , maImgDim( SVX_RES( IMG_LIGHTING_DIM ) )
578 , maImgBrighth( SVX_RES( IMG_LIGHTING_BRIGHT_H ) )
579 , maImgNormalh( SVX_RES( IMG_LIGHTING_NORMAL_H ) )
580 , maImgDimh( SVX_RES( IMG_LIGHTING_DIM_H ) )
581 , mnLevel( 0 )
582 , mbLevelEnabled( false )
583 , mnDirection( FROM_FRONT )
584 , mbDirectionEnabled( false )
585 , msExtrusionLightingDirection( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionLightingDirection" ))
586 , msExtrusionLightingIntensity( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionLightingIntensity" ))
587 {
588     sal_uInt16 i;
589     for( i = FROM_TOP_LEFT; i <= FROM_BOTTOM_RIGHT; i++ )
590     {
591         if( i != FROM_FRONT )
592         {
593             maImgLightingOff[i] = Image( SVX_RES( IMG_LIGHT_OFF + i ) );
594             maImgLightingOn[i] = Image( SVX_RES( IMG_LIGHT_ON + i ) );
595             maImgLightingOffh[i] = Image( SVX_RES( IMG_LIGHT_OFF_H + i ) );
596             maImgLightingOnh[i] = Image( SVX_RES( IMG_LIGHT_ON_H + i ) );
597         }
598         maImgLightingPreview[i] = Image( SVX_RES( IMG_LIGHT_PREVIEW + i ) );
599         maImgLightingPreviewh[i] = Image( SVX_RES( IMG_LIGHT_PREVIEW_H + i ) );
600     }
601 
602     SetHelpId( HID_MENU_EXTRUSION_LIGHTING );
603     SetSelectHdl( LINK( this, ExtrusionLightingWindow, SelectHdl ) );
604 
605     mpLightingSet = createEmptyValueSetControl();
606     mpLightingSet->SetHelpId( HID_VALUESET_EXTRUSION_LIGHTING );
607 
608     mpLightingSet->SetSelectHdl( LINK( this, ExtrusionLightingWindow, SelectHdl ) );
609     mpLightingSet->SetColCount( 3 );
610     mpLightingSet->EnableFullItemMode( sal_False );
611 
612     bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
613 
614     for( i = FROM_TOP_LEFT; i <= FROM_BOTTOM_RIGHT; i++ )
615     {
616         if( i != FROM_FRONT )
617         {
618             mpLightingSet->InsertItem( i+1, bHighContrast ? maImgLightingOffh[i] : maImgLightingOff[i] );
619         }
620         else
621         {
622             mpLightingSet->InsertItem( 5, bHighContrast ? maImgLightingPreviewh[FROM_FRONT] : maImgLightingPreview[FROM_FRONT] );
623         }
624     }
625     mpLightingSet->SetOutputSizePixel( Size( 72, 72 ) );
626 
627     appendEntry( 3, mpLightingSet );
628     appendSeparator();
629     appendEntry( 0, String( SVX_RES( STR_BRIGHT ) ), bHighContrast ? maImgBrighth : maImgBright );
630     appendEntry( 1, String( SVX_RES( STR_NORMAL ) ), bHighContrast ? maImgNormalh : maImgNormal );
631     appendEntry( 2, String( SVX_RES( STR_DIM ) ), bHighContrast ? maImgDimh : maImgDim );
632 
633     SetOutputSizePixel( getMenuSize() );
634 
635     FreeResource();
636 
637     AddStatusListener( msExtrusionLightingDirection );
638     AddStatusListener( msExtrusionLightingIntensity );
639 }
640 
641 // -----------------------------------------------------------------------
642 
implSetIntensity(int nLevel,bool bEnabled)643 void ExtrusionLightingWindow::implSetIntensity( int nLevel, bool bEnabled )
644 {
645     mnLevel = nLevel;
646     mbLevelEnabled = bEnabled;
647     int i = 0;
648     for( i = 0; i < 3; i++ )
649     {
650         checkEntry( i, (i == nLevel) && bEnabled );
651         enableEntry( i, bEnabled );
652     }
653 }
654 
655 // -----------------------------------------------------------------------
656 
implSetDirection(int nDirection,bool bEnabled)657 void ExtrusionLightingWindow::implSetDirection( int nDirection, bool bEnabled )
658 {
659     mnDirection = nDirection;
660     mbDirectionEnabled = bEnabled;
661 
662     bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
663 
664     if( !bEnabled )
665         nDirection = FROM_FRONT;
666 
667     sal_uInt16 nItemId;
668     for( nItemId = FROM_TOP_LEFT; nItemId <= FROM_BOTTOM_RIGHT; nItemId++ )
669     {
670         if( nItemId == FROM_FRONT )
671         {
672             mpLightingSet->SetItemImage( nItemId + 1, bHighContrast ? maImgLightingPreviewh[ nDirection ] : maImgLightingPreview[ nDirection ] );
673         }
674         else
675         {
676             if( bHighContrast )
677             {
678                 mpLightingSet->SetItemImage( nItemId + 1, (sal_uInt16)nDirection == nItemId ? maImgLightingOnh[nItemId] : maImgLightingOffh[nItemId] );
679             }
680             else
681             {
682                 mpLightingSet->SetItemImage( nItemId + 1, (sal_uInt16)nDirection == nItemId ? maImgLightingOn[nItemId] : maImgLightingOff[nItemId] );
683             }
684         }
685     }
686 
687     enableEntry( 3, bEnabled );
688 }
689 
690 // -----------------------------------------------------------------------
691 
statusChanged(const::com::sun::star::frame::FeatureStateEvent & Event)692 void SAL_CALL ExtrusionLightingWindow::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException )
693 {
694     if( Event.FeatureURL.Main.equals( msExtrusionLightingIntensity ) )
695     {
696         if( !Event.IsEnabled )
697         {
698             implSetIntensity( 0, false );
699         }
700         else
701         {
702             sal_Int32 nValue = 0;
703             if( Event.State >>= nValue )
704                 implSetIntensity( nValue, true );
705         }
706     }
707     else if( Event.FeatureURL.Main.equals( msExtrusionLightingDirection ) )
708     {
709         if( !Event.IsEnabled )
710         {
711             implSetDirection( 0, false );
712         }
713         else
714         {
715             sal_Int32 nValue = 0;
716             if( Event.State >>= nValue )
717                 implSetDirection( nValue, true );
718         }
719     }
720 }
721 
722 // -----------------------------------------------------------------------
723 
DataChanged(const DataChangedEvent & rDCEvt)724 void ExtrusionLightingWindow::DataChanged( const DataChangedEvent& rDCEvt )
725 {
726     ToolbarMenu::DataChanged( rDCEvt );
727 
728     if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
729     {
730         bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
731 
732         implSetDirection( mnDirection, mbDirectionEnabled );
733         setEntryImage( 0, bHighContrast ? maImgBrighth : maImgBright );
734         setEntryImage( 1, bHighContrast ? maImgNormalh : maImgNormal );
735         setEntryImage( 2, bHighContrast ? maImgDimh : maImgDim );
736     }
737 }
738 
739 // -----------------------------------------------------------------------
740 
IMPL_LINK(ExtrusionLightingWindow,SelectHdl,void *,pControl)741 IMPL_LINK( ExtrusionLightingWindow, SelectHdl, void *, pControl )
742 {
743     if ( IsInPopupMode() )
744         EndPopupMode();
745 
746     if( pControl == this )
747     {
748         int nLevel = getSelectedEntryId();
749         if( nLevel >= 0 )
750         {
751             if( nLevel != 3 )
752             {
753                 Sequence< PropertyValue > aArgs( 1 );
754                 aArgs[0].Name = msExtrusionLightingIntensity.copy(5);
755                 aArgs[0].Value <<= (sal_Int32)nLevel;
756 
757                 mrController.dispatchCommand( msExtrusionLightingIntensity, aArgs );
758 
759                 implSetIntensity( nLevel, true );
760             }
761         }
762     }
763     else
764     {
765         sal_Int32 nDirection = mpLightingSet->GetSelectItemId();
766 
767         if( (nDirection > 0) && (nDirection < 10) )
768         {
769             nDirection--;
770 
771             Sequence< PropertyValue > aArgs( 1 );
772             aArgs[0].Name = msExtrusionLightingDirection.copy(5);
773             aArgs[0].Value <<= (sal_Int32)nDirection;
774 
775             mrController.dispatchCommand( msExtrusionLightingDirection, aArgs );
776 
777             implSetDirection( nDirection, true );
778         }
779 
780     }
781 
782     return 0;
783 }
784 
785 // ========================================================================
786 
ExtrusionLightingControl(const Reference<lang::XMultiServiceFactory> & rServiceManager)787 ExtrusionLightingControl::ExtrusionLightingControl( const Reference< lang::XMultiServiceFactory >& rServiceManager )
788 : svt::PopupWindowController( rServiceManager, Reference< frame::XFrame >(), OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionDirectionFloater" ) ) )
789 {
790 }
791 
792 // -----------------------------------------------------------------------
793 
createPopupWindow(::Window * pParent)794 ::Window* ExtrusionLightingControl::createPopupWindow( ::Window* pParent )
795 {
796     return new ExtrusionLightingWindow( *this, m_xFrame, pParent );
797 }
798 
799 // -----------------------------------------------------------------------
800 // XServiceInfo
801 // -----------------------------------------------------------------------
802 
ExtrusionLightingControl_getImplementationName()803 OUString SAL_CALL ExtrusionLightingControl_getImplementationName()
804 {
805     return OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.ExtrusionLightingController" ));
806 }
807 
808 // --------------------------------------------------------------------
809 
ExtrusionLightingControl_getSupportedServiceNames()810 Sequence< OUString > SAL_CALL ExtrusionLightingControl_getSupportedServiceNames() throw( RuntimeException )
811 {
812     Sequence< OUString > aSNS( 1 );
813     aSNS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ));
814     return aSNS;
815 }
816 
817 // --------------------------------------------------------------------
818 
ExtrusionLightingControl_createInstance(const Reference<XMultiServiceFactory> & rSMgr)819 Reference< XInterface > SAL_CALL SAL_CALL ExtrusionLightingControl_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
820 {
821     return *new ExtrusionLightingControl( rSMgr );
822 }
823 
824 // --------------------------------------------------------------------
825 
getImplementationName()826 OUString SAL_CALL ExtrusionLightingControl::getImplementationName(  ) throw (RuntimeException)
827 {
828     return ExtrusionLightingControl_getImplementationName();
829 }
830 
831 // --------------------------------------------------------------------
832 
getSupportedServiceNames()833 Sequence< OUString > SAL_CALL ExtrusionLightingControl::getSupportedServiceNames(  ) throw (RuntimeException)
834 {
835     return ExtrusionLightingControl_getSupportedServiceNames();
836 }
837 
838 // ####################################################################
839 
ExtrusionSurfaceWindow(svt::ToolboxController & rController,const::com::sun::star::uno::Reference<::com::sun::star::frame::XFrame> & rFrame,Window * pParentWindow)840 ExtrusionSurfaceWindow::ExtrusionSurfaceWindow( svt::ToolboxController& rController, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame, Window* pParentWindow )
841 : ToolbarMenu( rFrame, pParentWindow, SVX_RES( RID_SVXFLOAT_EXTRUSION_SURFACE ))
842 , mrController( rController )
843 , maImgSurface1( SVX_RES( IMG_WIRE_FRAME ) )
844 , maImgSurface2( SVX_RES( IMG_MATTE ) )
845 , maImgSurface3( SVX_RES( IMG_PLASTIC ) )
846 , maImgSurface4( SVX_RES( IMG_METAL ) )
847 , maImgSurface1h( SVX_RES( IMG_WIRE_FRAME_H ) )
848 , maImgSurface2h( SVX_RES( IMG_MATTE_H ) )
849 , maImgSurface3h( SVX_RES( IMG_PLASTIC_H ) )
850 , maImgSurface4h( SVX_RES( IMG_METAL_H ) )
851 , msExtrusionSurface( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionSurface" ))
852 {
853     bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
854 
855     SetHelpId( HID_MENU_EXTRUSION_SURFACE );
856     SetSelectHdl( LINK( this, ExtrusionSurfaceWindow, SelectHdl ) );
857 
858     appendEntry( 0, String( SVX_RES( STR_WIREFRAME ) ), bHighContrast ? maImgSurface1h : maImgSurface1 );
859     appendEntry( 1, String( SVX_RES( STR_MATTE ) ), bHighContrast ? maImgSurface2h : maImgSurface2 );
860     appendEntry( 2, String( SVX_RES( STR_PLASTIC ) ), bHighContrast ? maImgSurface3h : maImgSurface3 );
861     appendEntry( 3, String( SVX_RES( STR_METAL ) ), bHighContrast ? maImgSurface4h : maImgSurface4 );
862 
863     SetOutputSizePixel( getMenuSize() );
864 
865     FreeResource();
866 
867     AddStatusListener( msExtrusionSurface );
868 }
869 
870 // -----------------------------------------------------------------------
871 
implSetSurface(int nSurface,bool bEnabled)872 void ExtrusionSurfaceWindow::implSetSurface( int nSurface, bool bEnabled )
873 {
874 //  if( mpMenu )
875     {
876         int i;
877         for( i = 0; i < 4; i++ )
878         {
879             checkEntry( i, (i == nSurface) && bEnabled );
880             enableEntry( i, bEnabled );
881         }
882     }
883 }
884 
885 // -----------------------------------------------------------------------
886 
statusChanged(const::com::sun::star::frame::FeatureStateEvent & Event)887 void SAL_CALL ExtrusionSurfaceWindow::statusChanged( const ::com::sun::star::frame::FeatureStateEvent& Event ) throw ( ::com::sun::star::uno::RuntimeException )
888 {
889     if( Event.FeatureURL.Main.equals( msExtrusionSurface ) )
890     {
891         if( !Event.IsEnabled )
892         {
893             implSetSurface( 0, false );
894         }
895         else
896         {
897             sal_Int32 nValue = 0;
898             if( Event.State >>= nValue )
899                 implSetSurface( nValue, true );
900         }
901     }
902 }
903 
904 // -----------------------------------------------------------------------
905 
IMPL_LINK(ExtrusionSurfaceWindow,SelectHdl,void *,EMPTYARG)906 IMPL_LINK( ExtrusionSurfaceWindow, SelectHdl, void *, EMPTYARG )
907 {
908     if ( IsInPopupMode() )
909         EndPopupMode();
910 
911     sal_Int32 nSurface = getSelectedEntryId();
912     if( nSurface >= 0 )
913     {
914         Sequence< PropertyValue > aArgs( 1 );
915         aArgs[0].Name = msExtrusionSurface.copy(5);
916         aArgs[0].Value <<= (sal_Int32)nSurface;
917 
918         mrController.dispatchCommand( msExtrusionSurface, aArgs );
919 
920         implSetSurface( nSurface, true );
921     }
922 
923     return 0;
924 }
925 
926 // ========================================================================
927 
ExtrusionSurfaceControl(const Reference<lang::XMultiServiceFactory> & rServiceManager)928 ExtrusionSurfaceControl::ExtrusionSurfaceControl( const Reference< lang::XMultiServiceFactory >& rServiceManager )
929 : svt::PopupWindowController( rServiceManager, Reference< frame::XFrame >(), OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ExtrusionSurfaceFloater" ) ) )
930 {
931 }
932 
933 // -----------------------------------------------------------------------
934 
createPopupWindow(::Window * pParent)935 ::Window* ExtrusionSurfaceControl::createPopupWindow( ::Window* pParent )
936 {
937     return new ExtrusionSurfaceWindow( *this, m_xFrame, pParent );
938 }
939 
940 // -----------------------------------------------------------------------
941 // XServiceInfo
942 // -----------------------------------------------------------------------
943 
ExtrusionSurfaceControl_getImplementationName()944 OUString SAL_CALL ExtrusionSurfaceControl_getImplementationName()
945 {
946     return OUString(RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.svx.ExtrusionSurfaceController" ));
947 }
948 
949 // --------------------------------------------------------------------
950 
ExtrusionSurfaceControl_getSupportedServiceNames()951 Sequence< OUString > SAL_CALL ExtrusionSurfaceControl_getSupportedServiceNames() throw( RuntimeException )
952 {
953     Sequence< OUString > aSNS( 1 );
954     aSNS.getArray()[0] = OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" ));
955     return aSNS;
956 }
957 
958 // --------------------------------------------------------------------
959 
ExtrusionSurfaceControl_createInstance(const Reference<XMultiServiceFactory> & rSMgr)960 Reference< XInterface > SAL_CALL SAL_CALL ExtrusionSurfaceControl_createInstance( const Reference< XMultiServiceFactory >& rSMgr ) throw( RuntimeException )
961 {
962     return *new ExtrusionSurfaceControl( rSMgr );
963 }
964 
965 // --------------------------------------------------------------------
966 
getImplementationName()967 OUString SAL_CALL ExtrusionSurfaceControl::getImplementationName(  ) throw (RuntimeException)
968 {
969     return ExtrusionSurfaceControl_getImplementationName();
970 }
971 
972 // --------------------------------------------------------------------
973 
getSupportedServiceNames()974 Sequence< OUString > SAL_CALL ExtrusionSurfaceControl::getSupportedServiceNames(  ) throw (RuntimeException)
975 {
976     return ExtrusionSurfaceControl_getSupportedServiceNames();
977 }
978 
979 //========================================================================
980 
981 SFX_IMPL_TOOLBOX_CONTROL( ExtrusionColorControl, SvxColorItem );
982 
ExtrusionColorControl(sal_uInt16 nSlotId,sal_uInt16 nId,ToolBox & rTbx)983 ExtrusionColorControl::ExtrusionColorControl(
984     sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx )
985 : SfxToolBoxControl ( nSlotId, nId, rTbx )
986 {
987     rTbx.SetItemBits( nId, TIB_DROPDOWNONLY | rTbx.GetItemBits( nId ) );
988     mpBtnUpdater = new ToolboxButtonColorUpdater( nSlotId, nId, &GetToolBox(), TBX_UPDATER_MODE_CHAR_COLOR_NEW );
989 }
990 
991 // -----------------------------------------------------------------------
992 
~ExtrusionColorControl()993 ExtrusionColorControl::~ExtrusionColorControl()
994 {
995     delete mpBtnUpdater;
996 }
997 
998 // -----------------------------------------------------------------------
999 
GetPopupWindowType() const1000 SfxPopupWindowType ExtrusionColorControl::GetPopupWindowType() const
1001 {
1002     return SFX_POPUPWINDOW_ONCLICK;
1003 }
1004 
1005 // -----------------------------------------------------------------------
1006 
CreatePopupWindow()1007 SfxPopupWindow* ExtrusionColorControl::CreatePopupWindow()
1008 {
1009     SvxColorWindow_Impl* pColorWin = new SvxColorWindow_Impl(
1010         rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:Extrusion3DColor" )),
1011         SID_EXTRUSION_3D_COLOR,
1012         m_xFrame,
1013         SVX_RESSTR( RID_SVXSTR_EXTRUSION_COLOR ),
1014         &GetToolBox() );
1015     pColorWin->StartPopupMode( &GetToolBox(), FLOATWIN_POPUPMODE_GRABFOCUS|FLOATWIN_POPUPMODE_ALLOWTEAROFF );
1016     pColorWin->StartSelection();
1017     SetPopupWindow( pColorWin );
1018     return pColorWin;
1019 }
1020 
1021 // -----------------------------------------------------------------------
1022 
StateChanged(sal_uInt16 nSID,SfxItemState eState,const SfxPoolItem * pState)1023 void ExtrusionColorControl::StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
1024 {
1025     sal_uInt16 nId = GetId();
1026     ToolBox& rTbx = GetToolBox();
1027 
1028     if( nSID == SID_EXTRUSION_3D_COLOR )
1029     {
1030         const SvxColorItem* pItem = 0;
1031 
1032         if( SFX_ITEM_DONTCARE != eState )
1033             pItem = PTR_CAST( SvxColorItem, pState );
1034 
1035         if ( pItem )
1036             mpBtnUpdater->Update( pItem->GetValue());
1037     }
1038 
1039     rTbx.EnableItem( nId, SFX_ITEM_DISABLED != eState );
1040     rTbx.SetItemState( nId, ( SFX_ITEM_DONTCARE == eState ) ? STATE_DONTKNOW : STATE_NOCHECK );
1041 }
1042 
1043 }
1044