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