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