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 : #include <string>
21 :
22 : #include <vcl/toolbox.hxx>
23 : #include <vcl/field.hxx>
24 : #include <vcl/fixed.hxx>
25 : #include <vcl/msgbox.hxx>
26 : #include <svl/intitem.hxx>
27 : #include <svl/eitem.hxx>
28 : #include <svl/whiter.hxx>
29 : #include <sfx2/app.hxx>
30 : #include <sfx2/dispatch.hxx>
31 : #include <sfx2/objsh.hxx>
32 : #include <sfx2/viewsh.hxx>
33 : #include <sfx2/request.hxx>
34 : #include <sfx2/basedlgs.hxx>
35 : #include <tools/urlobj.hxx>
36 : #include <comphelper/processfactory.hxx>
37 :
38 : #include <svx/svxids.hrc>
39 : #include <svx/dialogs.hrc>
40 : #include <editeng/brushitem.hxx>
41 : #include <editeng/sizeitem.hxx>
42 : #include <svx/sdgcpitm.hxx>
43 :
44 : #include <svx/itemwin.hxx>
45 : #include <svx/dialmgr.hxx>
46 : #include <svx/svdview.hxx>
47 : #include <svx/svdmodel.hxx>
48 : #include <svx/svdograf.hxx>
49 : #include <svx/svdundo.hxx>
50 : #include <svx/svdtrans.hxx>
51 : #include "svx/grafctrl.hxx"
52 : #include "svx/tbxcolor.hxx"
53 :
54 : using namespace ::com::sun::star::uno;
55 : using namespace ::com::sun::star::frame;
56 : using namespace ::com::sun::star::util;
57 : using namespace ::com::sun::star::beans;
58 : using namespace ::com::sun::star::lang;
59 :
60 : #include <svx/svxdlg.hxx>
61 :
62 : #define SYMBOL_TO_FIELD_OFFSET 4
63 : #define ITEMVALUE(ItemSet,Id,Cast) static_cast<const Cast&>((ItemSet).Get(Id)).GetValue()
64 : #define TOOLBOX_NAME OUString( "colorbar" )
65 :
66 10656 : TYPEINIT1_AUTOFACTORY( TbxImageItem, SfxUInt16Item );
67 :
68 101939 : TbxImageItem::TbxImageItem( sal_uInt16 _nWhich, sal_uInt16 nImage ) :
69 101939 : SfxUInt16Item( _nWhich, nImage )
70 : {
71 101939 : }
72 :
73 :
74 1696 : SfxPoolItem* TbxImageItem::Clone( SfxItemPool* ) const
75 : {
76 1696 : return new TbxImageItem( *this );
77 : }
78 :
79 671 : bool TbxImageItem::operator==( const SfxPoolItem& rItem ) const
80 : {
81 671 : return static_cast<const TbxImageItem&>(rItem).GetValue() == GetValue();
82 : }
83 :
84 : class ImplGrafMetricField : public MetricField
85 : {
86 : using Window::Update;
87 :
88 : private:
89 : Timer maTimer;
90 : OUString maCommand;
91 : Reference< XFrame > mxFrame;
92 :
93 : DECL_LINK(ImplModifyHdl, void *);
94 :
95 : protected:
96 :
97 : virtual void Modify() SAL_OVERRIDE;
98 :
99 : public:
100 :
101 : ImplGrafMetricField( vcl::Window* pParent, const OUString& aCmd, const Reference< XFrame >& rFrame );
102 : virtual ~ImplGrafMetricField();
103 :
104 : void Update( const SfxPoolItem* pItem );
105 : };
106 :
107 0 : ImplGrafMetricField::ImplGrafMetricField( vcl::Window* pParent, const OUString& rCmd, const Reference< XFrame >& rFrame ) :
108 : MetricField( pParent, WB_BORDER | WB_SPIN | WB_REPEAT | WB_3DLOOK ),
109 : maCommand( rCmd ),
110 0 : mxFrame( rFrame )
111 : {
112 0 : Size aSize( GetTextWidth( OUString("-100 %") ), GetTextHeight() );
113 :
114 0 : aSize.Width() += 20, aSize.Height() += 6;
115 0 : SetSizePixel( aSize );
116 :
117 0 : if ( maCommand == ".uno:GrafGamma" )
118 : {
119 0 : SetDecimalDigits( 2 );
120 :
121 0 : SetMin( 10 );
122 0 : SetFirst( 10 );
123 0 : SetMax( 1000 );
124 0 : SetLast( 1000 );
125 0 : SetSpinSize( 10 );
126 : }
127 : else
128 : {
129 0 : const long nMinVal = maCommand == ".uno:GrafTransparence" ? 0 : -100;
130 :
131 0 : SetUnit(FUNIT_PERCENT);
132 0 : SetDecimalDigits( 0 );
133 :
134 0 : SetMin( nMinVal );
135 0 : SetFirst( nMinVal );
136 0 : SetMax( 100 );
137 0 : SetLast( 100 );
138 0 : SetSpinSize( 1 );
139 : }
140 :
141 0 : maTimer.SetTimeout( 100 );
142 0 : maTimer.SetTimeoutHdl( LINK( this, ImplGrafMetricField, ImplModifyHdl ) );
143 0 : }
144 :
145 0 : ImplGrafMetricField::~ImplGrafMetricField()
146 : {
147 0 : }
148 :
149 0 : void ImplGrafMetricField::Modify()
150 : {
151 0 : maTimer.Start();
152 0 : }
153 :
154 0 : IMPL_LINK_NOARG(ImplGrafMetricField, ImplModifyHdl)
155 : {
156 0 : const sal_Int64 nVal = GetValue();
157 :
158 : // Convert value to an any to be usable with dispatch API
159 0 : Any a;
160 0 : if ( maCommand == ".uno:GrafRed" ||
161 0 : maCommand == ".uno:GrafGreen" ||
162 0 : maCommand == ".uno:GrafBlue" ||
163 0 : maCommand == ".uno:GrafLuminance" ||
164 0 : maCommand == ".uno:GrafContrast" )
165 0 : a = makeAny( sal_Int16( nVal ));
166 0 : else if ( maCommand == ".uno:GrafGamma" ||
167 0 : maCommand == ".uno:GrafTransparence" )
168 0 : a = makeAny( sal_Int32( nVal ));
169 :
170 0 : if ( a.hasValue() )
171 : {
172 0 : INetURLObject aObj( maCommand );
173 :
174 0 : Sequence< PropertyValue > aArgs( 1 );
175 0 : aArgs[0].Name = aObj.GetURLPath();
176 0 : aArgs[0].Value = a;
177 :
178 : SfxToolBoxControl::Dispatch(
179 0 : Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
180 : maCommand,
181 0 : aArgs );
182 : }
183 0 : return 0L;
184 : }
185 :
186 0 : void ImplGrafMetricField::Update( const SfxPoolItem* pItem )
187 : {
188 0 : if( pItem )
189 : {
190 : long nValue;
191 :
192 0 : if ( maCommand == ".uno:GrafTransparence" )
193 0 : nValue = static_cast<const SfxUInt16Item*>( pItem )->GetValue();
194 0 : else if ( maCommand == ".uno:GrafGamma" )
195 0 : nValue = static_cast<const SfxUInt32Item*>( pItem )->GetValue();
196 : else
197 0 : nValue = static_cast<const SfxInt16Item*>( pItem )->GetValue();
198 :
199 0 : SetValue( nValue );
200 : }
201 : else
202 0 : SetText( OUString() );
203 0 : }
204 :
205 : struct CommandToRID
206 : {
207 : const char* pCommand;
208 : sal_uInt16 nResId;
209 : };
210 :
211 0 : static sal_uInt16 ImplGetRID( const OUString& aCommand )
212 : {
213 : static const CommandToRID aImplCommandToResMap[] =
214 : {
215 : { ".uno:GrafRed", RID_SVXIMG_GRAF_RED },
216 : { ".uno:GrafGreen", RID_SVXIMG_GRAF_GREEN },
217 : { ".uno:GrafBlue", RID_SVXIMG_GRAF_BLUE },
218 : { ".uno:GrafLuminance", RID_SVXIMG_GRAF_LUMINANCE },
219 : { ".uno:GrafContrast", RID_SVXIMG_GRAF_CONTRAST },
220 : { ".uno:GrafGamma", RID_SVXIMG_GRAF_GAMMA },
221 : { ".uno:GrafTransparence", RID_SVXIMG_GRAF_TRANSPARENCE },
222 : { 0, 0 }
223 : };
224 :
225 0 : sal_uInt16 nRID = 0;
226 :
227 0 : sal_Int32 i( 0 );
228 0 : while ( aImplCommandToResMap[ i ].pCommand )
229 : {
230 0 : if ( aCommand.equalsAscii( aImplCommandToResMap[ i ].pCommand ))
231 : {
232 0 : nRID = aImplCommandToResMap[ i ].nResId;
233 0 : break;
234 : }
235 0 : ++i;
236 : }
237 :
238 0 : return nRID;
239 : }
240 :
241 : class ImplGrafControl : public Control
242 : {
243 : using Window::Update;
244 : private:
245 : FixedImage maImage;
246 : ImplGrafMetricField maField;
247 :
248 : protected:
249 :
250 : virtual void GetFocus() SAL_OVERRIDE;
251 :
252 : public:
253 :
254 : ImplGrafControl( vcl::Window* pParent, const OUString& rCmd, const Reference< XFrame >& rFrame );
255 : virtual ~ImplGrafControl();
256 :
257 0 : void Update( const SfxPoolItem* pItem ) { maField.Update( pItem ); }
258 0 : void SetText( const OUString& rStr ) SAL_OVERRIDE { maField.SetText( rStr ); }
259 : };
260 :
261 0 : ImplGrafControl::ImplGrafControl(
262 : vcl::Window* pParent,
263 : const OUString& rCmd,
264 : const Reference< XFrame >& rFrame
265 : ) : Control( pParent, WB_TABSTOP )
266 : , maImage( this )
267 0 : , maField( this, rCmd, rFrame )
268 : {
269 0 : ResId aResId( ImplGetRID( rCmd ), DIALOG_MGR() ) ;
270 0 : Image aImage( aResId );
271 :
272 0 : Size aImgSize( aImage.GetSizePixel() );
273 0 : Size aFldSize( maField.GetSizePixel() );
274 : long nFldY, nImgY;
275 :
276 0 : maImage.SetImage( aImage );
277 0 : maImage.SetSizePixel( aImgSize );
278 : // we want to see the backbround of the toolbox, not of the FixedImage or Control
279 0 : maImage.SetBackground( Wallpaper( COL_TRANSPARENT ) );
280 0 : SetBackground( Wallpaper( COL_TRANSPARENT ) );
281 :
282 0 : if( aImgSize.Height() > aFldSize.Height() )
283 0 : nImgY = 0, nFldY = ( aImgSize.Height() - aFldSize.Height() ) >> 1;
284 : else
285 0 : nFldY = 0, nImgY = ( aFldSize.Height() - aImgSize.Height() ) >> 1;
286 :
287 0 : long nOffset = SYMBOL_TO_FIELD_OFFSET / 2;
288 0 : maImage.SetPosPixel( Point( nOffset, nImgY ) );
289 0 : maField.SetPosPixel( Point( aImgSize.Width() + SYMBOL_TO_FIELD_OFFSET, nFldY ) );
290 0 : SetSizePixel( Size( aImgSize.Width() + aFldSize.Width() + SYMBOL_TO_FIELD_OFFSET + nOffset,
291 0 : std::max( aImgSize.Height(), aFldSize.Height() ) ) );
292 :
293 0 : SetBackground( Wallpaper() ); // transparent background
294 :
295 0 : maImage.Show();
296 :
297 0 : maField.SetHelpId( OUStringToOString( rCmd, RTL_TEXTENCODING_UTF8 ) );
298 0 : maField.Show();
299 0 : }
300 :
301 0 : ImplGrafControl::~ImplGrafControl()
302 : {
303 0 : }
304 :
305 0 : void ImplGrafControl::GetFocus()
306 : {
307 0 : maField.GrabFocus();
308 0 : }
309 :
310 : class ImplGrafModeControl : public ListBox
311 : {
312 : using Window::Update;
313 : private:
314 : sal_uInt16 mnCurPos;
315 : Reference< XFrame > mxFrame;
316 :
317 : virtual void Select() SAL_OVERRIDE;
318 : virtual bool PreNotify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
319 : virtual bool Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
320 : void ImplReleaseFocus();
321 :
322 : public:
323 :
324 : ImplGrafModeControl( vcl::Window* pParent, const Reference< XFrame >& rFrame );
325 : virtual ~ImplGrafModeControl();
326 :
327 : void Update( const SfxPoolItem* pItem );
328 : };
329 :
330 0 : ImplGrafModeControl::ImplGrafModeControl( vcl::Window* pParent, const Reference< XFrame >& rFrame ) :
331 : ListBox( pParent, WB_BORDER | WB_DROPDOWN | WB_AUTOHSCROLL ),
332 : mnCurPos( 0 ),
333 0 : mxFrame( rFrame )
334 : {
335 0 : SetSizePixel( Size( 100, 260 ) );
336 :
337 0 : InsertEntry( SVX_RESSTR( RID_SVXSTR_GRAFMODE_STANDARD ) );
338 0 : InsertEntry( SVX_RESSTR( RID_SVXSTR_GRAFMODE_GREYS ) );
339 0 : InsertEntry( SVX_RESSTR( RID_SVXSTR_GRAFMODE_MONO ) );
340 0 : InsertEntry( SVX_RESSTR( RID_SVXSTR_GRAFMODE_WATERMARK ) );
341 :
342 0 : Show();
343 0 : }
344 :
345 0 : ImplGrafModeControl::~ImplGrafModeControl()
346 : {
347 0 : }
348 :
349 0 : void ImplGrafModeControl::Select()
350 : {
351 0 : if ( !IsTravelSelect() )
352 : {
353 0 : Sequence< PropertyValue > aArgs( 1 );
354 0 : aArgs[0].Name = "GrafMode";
355 0 : aArgs[0].Value = makeAny( sal_Int16( GetSelectEntryPos() ));
356 :
357 : /* #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call.
358 : This instance may be deleted in the meantime (i.e. when a dialog is opened
359 : while in Dispatch()), accessing members will crash in this case. */
360 0 : ImplReleaseFocus();
361 :
362 : SfxToolBoxControl::Dispatch(
363 0 : Reference< XDispatchProvider >( mxFrame->getController(), UNO_QUERY ),
364 : OUString( ".uno:GrafMode" ),
365 0 : aArgs );
366 : }
367 0 : }
368 :
369 0 : bool ImplGrafModeControl::PreNotify( NotifyEvent& rNEvt )
370 : {
371 0 : sal_uInt16 nType = rNEvt.GetType();
372 :
373 0 : if( EVENT_MOUSEBUTTONDOWN == nType || EVENT_GETFOCUS == nType )
374 0 : mnCurPos = GetSelectEntryPos();
375 :
376 0 : return ListBox::PreNotify( rNEvt );
377 : }
378 :
379 0 : bool ImplGrafModeControl::Notify( NotifyEvent& rNEvt )
380 : {
381 0 : bool nHandled = ListBox::Notify( rNEvt );
382 :
383 0 : if( rNEvt.GetType() == EVENT_KEYINPUT )
384 : {
385 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
386 :
387 0 : switch( pKEvt->GetKeyCode().GetCode() )
388 : {
389 : case KEY_RETURN:
390 : {
391 0 : Select();
392 0 : nHandled = true;
393 : }
394 0 : break;
395 :
396 : case KEY_ESCAPE:
397 : {
398 0 : SelectEntryPos( mnCurPos );
399 0 : ImplReleaseFocus();
400 0 : nHandled = true;
401 : }
402 0 : break;
403 : }
404 : }
405 :
406 0 : return nHandled;
407 : }
408 :
409 0 : void ImplGrafModeControl::ImplReleaseFocus()
410 : {
411 0 : if( SfxViewShell::Current() )
412 : {
413 0 : vcl::Window* pShellWnd = SfxViewShell::Current()->GetWindow();
414 :
415 0 : if( pShellWnd )
416 0 : pShellWnd->GrabFocus();
417 : }
418 0 : }
419 :
420 0 : void ImplGrafModeControl::Update( const SfxPoolItem* pItem )
421 : {
422 0 : if( pItem )
423 0 : SelectEntryPos( static_cast<const SfxUInt16Item*>(pItem)->GetValue() );
424 : else
425 0 : SetNoSelection();
426 0 : }
427 :
428 200 : SFX_IMPL_TOOLBOX_CONTROL( SvxGrafFilterToolBoxControl, TbxImageItem );
429 :
430 0 : SvxGrafFilterToolBoxControl::SvxGrafFilterToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
431 0 : SfxToolBoxControl( nSlotId, nId, rTbx )
432 : {
433 0 : rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWNONLY | rTbx.GetItemBits( nId ) );
434 0 : rTbx.Invalidate();
435 0 : }
436 :
437 0 : SvxGrafFilterToolBoxControl::~SvxGrafFilterToolBoxControl()
438 : {
439 0 : }
440 :
441 0 : void SvxGrafFilterToolBoxControl::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* )
442 : {
443 0 : GetToolBox().EnableItem( GetId(), ( eState != SfxItemState::DISABLED ) );
444 0 : }
445 :
446 0 : SfxPopupWindowType SvxGrafFilterToolBoxControl::GetPopupWindowType() const
447 : {
448 0 : return SFX_POPUPWINDOW_ONCLICK;
449 : }
450 :
451 0 : SfxPopupWindow* SvxGrafFilterToolBoxControl::CreatePopupWindow()
452 : {
453 0 : OUString aSubTbxResName( "private:resource/toolbar/graffilterbar" );
454 0 : createAndPositionSubToolBar( aSubTbxResName );
455 :
456 0 : return NULL;
457 : }
458 :
459 0 : SvxGrafToolBoxControl::SvxGrafToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx) :
460 0 : SfxToolBoxControl( nSlotId, nId, rTbx )
461 : {
462 0 : rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWN | rTbx.GetItemBits( nId ) );
463 0 : rTbx.Invalidate();
464 0 : }
465 :
466 0 : SvxGrafToolBoxControl::~SvxGrafToolBoxControl()
467 : {
468 0 : }
469 :
470 0 : void SvxGrafToolBoxControl::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* pState )
471 :
472 : {
473 0 : ImplGrafControl* pCtrl = static_cast<ImplGrafControl*>( GetToolBox().GetItemWindow( GetId() ) );
474 : DBG_ASSERT( pCtrl, "Control not found" );
475 :
476 0 : if( eState == SfxItemState::DISABLED )
477 : {
478 0 : pCtrl->Disable();
479 0 : pCtrl->SetText( OUString() );
480 : }
481 : else
482 : {
483 0 : pCtrl->Enable();
484 :
485 0 : if( eState == SfxItemState::DEFAULT )
486 0 : pCtrl->Update( pState );
487 : else
488 0 : pCtrl->Update( NULL );
489 : }
490 0 : }
491 :
492 0 : vcl::Window* SvxGrafToolBoxControl::CreateItemWindow( vcl::Window *pParent )
493 : {
494 0 : return( new ImplGrafControl( pParent, m_aCommandURL, m_xFrame ) );
495 : }
496 :
497 200 : SFX_IMPL_TOOLBOX_CONTROL( SvxGrafRedToolBoxControl, SfxInt16Item );
498 :
499 0 : SvxGrafRedToolBoxControl::SvxGrafRedToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
500 0 : SvxGrafToolBoxControl( nSlotId, nId, rTbx )
501 : {
502 0 : }
503 :
504 200 : SFX_IMPL_TOOLBOX_CONTROL( SvxGrafGreenToolBoxControl, SfxInt16Item );
505 :
506 0 : SvxGrafGreenToolBoxControl::SvxGrafGreenToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
507 0 : SvxGrafToolBoxControl( nSlotId, nId, rTbx )
508 : {
509 0 : }
510 :
511 200 : SFX_IMPL_TOOLBOX_CONTROL( SvxGrafBlueToolBoxControl, SfxInt16Item );
512 :
513 0 : SvxGrafBlueToolBoxControl::SvxGrafBlueToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
514 0 : SvxGrafToolBoxControl( nSlotId, nId, rTbx )
515 : {
516 0 : }
517 :
518 200 : SFX_IMPL_TOOLBOX_CONTROL( SvxGrafLuminanceToolBoxControl, SfxInt16Item );
519 :
520 0 : SvxGrafLuminanceToolBoxControl::SvxGrafLuminanceToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
521 0 : SvxGrafToolBoxControl( nSlotId, nId, rTbx )
522 : {
523 0 : }
524 :
525 200 : SFX_IMPL_TOOLBOX_CONTROL( SvxGrafContrastToolBoxControl, SfxInt16Item );
526 :
527 0 : SvxGrafContrastToolBoxControl::SvxGrafContrastToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
528 0 : SvxGrafToolBoxControl( nSlotId, nId, rTbx )
529 : {
530 0 : }
531 :
532 200 : SFX_IMPL_TOOLBOX_CONTROL( SvxGrafGammaToolBoxControl, SfxUInt32Item );
533 :
534 0 : SvxGrafGammaToolBoxControl::SvxGrafGammaToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
535 0 : SvxGrafToolBoxControl( nSlotId, nId, rTbx )
536 : {
537 0 : }
538 :
539 200 : SFX_IMPL_TOOLBOX_CONTROL( SvxGrafTransparenceToolBoxControl, SfxUInt16Item );
540 :
541 0 : SvxGrafTransparenceToolBoxControl::SvxGrafTransparenceToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
542 0 : SvxGrafToolBoxControl( nSlotId, nId, rTbx )
543 : {
544 0 : }
545 :
546 200 : SFX_IMPL_TOOLBOX_CONTROL( SvxGrafModeToolBoxControl, SfxUInt16Item );
547 :
548 0 : SvxGrafModeToolBoxControl::SvxGrafModeToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
549 0 : SfxToolBoxControl( nSlotId, nId, rTbx )
550 : {
551 0 : }
552 :
553 0 : SvxGrafModeToolBoxControl::~SvxGrafModeToolBoxControl()
554 : {
555 0 : }
556 :
557 0 : void SvxGrafModeToolBoxControl::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* pState )
558 :
559 : {
560 0 : ImplGrafModeControl* pCtrl = static_cast<ImplGrafModeControl*>( GetToolBox().GetItemWindow( GetId() ) );
561 : DBG_ASSERT( pCtrl, "Control not found" );
562 :
563 0 : if( eState == SfxItemState::DISABLED )
564 : {
565 0 : pCtrl->Disable();
566 0 : pCtrl->SetText( OUString() );
567 : }
568 : else
569 : {
570 0 : pCtrl->Enable();
571 :
572 0 : if( eState == SfxItemState::DEFAULT )
573 0 : pCtrl->Update( pState );
574 : else
575 0 : pCtrl->Update( NULL );
576 : }
577 0 : }
578 :
579 0 : vcl::Window* SvxGrafModeToolBoxControl::CreateItemWindow( vcl::Window *pParent )
580 : {
581 0 : return( new ImplGrafModeControl( pParent, m_xFrame ) );
582 : }
583 :
584 0 : void SvxGrafAttrHelper::ExecuteGrafAttr( SfxRequest& rReq, SdrView& rView )
585 : {
586 0 : SfxItemPool& rPool = rView.GetModel()->GetItemPool();
587 0 : SfxItemSet aSet( rPool, SDRATTR_GRAF_FIRST, SDRATTR_GRAF_LAST );
588 0 : OUString aUndoStr;
589 0 : const bool bUndo = rView.IsUndoEnabled();
590 :
591 0 : if( bUndo )
592 : {
593 0 : aUndoStr = rView.GetDescriptionOfMarkedObjects();
594 0 : aUndoStr += " ";
595 : }
596 :
597 0 : const SfxItemSet* pArgs = rReq.GetArgs();
598 : const SfxPoolItem* pItem;
599 0 : sal_uInt16 nSlot = rReq.GetSlot();
600 :
601 0 : if( !pArgs || SfxItemState::SET != pArgs->GetItemState( nSlot, false, &pItem ))
602 0 : pItem = 0;
603 :
604 0 : switch( nSlot )
605 : {
606 : case SID_ATTR_GRAF_RED:
607 : {
608 0 : if( pItem )
609 : {
610 0 : aSet.Put( SdrGrafRedItem( static_cast<const SfxInt16Item*>(pItem)->GetValue() ));
611 0 : if( bUndo )
612 0 : aUndoStr += SVX_RESSTR( RID_SVXSTR_UNDO_GRAFRED );
613 : }
614 : }
615 0 : break;
616 :
617 : case SID_ATTR_GRAF_GREEN:
618 : {
619 0 : if( pItem )
620 : {
621 0 : aSet.Put( SdrGrafGreenItem( static_cast<const SfxInt16Item*>(pItem)->GetValue() ));
622 0 : if( bUndo )
623 0 : aUndoStr += SVX_RESSTR( RID_SVXSTR_UNDO_GRAFGREEN );
624 : }
625 : }
626 0 : break;
627 :
628 : case SID_ATTR_GRAF_BLUE:
629 : {
630 0 : if( pItem )
631 : {
632 0 : aSet.Put( SdrGrafBlueItem( static_cast<const SfxInt16Item*>(pItem)->GetValue() ));
633 0 : if( bUndo )
634 0 : aUndoStr += SVX_RESSTR( RID_SVXSTR_UNDO_GRAFBLUE );
635 : }
636 : }
637 0 : break;
638 :
639 : case SID_ATTR_GRAF_LUMINANCE:
640 : {
641 0 : if( pItem )
642 : {
643 0 : aSet.Put( SdrGrafLuminanceItem( static_cast<const SfxInt16Item*>(pItem)->GetValue() ));
644 0 : if( bUndo )
645 0 : aUndoStr += SVX_RESSTR( RID_SVXSTR_UNDO_GRAFLUMINANCE );
646 : }
647 : }
648 0 : break;
649 :
650 : case SID_ATTR_GRAF_CONTRAST:
651 : {
652 0 : if( pItem )
653 : {
654 0 : aSet.Put( SdrGrafContrastItem( static_cast<const SfxInt16Item*>(pItem)->GetValue() ));
655 0 : if( bUndo )
656 0 : aUndoStr += SVX_RESSTR( RID_SVXSTR_UNDO_GRAFCONTRAST );
657 : }
658 : }
659 0 : break;
660 :
661 : case SID_ATTR_GRAF_GAMMA:
662 : {
663 0 : if( pItem )
664 : {
665 0 : aSet.Put( SdrGrafGamma100Item( static_cast<const SfxUInt32Item*>(pItem)->GetValue() ));
666 0 : if( bUndo )
667 0 : aUndoStr += SVX_RESSTR( RID_SVXSTR_UNDO_GRAFGAMMA );
668 : }
669 : }
670 0 : break;
671 :
672 : case SID_ATTR_GRAF_TRANSPARENCE:
673 : {
674 0 : if( pItem )
675 : {
676 0 : aSet.Put( SdrGrafTransparenceItem( static_cast<const SfxUInt16Item*>(pItem)->GetValue() ));
677 0 : if( bUndo )
678 0 : aUndoStr += SVX_RESSTR( RID_SVXSTR_UNDO_GRAFTRANSPARENCY );
679 : }
680 : }
681 0 : break;
682 :
683 : case SID_ATTR_GRAF_MODE:
684 : {
685 0 : if( pItem )
686 : {
687 0 : aSet.Put( SdrGrafModeItem( (GraphicDrawMode) static_cast<const SfxUInt16Item*>(pItem)->GetValue() ));
688 0 : if( bUndo )
689 0 : aUndoStr += SVX_RESSTR( RID_SVXSTR_UNDO_GRAFMODE );
690 : }
691 : }
692 0 : break;
693 :
694 : case( SID_ATTR_GRAF_CROP ):
695 : {
696 0 : const SdrMarkList& rMarkList = rView.GetMarkedObjectList();
697 :
698 0 : if( 0 < rMarkList.GetMarkCount() )
699 : {
700 0 : SdrGrafObj* pObj = static_cast<SdrGrafObj*>( rMarkList.GetMark( 0 )->GetMarkedSdrObj() );
701 :
702 0 : if( pObj && pObj->ISA( SdrGrafObj ) &&
703 0 : ( pObj->GetGraphicType() != GRAPHIC_NONE ) &&
704 0 : ( pObj->GetGraphicType() != GRAPHIC_DEFAULT ) )
705 : {
706 0 : SfxItemSet aGrfAttr( rPool, SDRATTR_GRAFCROP, SDRATTR_GRAFCROP, 0 );
707 0 : const SfxMapUnit eOldMetric = rPool.GetMetric( 0 );
708 0 : const MapMode aMap100( MAP_100TH_MM );
709 0 : const MapMode aMapTwip( MAP_TWIP );
710 :
711 0 : aGrfAttr.Put(pObj->GetMergedItemSet());
712 0 : rPool.SetDefaultMetric( SFX_MAPUNIT_TWIP );
713 :
714 : SfxItemSet aCropDlgAttr( rPool,
715 : SDRATTR_GRAFCROP, SDRATTR_GRAFCROP,
716 : SID_ATTR_GRAF_GRAPHIC, SID_ATTR_GRAF_GRAPHIC,
717 : SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
718 : SID_ATTR_GRAF_FRMSIZE, SID_ATTR_GRAF_FRMSIZE,
719 0 : SID_ATTR_GRAF_CROP, SID_ATTR_GRAF_CROP, 0 );
720 :
721 0 : aCropDlgAttr.Put( SvxBrushItem( pObj->GetGraphic(), GPOS_MM, SID_ATTR_GRAF_GRAPHIC ) );
722 : aCropDlgAttr.Put( SvxSizeItem( SID_ATTR_PAGE_SIZE,
723 : Size( OutputDevice::LogicToLogic(
724 0 : Size( 200000, 200000 ), aMap100, aMapTwip ) ) ) );
725 : aCropDlgAttr.Put( SvxSizeItem( SID_ATTR_GRAF_FRMSIZE, OutputDevice::LogicToLogic(
726 0 : pObj->GetLogicRect().GetSize(), aMap100, aMapTwip ) ) );
727 :
728 0 : const SdrGrafCropItem& rCrop = static_cast<const SdrGrafCropItem&>( aGrfAttr.Get( SDRATTR_GRAFCROP ) );
729 : Size aLTSize( OutputDevice::LogicToLogic(
730 0 : Size( rCrop.GetLeft(), rCrop.GetTop() ), aMap100, aMapTwip ) );
731 : Size aRBSize( OutputDevice::LogicToLogic(
732 0 : Size( rCrop.GetRight(), rCrop.GetBottom() ), aMap100, aMapTwip ) );
733 :
734 0 : aCropDlgAttr.Put( SdrGrafCropItem( aLTSize.Width(), aLTSize.Height(),
735 0 : aRBSize.Width(), aRBSize.Height() ) );
736 :
737 : SfxSingleTabDialog aCropDialog(
738 0 : SfxViewShell::Current() ? SfxViewShell::Current()->GetWindow() : NULL,
739 0 : aCropDlgAttr);
740 0 : const OUString aCropStr(SVX_RESSTR(RID_SVXSTR_GRAFCROP));
741 :
742 0 : SfxAbstractDialogFactory* pFact = SfxAbstractDialogFactory::Create();
743 : assert(pFact && "Dialog creation failed!");
744 0 : ::CreateTabPage fnCreatePage = pFact->GetTabPageCreatorFunc( RID_SVXPAGE_GRFCROP );
745 : assert(fnCreatePage && "Dialog creation failed!");
746 0 : SfxTabPage* pTabPage = (*fnCreatePage)( aCropDialog.get_content_area(), &aCropDlgAttr );
747 :
748 0 : pTabPage->SetText( aCropStr );
749 0 : aCropDialog.SetTabPage( pTabPage );
750 :
751 0 : if( aCropDialog.Execute() == RET_OK )
752 : {
753 0 : const SfxItemSet* pOutAttr = aCropDialog.GetOutputItemSet();
754 :
755 0 : if( pOutAttr )
756 : {
757 0 : aUndoStr += SVX_RESSTR( RID_SVXSTR_UNDO_GRAFCROP );
758 :
759 : // set crop attributes
760 0 : if( SfxItemState::SET <= pOutAttr->GetItemState( SDRATTR_GRAFCROP ) )
761 : {
762 0 : const SdrGrafCropItem& rNewCrop = static_cast<const SdrGrafCropItem&>( pOutAttr->Get( SDRATTR_GRAFCROP ) );
763 :
764 0 : aLTSize = OutputDevice::LogicToLogic( Size( rNewCrop.GetLeft(), rNewCrop.GetTop() ), aMapTwip, aMap100 );
765 0 : aRBSize = OutputDevice::LogicToLogic( Size( rNewCrop.GetRight(), rNewCrop.GetBottom() ), aMapTwip, aMap100 );
766 0 : aSet.Put( SdrGrafCropItem( aLTSize.Width(), aLTSize.Height(), aRBSize.Width(), aRBSize.Height() ) );
767 : }
768 :
769 : // set new logic rect
770 0 : if( SfxItemState::SET <= pOutAttr->GetItemState( SID_ATTR_GRAF_FRMSIZE ) )
771 : {
772 0 : Point aNewOrigin( pObj->GetLogicRect().TopLeft() );
773 0 : const Size& rGrfSize = static_cast<const SvxSizeItem&>( pOutAttr->Get( SID_ATTR_GRAF_FRMSIZE ) ).GetSize();
774 0 : Size aNewGrfSize( OutputDevice::LogicToLogic( rGrfSize, aMapTwip, aMap100 ) );
775 0 : Size aOldGrfSize( pObj->GetLogicRect().GetSize() );
776 :
777 0 : Rectangle aNewRect( aNewOrigin, aNewGrfSize );
778 0 : Point aOffset( (aNewGrfSize.Width() - aOldGrfSize.Width()) >> 1,
779 0 : (aNewGrfSize.Height() - aOldGrfSize.Height()) >> 1 );
780 :
781 : // #106181# rotate snap rect before setting it
782 0 : const GeoStat& aGeo = pObj->GetGeoStat();
783 :
784 0 : if (aGeo.nRotationAngle!=0 || aGeo.nShearAngle!=0)
785 : {
786 0 : Polygon aPol(aNewRect);
787 :
788 : // also transform origin offset
789 0 : if (aGeo.nShearAngle!=0)
790 : {
791 : ShearPoly(aPol,
792 : aNewRect.TopLeft(),
793 0 : aGeo.nTan);
794 0 : ShearPoint(aOffset, Point(0,0), aGeo.nTan);
795 : }
796 0 : if (aGeo.nRotationAngle!=0)
797 : {
798 : RotatePoly(aPol,
799 : aNewRect.TopLeft(),
800 0 : aGeo.nSin,aGeo.nCos);
801 0 : RotatePoint(aOffset, Point(0,0), aGeo.nSin,aGeo.nCos);
802 : }
803 :
804 : // apply offset
805 0 : aPol.Move( -aOffset.X(), -aOffset.Y() );
806 0 : aNewRect=aPol.GetBoundRect();
807 : }
808 : else
809 : {
810 0 : aNewRect.Move( -aOffset.X(), -aOffset.Y() );
811 : }
812 :
813 0 : if( !aSet.Count() )
814 0 : rView.SetMarkedObjRect( aNewRect );
815 : else
816 : {
817 0 : if( bUndo )
818 : {
819 0 : rView.BegUndo( aUndoStr );
820 0 : rView.AddUndo( rView.GetModel()->GetSdrUndoFactory().CreateUndoGeoObject( *pObj ) );
821 : }
822 0 : pObj->SetSnapRect( aNewRect );
823 0 : rView.SetAttributes( aSet );
824 :
825 0 : if( bUndo )
826 0 : rView.EndUndo();
827 0 : aSet.ClearItem();
828 : }
829 : }
830 : }
831 : }
832 :
833 0 : rPool.SetDefaultMetric( eOldMetric );
834 : }
835 : }
836 : }
837 0 : break;
838 :
839 : case SID_COLOR_SETTINGS:
840 : {
841 0 : svx::ToolboxAccess aToolboxAccess( TOOLBOX_NAME );
842 0 : aToolboxAccess.toggleToolbox();
843 0 : rReq.Done();
844 0 : break;
845 : }
846 :
847 : default:
848 0 : break;
849 : }
850 :
851 0 : if( aSet.Count() )
852 : {
853 0 : if( bUndo )
854 0 : rView.BegUndo( aUndoStr );
855 :
856 0 : rView.SetAttributes( aSet );
857 :
858 0 : if( bUndo )
859 0 : rView.EndUndo();
860 0 : }
861 0 : }
862 :
863 0 : void SvxGrafAttrHelper::GetGrafAttrState( SfxItemSet& rSet, SdrView& rView )
864 : {
865 0 : SfxItemPool& rPool = rView.GetModel()->GetItemPool();
866 0 : SfxItemSet aAttrSet( rPool );
867 0 : SfxWhichIter aIter( rSet );
868 0 : sal_uInt16 nWhich = aIter.FirstWhich();
869 0 : const SdrMarkList& rMarkList = rView.GetMarkedObjectList();
870 0 : bool bEnableColors = true;
871 0 : bool bEnableTransparency = true;
872 0 : bool bEnableCrop = ( 1 == rMarkList.GetMarkCount() );
873 :
874 0 : for( size_t i = 0, nCount = rMarkList.GetMarkCount(); i < nCount; ++i )
875 : {
876 0 : SdrGrafObj* pGrafObj = dynamic_cast< SdrGrafObj* >( rMarkList.GetMark( i )->GetMarkedSdrObj() );
877 :
878 0 : if( !pGrafObj ||
879 0 : ( pGrafObj->GetGraphicType() == GRAPHIC_NONE ) ||
880 0 : ( pGrafObj->GetGraphicType() == GRAPHIC_DEFAULT ))
881 : {
882 0 : bEnableColors = bEnableTransparency = bEnableCrop = false;
883 0 : break;
884 : }
885 0 : else if( bEnableTransparency && ( pGrafObj->HasGDIMetaFile() || pGrafObj->IsAnimated() ) )
886 : {
887 0 : bEnableTransparency = false;
888 : }
889 : }
890 :
891 0 : rView.GetAttributes( aAttrSet );
892 :
893 0 : while( nWhich )
894 : {
895 0 : sal_uInt16 nSlotId = SfxItemPool::IsWhich( nWhich ) ? rPool.GetSlotId( nWhich ) : nWhich;
896 :
897 0 : switch( nSlotId )
898 : {
899 : case( SID_ATTR_GRAF_MODE ):
900 : {
901 0 : if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFMODE ) )
902 : {
903 0 : if( bEnableColors )
904 : {
905 : rSet.Put( SfxUInt16Item( nSlotId,
906 0 : sal::static_int_cast< sal_uInt16 >( ITEMVALUE( aAttrSet, SDRATTR_GRAFMODE, SdrGrafModeItem ) ) ) );
907 : }
908 : else
909 : {
910 0 : rSet.DisableItem( SID_ATTR_GRAF_MODE );
911 : }
912 : }
913 : }
914 0 : break;
915 :
916 : case( SID_ATTR_GRAF_RED ):
917 : {
918 0 : if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFRED ) )
919 : {
920 0 : if( bEnableColors )
921 : {
922 : rSet.Put( SfxInt16Item( nSlotId,
923 0 : ITEMVALUE( aAttrSet, SDRATTR_GRAFRED, SdrGrafRedItem ) ) );
924 : }
925 : else
926 : {
927 0 : rSet.DisableItem( SID_ATTR_GRAF_RED );
928 : }
929 : }
930 : }
931 0 : break;
932 :
933 : case( SID_ATTR_GRAF_GREEN ):
934 : {
935 0 : if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFGREEN ) )
936 : {
937 0 : if( bEnableColors )
938 : {
939 : rSet.Put( SfxInt16Item( nSlotId,
940 0 : ITEMVALUE( aAttrSet, SDRATTR_GRAFGREEN, SdrGrafGreenItem ) ) );
941 : }
942 : else
943 : {
944 0 : rSet.DisableItem( SID_ATTR_GRAF_GREEN );
945 : }
946 : }
947 : }
948 0 : break;
949 :
950 : case( SID_ATTR_GRAF_BLUE ):
951 : {
952 0 : if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFBLUE ) )
953 : {
954 0 : if( bEnableColors )
955 : {
956 : rSet.Put( SfxInt16Item( nSlotId,
957 0 : ITEMVALUE( aAttrSet, SDRATTR_GRAFBLUE, SdrGrafBlueItem ) ) );
958 : }
959 : else
960 : {
961 0 : rSet.DisableItem( SID_ATTR_GRAF_BLUE );
962 : }
963 : }
964 : }
965 0 : break;
966 :
967 : case( SID_ATTR_GRAF_LUMINANCE ):
968 : {
969 0 : if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFLUMINANCE ) )
970 : {
971 0 : if( bEnableColors )
972 : {
973 : rSet.Put( SfxInt16Item( nSlotId,
974 0 : ITEMVALUE( aAttrSet, SDRATTR_GRAFLUMINANCE, SdrGrafLuminanceItem ) ) );
975 : }
976 : else
977 : {
978 0 : rSet.DisableItem( SID_ATTR_GRAF_LUMINANCE );
979 : }
980 : }
981 : }
982 0 : break;
983 :
984 : case( SID_ATTR_GRAF_CONTRAST ):
985 : {
986 0 : if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFCONTRAST ) )
987 : {
988 0 : if( bEnableColors )
989 : {
990 : rSet.Put( SfxInt16Item( nSlotId,
991 0 : ITEMVALUE( aAttrSet, SDRATTR_GRAFCONTRAST, SdrGrafContrastItem ) ) );
992 : }
993 : else
994 : {
995 0 : rSet.DisableItem( SID_ATTR_GRAF_CONTRAST );
996 : }
997 : }
998 : }
999 0 : break;
1000 :
1001 : case( SID_ATTR_GRAF_GAMMA ):
1002 : {
1003 0 : if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFGAMMA ) )
1004 : {
1005 0 : if( bEnableColors )
1006 : {
1007 : rSet.Put( SfxUInt32Item( nSlotId,
1008 0 : ITEMVALUE( aAttrSet, SDRATTR_GRAFGAMMA, SdrGrafGamma100Item ) ) );
1009 : }
1010 : else
1011 : {
1012 0 : rSet.DisableItem( SID_ATTR_GRAF_GAMMA );
1013 : }
1014 : }
1015 : }
1016 0 : break;
1017 :
1018 : case( SID_ATTR_GRAF_TRANSPARENCE ):
1019 : {
1020 0 : if( SfxItemState::DEFAULT <= aAttrSet.GetItemState( SDRATTR_GRAFTRANSPARENCE ) )
1021 : {
1022 0 : if( bEnableTransparency )
1023 : {
1024 : rSet.Put( SfxUInt16Item( nSlotId,
1025 0 : ITEMVALUE( aAttrSet, SDRATTR_GRAFTRANSPARENCE, SdrGrafTransparenceItem ) ) );
1026 : }
1027 : else
1028 : {
1029 0 : rSet.DisableItem( SID_ATTR_GRAF_TRANSPARENCE );
1030 : }
1031 : }
1032 : }
1033 0 : break;
1034 :
1035 : case( SID_ATTR_GRAF_CROP ):
1036 : {
1037 0 : if( !bEnableCrop )
1038 0 : rSet.DisableItem( nSlotId );
1039 : }
1040 0 : break;
1041 :
1042 : case SID_COLOR_SETTINGS :
1043 : {
1044 0 : svx::ToolboxAccess aToolboxAccess( TOOLBOX_NAME );
1045 0 : rSet.Put( SfxBoolItem( nWhich, aToolboxAccess.isToolboxVisible() ) );
1046 0 : break;
1047 : }
1048 :
1049 : default:
1050 0 : break;
1051 : }
1052 :
1053 0 : nWhich = aIter.NextWhich();
1054 0 : }
1055 594 : }
1056 :
1057 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|