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