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 <cmdid.h>
21 : #include <hintids.hxx>
22 : #include <tools/urlobj.hxx>
23 : #include <vcl/msgbox.hxx>
24 : #include <svl/stritem.hxx>
25 : #include <svl/whiter.hxx>
26 : #include <svl/urihelper.hxx>
27 : #include <sfx2/docfile.hxx>
28 : #include <sfx2/dispatch.hxx>
29 : #include <sfx2/objface.hxx>
30 : #include <editeng/sizeitem.hxx>
31 : #include <editeng/protitem.hxx>
32 : #include <sfx2/request.hxx>
33 : #include <sfx2/sidebar/EnumContext.hxx>
34 : #include <svl/srchitem.hxx>
35 : #include <sfx2/htmlmode.hxx>
36 : #include <svx/sdgluitm.hxx>
37 : #include <svx/sdgcoitm.hxx>
38 : #include <svx/sdggaitm.hxx>
39 : #include <svx/sdgtritm.hxx>
40 : #include <svx/sdginitm.hxx>
41 : #include <svx/sdgmoitm.hxx>
42 : #include <editeng/brushitem.hxx>
43 : #include <svx/grfflt.hxx>
44 : #include <svx/compressgraphicdialog.hxx>
45 : #include <vcl/GraphicNativeTransform.hxx>
46 : #include <svx/tbxcolor.hxx>
47 : #include <drawdoc.hxx>
48 : #include <fmturl.hxx>
49 : #include <view.hxx>
50 : #include <wrtsh.hxx>
51 : #include <viewopt.hxx>
52 : #include <swmodule.hxx>
53 : #include <frmatr.hxx>
54 : #include <swundo.hxx>
55 : #include <uitool.hxx>
56 : #include <docsh.hxx>
57 : #include <grfsh.hxx>
58 : #include <frmmgr.hxx>
59 : #include <frmdlg.hxx>
60 : #include <frmfmt.hxx>
61 : #include <grfatr.hxx>
62 : #include <usrpref.hxx>
63 : #include <edtwin.hxx>
64 : #include <swwait.hxx>
65 : #include <shells.hrc>
66 : #include <popup.hrc>
67 : #include <svx/extedit.hxx>
68 : #include <svx/graphichelper.hxx>
69 : #include <doc.hxx>
70 : #include <IDocumentDrawModelAccess.hxx>
71 :
72 : #include <svx/drawitem.hxx>
73 : #define SwGrfShell
74 :
75 : #include <sfx2/msg.hxx>
76 : #include "swslots.hxx"
77 : #include "swabstdlg.hxx"
78 : #include <boost/scoped_ptr.hpp>
79 :
80 : #define TOOLBOX_NAME "colorbar"
81 :
82 : namespace
83 : {
84 0 : class SwExternalToolEdit : public ExternalToolEdit
85 : {
86 : SwWrtShell* m_pShell;
87 :
88 : public:
89 0 : SwExternalToolEdit ( SwWrtShell* pShell ) :
90 0 : m_pShell (pShell)
91 0 : {}
92 :
93 0 : virtual void Update( Graphic& aGraphic ) SAL_OVERRIDE
94 : {
95 0 : m_pShell->ReRead(OUString(), OUString(), (const Graphic*) &aGraphic);
96 0 : }
97 : };
98 : }
99 :
100 450 : SFX_IMPL_INTERFACE(SwGrfShell, SwBaseShell, SW_RES(STR_SHELLNAME_GRAPHIC))
101 :
102 90 : void SwGrfShell::InitInterface_Impl()
103 : {
104 90 : GetStaticInterface()->RegisterPopupMenu(SW_RES(MN_GRF_POPUPMENU));
105 :
106 90 : GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_OBJECT, SW_RES(RID_GRAFIK_TOOLBOX));
107 90 : }
108 :
109 0 : void SwGrfShell::Execute(SfxRequest &rReq)
110 : {
111 0 : SwWrtShell &rSh = GetShell();
112 :
113 0 : sal_uInt16 nSlot = rReq.GetSlot();
114 0 : switch(nSlot)
115 : {
116 : case SID_TWAIN_TRANSFER:
117 : {
118 0 : GetView().ExecuteScan( rReq );
119 0 : break;
120 : }
121 :
122 : case SID_SAVE_GRAPHIC:
123 : {
124 : const Graphic *pGraphic;
125 0 : if(0 != (pGraphic = rSh.GetGraphic()))
126 : {
127 0 : OUString sGrfNm;
128 0 : OUString sFilterNm;
129 0 : rSh.GetGrfNms( &sGrfNm, &sFilterNm );
130 0 : GraphicHelper::ExportGraphic( *pGraphic, sGrfNm );
131 : }
132 : }
133 0 : break;
134 :
135 : case SID_COMPRESS_GRAPHIC:
136 : {
137 0 : const Graphic* pGraphic = rSh.GetGraphic();
138 0 : if( pGraphic )
139 : {
140 : Size aSize (
141 0 : convertTwipToMm100(rSh.GetAnyCurRect(RECT_FLY_EMBEDDED).Width()),
142 0 : convertTwipToMm100(rSh.GetAnyCurRect(RECT_FLY_EMBEDDED).Height()));
143 :
144 0 : SfxItemSet aSet( rSh.GetAttrPool(), RES_GRFATR_CROPGRF, RES_GRFATR_CROPGRF );
145 0 : rSh.GetCurAttr( aSet );
146 0 : SwCropGrf aCrop( (const SwCropGrf&) aSet.Get(RES_GRFATR_CROPGRF) );
147 :
148 : Rectangle aCropRectangle(
149 0 : convertTwipToMm100(aCrop.GetLeft()),
150 0 : convertTwipToMm100(aCrop.GetTop()),
151 0 : convertTwipToMm100(aCrop.GetRight()),
152 0 : convertTwipToMm100(aCrop.GetBottom()) );
153 :
154 0 : Graphic aGraphic = Graphic( *pGraphic );
155 :
156 0 : CompressGraphicsDialog aDialog( GetView().GetWindow(), aGraphic, aSize, aCropRectangle, GetView().GetViewFrame()->GetBindings() );
157 0 : if( aDialog.Execute() == RET_OK )
158 : {
159 0 : rSh.StartAllAction();
160 0 : rSh.StartUndo(UNDO_START);
161 0 : Rectangle aScaledCropedRectangle = aDialog.GetScaledCropRectangle();
162 :
163 0 : aCrop.SetLeft( convertMm100ToTwip( aScaledCropedRectangle.Left() ));
164 0 : aCrop.SetTop( convertMm100ToTwip( aScaledCropedRectangle.Top() ));
165 0 : aCrop.SetRight( convertMm100ToTwip( aScaledCropedRectangle.Right() ));
166 0 : aCrop.SetBottom( convertMm100ToTwip( aScaledCropedRectangle.Bottom() ));
167 :
168 0 : Graphic aCompressedGraphic( aDialog.GetCompressedGraphic() );
169 0 : rSh.ReRead(OUString(), OUString(), (const Graphic*) &aCompressedGraphic);
170 :
171 0 : rSh.SetAttrItem(aCrop);
172 :
173 0 : rSh.EndUndo(UNDO_END);
174 0 : rSh.EndAllAction();
175 0 : }
176 : }
177 : }
178 0 : break;
179 : case SID_EXTERNAL_EDIT:
180 : {
181 : // When the graphic is selected to be opened via some external tool
182 : // for advanced editing
183 0 : GraphicObject *pGraphicObject = (GraphicObject *) rSh.GetGraphicObj();
184 0 : if(0 != pGraphicObject)
185 : {
186 0 : SwExternalToolEdit* externalToolEdit = new SwExternalToolEdit( &rSh );
187 0 : externalToolEdit->Edit ( pGraphicObject );
188 : }
189 : }
190 0 : break;
191 : case SID_CHANGE_PICTURE:
192 : case SID_INSERT_GRAPHIC:
193 : {
194 : // #i123922# implement slot independent from the two below to
195 : // bring up the insert graphic dialog and associated actions
196 0 : SwView& rLclView = GetView();
197 0 : rReq.SetReturnValue(SfxBoolItem(nSlot, rLclView.InsertGraphicDlg( rReq )));
198 0 : break;
199 : }
200 : case FN_FORMAT_GRAFIC_DLG:
201 : case FN_DRAW_WRAP_DLG:
202 : {
203 0 : SwFlyFrmAttrMgr aMgr( false, &rSh, rSh.IsFrmSelected() ?
204 0 : FRMMGR_TYPE_NONE : FRMMGR_TYPE_GRF);
205 0 : const SwViewOption* pVOpt = rSh.GetViewOptions();
206 0 : SwViewOption aUsrPref( *pVOpt );
207 :
208 0 : SfxItemSet aSet(GetPool(), //UUUU sorted by indices
209 :
210 : RES_FRMATR_BEGIN,RES_FRMATR_END - 1, // [ 82
211 : RES_GRFATR_MIRRORGRF,RES_GRFATR_CROPGRF, // [ 123
212 :
213 : //UUUU FillAttribute support
214 : XATTR_FILL_FIRST, XATTR_FILL_LAST, // [ 1014
215 :
216 : SID_DOCFRAME,SID_DOCFRAME, // [ 5598
217 : SID_ATTR_BORDER_INNER,SID_ATTR_BORDER_INNER, // [10023
218 : SID_ATTR_PAGE_SIZE,SID_ATTR_PAGE_SIZE, // [10051
219 : SID_ATTR_GRAF_KEEP_ZOOM,SID_ATTR_GRAF_KEEP_ZOOM, // [10882
220 : SID_ATTR_GRAF_FRMSIZE,SID_ATTR_GRAF_GRAPHIC, // [10884, contains SID_ATTR_GRAF_FRMSIZE_PERCENT
221 :
222 : //UUUU items to hand over XPropertyList things like
223 : // XColorList, XHatchList, XGradientList and XBitmapList
224 : // to the Area TabPage
225 : SID_COLOR_TABLE, SID_BITMAP_LIST, // [10179
226 :
227 : SID_HTML_MODE,SID_HTML_MODE, // [10414
228 : FN_GET_PRINT_AREA,FN_GET_PRINT_AREA, // [21032
229 : FN_PARAM_GRF_CONNECT,FN_PARAM_GRF_CONNECT, // [21153
230 : FN_PARAM_GRF_DIALOG,FN_PARAM_GRF_DIALOG, // [21171
231 : FN_SET_FRM_NAME,FN_KEEP_ASPECT_RATIO, // [21306
232 : FN_SET_FRM_ALT_NAME,FN_SET_FRM_ALT_NAME, // [21318
233 : SID_REFERER, SID_REFERER,
234 0 : 0);
235 :
236 : //UUUU create needed items for XPropertyList entries from the DrawModel so that
237 : // the Area TabPage can access them
238 0 : const SwDrawModel* pDrawModel = rSh.GetView().GetDocShell()->GetDoc()->getIDocumentDrawModelAccess().GetDrawModel();
239 :
240 0 : aSet.Put(SvxColorListItem(pDrawModel->GetColorList(), SID_COLOR_TABLE));
241 0 : aSet.Put(SvxGradientListItem(pDrawModel->GetGradientList(), SID_GRADIENT_LIST));
242 0 : aSet.Put(SvxHatchListItem(pDrawModel->GetHatchList(), SID_HATCH_LIST));
243 0 : aSet.Put(SvxBitmapListItem(pDrawModel->GetBitmapList(), SID_BITMAP_LIST));
244 :
245 0 : sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
246 0 : aSet.Put(SfxUInt16Item(SID_HTML_MODE, nHtmlMode));
247 0 : FieldUnit eMetric = ::GetDfltMetric((0 != (nHtmlMode&HTMLMODE_ON)));
248 0 : SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)) );
249 :
250 0 : const SwRect* pRect = &rSh.GetAnyCurRect(RECT_PAGE);
251 0 : SwFmtFrmSize aFrmSize( ATT_VAR_SIZE, pRect->Width(), pRect->Height());
252 0 : aFrmSize.SetWhich( GetPool().GetWhich( SID_ATTR_PAGE_SIZE ) );
253 0 : aSet.Put( aFrmSize );
254 :
255 0 : aSet.Put(SfxStringItem(FN_SET_FRM_NAME, rSh.GetFlyName()));
256 0 : if ( nSlot == FN_FORMAT_GRAFIC_DLG )
257 : {
258 : // #i73249#
259 0 : aSet.Put( SfxStringItem( FN_SET_FRM_ALT_NAME, rSh.GetObjTitle() ) );
260 : }
261 :
262 0 : pRect = &rSh.GetAnyCurRect(RECT_PAGE_PRT);
263 0 : aFrmSize.SetWidth( pRect->Width() );
264 0 : aFrmSize.SetHeight( pRect->Height() );
265 0 : aFrmSize.SetWhich( GetPool().GetWhich(FN_GET_PRINT_AREA) );
266 0 : aSet.Put( aFrmSize );
267 :
268 0 : aSet.Put( aMgr.GetAttrSet() );
269 0 : aSet.SetParent( aMgr.GetAttrSet().GetParent() );
270 :
271 : // At percentage values initialize size
272 0 : SwFmtFrmSize aSizeCopy = (const SwFmtFrmSize&)aSet.Get(RES_FRM_SIZE);
273 0 : if (aSizeCopy.GetWidthPercent() && aSizeCopy.GetWidthPercent() != 0xff)
274 0 : aSizeCopy.SetWidth(rSh.GetAnyCurRect(RECT_FLY_EMBEDDED).Width());
275 0 : if (aSizeCopy.GetHeightPercent() && aSizeCopy.GetHeightPercent() != 0xff)
276 0 : aSizeCopy.SetHeight(rSh.GetAnyCurRect(RECT_FLY_EMBEDDED).Height());
277 : // and now set the size for "external" tabpages
278 : {
279 0 : SvxSizeItem aSzItm( SID_ATTR_GRAF_FRMSIZE, aSizeCopy.GetSize() );
280 0 : aSet.Put( aSzItm );
281 :
282 0 : Size aSz( aSizeCopy.GetWidthPercent(), aSizeCopy.GetHeightPercent() );
283 0 : if( 0xff == aSz.Width() ) aSz.Width() = 0;
284 0 : if( 0xff == aSz.Height() ) aSz.Height() = 0;
285 :
286 0 : aSzItm.SetSize( aSz );
287 0 : aSzItm.SetWhich( SID_ATTR_GRAF_FRMSIZE_PERCENT );
288 0 : aSet.Put( aSzItm );
289 : }
290 :
291 0 : OUString sGrfNm;
292 0 : OUString sFilterNm;
293 0 : rSh.GetGrfNms( &sGrfNm, &sFilterNm );
294 0 : if( !sGrfNm.isEmpty() )
295 : {
296 : aSet.Put( SvxBrushItem( INetURLObject::decode( sGrfNm,
297 : '%',
298 : INetURLObject::DECODE_UNAMBIGUOUS,
299 : RTL_TEXTENCODING_UTF8 ),
300 : sFilterNm, GPOS_LT,
301 0 : SID_ATTR_GRAF_GRAPHIC ));
302 : }
303 : else
304 : {
305 : // #119353# - robust
306 0 : const GraphicObject* pGrfObj = rSh.GetGraphicObj();
307 0 : if ( pGrfObj )
308 : {
309 : aSet.Put( SvxBrushItem( *pGrfObj, GPOS_LT,
310 0 : SID_ATTR_GRAF_GRAPHIC ) );
311 : }
312 : }
313 0 : aSet.Put( SfxBoolItem( FN_PARAM_GRF_CONNECT, !sGrfNm.isEmpty() ) );
314 :
315 : // get Mirror and Crop
316 : {
317 0 : SfxItemSet aTmpSet( rSh.GetAttrPool(),
318 0 : RES_GRFATR_MIRRORGRF, RES_GRFATR_CROPGRF );
319 :
320 0 : rSh.GetCurAttr( aTmpSet );
321 0 : aSet.Put( aTmpSet );
322 : }
323 :
324 0 : aSet.Put(SfxBoolItem(FN_KEEP_ASPECT_RATIO, aUsrPref.IsKeepRatio()));
325 0 : aSet.Put(SfxBoolItem( SID_ATTR_GRAF_KEEP_ZOOM, aUsrPref.IsGrfKeepZoom()));
326 :
327 0 : aSet.Put(SfxFrameItem( SID_DOCFRAME, &GetView().GetViewFrame()->GetTopFrame()));
328 :
329 0 : SfxObjectShell * sh = rSh.GetDoc()->GetPersist();
330 0 : if (sh != 0 && sh->HasName())
331 : {
332 : aSet.Put(
333 0 : SfxStringItem(SID_REFERER, sh->GetMedium()->GetName()));
334 : }
335 :
336 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
337 : OSL_ENSURE(pFact, "no dialog factory!");
338 : boost::scoped_ptr<SfxAbstractTabDialog> pDlg(pFact->CreateFrmTabDialog("PictureDialog",
339 0 : GetView().GetViewFrame(),
340 0 : GetView().GetWindow(),
341 0 : aSet, false));
342 : OSL_ENSURE(pDlg, "no tab dialog!");
343 :
344 0 : if (nSlot == FN_DRAW_WRAP_DLG)
345 0 : pDlg->SetCurPageId("wrap");
346 :
347 0 : if( pDlg->Execute() )
348 : {
349 0 : rSh.StartAllAction();
350 0 : rSh.StartUndo(UNDO_START);
351 : const SfxPoolItem* pItem;
352 0 : SfxItemSet* pSet = (SfxItemSet*)pDlg->GetOutputItemSet();
353 0 : rReq.Done(*pSet);
354 : // change the 2 frmsize SizeItems to the correct SwFrmSizeItem
355 0 : if( SfxItemState::SET == pSet->GetItemState(
356 0 : SID_ATTR_GRAF_FRMSIZE, false, &pItem ))
357 : {
358 0 : SwFmtFrmSize aSize;
359 0 : const Size& rSz = ((SvxSizeItem*)pItem)->GetSize();
360 0 : aSize.SetWidth( rSz.Width() );
361 0 : aSize.SetHeight( rSz.Height() );
362 :
363 0 : if( SfxItemState::SET == pSet->GetItemState(
364 0 : SID_ATTR_GRAF_FRMSIZE_PERCENT, false, &pItem ))
365 : {
366 0 : const Size& rRelativeSize = ((SvxSizeItem*)pItem)->GetSize();
367 0 : aSize.SetWidthPercent( static_cast< sal_uInt8 >( rRelativeSize.Width() ) );
368 0 : aSize.SetHeightPercent( static_cast< sal_uInt8 >( rRelativeSize.Height() ) );
369 : }
370 0 : pSet->Put( aSize );
371 : }
372 :
373 : // Templates AutoUpdate
374 0 : SwFrmFmt* pFmt = rSh.GetCurFrmFmt();
375 0 : if(pFmt && pFmt->IsAutoUpdateFmt())
376 : {
377 0 : pFmt->SetFmtAttr(*pSet);
378 0 : SfxItemSet aShellSet(GetPool(), RES_FRM_SIZE, RES_FRM_SIZE,
379 : RES_SURROUND, RES_SURROUND,
380 : RES_ANCHOR, RES_ANCHOR,
381 : RES_VERT_ORIENT,RES_HORI_ORIENT,
382 0 : 0);
383 0 : aShellSet.Put(*pSet);
384 0 : aMgr.SetAttrSet(aShellSet);
385 : }
386 : else
387 : {
388 0 : aMgr.SetAttrSet(*pSet);
389 : }
390 0 : aMgr.UpdateFlyFrm();
391 :
392 0 : bool bApplyUsrPref = false;
393 0 : if (SfxItemState::SET == pSet->GetItemState(
394 0 : FN_KEEP_ASPECT_RATIO, true, &pItem ))
395 : {
396 : aUsrPref.SetKeepRatio(
397 0 : ((const SfxBoolItem*)pItem)->GetValue() );
398 0 : bApplyUsrPref = true;
399 : }
400 0 : if( SfxItemState::SET == pSet->GetItemState(
401 0 : SID_ATTR_GRAF_KEEP_ZOOM, true, &pItem ))
402 : {
403 : aUsrPref.SetGrfKeepZoom(
404 0 : ((const SfxBoolItem*)pItem)->GetValue() );
405 0 : bApplyUsrPref = true;
406 : }
407 :
408 0 : if( bApplyUsrPref )
409 0 : SW_MOD()->ApplyUsrPref(aUsrPref, &GetView());
410 :
411 : // and now set all the graphic attributes and other stuff
412 0 : if( SfxItemState::SET == pSet->GetItemState(
413 0 : SID_ATTR_GRAF_GRAPHIC, true, &pItem ))
414 : {
415 0 : if( !((SvxBrushItem*)pItem)->GetGraphicLink().isEmpty() )
416 0 : sGrfNm = ((SvxBrushItem*)pItem)->GetGraphicLink();
417 : else
418 0 : sGrfNm = "";
419 :
420 0 : if( !((SvxBrushItem*)pItem)->GetGraphicFilter().isEmpty() )
421 0 : sFilterNm = ((SvxBrushItem*)pItem)->GetGraphicFilter();
422 : else
423 0 : sFilterNm = "";
424 :
425 0 : if( !sGrfNm.isEmpty() )
426 : {
427 0 : SwDocShell* pDocSh = GetView().GetDocShell();
428 0 : SwWait aWait( *pDocSh, true );
429 0 : SfxMedium* pMedium = pDocSh->GetMedium();
430 0 : INetURLObject aAbs;
431 0 : if( pMedium )
432 0 : aAbs = pMedium->GetURLObject();
433 : rSh.ReRead( URIHelper::SmartRel2Abs(
434 : aAbs, sGrfNm,
435 : URIHelper::GetMaybeFileHdl() ),
436 0 : sFilterNm, 0 );
437 : }
438 : }
439 0 : if ( SfxItemState::SET == pSet->GetItemState(
440 0 : FN_SET_FRM_ALT_NAME, true, &pItem ))
441 : {
442 : // #i73249#
443 0 : rSh.SetObjTitle( ((const SfxStringItem*)pItem)->GetValue() );
444 : }
445 :
446 0 : SfxItemSet aGrfSet( rSh.GetAttrPool(), RES_GRFATR_BEGIN,
447 0 : RES_GRFATR_END-1 );
448 0 : aGrfSet.Put( *pSet );
449 0 : if( aGrfSet.Count() )
450 0 : rSh.SetAttrSet( aGrfSet );
451 :
452 0 : rSh.EndUndo(UNDO_END);
453 0 : rSh.EndAllAction();
454 0 : }
455 : }
456 0 : break;
457 :
458 : case FN_GRAPHIC_MIRROR_ON_EVEN_PAGES:
459 : {
460 0 : SfxItemSet aSet(rSh.GetAttrPool(), RES_GRFATR_MIRRORGRF, RES_GRFATR_MIRRORGRF);
461 0 : rSh.GetCurAttr( aSet );
462 0 : SwMirrorGrf aGrf((const SwMirrorGrf &)aSet.Get(RES_GRFATR_MIRRORGRF));
463 0 : aGrf.SetGrfToggle(!aGrf.IsGrfToggle());
464 0 : rSh.SetAttrItem(aGrf);
465 : }
466 0 : break;
467 :
468 : default:
469 : OSL_ENSURE(false, "wrong dispatcher");
470 0 : return;
471 : }
472 : }
473 :
474 0 : void SwGrfShell::ExecAttr( SfxRequest &rReq )
475 : {
476 : sal_uInt16 nGrfType;
477 0 : if( CNT_GRF == GetShell().GetCntType() &&
478 0 : ( GRAPHIC_BITMAP == ( nGrfType = GetShell().GetGraphicType()) ||
479 : GRAPHIC_GDIMETAFILE == nGrfType ))
480 : {
481 0 : SfxItemSet aGrfSet( GetShell().GetAttrPool(), RES_GRFATR_BEGIN,
482 0 : RES_GRFATR_END -1 );
483 0 : const SfxItemSet *pArgs = rReq.GetArgs();
484 : const SfxPoolItem* pItem;
485 0 : sal_uInt16 nSlot = rReq.GetSlot();
486 0 : if( !pArgs || SfxItemState::SET != pArgs->GetItemState( nSlot, false, &pItem ))
487 0 : pItem = 0;
488 :
489 0 : switch( nSlot )
490 : {
491 : case SID_FLIP_VERTICAL:
492 : case SID_FLIP_HORIZONTAL:
493 : {
494 0 : GetShell().GetCurAttr( aGrfSet );
495 0 : SwMirrorGrf aMirror( (SwMirrorGrf&)aGrfSet.Get( RES_GRFATR_MIRRORGRF ) );
496 0 : sal_uInt16 nMirror = aMirror.GetValue();
497 0 : if ( nSlot==SID_FLIP_HORIZONTAL )
498 0 : switch( nMirror )
499 : {
500 0 : case RES_MIRROR_GRAPH_DONT: nMirror = RES_MIRROR_GRAPH_VERT;
501 0 : break;
502 0 : case RES_MIRROR_GRAPH_HOR: nMirror = RES_MIRROR_GRAPH_BOTH;
503 0 : break;
504 0 : case RES_MIRROR_GRAPH_VERT: nMirror = RES_MIRROR_GRAPH_DONT;
505 0 : break;
506 0 : case RES_MIRROR_GRAPH_BOTH: nMirror = RES_MIRROR_GRAPH_HOR;
507 0 : break;
508 : }
509 : else
510 0 : switch( nMirror )
511 : {
512 0 : case RES_MIRROR_GRAPH_DONT: nMirror = RES_MIRROR_GRAPH_HOR;
513 0 : break;
514 0 : case RES_MIRROR_GRAPH_VERT: nMirror = RES_MIRROR_GRAPH_BOTH;
515 0 : break;
516 0 : case RES_MIRROR_GRAPH_HOR: nMirror = RES_MIRROR_GRAPH_DONT;
517 0 : break;
518 0 : case RES_MIRROR_GRAPH_BOTH: nMirror = RES_MIRROR_GRAPH_VERT;
519 0 : break;
520 : }
521 0 : aMirror.SetValue( nMirror );
522 0 : aGrfSet.ClearItem();
523 0 : aGrfSet.Put( aMirror );
524 : }
525 0 : break;
526 :
527 : case SID_ATTR_GRAF_LUMINANCE:
528 0 : if( pItem )
529 : aGrfSet.Put( SwLuminanceGrf(
530 0 : ((SfxInt16Item*)pItem)->GetValue() ));
531 0 : break;
532 :
533 : case SID_ATTR_GRAF_CONTRAST:
534 0 : if( pItem )
535 : aGrfSet.Put( SwContrastGrf(
536 0 : ((SfxInt16Item*)pItem)->GetValue() ));
537 0 : break;
538 :
539 : case SID_ATTR_GRAF_RED:
540 0 : if( pItem )
541 : aGrfSet.Put( SwChannelRGrf(
542 0 : ((SfxInt16Item*)pItem)->GetValue() ));
543 0 : break;
544 :
545 : case SID_ATTR_GRAF_GREEN:
546 0 : if( pItem )
547 : aGrfSet.Put( SwChannelGGrf(
548 0 : ((SfxInt16Item*)pItem)->GetValue() ));
549 0 : break;
550 :
551 : case SID_ATTR_GRAF_BLUE:
552 0 : if( pItem )
553 : aGrfSet.Put( SwChannelBGrf(
554 0 : ((SfxInt16Item*)pItem)->GetValue() ));
555 0 : break;
556 :
557 : case SID_ATTR_GRAF_GAMMA:
558 0 : if( pItem )
559 : {
560 0 : double fVal = ((SfxUInt32Item*)pItem)->GetValue();
561 0 : aGrfSet.Put( SwGammaGrf(fVal/100. ));
562 : }
563 0 : break;
564 :
565 : case SID_ATTR_GRAF_TRANSPARENCE:
566 0 : if( pItem )
567 : aGrfSet.Put( SwTransparencyGrf(
568 0 : static_cast< sal_Int8 >( ( (SfxUInt16Item*)pItem )->GetValue() ) ) );
569 0 : break;
570 :
571 : case SID_ATTR_GRAF_INVERT:
572 0 : if( pItem )
573 : aGrfSet.Put( SwInvertGrf(
574 0 : ((SfxBoolItem*)pItem)->GetValue() ));
575 0 : break;
576 :
577 : case SID_ATTR_GRAF_MODE:
578 0 : if( pItem )
579 : aGrfSet.Put( SwDrawModeGrf(
580 0 : ((SfxUInt16Item*)pItem)->GetValue() ));
581 0 : break;
582 :
583 : case SID_COLOR_SETTINGS:
584 : {
585 0 : svx::ToolboxAccess aToolboxAccess( TOOLBOX_NAME );
586 0 : aToolboxAccess.toggleToolbox();
587 0 : break;
588 : }
589 :
590 : case SID_GRFFILTER:
591 : case SID_GRFFILTER_INVERT:
592 : case SID_GRFFILTER_SMOOTH:
593 : case SID_GRFFILTER_SHARPEN:
594 : case SID_GRFFILTER_REMOVENOISE:
595 : case SID_GRFFILTER_SOBEL:
596 : case SID_GRFFILTER_MOSAIC:
597 : case SID_GRFFILTER_EMBOSS:
598 : case SID_GRFFILTER_POSTER:
599 : case SID_GRFFILTER_POPART:
600 : case SID_GRFFILTER_SEPIA:
601 : case SID_GRFFILTER_SOLARIZE:
602 0 : if( GRAPHIC_BITMAP == nGrfType )
603 : {
604 : // #119353# - robust
605 0 : const GraphicObject* pFilterObj( GetShell().GetGraphicObj() );
606 0 : if ( pFilterObj )
607 : {
608 0 : GraphicObject aFilterObj( *pFilterObj );
609 0 : if( SVX_GRAPHICFILTER_ERRCODE_NONE ==
610 0 : SvxGraphicFilter::ExecuteGrfFilterSlot( rReq, aFilterObj ))
611 0 : GetShell().ReRead( OUString(), OUString(),
612 0 : &aFilterObj.GetGraphic() );
613 : }
614 : }
615 0 : break;
616 :
617 : default:
618 : OSL_ENSURE(false, "wrong dispatcher");
619 : }
620 :
621 0 : if( aGrfSet.Count() )
622 0 : GetShell().SetAttrSet( aGrfSet );
623 : }
624 0 : GetView().GetViewFrame()->GetBindings().Invalidate(rReq.GetSlot());
625 0 : }
626 :
627 0 : void SwGrfShell::GetAttrState(SfxItemSet &rSet)
628 : {
629 0 : SwWrtShell &rSh = GetShell();
630 0 : SfxItemSet aCoreSet( GetPool(), aNoTxtNodeSetRange );
631 0 : rSh.GetCurAttr( aCoreSet );
632 0 : bool bParentCntProt = 0 != rSh.IsSelObjProtected( FLYPROTECT_CONTENT|FLYPROTECT_PARENT );
633 0 : bool bIsGrfCntnt = CNT_GRF == GetShell().GetCntType();
634 :
635 0 : SetGetStateSet( &rSet );
636 :
637 0 : SfxWhichIter aIter( rSet );
638 0 : sal_uInt16 nWhich = aIter.FirstWhich();
639 0 : while( nWhich )
640 : {
641 0 : bool bDisable = bParentCntProt;
642 0 : switch( nWhich )
643 : {
644 : case SID_INSERT_GRAPHIC:
645 : case FN_FORMAT_GRAFIC_DLG:
646 : case SID_TWAIN_TRANSFER:
647 0 : if( bParentCntProt || !bIsGrfCntnt )
648 0 : bDisable = true;
649 0 : else if ( nWhich == SID_INSERT_GRAPHIC
650 0 : && rSh.CrsrInsideInputFld() )
651 : {
652 0 : bDisable = true;
653 : }
654 0 : break;
655 :
656 : case SID_SAVE_GRAPHIC:
657 : case SID_EXTERNAL_EDIT:
658 0 : if( rSh.GetGraphicType() == GRAPHIC_NONE )
659 0 : bDisable = true;
660 0 : break;
661 :
662 : case SID_COLOR_SETTINGS:
663 : {
664 0 : if ( bParentCntProt || !bIsGrfCntnt )
665 0 : bDisable = true;
666 : else
667 : {
668 0 : svx::ToolboxAccess aToolboxAccess( TOOLBOX_NAME );
669 0 : rSet.Put( SfxBoolItem( nWhich, aToolboxAccess.isToolboxVisible() ) );
670 : }
671 0 : break;
672 : }
673 :
674 : case SID_FLIP_HORIZONTAL:
675 0 : if( !bParentCntProt )
676 : {
677 : MirrorGraph nState = static_cast< MirrorGraph >(((const SwMirrorGrf &) aCoreSet.Get(
678 0 : RES_GRFATR_MIRRORGRF )).GetValue());
679 :
680 0 : rSet.Put(SfxBoolItem( nWhich, nState == RES_MIRROR_GRAPH_VERT ||
681 0 : nState == RES_MIRROR_GRAPH_BOTH));
682 : }
683 0 : break;
684 :
685 : case SID_FLIP_VERTICAL:
686 0 : if( !bParentCntProt )
687 : {
688 : MirrorGraph nState = static_cast< MirrorGraph >(((const SwMirrorGrf &) aCoreSet.Get(
689 0 : RES_GRFATR_MIRRORGRF )).GetValue());
690 :
691 0 : rSet.Put(SfxBoolItem( nWhich, nState == RES_MIRROR_GRAPH_HOR ||
692 0 : nState == RES_MIRROR_GRAPH_BOTH));
693 : }
694 0 : break;
695 :
696 : case SID_ATTR_GRAF_LUMINANCE:
697 0 : if( !bParentCntProt )
698 : rSet.Put( SfxInt16Item( nWhich, ((SwLuminanceGrf&)
699 0 : aCoreSet.Get(RES_GRFATR_LUMINANCE)).GetValue() ));
700 0 : break;
701 :
702 : case SID_ATTR_GRAF_CONTRAST:
703 0 : if( !bParentCntProt )
704 : rSet.Put( SfxInt16Item( nWhich, ((SwContrastGrf&)
705 0 : aCoreSet.Get(RES_GRFATR_CONTRAST)).GetValue() ));
706 0 : break;
707 :
708 : case SID_ATTR_GRAF_RED:
709 0 : if( !bParentCntProt )
710 : rSet.Put( SfxInt16Item( nWhich, ((SwChannelRGrf&)
711 0 : aCoreSet.Get(RES_GRFATR_CHANNELR)).GetValue() ));
712 0 : break;
713 :
714 : case SID_ATTR_GRAF_GREEN:
715 0 : if( !bParentCntProt )
716 : rSet.Put( SfxInt16Item( nWhich, ((SwChannelGGrf&)
717 0 : aCoreSet.Get(RES_GRFATR_CHANNELG)).GetValue() ));
718 0 : break;
719 :
720 : case SID_ATTR_GRAF_BLUE:
721 0 : if( !bParentCntProt )
722 : rSet.Put( SfxInt16Item( nWhich, ((SwChannelBGrf&)
723 0 : aCoreSet.Get(RES_GRFATR_CHANNELB)).GetValue() ));
724 0 : break;
725 :
726 : case SID_ATTR_GRAF_GAMMA:
727 0 : if( !bParentCntProt )
728 : rSet.Put( SfxUInt32Item( nWhich, static_cast< sal_uInt32 >(
729 0 : ( (SwGammaGrf&)aCoreSet.Get( RES_GRFATR_GAMMA ) ).GetValue() * 100 ) ) );
730 0 : break;
731 :
732 : case SID_ATTR_GRAF_TRANSPARENCE:
733 0 : if( !bParentCntProt )
734 : {
735 : // #119353# - robust
736 0 : const GraphicObject* pGrafObj = rSh.GetGraphicObj();
737 0 : if ( pGrafObj )
738 : {
739 0 : if( pGrafObj->IsAnimated() ||
740 0 : GRAPHIC_GDIMETAFILE == pGrafObj->GetType() )
741 0 : bDisable = true;
742 : else
743 : rSet.Put( SfxUInt16Item( nWhich, ((SwTransparencyGrf&)
744 0 : aCoreSet.Get(RES_GRFATR_TRANSPARENCY)).GetValue() ));
745 : }
746 : }
747 0 : break;
748 :
749 : case SID_ATTR_GRAF_INVERT:
750 0 : if( !bParentCntProt )
751 : rSet.Put( SfxBoolItem( nWhich, ((SwInvertGrf&)
752 0 : aCoreSet.Get(RES_GRFATR_INVERT)).GetValue() ));
753 0 : break;
754 :
755 : case SID_ATTR_GRAF_MODE:
756 0 : if( !bParentCntProt )
757 : rSet.Put( SfxUInt16Item( nWhich, ((SwDrawModeGrf&)
758 0 : aCoreSet.Get(RES_GRFATR_DRAWMODE)).GetValue() ));
759 0 : break;
760 :
761 : case SID_GRFFILTER:
762 : case SID_GRFFILTER_INVERT:
763 : case SID_GRFFILTER_SMOOTH:
764 : case SID_GRFFILTER_SHARPEN:
765 : case SID_GRFFILTER_REMOVENOISE:
766 : case SID_GRFFILTER_SOBEL:
767 : case SID_GRFFILTER_MOSAIC:
768 : case SID_GRFFILTER_EMBOSS:
769 : case SID_GRFFILTER_POSTER:
770 : case SID_GRFFILTER_POPART:
771 : case SID_GRFFILTER_SEPIA:
772 : case SID_GRFFILTER_SOLARIZE:
773 : {
774 0 : if( bParentCntProt || !bIsGrfCntnt )
775 0 : bDisable = true;
776 : // #i59688# load graphic only if type is unknown
777 : else
778 : {
779 0 : const sal_uInt16 eGraphicType( rSh.GetGraphicType() );
780 0 : if ( ( eGraphicType == GRAPHIC_NONE ||
781 0 : eGraphicType == GRAPHIC_DEFAULT ) &&
782 0 : rSh.IsGrfSwapOut( true ) )
783 : {
784 0 : rSet.DisableItem( nWhich );
785 0 : if( AddGrfUpdateSlot( nWhich ))
786 0 : rSh.GetGraphic(false); // start the loading
787 : }
788 : else
789 : {
790 0 : bDisable = eGraphicType != GRAPHIC_BITMAP;
791 : }
792 : }
793 : }
794 0 : break;
795 :
796 : default:
797 0 : bDisable = false;
798 : }
799 :
800 0 : if( bDisable )
801 0 : rSet.DisableItem( nWhich );
802 0 : nWhich = aIter.NextWhich();
803 : }
804 0 : SetGetStateSet( 0 );
805 0 : }
806 :
807 0 : void SwGrfShell::ExecuteRotation(SfxRequest &rReq)
808 : {
809 : sal_uInt16 aRotation;
810 :
811 0 : SwWrtShell& rShell = GetShell();
812 :
813 0 : if (rReq.GetSlot() == SID_ROTATE_GRAPHIC_LEFT)
814 : {
815 0 : aRotation = 900;
816 : }
817 0 : else if (rReq.GetSlot() == SID_ROTATE_GRAPHIC_RIGHT)
818 : {
819 0 : aRotation = 2700;
820 : }
821 : else
822 : {
823 0 : return;
824 : }
825 :
826 0 : rShell.StartAllAction();
827 0 : rShell.StartUndo(UNDO_START);
828 :
829 0 : Graphic aGraphic = *rShell.GetGraphic();
830 0 : GraphicNativeTransform aTransform(aGraphic);
831 0 : aTransform.rotate(aRotation);
832 0 : rShell.ReRead(OUString(), OUString(), (const Graphic*) &aGraphic);
833 :
834 0 : SwFlyFrmAttrMgr aManager(false, &rShell, rShell.IsFrmSelected() ? FRMMGR_TYPE_NONE : FRMMGR_TYPE_GRF);
835 0 : const long nRotatedWidth = aManager.GetSize().Height();
836 0 : const long nRotatedHeight = aManager.GetSize().Width();
837 0 : Size aSize(nRotatedWidth, nRotatedHeight);
838 0 : aManager.SetSize(aSize);
839 0 : aManager.UpdateFlyFrm();
840 :
841 0 : SfxItemSet aSet( rShell.GetAttrPool(), RES_GRFATR_CROPGRF, RES_GRFATR_CROPGRF );
842 0 : rShell.GetCurAttr( aSet );
843 0 : SwCropGrf aCrop( (const SwCropGrf&) aSet.Get(RES_GRFATR_CROPGRF) );
844 0 : Rectangle aCropRectangle(aCrop.GetLeft(), aCrop.GetTop(), aCrop.GetRight(), aCrop.GetBottom());
845 :
846 0 : if (rReq.GetSlot() == SID_ROTATE_GRAPHIC_LEFT)
847 : {
848 0 : aCrop.SetLeft( aCropRectangle.Top() );
849 0 : aCrop.SetTop( aCropRectangle.Right() );
850 0 : aCrop.SetRight( aCropRectangle.Bottom() );
851 0 : aCrop.SetBottom( aCropRectangle.Left() );
852 : }
853 0 : else if (rReq.GetSlot() == SID_ROTATE_GRAPHIC_RIGHT)
854 : {
855 0 : aCrop.SetLeft( aCropRectangle.Bottom() );
856 0 : aCrop.SetTop( aCropRectangle.Left() );
857 0 : aCrop.SetRight( aCropRectangle.Top() );
858 0 : aCrop.SetBottom( aCropRectangle.Right() );
859 : }
860 :
861 0 : rShell.SetAttrItem(aCrop);
862 :
863 0 : rShell.EndUndo(UNDO_END);
864 0 : rShell.EndAllAction();
865 : }
866 :
867 0 : void SwGrfShell::GetAttrStateForRotation(SfxItemSet &rSet)
868 : {
869 0 : SwWrtShell& rShell = GetShell();
870 0 : bool bIsParentContentProtected = 0 != rShell.IsSelObjProtected( FLYPROTECT_CONTENT|FLYPROTECT_PARENT );
871 :
872 0 : SetGetStateSet( &rSet );
873 :
874 0 : SfxWhichIter aIterator( rSet );
875 0 : sal_uInt16 nWhich = aIterator.FirstWhich();
876 0 : while( nWhich )
877 : {
878 0 : bool bDisable = bIsParentContentProtected;
879 0 : switch( nWhich )
880 : {
881 : case SID_ROTATE_GRAPHIC_LEFT:
882 : case SID_ROTATE_GRAPHIC_RIGHT:
883 0 : if( rShell.GetGraphicType() == GRAPHIC_NONE )
884 : {
885 0 : bDisable = true;
886 : }
887 : else
888 : {
889 0 : Graphic aGraphic = *rShell.GetGraphic();
890 0 : GraphicNativeTransform aTransform(aGraphic);
891 0 : if (!aTransform.canBeRotated())
892 : {
893 0 : bDisable = true;
894 0 : }
895 : }
896 0 : break;
897 : default:
898 0 : bDisable = false;
899 : }
900 :
901 0 : if( bDisable )
902 0 : rSet.DisableItem( nWhich );
903 0 : nWhich = aIterator.NextWhich();
904 : }
905 0 : SetGetStateSet( 0 );
906 0 : }
907 :
908 0 : SwGrfShell::SwGrfShell(SwView &_rView) :
909 0 : SwBaseShell(_rView)
910 : {
911 0 : SetName(OUString("Graphic"));
912 0 : SetHelpId(SW_GRFSHELL);
913 0 : SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_Graphic));
914 270 : }
915 :
916 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|