xref: /trunk/main/sw/source/ui/shells/grfsh.cxx (revision 870262e3)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_sw.hxx"
24 
25 #include <cmdid.h>
26 #include <hintids.hxx>
27 #include <tools/urlobj.hxx>
28 #include <vcl/msgbox.hxx>
29 #include <svl/stritem.hxx>
30 #include <svl/whiter.hxx>
31 #include <svl/urihelper.hxx>
32 #include <sfx2/docfile.hxx>
33 #include <sfx2/dispatch.hxx>
34 #include <sfx2/objface.hxx>
35 #include <editeng/sizeitem.hxx>
36 #include <editeng/protitem.hxx>
37 #include <sfx2/request.hxx>
38 #include <sfx2/sidebar/EnumContext.hxx>
39 #include <svl/srchitem.hxx>
40 #include <svx/htmlmode.hxx>
41 #include <svx/sdgluitm.hxx>
42 #include <svx/sdgcoitm.hxx>
43 #include <svx/sdggaitm.hxx>
44 #include <svx/sdgtritm.hxx>
45 #include <svx/sdginitm.hxx>
46 #include <svx/sdgmoitm.hxx>
47 #include <editeng/brshitem.hxx>
48 #include <svx/grfflt.hxx>
49 #include <svx/tbxcolor.hxx>
50 #include <fmturl.hxx>
51 #include <view.hxx>
52 #include <wrtsh.hxx>
53 #include <viewopt.hxx>
54 #include <swmodule.hxx>
55 #include <frmatr.hxx>
56 #include <swundo.hxx>
57 #include <uitool.hxx>
58 #include <docsh.hxx>
59 #include <grfsh.hxx>
60 #include <frmmgr.hxx>
61 #include <frmdlg.hxx>
62 #include <frmfmt.hxx>
63 #include <grfatr.hxx>
64 #include <usrpref.hxx>
65 #include <edtwin.hxx>
66 #include <swwait.hxx>
67 #include <shells.hrc>
68 #include <popup.hrc>
69 #include <doc.hxx>
70 #include <docsh.hxx>
71 #include <svx/drawitem.hxx>
72 #define SwGrfShell
73 #include <sfx2/msg.hxx>
74 #include "swslots.hxx"
75 #include "swabstdlg.hxx"
76 #include <drawdoc.hxx>
77 
78 #define TOOLBOX_NAME    ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "colorbar" ) )
79 
SFX_IMPL_INTERFACE(SwGrfShell,SwBaseShell,SW_RES (STR_SHELLNAME_GRAPHIC))80 SFX_IMPL_INTERFACE(SwGrfShell, SwBaseShell, SW_RES(STR_SHELLNAME_GRAPHIC))
81 {
82 	SFX_POPUPMENU_REGISTRATION(SW_RES(MN_GRF_POPUPMENU));
83 	SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_GRAFIK_TOOLBOX));
84 }
85 
Execute(SfxRequest & rReq)86 void SwGrfShell::Execute(SfxRequest &rReq)
87 {
88 	SwWrtShell &rSh = GetShell();
89 
90 	sal_uInt16 nSlot = rReq.GetSlot();
91 	switch(nSlot)
92 	{
93 		case SID_TWAIN_TRANSFER:
94 		{
95             GetView().ExecuteScan( rReq );
96 			break;
97 		}
98         case FN_SAVE_GRAPHIC:
99         {
100             const Graphic *pGraphic;
101             if(0 != (pGraphic = rSh.GetGraphic()))
102             {
103 			    String sGrfNm, sFilterNm;
104 			    rSh.GetGrfNms( &sGrfNm, &sFilterNm );
105                 ExportGraphic( *pGraphic, sGrfNm );
106             }
107         }
108         break;
109         case SID_INSERT_GRAPHIC:
110         {
111             // #123922# implement slot independent from the two below to
112             // bring up the insert graphic dialog and associated actions
113             SwView& rView = GetView();
114             rReq.SetReturnValue(SfxBoolItem(nSlot, rView.InsertGraphicDlg( rReq )));
115             break;
116         }
117 		case FN_FORMAT_GRAFIC_DLG:
118 		case FN_DRAW_WRAP_DLG:
119 		{
120 			SwFlyFrmAttrMgr aMgr( sal_False, &rSh, rSh.IsFrmSelected() ?
121 											   FRMMGR_TYPE_NONE : FRMMGR_TYPE_GRF);
122 			const SwViewOption* pVOpt = rSh.GetViewOptions();
123 			SwViewOption aUsrPref( *pVOpt );
124 
125             SfxItemSet aSet(GetPool(), //UUUU sorted by indices
126 
127                 RES_FRMATR_BEGIN,RES_FRMATR_END - 1,                            // [   82
128                 RES_GRFATR_MIRRORGRF,RES_GRFATR_CROPGRF,                        // [  123
129 
130                 //UUUU FillAttribute support
131                 XATTR_FILL_FIRST,       XATTR_FILL_LAST,                        // [ 1014
132 
133                 SID_DOCFRAME,SID_DOCFRAME,                                      // [ 5598
134                 SID_ATTR_BORDER_INNER,SID_ATTR_BORDER_INNER,                    // [10023
135                 SID_ATTR_PAGE_SIZE,SID_ATTR_PAGE_SIZE,                          // [10051
136                 SID_ATTR_GRAF_KEEP_ZOOM,SID_ATTR_GRAF_KEEP_ZOOM,                // [10882
137                 SID_ATTR_GRAF_FRMSIZE,SID_ATTR_GRAF_GRAPHIC,                    // [10884, contains SID_ATTR_GRAF_FRMSIZE_PERCENT
138 
139                 //UUUU items to hand over XPropertyList things like
140                 // XColorList, XHatchList, XGradientList and XBitmapList
141                 // to the Area TabPage
142                 SID_COLOR_TABLE,        SID_BITMAP_LIST,                        // [10179
143 
144                 SID_HTML_MODE,SID_HTML_MODE,                                    // [10414
145                 FN_GET_PRINT_AREA,FN_GET_PRINT_AREA,                            // [21032
146                 FN_PARAM_GRF_CONNECT,FN_PARAM_GRF_CONNECT,                      // [21153
147                 FN_PARAM_GRF_DIALOG,FN_PARAM_GRF_DIALOG,                        // [21171
148                 FN_SET_FRM_NAME,FN_KEEP_ASPECT_RATIO,                           // [21306
149                 FN_SET_FRM_ALT_NAME,FN_SET_FRM_ALT_NAME,                        // [21318
150                 0);
151 
152             //UUUU create needed items for XPropertyList entries from the DrawModel so that
153             // the Area TabPage can access them
154             const SwDrawModel* pDrawModel = rSh.GetView().GetDocShell()->GetDoc()->GetDrawModel();
155 
156             aSet.Put(SvxColorTableItem(pDrawModel->GetColorTableFromSdrModel(), SID_COLOR_TABLE));
157             aSet.Put(SvxGradientListItem(pDrawModel->GetGradientListFromSdrModel(), SID_GRADIENT_LIST));
158             aSet.Put(SvxHatchListItem(pDrawModel->GetHatchListFromSdrModel(), SID_HATCH_LIST));
159             aSet.Put(SvxBitmapListItem(pDrawModel->GetBitmapListFromSdrModel(), SID_BITMAP_LIST));
160 
161 			sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
162 			aSet.Put(SfxUInt16Item(SID_HTML_MODE, nHtmlMode));
163 			FieldUnit eMetric = ::GetDfltMetric((0 != (nHtmlMode&HTMLMODE_ON)));
164             SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)) );
165 
166 			const SwRect* pRect = &rSh.GetAnyCurRect(RECT_PAGE);
167 			SwFmtFrmSize aFrmSize( ATT_VAR_SIZE, pRect->Width(), pRect->Height());
168 			aFrmSize.SetWhich( GetPool().GetWhich( SID_ATTR_PAGE_SIZE ) );
169 			aSet.Put( aFrmSize );
170 
171 			aSet.Put(SfxStringItem(FN_SET_FRM_NAME, rSh.GetFlyName()));
172             if ( nSlot == FN_FORMAT_GRAFIC_DLG )
173             {
174                 aSet.Put( SfxStringItem( FN_SET_FRM_ALT_NAME, rSh.GetObjTitle() ) );
175             }
176 
177 			pRect = &rSh.GetAnyCurRect(RECT_PAGE_PRT);
178 			aFrmSize.SetWidth( pRect->Width() );
179 			aFrmSize.SetHeight( pRect->Height() );
180 			aFrmSize.SetWhich( GetPool().GetWhich(FN_GET_PRINT_AREA) );
181 			aSet.Put( aFrmSize );
182 
183 			aSet.Put( aMgr.GetAttrSet() );
184 			aSet.SetParent( aMgr.GetAttrSet().GetParent() );
185 
186 			// Bei %-Werten Groesse initialisieren
187 			SwFmtFrmSize aSizeCopy = (const SwFmtFrmSize&)aSet.Get(RES_FRM_SIZE);
188 			if (aSizeCopy.GetWidthPercent() && aSizeCopy.GetWidthPercent() != 0xff)
189 				aSizeCopy.SetWidth(rSh.GetAnyCurRect(RECT_FLY_EMBEDDED).Width());
190 			if (aSizeCopy.GetHeightPercent() && aSizeCopy.GetHeightPercent() != 0xff)
191 				aSizeCopy.SetHeight(rSh.GetAnyCurRect(RECT_FLY_EMBEDDED).Height());
192 
193 			// and now set the size for "external" tabpages
194 			{
195 				SvxSizeItem aSzItm( SID_ATTR_GRAF_FRMSIZE, aSizeCopy.GetSize() );
196 				aSet.Put( aSzItm );
197 
198 				Size aSz( aSizeCopy.GetWidthPercent(), aSizeCopy.GetHeightPercent() );
199 				if( 0xff == aSz.Width() ) 	aSz.Width() = 0;
200 				if( 0xff == aSz.Height() )  aSz.Height() = 0;
201 
202 				aSzItm.SetSize( aSz );
203 				aSzItm.SetWhich( SID_ATTR_GRAF_FRMSIZE_PERCENT );
204 				aSet.Put( aSzItm );
205 			}
206 
207 			String sGrfNm, sFilterNm;
208 			rSh.GetGrfNms( &sGrfNm, &sFilterNm );
209 			if( sGrfNm.Len() )
210 			{
211 				aSet.Put( SvxBrushItem( INetURLObject::decode( sGrfNm,
212 										INET_HEX_ESCAPE,
213 						   				INetURLObject::DECODE_UNAMBIGUOUS,
214 										RTL_TEXTENCODING_UTF8 ),
215 										sFilterNm, GPOS_LT,
216 										SID_ATTR_GRAF_GRAPHIC ));
217 			}
218 			else
219 			{
220                 // --> OD 2005-02-09 #119353# - robust
221                 const GraphicObject* pGrfObj = rSh.GetGraphicObj();
222                 if ( pGrfObj )
223                 {
224                     aSet.Put( SvxBrushItem( *pGrfObj, GPOS_LT,
225                                             SID_ATTR_GRAF_GRAPHIC ) );
226                 }
227                 // <--
228 			}
229             aSet.Put( SfxBoolItem( FN_PARAM_GRF_CONNECT, sGrfNm.Len() > 0 ) );
230 
231 			// get Mirror and Crop
232 			{
233 				SfxItemSet aTmpSet( rSh.GetAttrPool(),
234 								RES_GRFATR_MIRRORGRF, RES_GRFATR_CROPGRF );
235 
236                 rSh.GetCurAttr( aTmpSet );
237 				aSet.Put( aTmpSet );
238 			}
239 
240 			aSet.Put(SfxBoolItem(FN_KEEP_ASPECT_RATIO, aUsrPref.IsKeepRatio()));
241 			aSet.Put(SfxBoolItem( SID_ATTR_GRAF_KEEP_ZOOM, aUsrPref.IsGrfKeepZoom()));
242 
243 			aSet.Put(SfxFrameItem( SID_DOCFRAME, &GetView().GetViewFrame()->GetTopFrame()));
244 
245 			SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
246             DBG_ASSERT(pFact, "Dialogdiet fail!");
247             SfxAbstractTabDialog* pDlg = pFact->CreateFrmTabDialog( DLG_FRM_GRF,
248 													GetView().GetViewFrame(),
249 													GetView().GetWindow(),
250 													aSet, sal_False, DLG_FRM_GRF);
251             DBG_ASSERT(pDlg, "Dialogdiet fail!");
252 
253             if (nSlot == FN_DRAW_WRAP_DLG)
254                 pDlg->SetCurPageId(TP_FRM_WRAP);
255 
256 			if( pDlg->Execute() )
257 			{
258 				rSh.StartAllAction();
259 				rSh.StartUndo(UNDO_START);
260 				const SfxPoolItem* pItem;
261 				SfxItemSet* pSet = (SfxItemSet*)pDlg->GetOutputItemSet();
262                 rReq.Done(*pSet);
263 				// change the 2 frmsize SizeItems to the correct SwFrmSizeItem
264 				if( SFX_ITEM_SET == pSet->GetItemState(
265 								SID_ATTR_GRAF_FRMSIZE, sal_False, &pItem ))
266 				{
267 					SwFmtFrmSize aSize;
268 					const Size& rSz = ((SvxSizeItem*)pItem)->GetSize();
269 					aSize.SetWidth( rSz.Width() );
270 					aSize.SetHeight( rSz.Height() );
271 
272 					if( SFX_ITEM_SET == pSet->GetItemState(
273 							SID_ATTR_GRAF_FRMSIZE_PERCENT, sal_False, &pItem ))
274 					{
275                         const Size& rRelativeSize = ((SvxSizeItem*)pItem)->GetSize();
276                         aSize.SetWidthPercent( static_cast< sal_uInt8 >( rRelativeSize.Width() ) );
277                         aSize.SetHeightPercent( static_cast< sal_uInt8 >( rRelativeSize.Height() ) );
278 					}
279 					pSet->Put( aSize );
280 				}
281 
282 				// Vorlagen-AutoUpdate
283 				SwFrmFmt* pFmt = rSh.GetCurFrmFmt();
284 				if(pFmt && pFmt->IsAutoUpdateFmt())
285 				{
286                     pFmt->SetFmtAttr(*pSet);
287 					SfxItemSet aShellSet(GetPool(), RES_FRM_SIZE,	RES_FRM_SIZE,
288 													RES_SURROUND, 	RES_SURROUND,
289 													RES_ANCHOR,		RES_ANCHOR,
290 													RES_VERT_ORIENT,RES_HORI_ORIENT,
291 													0);
292 					aShellSet.Put(*pSet);
293 					aMgr.SetAttrSet(aShellSet);
294 				}
295 				else
296 				{
297 					aMgr.SetAttrSet(*pSet);
298 				}
299 				aMgr.UpdateFlyFrm();
300 
301 				sal_Bool bApplyUsrPref = sal_False;
302 				if (SFX_ITEM_SET == pSet->GetItemState(
303 					FN_KEEP_ASPECT_RATIO, sal_True, &pItem ))
304 				{
305 					aUsrPref.SetKeepRatio(
306 									((const SfxBoolItem*)pItem)->GetValue() );
307 					bApplyUsrPref = sal_True;
308 				}
309 				if( SFX_ITEM_SET == pSet->GetItemState(
310 					SID_ATTR_GRAF_KEEP_ZOOM, sal_True, &pItem ))
311 				{
312 					aUsrPref.SetGrfKeepZoom(
313 									((const SfxBoolItem*)pItem)->GetValue() );
314 					bApplyUsrPref = sal_True;
315 				}
316 
317 				if( bApplyUsrPref )
318 					SW_MOD()->ApplyUsrPref(aUsrPref, &GetView());
319 
320 				// and now set all the graphic attributes and other stuff
321 				if( SFX_ITEM_SET == pSet->GetItemState(
322 										SID_ATTR_GRAF_GRAPHIC, sal_True, &pItem ))
323 				{
324 					if( ((SvxBrushItem*)pItem)->GetGraphicLink() )
325 						sGrfNm = *((SvxBrushItem*)pItem)->GetGraphicLink();
326 					else
327 						sGrfNm.Erase();
328 
329 					if( ((SvxBrushItem*)pItem)->GetGraphicFilter() )
330 						sFilterNm = *((SvxBrushItem*)pItem)->GetGraphicFilter();
331 					else
332 						sFilterNm.Erase();
333 
334 					if( sGrfNm.Len() )
335 					{
336                         SwDocShell* pDocSh = GetView().GetDocShell();
337                         SwWait aWait( *pDocSh, true );
338                         SfxMedium* pMedium = pDocSh->GetMedium();
339                         INetURLObject aAbs;
340                         if( pMedium )
341                             aAbs = pMedium->GetURLObject();
342                         rSh.ReRead( URIHelper::SmartRel2Abs(
343                                         aAbs, sGrfNm,
344                                         URIHelper::GetMaybeFileHdl() ),
345 								 	sFilterNm, 0 );
346 					}
347 				}
348                 if ( SFX_ITEM_SET == pSet->GetItemState(
349 										FN_SET_FRM_ALT_NAME, sal_True, &pItem ))
350                 {
351                     // --> OD 2009-07-13 #i73249#
352 //                    rSh.SetAlternateText(
353 //                                ((const SfxStringItem*)pItem)->GetValue() );
354                     rSh.SetObjTitle( ((const SfxStringItem*)pItem)->GetValue() );
355                     // <--
356                 }
357 
358 				SfxItemSet aGrfSet( rSh.GetAttrPool(), RES_GRFATR_BEGIN,
359 													   RES_GRFATR_END-1 );
360 				aGrfSet.Put( *pSet );
361 				if( aGrfSet.Count() )
362 					rSh.SetAttrSet( aGrfSet );
363 
364 				rSh.EndUndo(UNDO_END);
365 				rSh.EndAllAction();
366 			}
367 			delete pDlg;
368 		}
369 		break;
370 
371 		case FN_GRAPHIC_MIRROR_ON_EVEN_PAGES:
372 		{
373 			SfxItemSet aSet(rSh.GetAttrPool(), RES_GRFATR_MIRRORGRF, RES_GRFATR_MIRRORGRF);
374             rSh.GetCurAttr( aSet );
375 			SwMirrorGrf aGrf((const SwMirrorGrf &)aSet.Get(RES_GRFATR_MIRRORGRF));
376 			aGrf.SetGrfToggle(!aGrf.IsGrfToggle());
377 			rSh.SetAttrItem(aGrf);
378 		}
379 		break;
380 
381 		default:
382 			ASSERT(sal_False, "wrong dispatcher");
383 			return;
384 	}
385 }
386 
387 
ExecAttr(SfxRequest & rReq)388 void SwGrfShell::ExecAttr( SfxRequest &rReq )
389 {
390 	sal_uInt16 nGrfType;
391 	if( CNT_GRF == GetShell().GetCntType() &&
392 		( GRAPHIC_BITMAP == ( nGrfType = GetShell().GetGraphicType()) ||
393 		  GRAPHIC_GDIMETAFILE == nGrfType ))
394 	{
395 		SfxItemSet aGrfSet( GetShell().GetAttrPool(), RES_GRFATR_BEGIN,
396 													  RES_GRFATR_END -1 );
397     	const SfxItemSet *pArgs = rReq.GetArgs();
398     	const SfxPoolItem* pItem;
399     	sal_uInt16 nSlot = rReq.GetSlot();
400 	    if( !pArgs || SFX_ITEM_SET != pArgs->GetItemState( nSlot, sal_False, &pItem ))
401 			pItem = 0;
402 
403         switch( nSlot )
404         {
405             case SID_FLIP_VERTICAL:
406             case SID_FLIP_HORIZONTAL:
407             {
408                 GetShell().GetCurAttr( aGrfSet );
409                 SwMirrorGrf aMirror( (SwMirrorGrf&)aGrfSet.Get( RES_GRFATR_MIRRORGRF ) );
410                 sal_uInt16 nMirror = aMirror.GetValue();
411                 if ( nSlot==SID_FLIP_HORIZONTAL )
412                     switch( nMirror )
413                     {
414                     case RES_MIRROR_GRAPH_DONT: nMirror = RES_MIRROR_GRAPH_VERT;
415                                                 break;
416                     case RES_MIRROR_GRAPH_HOR:  nMirror = RES_MIRROR_GRAPH_BOTH;
417                                                 break;
418                     case RES_MIRROR_GRAPH_VERT:   nMirror = RES_MIRROR_GRAPH_DONT;
419                                                 break;
420                     case RES_MIRROR_GRAPH_BOTH: nMirror = RES_MIRROR_GRAPH_HOR;
421                                                 break;
422                     }
423                 else
424                     switch( nMirror )
425                     {
426                     case RES_MIRROR_GRAPH_DONT: nMirror = RES_MIRROR_GRAPH_HOR;
427                                                 break;
428                     case RES_MIRROR_GRAPH_VERT: nMirror = RES_MIRROR_GRAPH_BOTH;
429                                                 break;
430                     case RES_MIRROR_GRAPH_HOR:    nMirror = RES_MIRROR_GRAPH_DONT;
431                                                 break;
432                     case RES_MIRROR_GRAPH_BOTH: nMirror = RES_MIRROR_GRAPH_VERT;
433                                                 break;
434                     }
435                 aMirror.SetValue( nMirror );
436                 aGrfSet.ClearItem();
437                 aGrfSet.Put( aMirror );
438             }
439             break;
440 
441 		case SID_ATTR_GRAF_LUMINANCE:
442 			if( pItem )
443 				aGrfSet.Put( SwLuminanceGrf(
444 							((SfxInt16Item*)pItem)->GetValue() ));
445 			break;
446 		case SID_ATTR_GRAF_CONTRAST:
447 			if( pItem )
448 				aGrfSet.Put( SwContrastGrf(
449 							((SfxInt16Item*)pItem)->GetValue() ));
450 			break;
451 		case SID_ATTR_GRAF_RED:
452 			if( pItem )
453 				aGrfSet.Put( SwChannelRGrf(
454 							((SfxInt16Item*)pItem)->GetValue() ));
455 			break;
456 		case SID_ATTR_GRAF_GREEN:
457 			if( pItem )
458 				aGrfSet.Put( SwChannelGGrf(
459 							((SfxInt16Item*)pItem)->GetValue() ));
460 			break;
461 		case SID_ATTR_GRAF_BLUE:
462 			if( pItem )
463 				aGrfSet.Put( SwChannelBGrf(
464 							((SfxInt16Item*)pItem)->GetValue() ));
465 			break;
466 		case SID_ATTR_GRAF_GAMMA:
467 			if( pItem )
468 			{
469 				double fVal = ((SfxUInt32Item*)pItem)->GetValue();
470 				aGrfSet.Put( SwGammaGrf(fVal/100. ));
471 			}
472 			break;
473 		case SID_ATTR_GRAF_TRANSPARENCE:
474 			if( pItem )
475                 aGrfSet.Put( SwTransparencyGrf(
476                     static_cast< sal_Int8 >( ( (SfxUInt16Item*)pItem )->GetValue() ) ) );
477 			break;
478 		case SID_ATTR_GRAF_INVERT:
479 			if( pItem )
480 				aGrfSet.Put( SwInvertGrf(
481 							((SfxBoolItem*)pItem)->GetValue() ));
482 			break;
483 
484 		case SID_ATTR_GRAF_MODE:
485 			if( pItem )
486 				aGrfSet.Put( SwDrawModeGrf(
487 							((SfxUInt16Item*)pItem)->GetValue() ));
488 			break;
489 
490         case SID_COLOR_SETTINGS:
491         {
492             svx::ToolboxAccess aToolboxAccess( TOOLBOX_NAME );
493             aToolboxAccess.toggleToolbox();
494             break;
495         }
496         case SID_GRFFILTER:
497         case SID_GRFFILTER_INVERT:
498 		case SID_GRFFILTER_SMOOTH:
499 		case SID_GRFFILTER_SHARPEN:
500 		case SID_GRFFILTER_REMOVENOISE:
501 		case SID_GRFFILTER_SOBEL:
502 		case SID_GRFFILTER_MOSAIC:
503 		case SID_GRFFILTER_EMBOSS:
504 		case SID_GRFFILTER_POSTER:
505 		case SID_GRFFILTER_POPART:
506 		case SID_GRFFILTER_SEPIA:
507 		case SID_GRFFILTER_SOLARIZE:
508 			if( GRAPHIC_BITMAP == nGrfType )
509 			{
510                 // --> OD 2005-02-09 #119353# - robust
511                 const GraphicObject* pFilterObj( GetShell().GetGraphicObj() );
512                 if ( pFilterObj )
513                 {
514                     GraphicObject aFilterObj( *pFilterObj );
515                     if( SVX_GRAPHICFILTER_ERRCODE_NONE ==
516                         SvxGraphicFilter::ExecuteGrfFilterSlot( rReq, aFilterObj ))
517                         GetShell().ReRead( aEmptyStr, aEmptyStr,
518                                            &aFilterObj.GetGraphic() );
519                 }
520                 // <--
521 			}
522 			break;
523 
524 		default:
525 			ASSERT(sal_False, "wrong dispatcher");
526 		}
527 		if( aGrfSet.Count() )
528 			GetShell().SetAttrSet( aGrfSet );
529 	}
530 	GetView().GetViewFrame()->GetBindings().Invalidate(rReq.GetSlot());
531 }
532 
GetAttrState(SfxItemSet & rSet)533 void SwGrfShell::GetAttrState(SfxItemSet &rSet)
534 {
535     SwWrtShell &rSh = GetShell();
536     SfxItemSet aCoreSet( GetPool(), aNoTxtNodeSetRange );
537     rSh.GetCurAttr( aCoreSet );
538     sal_Bool bParentCntProt = 0 != rSh.IsSelObjProtected( FLYPROTECT_CONTENT|FLYPROTECT_PARENT );
539     sal_Bool bIsGrfCntnt = CNT_GRF == GetShell().GetCntType();
540 
541     SetGetStateSet( &rSet );
542 
543     SfxWhichIter aIter( rSet );
544     sal_uInt16 nWhich = aIter.FirstWhich();
545     while( nWhich )
546     {
547         sal_Bool bDisable = bParentCntProt;
548         switch( nWhich )
549         {
550         case SID_INSERT_GRAPHIC:
551         case FN_FORMAT_GRAFIC_DLG:
552         case SID_TWAIN_TRANSFER:
553             if( bParentCntProt || !bIsGrfCntnt )
554                 bDisable = sal_True;
555             else if ( nWhich == SID_INSERT_GRAPHIC
556                       && rSh.CrsrInsideInputFld() )
557             {
558                 bDisable = sal_True;
559             }
560             break;
561 
562         case FN_SAVE_GRAPHIC:
563             if( rSh.GetGraphicType() == GRAPHIC_NONE )
564                 bDisable = sal_True;
565             break;
566 
567         case SID_COLOR_SETTINGS:
568         {
569             if ( bParentCntProt || !bIsGrfCntnt )
570                 bDisable = sal_True;
571             else
572             {
573                 svx::ToolboxAccess aToolboxAccess( TOOLBOX_NAME );
574                 rSet.Put( SfxBoolItem( nWhich, aToolboxAccess.isToolboxVisible() ) );
575             }
576             break;
577         }
578 
579         case SID_FLIP_HORIZONTAL:
580             if( !bParentCntProt )
581             {
582                 MirrorGraph nState = static_cast< MirrorGraph >(((const SwMirrorGrf &) aCoreSet.Get(
583                                         RES_GRFATR_MIRRORGRF )).GetValue());
584 
585                 rSet.Put(SfxBoolItem( nWhich, nState == RES_MIRROR_GRAPH_VERT ||
586                                               nState == RES_MIRROR_GRAPH_BOTH));
587             }
588             break;
589 
590         case SID_FLIP_VERTICAL:
591             if( !bParentCntProt )
592             {
593                 MirrorGraph nState = static_cast< MirrorGraph >(((const SwMirrorGrf &) aCoreSet.Get(
594                                         RES_GRFATR_MIRRORGRF )).GetValue());
595 
596                 rSet.Put(SfxBoolItem( nWhich, nState == RES_MIRROR_GRAPH_HOR ||
597                                               nState == RES_MIRROR_GRAPH_BOTH));
598             }
599             break;
600 
601 
602 		case SID_ATTR_GRAF_LUMINANCE:
603 			if( !bParentCntProt )
604 				rSet.Put( SfxInt16Item( nWhich, ((SwLuminanceGrf&)
605 						aCoreSet.Get(RES_GRFATR_LUMINANCE)).GetValue() ));
606 			break;
607 		case SID_ATTR_GRAF_CONTRAST:
608 			if( !bParentCntProt )
609 				rSet.Put( SfxInt16Item( nWhich, ((SwContrastGrf&)
610 						aCoreSet.Get(RES_GRFATR_CONTRAST)).GetValue() ));
611 			break;
612 		case SID_ATTR_GRAF_RED:
613 			if( !bParentCntProt )
614 				rSet.Put( SfxInt16Item( nWhich, ((SwChannelRGrf&)
615 						aCoreSet.Get(RES_GRFATR_CHANNELR)).GetValue() ));
616 			break;
617 		case SID_ATTR_GRAF_GREEN:
618 			if( !bParentCntProt )
619 				rSet.Put( SfxInt16Item( nWhich, ((SwChannelGGrf&)
620 						aCoreSet.Get(RES_GRFATR_CHANNELG)).GetValue() ));
621 			break;
622 		case SID_ATTR_GRAF_BLUE:
623 			if( !bParentCntProt )
624 				rSet.Put( SfxInt16Item( nWhich, ((SwChannelBGrf&)
625 						aCoreSet.Get(RES_GRFATR_CHANNELB)).GetValue() ));
626 			break;
627 
628 		case SID_ATTR_GRAF_GAMMA:
629 			if( !bParentCntProt )
630                 rSet.Put( SfxUInt32Item( nWhich, static_cast< sal_uInt32 >(
631                     ( (SwGammaGrf&)aCoreSet.Get( RES_GRFATR_GAMMA ) ).GetValue() * 100 ) ) );
632 			break;
633 		case SID_ATTR_GRAF_TRANSPARENCE:
634 			if( !bParentCntProt )
635 			{
636                 // --> OD 2005-02-09 #119353# - robust
637                 const GraphicObject* pGrafObj = rSh.GetGraphicObj();
638                 if ( pGrafObj )
639                 {
640                     if( pGrafObj->IsAnimated() ||
641                         GRAPHIC_GDIMETAFILE == pGrafObj->GetType() )
642                         bDisable = sal_True;
643                     else
644                         rSet.Put( SfxUInt16Item( nWhich, ((SwTransparencyGrf&)
645                             aCoreSet.Get(RES_GRFATR_TRANSPARENCY)).GetValue() ));
646                 }
647 			}
648 			break;
649 		case SID_ATTR_GRAF_INVERT:
650 			if( !bParentCntProt )
651 				rSet.Put( SfxBoolItem( nWhich, ((SwInvertGrf&)
652 						aCoreSet.Get(RES_GRFATR_INVERT)).GetValue() ));
653 			break;
654 
655 		case SID_ATTR_GRAF_MODE:
656 			if( !bParentCntProt )
657                 rSet.Put( SfxUInt16Item( nWhich, ((SwDrawModeGrf&)
658 						aCoreSet.Get(RES_GRFATR_DRAWMODE)).GetValue() ));
659 			break;
660 
661         case SID_GRFFILTER:
662         case SID_GRFFILTER_INVERT:
663         case SID_GRFFILTER_SMOOTH:
664         case SID_GRFFILTER_SHARPEN:
665         case SID_GRFFILTER_REMOVENOISE:
666         case SID_GRFFILTER_SOBEL:
667         case SID_GRFFILTER_MOSAIC:
668         case SID_GRFFILTER_EMBOSS:
669         case SID_GRFFILTER_POSTER:
670         case SID_GRFFILTER_POPART:
671         case SID_GRFFILTER_SEPIA:
672         case SID_GRFFILTER_SOLARIZE:
673             {
674                 if( bParentCntProt || !bIsGrfCntnt )
675                     bDisable = sal_True;
676                 else
677                 {
678                     const sal_uInt16 eGraphicType( rSh.GetGraphicType() );
679                     if ( ( eGraphicType == GRAPHIC_NONE ||
680                            eGraphicType == GRAPHIC_DEFAULT ) &&
681                          rSh.IsGrfSwapOut( sal_True ) )
682                     {
683                         rSet.DisableItem( nWhich );
684                         if( AddGrfUpdateSlot( nWhich ))
685                             rSh.GetGraphic(sal_False);  // start the loading
686                     }
687                     else
688                     {
689                         bDisable = eGraphicType != GRAPHIC_BITMAP;
690                     }
691                 }
692                 // <--
693             }
694             break;
695 
696         default:
697             bDisable = sal_False;
698         }
699 
700         if( bDisable )
701             rSet.DisableItem( nWhich );
702         nWhich = aIter.NextWhich();
703     }
704     SetGetStateSet( 0 );
705 }
706 
707 
SwGrfShell(SwView & _rView)708 SwGrfShell::SwGrfShell(SwView &_rView) :
709     SwBaseShell(_rView)
710 
711 {
712 	SetName(String::CreateFromAscii("Graphic"));
713 	SetHelpId(SW_GRFSHELL);
714     SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_Graphic));
715 }
716