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