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