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