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