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