xref: /core/sd/source/ui/view/drviews7.cxx (revision efdc775d)
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 <memory>
21 
22 #include <sal/config.h>
23 #include <sal/log.hxx>
24 
25 #include <utility>
26 
27 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
28 #include <com/sun/star/lang/Locale.hpp>
29 #include <com/sun/star/linguistic2/XThesaurus.hpp>
30 #include <svx/fmglob.hxx>
31 #include <svx/globl3d.hxx>
32 #include <svx/rulritem.hxx>
33 #include <svx/svdouno.hxx>
34 #include <editeng/eeitem.hxx>
35 #include <editeng/flditem.hxx>
36 #include <editeng/outlobj.hxx>
37 #include <editeng/sizeitem.hxx>
38 #include <editeng/ulspitem.hxx>
39 #include <editeng/lrspitem.hxx>
40 #include <officecfg/Office/Common.hxx>
41 #include <officecfg/Office/Impress.hxx>
42 #include <svx/svxids.hrc>
43 #include <svx/svdpagv.hxx>
44 #include <svx/clipfmtitem.hxx>
45 #include <svx/fmshell.hxx>
46 #include <svl/eitem.hxx>
47 #include <svl/aeitem.hxx>
48 #include <svl/itemset.hxx>
49 #include <svl/stritem.hxx>
50 #include <svl/visitem.hxx>
51 #include <svl/whiter.hxx>
52 #include <sfx2/dispatch.hxx>
53 #include <svx/svdograf.hxx>
54 #include <svx/xflclit.hxx>
55 #include <svx/xflgrit.hxx>
56 #include <svx/xflhtit.hxx>
57 #include <svx/xbtmpit.hxx>
58 #include <editeng/unolingu.hxx>
59 #include <svx/extrusionbar.hxx>
60 #include <svx/fontworkbar.hxx>
61 
62 // #UndoRedo#
63 #include <svl/slstitm.hxx>
64 #include <sfx2/app.hxx>
65 #include <svtools/insdlg.hxx>
66 #include <unotools/moduleoptions.hxx>
67 #include <svl/languageoptions.hxx>
68 #include <comphelper/processfactory.hxx>
69 #include <sfx2/request.hxx>
70 
71 #include <svx/grafctrl.hxx>
72 #include <svtools/cliplistener.hxx>
73 #include <sfx2/viewfrm.hxx>
74 
75 #include <app.hrc>
76 #include <strings.hrc>
77 
78 #include <PresentationViewShell.hxx>
79 
80 #include <Outliner.hxx>
81 #include <drawdoc.hxx>
82 #include <DrawViewShell.hxx>
83 #include <sdmod.hxx>
84 #include <sdresid.hxx>
85 #include <sdpage.hxx>
86 #include <Client.hxx>
87 #include <DrawDocShell.hxx>
88 #include <zoomlist.hxx>
89 #include <slideshow.hxx>
90 #include <drawview.hxx>
91 #include <View.hxx>
92 #include <ViewShellBase.hxx>
93 #include <ViewShellManager.hxx>
94 #include <LayerTabBar.hxx>
95 #include <fupoor.hxx>
96 #include <Window.hxx>
97 #include <fuediglu.hxx>
98 #include <fubullet.hxx>
99 #include <fuconcs.hxx>
100 #include <fuformatpaintbrush.hxx>
101 #include <stlsheet.hxx>
102 
103 #include <config_features.h>
104 
105 using namespace ::com::sun::star;
106 using namespace ::com::sun::star::uno;
107 using namespace ::com::sun::star::lang;
108 using namespace ::com::sun::star::linguistic2;
109 
110 /** Create a list of clipboard formats that are supported both from the
111     current clipboard content and the DrawViewShell.
112     The list is stored in a new instance of SvxClipboardFormatItem.
113 */
114 ::std::unique_ptr<SvxClipboardFormatItem> GetSupportedClipboardFormats (
115     TransferableDataHelper& rDataHelper)
116 {
117     ::std::unique_ptr<SvxClipboardFormatItem> pResult (
118         new SvxClipboardFormatItem(SID_CLIPBOARD_FORMAT_ITEMS));
119 
120     sal_uInt32 nFormatCount (rDataHelper.GetFormatCount());
121     for (sal_uInt32 i=0; i<nFormatCount; i++)
122     {
123         const SotClipboardFormatId nTestFormat = rDataHelper.GetFormat(i);
124 
125         // Check if the current format is the same as one that has already
126         // been handled.
127         bool bDuplicate (false);
128         for (sal_uInt32 j=0; j<i; j++)
129         {
130             if (nTestFormat == rDataHelper.GetFormat(j))
131             {
132                 bDuplicate = true;
133                 break;
134             }
135         }
136 
137         // Look up the format among those that are supported by the
138         // DrawViewShell.
139         if ( ! bDuplicate)
140         {
141             switch (nTestFormat)
142             {
143                 case SotClipboardFormatId::EMBED_SOURCE:
144                 {
145                     OUString sName;
146 
147                     TransferableObjectDescriptor aDescriptor;
148                     if (rDataHelper.GetTransferableObjectDescriptor(
149                         SotClipboardFormatId::OBJECTDESCRIPTOR, aDescriptor))
150                     {
151                         sName = aDescriptor.maTypeName;
152                     }
153                     if (!sName.isEmpty())
154                         pResult->AddClipbrdFormat(nTestFormat, sName);
155                     else
156                         pResult->AddClipbrdFormat(nTestFormat);
157 
158                     break;
159                 }
160 
161 
162                 case SotClipboardFormatId::LINK_SOURCE:
163                 case SotClipboardFormatId::DRAWING:
164                 case SotClipboardFormatId::SVXB:
165                 case SotClipboardFormatId::GDIMETAFILE:
166                 case SotClipboardFormatId::BITMAP:
167                 case SotClipboardFormatId::NETSCAPE_BOOKMARK:
168                 case SotClipboardFormatId::STRING:
169                 case SotClipboardFormatId::HTML:
170                 case SotClipboardFormatId::RTF:
171                 case SotClipboardFormatId::RICHTEXT:
172                 case SotClipboardFormatId::EDITENGINE_ODF_TEXT_FLAT:
173                     pResult->AddClipbrdFormat(nTestFormat);
174                     break;
175                 default: break;
176             }
177         }
178     }
179 
180     // Check some OLE formats whose names are handled differently.
181     SotClipboardFormatId nFormat (SotClipboardFormatId::EMBED_SOURCE_OLE);
182     bool bHasFormat (rDataHelper.HasFormat(nFormat));
183     if ( ! bHasFormat)
184     {
185         bHasFormat = rDataHelper.HasFormat(nFormat);
186     }
187     if (bHasFormat)
188     {
189         OUString sName;
190         OUString sSource;
191         if (SvPasteObjectHelper::GetEmbeddedName (rDataHelper, sName, sSource, nFormat))
192             pResult->AddClipbrdFormat (nFormat, sName);
193     }
194 
195     return pResult;
196 }
197 
198 namespace sd {
199 
200 IMPL_LINK( DrawViewShell, ClipboardChanged, TransferableDataHelper*, pDataHelper, void )
201 {
202     mbPastePossible = ( pDataHelper->GetFormatCount() != 0 );
203 
204     // Update the list of supported clipboard formats according to the
205     // new clipboard content.
206     // There are some stack traces that indicate the possibility of the
207     // DrawViewShell destructor called during the call to
208     // GetSupportedClipboardFormats().  If that really has happened then
209     // exit immediately.
210     TransferableDataHelper aDataHelper (
211         TransferableDataHelper::CreateFromSystemClipboard(GetActiveWindow()));
212     ::std::unique_ptr<SvxClipboardFormatItem> pFormats (GetSupportedClipboardFormats(aDataHelper));
213     if (mpDrawView == nullptr)
214         return;
215     mpCurrentClipboardFormats = std::move(pFormats);
216 
217     SfxBindings& rBindings = GetViewFrame()->GetBindings();
218     rBindings.Invalidate( SID_PASTE );
219     rBindings.Invalidate( SID_PASTE_SPECIAL );
220     rBindings.Invalidate( SID_PASTE_UNFORMATTED );
221     rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
222 }
223 
224 void DrawViewShell::GetDrawAttrState(SfxItemSet& rSet)
225 {
226     SfxItemSet aSet( mpDrawView->GetGeoAttrFromMarked() );
227     rSet.Put(aSet,false);
228 }
229 
230 ::Outliner* DrawViewShell::GetOutlinerForMasterPageOutlineTextObj(ESelection &rSel)
231 {
232     if( !mpDrawView )
233         return nullptr;
234 
235     //when there is one object selected
236     if (!mpDrawView->AreObjectsMarked() || (mpDrawView->GetMarkedObjectList().GetMarkCount() != 1))
237         return nullptr;
238 
239     //and we are editing the outline object
240     if (!mpDrawView->IsTextEdit())
241         return nullptr;
242 
243     SdrPageView* pPageView = mpDrawView->GetSdrPageView();
244     if (!pPageView)
245         return nullptr;
246 
247     SdPage* pPage = static_cast<SdPage*>(pPageView->GetPage());
248     //only show these in a normal master page
249     if (!pPage || (pPage->GetPageKind() != PageKind::Standard) || !pPage->IsMasterPage())
250         return nullptr;
251 
252     OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
253     ::Outliner* pOL = pOLV ? pOLV->GetOutliner() : nullptr;
254     if (!pOL)
255         return nullptr;
256     rSel = pOLV->GetSelection();
257 
258     return pOL;
259 }
260 
261 void DrawViewShell::GetMarginProperties( SfxItemSet &rSet )
262 {
263     SdPage *pPage = getCurrentPage();
264     SfxWhichIter aIter( rSet );
265     sal_uInt16 nWhich = aIter.FirstWhich();
266     while ( nWhich )
267     {
268         switch ( nWhich )
269         {
270             case SID_ATTR_PAGE_LRSPACE:
271             {
272                 // const SvxLRSpaceItem aTmpPageLRSpace ( rDesc.GetMaster().GetLRSpace() );
273                 const SvxLongLRSpaceItem aLongLR(
274                     static_cast<long>(pPage->GetLeftBorder()),
275                     static_cast<long>(pPage->GetRightBorder()),
276                     SID_ATTR_PAGE_LRSPACE );
277                 rSet.Put( aLongLR );
278             }
279             break;
280 
281             case SID_ATTR_PAGE_ULSPACE:
282             {
283                 // const SvxULSpaceItem aUL( rDesc.GetMaster().GetULSpace() );
284                 SvxLongULSpaceItem aLongUL(
285                     static_cast<long>(pPage->GetUpperBorder()),
286                     static_cast<long>(pPage->GetLowerBorder()),
287                     SID_ATTR_PAGE_ULSPACE );
288                 rSet.Put( aLongUL );
289             }
290             break;
291 
292             default:
293             break;
294         }
295         nWhich = aIter.NextWhich();
296     }
297 }
298 
299 void DrawViewShell::GetMenuState( SfxItemSet &rSet )
300 {
301     if (mpDrawView == nullptr)
302     {
303         // This assertion and return are here to prevent crashes.
304         DBG_ASSERT(mpDrawView!=nullptr, "Please report this assertion to the Impress team.");
305         return;
306     }
307 
308     ViewShell::GetMenuState(rSet);
309     bool bDisableVerticalText = !SvtLanguageOptions().IsVerticalTextEnabled();
310 
311     if ( bDisableVerticalText )
312     {
313         rSet.DisableItem( SID_DRAW_FONTWORK_VERTICAL );
314         rSet.DisableItem( SID_DRAW_CAPTION_VERTICAL );
315         rSet.DisableItem( SID_TEXT_FITTOSIZE_VERTICAL );
316         rSet.DisableItem( SID_DRAW_TEXT_VERTICAL );
317     }
318 
319     bool bConvertToPathPossible = mpDrawView->IsConvertToPathObjPossible();
320 
321     const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
322     const size_t nMarkCount = rMarkList.GetMarkCount();
323 
324     //format paintbrush
325     FuFormatPaintBrush::GetMenuState( *this, rSet );
326 
327     // State of SfxChild-Windows (Animator, Fontwork etc.)
328     SetChildWindowState( rSet );
329 
330     if(HasCurrentFunction())
331     {
332         sal_uInt16 nSId = GetCurrentFunction()->GetSlotID();
333         rSet.Put( SfxBoolItem( nSId, true ) );
334     }
335 
336     SdrPageView* pPageView = mpDrawView->GetSdrPageView();
337 
338     GetMenuStateSel(rSet);
339 
340     if (SfxItemState::DEFAULT == rSet.GetItemState(SID_ASSIGN_LAYOUT))
341     {
342         bool bDisable = true;
343         if( pPageView )
344         {
345             SdPage* pPage = dynamic_cast< SdPage* >( pPageView->GetPage() );
346 
347             if( pPage && !pPage->IsMasterPage() )
348             {
349                 rSet.Put( SfxUInt32Item( SID_ASSIGN_LAYOUT, static_cast< sal_uInt32 >(pPage->GetAutoLayout()) ) );
350                 bDisable = false;
351             }
352         }
353 
354         if(bDisable)
355         {
356             rSet.DisableItem(SID_ASSIGN_LAYOUT);
357         }
358     }
359 
360     if (SfxItemState::DEFAULT == rSet.GetItemState(SID_EXPAND_PAGE))
361     {
362         bool bDisable = true;
363         if( pPageView )
364         {
365             SdPage* pPage = dynamic_cast< SdPage* >( pPageView->GetPage() );
366 
367             if( pPage && (pPage->GetPageKind() == PageKind::Standard) && !pPage->IsMasterPage() )
368             {
369                 SdrObject* pObj = pPage->GetPresObj(PRESOBJ_OUTLINE);
370 
371                 if (pObj!=nullptr )
372                 {
373                     if( !pObj->IsEmptyPresObj() )
374                     {
375                         bDisable = false;
376                     }
377                     else
378                     {
379                         // check if the object is in edit, than its temporarely not empty
380                         SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
381                         if( pTextObj )
382                         {
383                             std::unique_ptr<OutlinerParaObject> pParaObj = pTextObj->GetEditOutlinerParaObject();
384                             if( pParaObj )
385                             {
386                                 bDisable = false;
387                             }
388                         }
389                     }
390                 }
391             }
392         }
393 
394         if(bDisable)
395         {
396             rSet.DisableItem(SID_EXPAND_PAGE);
397         }
398     }
399 
400     if (SfxItemState::DEFAULT == rSet.GetItemState(SID_SUMMARY_PAGE))
401     {
402         bool bDisable = true;
403         if( pPageView )
404         {
405             SdPage* pPage = dynamic_cast< SdPage* >( pPageView->GetPage() );
406 
407             if( pPage && (pPage->GetPageKind() == PageKind::Standard) && !pPage->IsMasterPage() )
408             {
409                 SdrObject* pObj = pPage->GetPresObj(PRESOBJ_TITLE);
410 
411                 if(pObj && !pObj->IsEmptyPresObj())
412                 {
413                     bDisable = false;
414                 }
415             }
416         }
417 
418         if(bDisable)
419         {
420             rSet.DisableItem(SID_SUMMARY_PAGE);
421         }
422     }
423 
424     if (SfxItemState::DEFAULT == rSet.GetItemState(SID_ASSIGN_LAYOUT))
425     {
426         bool bDisable = true;
427         if( pPageView )
428         {
429             SdPage* pPage = dynamic_cast< SdPage* >( pPageView->GetPage() );
430 
431             if( pPage && !pPage->IsMasterPage() )
432             {
433                 rSet.Put( SfxUInt32Item(SID_ASSIGN_LAYOUT, pPage->GetAutoLayout()) );
434                 bDisable = false;
435             }
436         }
437 
438         if(bDisable)
439         {
440             rSet.DisableItem(SID_ASSIGN_LAYOUT);
441         }
442     }
443 
444     // is it possible to start the presentation?
445     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_PRESENTATION ) ||
446         SfxItemState::DEFAULT == rSet.GetItemState( SID_REHEARSE_TIMINGS ) )
447     {
448         bool bDisable = true;
449         sal_uInt16 nCount = GetDoc()->GetSdPageCount( PageKind::Standard );
450 
451         for( sal_uInt16 i = 0; i < nCount && bDisable; i++ )
452         {
453             SdPage* pPage = GetDoc()->GetSdPage(i, PageKind::Standard);
454 
455             if( !pPage->IsExcluded() )
456                 bDisable = false;
457         }
458 
459         if( bDisable || GetDocSh()->IsPreview())
460         {
461             rSet.DisableItem( SID_PRESENTATION );
462             rSet.DisableItem( SID_REHEARSE_TIMINGS );
463         }
464     }
465 
466     // glue points
467     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_EDITMODE ) ||
468         SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_INSERT_POINT ) ||
469         SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_PERCENT ) ||
470         SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR ) ||
471         SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR_LEFT ) ||
472         SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR_RIGHT ) ||
473         SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR_TOP ) ||
474         SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_ESCDIR_BOTTOM ) ||
475         SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_HORZALIGN_CENTER ) ||
476         SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_HORZALIGN_LEFT ) ||
477         SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_HORZALIGN_RIGHT ) ||
478         SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_VERTALIGN_CENTER ) ||
479         SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_VERTALIGN_TOP ) ||
480         SfxItemState::DEFAULT == rSet.GetItemState( SID_GLUE_VERTALIGN_BOTTOM ) )
481     {
482         // percent
483         TriState eState = mpDrawView->IsMarkedGluePointsPercent();
484         if( eState == TRISTATE_INDET )
485             rSet.InvalidateItem( SID_GLUE_PERCENT );
486         else
487             rSet.Put( SfxBoolItem( SID_GLUE_PERCENT, eState == TRISTATE_TRUE ) );
488 
489         // alignment has no effect by percent
490         if( eState == TRISTATE_TRUE )
491         {
492             rSet.DisableItem( SID_GLUE_HORZALIGN_CENTER );
493             rSet.DisableItem( SID_GLUE_HORZALIGN_LEFT );
494             rSet.DisableItem( SID_GLUE_HORZALIGN_RIGHT );
495             rSet.DisableItem( SID_GLUE_VERTALIGN_CENTER );
496             rSet.DisableItem( SID_GLUE_VERTALIGN_TOP );
497             rSet.DisableItem( SID_GLUE_VERTALIGN_BOTTOM );
498         }
499         else
500         {
501             // horizontal alignment
502             SdrAlign nHorz = mpDrawView->GetMarkedGluePointsAlign( false );
503             rSet.Put( SfxBoolItem( SID_GLUE_HORZALIGN_CENTER, nHorz == SdrAlign::HORZ_CENTER ) );
504             rSet.Put( SfxBoolItem( SID_GLUE_HORZALIGN_LEFT,   nHorz == SdrAlign::HORZ_LEFT ) );
505             rSet.Put( SfxBoolItem( SID_GLUE_HORZALIGN_RIGHT,  nHorz == SdrAlign::HORZ_RIGHT ) );
506             // vertical alignment
507             SdrAlign nVert = mpDrawView->GetMarkedGluePointsAlign( true );
508             rSet.Put( SfxBoolItem( SID_GLUE_VERTALIGN_CENTER, nVert == SdrAlign::VERT_CENTER ) );
509             rSet.Put( SfxBoolItem( SID_GLUE_VERTALIGN_TOP,    nVert == SdrAlign::VERT_TOP ) );
510             rSet.Put( SfxBoolItem( SID_GLUE_VERTALIGN_BOTTOM, nVert == SdrAlign::VERT_BOTTOM ) );
511         }
512 
513         // insert point
514         rSet.Put( SfxBoolItem( SID_GLUE_INSERT_POINT, mpDrawView->IsInsGluePointMode() ) );
515 
516         // Escape direction
517         // left
518         eState = mpDrawView->IsMarkedGluePointsEscDir( SdrEscapeDirection::LEFT );
519         if( eState == TRISTATE_INDET )
520             rSet.InvalidateItem( SID_GLUE_ESCDIR_LEFT );
521         else
522             rSet.Put( SfxBoolItem( SID_GLUE_ESCDIR_LEFT, eState == TRISTATE_TRUE ) );
523         // right
524         eState = mpDrawView->IsMarkedGluePointsEscDir( SdrEscapeDirection::RIGHT );
525         if( eState == TRISTATE_INDET )
526             rSet.InvalidateItem( SID_GLUE_ESCDIR_RIGHT );
527         else
528             rSet.Put( SfxBoolItem( SID_GLUE_ESCDIR_RIGHT, eState == TRISTATE_TRUE ) );
529         // top
530         eState = mpDrawView->IsMarkedGluePointsEscDir( SdrEscapeDirection::TOP );
531         if( eState == TRISTATE_INDET )
532             rSet.InvalidateItem( SID_GLUE_ESCDIR_TOP );
533         else
534             rSet.Put( SfxBoolItem( SID_GLUE_ESCDIR_TOP, eState == TRISTATE_TRUE ) );
535         // bottom
536         eState = mpDrawView->IsMarkedGluePointsEscDir( SdrEscapeDirection::BOTTOM );
537         if( eState == TRISTATE_INDET )
538             rSet.InvalidateItem( SID_GLUE_ESCDIR_BOTTOM );
539         else
540             rSet.Put( SfxBoolItem( SID_GLUE_ESCDIR_BOTTOM, eState == TRISTATE_TRUE ) );
541     }
542 
543     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_GRID_FRONT ) ||
544         SfxItemState::DEFAULT == rSet.GetItemState( SID_HELPLINES_FRONT ) )
545     {
546         rSet.Put( SfxBoolItem( SID_GRID_FRONT, mpDrawView->IsGridFront() ) );
547         rSet.Put( SfxBoolItem( SID_HELPLINES_FRONT, mpDrawView->IsHlplFront() ) );
548     }
549 
550     if (!mpDrawView->IsFrameDragSingles())
551         rSet.Put(SfxBoolItem(SID_BEZIER_EDIT, true));
552     else
553         rSet.Put(SfxBoolItem(SID_BEZIER_EDIT, false));
554 
555     if(dynamic_cast<FuEditGluePoints*>( GetCurrentFunction().get()))
556         rSet.Put(SfxBoolItem(SID_GLUE_EDITMODE, true));
557     else
558         rSet.Put(SfxBoolItem(SID_GLUE_EDITMODE, false));
559 
560     if( !mpDrawView->IsMirrorAllowed( true, true ) )
561     {
562         rSet.DisableItem( SID_HORIZONTAL );
563         rSet.DisableItem( SID_VERTICAL );
564         rSet.DisableItem( SID_FLIP_HORIZONTAL );
565         rSet.DisableItem( SID_FLIP_VERTICAL );
566     }
567 
568     if( !mpDrawView->IsMirrorAllowed() )
569     {
570         rSet.DisableItem( SID_OBJECT_MIRROR );
571 //        rSet.DisableItem( SID_CONVERT_TO_3D_LATHE );
572 //        rSet.DisableItem( SID_CONVERT_TO_3D_LATHE_FAST );
573     }
574 
575     // interactive transparence control
576     if(!mpDrawView->IsTransparenceAllowed())
577     {
578         rSet.DisableItem( SID_OBJECT_TRANSPARENCE );
579     }
580 
581     // interactive gradient control
582     if(!mpDrawView->IsGradientAllowed())
583     {
584         rSet.DisableItem( SID_OBJECT_GRADIENT );
585     }
586 
587     // disable morphing if necessary
588     if ( !mpDrawView->IsMorphingAllowed() )
589         rSet.DisableItem( SID_POLYGON_MORPHING );
590 
591     if( !mpDrawView->IsReverseOrderPossible() )
592     {
593         rSet.DisableItem( SID_REVERSE_ORDER );
594     }
595 
596     if ( !bConvertToPathPossible &&
597          !mpDrawView->IsCrookAllowed( mpDrawView->IsCrookNoContortion() ) )
598     {
599         // implicit transformation into curve not possible
600         rSet.DisableItem(SID_OBJECT_CROOK_ROTATE);
601         rSet.DisableItem(SID_OBJECT_CROOK_SLANT);
602         rSet.DisableItem(SID_OBJECT_CROOK_STRETCH);
603     }
604 
605     if ( !mpDrawView->IsGroupEntered() )
606     {
607         rSet.DisableItem( SID_LEAVE_GROUP );
608         rSet.Put( SfxBoolItem( SID_LEAVE_ALL_GROUPS, false ) );
609         rSet.ClearItem( SID_LEAVE_ALL_GROUPS );
610         rSet.DisableItem( SID_LEAVE_ALL_GROUPS );
611     }
612     else
613         rSet.Put( SfxBoolItem( SID_LEAVE_ALL_GROUPS, true ) );
614 
615     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_THESAURUS ) )
616     {
617         if ( !mpDrawView->IsTextEdit() )
618         {
619             rSet.DisableItem( SID_THESAURUS );
620         }
621         else
622         {
623             LanguageType            eLang = GetDoc()->GetLanguage( EE_CHAR_LANGUAGE );
624             Reference< XThesaurus > xThesaurus( LinguMgr::GetThesaurus() );
625 
626             if (!xThesaurus.is() || eLang == LANGUAGE_NONE || !xThesaurus->hasLocale( LanguageTag::convertToLocale( eLang)) )
627                 rSet.DisableItem( SID_THESAURUS );
628         }
629     }
630 
631     if ( !mpDrawView->IsTextEdit() )
632     {
633         rSet.DisableItem( SID_THESAURUS );
634     }
635 
636     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_SELECTALL ) ||
637         SfxItemState::DEFAULT == rSet.GetItemState( SID_SIZE_ALL ) )
638     {
639         if( pPageView && pPageView->GetObjList()->GetObjCount() == 0 )
640         {
641             // should be disabled if there is no object on the draw area:
642             rSet.DisableItem( SID_SELECTALL );
643             rSet.DisableItem( SID_SIZE_ALL );
644         }
645     }
646 
647     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_CONTEXT ) )
648         rSet.Put( SfxStringItem( SID_CONTEXT, mpDrawView->GetStatusText() ) );
649 
650     // clipboard (paste)
651     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_PASTE ) ||
652         SfxItemState::DEFAULT == rSet.GetItemState( SID_PASTE_SPECIAL ) ||
653         SfxItemState::DEFAULT == rSet.GetItemState( SID_PASTE_UNFORMATTED ) ||
654         SfxItemState::DEFAULT == rSet.GetItemState( SID_CLIPBOARD_FORMAT_ITEMS ) )
655     {
656         if ( !mxClipEvtLstnr.is() )
657         {
658             // avoid clipboard initialization for
659             // read-only presentation views (workaround for NT4.0
660             // clipboard prob...)
661             if( dynamic_cast< const PresentationViewShell *>( this ) ==  nullptr )
662             {
663                 // create listener
664                 mxClipEvtLstnr = new TransferableClipboardListener( LINK( this, DrawViewShell, ClipboardChanged ) );
665                 mxClipEvtLstnr->AddListener( GetActiveWindow() );
666 
667                 // get initial state
668                 TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) );
669                 mbPastePossible = ( aDataHelper.GetFormatCount() != 0 );
670                 mpCurrentClipboardFormats = GetSupportedClipboardFormats( aDataHelper );
671             }
672             else
673                 mbPastePossible = false;
674         }
675 
676         if( !mbPastePossible )
677         {
678             rSet.DisableItem( SID_PASTE );
679             rSet.DisableItem( SID_PASTE_SPECIAL );
680             rSet.DisableItem( SID_PASTE_UNFORMATTED );
681             rSet.DisableItem( SID_CLIPBOARD_FORMAT_ITEMS );
682         }
683         else if( SfxItemState::DEFAULT == rSet.GetItemState( SID_CLIPBOARD_FORMAT_ITEMS ) )
684         {
685             if (mpCurrentClipboardFormats.get() != nullptr)
686                 rSet.Put(*mpCurrentClipboardFormats);
687         }
688     }
689 
690     if ( !bConvertToPathPossible )
691     {
692         rSet.DisableItem(SID_CHANGEBEZIER);
693     }
694 
695     if (mpDrawView == nullptr)
696     {
697         // The mpDrawView was not NULL but is now.
698         // The reason for this may be that the DrawViewShell has been
699         // destroyed in the mean time.
700         // We can only return immediately and hope that the deleted
701         // DrawViewShell is not called again.
702         DBG_ASSERT(mpDrawView!=nullptr, "Please report this assertion to the Impress team.");
703         return;
704     }
705 
706     if( !( mpDrawView->IsConvertToPolyObjPossible() || mpDrawView->IsVectorizeAllowed() ) )
707         rSet.DisableItem(SID_CHANGEPOLYGON);
708 
709     if( !( mpDrawView->IsConvertToPolyObjPossible() || mpDrawView->IsConvertToContourPossible() ) )
710         rSet.DisableItem(SID_CONVERT_TO_CONTOUR);
711 
712     if ( !mpDrawView->IsConvertTo3DObjPossible() )
713     {
714         rSet.DisableItem(SID_CONVERT_TO_3D);
715         rSet.DisableItem(SID_CONVERT_TO_3D_LATHE);
716         rSet.DisableItem(SID_CONVERT_TO_3D_LATHE_FAST);
717     }
718 
719     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_MANAGE_LINKS ) )
720     {
721         if ( GetDoc()->GetLinkCount() == 0 )
722         {
723             rSet.DisableItem(SID_MANAGE_LINKS);
724         }
725     }
726 
727     if (mePageKind == PageKind::Handout)
728     {
729         rSet.DisableItem(SID_PRESENTATION_LAYOUT);
730         rSet.DisableItem(SID_SELECT_BACKGROUND);
731         rSet.DisableItem(SID_SAVE_BACKGROUND);
732     }
733 
734     if (mePageKind == PageKind::Notes)
735     {
736         rSet.DisableItem(SID_INSERTPAGE);
737         rSet.DisableItem(SID_RENAMEPAGE);
738         rSet.DisableItem(SID_RENAMEPAGE_QUICK);
739         rSet.DisableItem(SID_DUPLICATE_PAGE);
740         rSet.ClearItem(SID_ANIMATION_OBJECTS);
741         rSet.DisableItem(SID_ANIMATION_OBJECTS);
742         rSet.DisableItem(SID_ANIMATION_EFFECTS);
743 
744         if (meEditMode == EditMode::MasterPage)
745             rSet.DisableItem(SID_MODIFYPAGE);
746 
747         rSet.DisableItem(SID_SELECT_BACKGROUND);
748         rSet.DisableItem(SID_SAVE_BACKGROUND);
749         rSet.DisableItem(SID_INSERTLAYER);
750         rSet.DisableItem(SID_LAYERMODE);
751         rSet.DisableItem(SID_INSERTFILE);
752     }
753     else if (mePageKind == PageKind::Handout)
754     {
755         rSet.DisableItem(SID_INSERTPAGE);
756         rSet.DisableItem(SID_DUPLICATE_PAGE);
757         rSet.ClearItem(SID_ANIMATION_OBJECTS);
758         rSet.DisableItem(SID_ANIMATION_OBJECTS);
759         rSet.DisableItem(SID_ANIMATION_EFFECTS);
760         rSet.DisableItem(SID_RENAMEPAGE);
761         rSet.DisableItem(SID_RENAMEPAGE_QUICK);
762         rSet.DisableItem(SID_INSERTLAYER);
763         rSet.DisableItem(SID_MODIFYLAYER);
764         rSet.DisableItem(SID_RENAMELAYER);
765         rSet.DisableItem(SID_LAYERMODE);
766         rSet.DisableItem(SID_INSERTFILE);
767         rSet.DisableItem(SID_PAGEMODE);
768         rSet.DisableItem(SID_SELECT_BACKGROUND);
769         rSet.DisableItem(SID_SAVE_BACKGROUND);
770     }
771     else
772     {
773         if (meEditMode == EditMode::MasterPage)
774         {
775             rSet.DisableItem(SID_INSERTPAGE);
776             rSet.DisableItem(SID_DUPLICATE_PAGE);
777             rSet.DisableItem(SID_MODIFYPAGE);
778             rSet.ClearItem(SID_ANIMATION_OBJECTS);
779             rSet.DisableItem(SID_ANIMATION_OBJECTS);
780         }
781 
782         rSet.Put (SfxBoolItem (SID_LAYERMODE, IsLayerModeActive()));
783     }
784 
785     if ( ! IsLayerModeActive())
786     {
787         rSet.DisableItem( SID_INSERTLAYER );
788         rSet.DisableItem( SID_MODIFYLAYER );
789         rSet.DisableItem( SID_DELETE_LAYER );
790         rSet.DisableItem( SID_RENAMELAYER );
791     }
792 
793     if (meEditMode == EditMode::Page)
794     {
795         /**********************************************************************
796         * page mode
797         **********************************************************************/
798         rSet.Put(SfxBoolItem(SID_PAGEMODE, true));
799         rSet.Put(SfxBoolItem(SID_MASTERPAGE, false));
800         rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false));
801         rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false));
802         rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false));
803 
804         rSet.DisableItem (SID_INSERT_MASTER_PAGE);
805         rSet.DisableItem (SID_DELETE_MASTER_PAGE);
806         rSet.DisableItem (SID_RENAME_MASTER_PAGE);
807         rSet.DisableItem (SID_CLOSE_MASTER_VIEW);
808     }
809     else
810     {
811         rSet.Put(SfxBoolItem(SID_PAGEMODE, false));
812         rSet.Put(SfxBoolItem(SID_MASTERPAGE, true));
813 
814         /**********************************************************************
815         * Background page mode
816         **********************************************************************/
817         if (mePageKind == PageKind::Standard)
818         {
819             rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, true));
820             rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false));
821             rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false));
822 
823         }
824         else if (mePageKind == PageKind::Notes)
825         {
826             rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false));
827             rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, true));
828             rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false));
829         }
830         else if (mePageKind == PageKind::Handout)
831         {
832             rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false));
833             rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false));
834             rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, true));
835         }
836     }
837 
838     // set state of the ruler
839     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_RULER ) )
840         rSet.Put( SfxBoolItem( SID_RULER, HasRuler() ) );
841 
842     // do not delete the last page or a master page
843     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_DELETE_PAGE )
844         || SfxItemState::DEFAULT == rSet.GetItemState( SID_DELETE_MASTER_PAGE ) )
845     {
846         if (maTabControl->GetPageCount() == 1 ||
847             meEditMode == EditMode::MasterPage     ||
848             mePageKind == PageKind::Notes          ||
849             mePageKind == PageKind::Handout        ||
850             (GetShellType()!=ST_DRAW&&IsLayerModeActive()))
851         {
852             if (rSet.GetItemState(SID_DELETE_PAGE) == SfxItemState::DEFAULT)
853                 rSet.DisableItem(SID_DELETE_PAGE);
854             if (rSet.GetItemState(SID_DELETE_MASTER_PAGE)==SfxItemState::DEFAULT)
855                 rSet.DisableItem(SID_DELETE_MASTER_PAGE);
856         }
857     }
858 
859     // is it allowed to delete the current layer?
860     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_DELETE_LAYER ) )
861     {
862         if(GetLayerTabControl()) // #i87182#
863         {
864             sal_uInt16 nCurrentLayer = GetLayerTabControl()->GetCurPageId();
865             const OUString& rName = GetLayerTabControl()->GetPageText(nCurrentLayer);
866 
867             bool bDisableIt = !IsLayerModeActive();
868             bDisableIt |= (rName == SdResId(STR_LAYER_LAYOUT));
869             bDisableIt |= (rName == SdResId(STR_LAYER_BCKGRND));
870             bDisableIt |= (rName == SdResId(STR_LAYER_BCKGRNDOBJ));
871             bDisableIt |= (rName == SdResId(STR_LAYER_CONTROLS));
872             bDisableIt |= (rName == SdResId(STR_LAYER_MEASURELINES));
873 
874             if (bDisableIt)
875             {
876                 rSet.DisableItem(SID_DELETE_LAYER);
877                 rSet.DisableItem(SID_RENAMELAYER);
878             }
879         }
880         else
881         {
882             OSL_ENSURE(false, "No LayerTabBar (!)");
883         }
884     }
885 
886     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_CUT ) ||
887         SfxItemState::DEFAULT == rSet.GetItemState( SID_COPY ) ||
888         SfxItemState::DEFAULT == rSet.GetItemState( SID_OUTLINE_BULLET ))
889     {
890         OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView();
891 
892         // special treatment of for SID_OUTLINE_BULLET if objects with different
893         // kinds of NumBullets are marked
894         bool bHasOutliner = false;
895         bool bHasOther    = false;
896         for(size_t nNum = 0; nNum < nMarkCount; ++nNum)
897         {
898             SdrObject* pObj = rMarkList.GetMark(nNum)->GetMarkedSdrObj();
899             if( pObj->GetObjInventor() == SdrInventor::Default )
900             {
901                 if( pObj->GetObjIdentifier() == OBJ_OUTLINETEXT )
902                 {
903                     bHasOutliner = true;
904                     if(bHasOther)
905                         break;
906                 }
907                 else
908                 {
909                     bHasOther = true;
910                     if(bHasOutliner)
911                         break;
912                 }
913             }
914         }
915 
916         if( bHasOther && bHasOutliner )
917             rSet.DisableItem( SID_OUTLINE_BULLET );
918 
919         if (pOlView)
920         {
921             if (pOlView->GetSelected().isEmpty())
922             {
923                 rSet.DisableItem( SID_CUT );
924                 rSet.DisableItem( SID_COPY );
925             }
926         }
927 
928     }
929 
930     FuBullet::GetSlotState( rSet, this, GetViewFrame() );
931 
932     if ( GetDocSh()->IsUIActive() )
933     {
934         rSet.DisableItem( SID_INSERT_OBJECT );
935         rSet.DisableItem( SID_INSERT_FLOATINGFRAME );
936         rSet.DisableItem( SID_INSERT_MATH );
937         rSet.DisableItem( SID_INSERT_DIAGRAM );
938         rSet.DisableItem( SID_ATTR_TABLE );
939         rSet.DisableItem( SID_SIZE_REAL );
940         rSet.DisableItem( SID_SIZE_OPTIMAL );
941         rSet.DisableItem( SID_SIZE_ALL );
942         rSet.DisableItem( SID_SIZE_PAGE_WIDTH );
943         rSet.DisableItem( SID_SIZE_PAGE );
944         rSet.DisableItem( SID_DUPLICATE_PAGE );
945         rSet.DisableItem( SID_ZOOM_TOOLBOX );
946     }
947 
948     // Zoom-State
949     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_ZOOM_IN ) ||
950         SfxItemState::DEFAULT == rSet.GetItemState( SID_ZOOM_OUT )||
951         SfxItemState::DEFAULT == rSet.GetItemState( SID_ZOOM_PANNING ) )
952     {
953         if( GetActiveWindow()->GetZoom() <= GetActiveWindow()->GetMinZoom() || GetDocSh()->IsUIActive() )
954         {
955             rSet.DisableItem( SID_ZOOM_IN );
956             rSet.DisableItem( SID_ZOOM_PANNING );
957         }
958         if( GetActiveWindow()->GetZoom() >= GetActiveWindow()->GetMaxZoom() || GetDocSh()->IsUIActive() )
959             rSet.DisableItem( SID_ZOOM_OUT );
960     }
961 
962     if (!mpZoomList->IsNextPossible())
963     {
964        rSet.DisableItem(SID_ZOOM_NEXT);
965     }
966     if (!mpZoomList->IsPreviousPossible())
967     {
968        rSet.DisableItem(SID_ZOOM_PREV);
969     }
970 
971     if( SfxItemState::DEFAULT == rSet.GetItemState( SID_REMOTE_DLG ) )
972     {
973 
974         bool bDisableSdremoteForGood = false;
975 #ifndef ENABLE_SDREMOTE
976         bDisableSdremoteForGood = true;
977 #endif
978         uno::Reference< uno::XComponentContext > xContext = comphelper::getProcessComponentContext();
979         if ( xContext.is() )
980             bDisableSdremoteForGood |= ! ( /*officecfg::Office::Common::Misc::ExperimentalMode::get( xContext ) &&*/
981 
982                                            officecfg::Office::Impress::Misc::Start::EnableSdremote::get( xContext ) );
983 
984         // This dialog is only useful for TCP/IP remote control
985         // which is unusual, under-tested and a security issue.
986         if ( bDisableSdremoteForGood )
987         {
988             rSet.Put(SfxVisibilityItem(SID_REMOTE_DLG, false));
989         }
990     }
991 
992     // EditText active
993     if (GetViewShellBase().GetViewShellManager()->GetShell(ToolbarId::Draw_Text_Toolbox_Sd) != nullptr)
994     {
995         sal_uInt16 nCurrentSId = SID_ATTR_CHAR;
996 
997         if(HasCurrentFunction())
998         {
999             nCurrentSId = GetCurrentFunction()->GetSlotID();
1000         }
1001         if( nCurrentSId != SID_TEXT_FITTOSIZE &&
1002             nCurrentSId != SID_TEXT_FITTOSIZE_VERTICAL &&
1003             nCurrentSId != SID_ATTR_CHAR_VERTICAL )
1004             nCurrentSId = SID_ATTR_CHAR;
1005 
1006         rSet.Put( SfxBoolItem( nCurrentSId, true ) );
1007     }
1008 
1009     if ( GetDocSh()->IsReadOnly() )
1010     {
1011         rSet.DisableItem( SID_AUTOSPELL_CHECK );
1012     }
1013     else
1014     {
1015         if (GetDoc()->GetOnlineSpell())
1016         {
1017             rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, true));
1018         }
1019         else
1020         {
1021             rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, false));
1022         }
1023     }
1024 
1025     SdrPageView* pPV = mpDrawView->GetSdrPageView();
1026     OUString aActiveLayer = mpDrawView->GetActiveLayer();
1027 
1028     if ( ( !aActiveLayer.isEmpty() && pPV && ( pPV->IsLayerLocked(aActiveLayer) ||
1029           !pPV->IsLayerVisible(aActiveLayer) ) ) ||
1030           SD_MOD()->GetWaterCan() )
1031     {
1032         rSet.DisableItem( SID_PASTE );
1033         rSet.DisableItem( SID_PASTE_SPECIAL );
1034         rSet.DisableItem( SID_PASTE_UNFORMATTED );
1035         rSet.DisableItem( SID_CLIPBOARD_FORMAT_ITEMS );
1036 
1037         rSet.DisableItem( SID_INSERT_FLD_DATE_FIX );
1038         rSet.DisableItem( SID_INSERT_FLD_DATE_VAR );
1039         rSet.DisableItem( SID_INSERT_FLD_TIME_FIX );
1040         rSet.DisableItem( SID_INSERT_FLD_TIME_VAR );
1041         rSet.DisableItem( SID_INSERT_FLD_AUTHOR );
1042         rSet.DisableItem( SID_INSERT_FLD_PAGE );
1043         rSet.DisableItem( SID_INSERT_FLD_PAGE_TITLE );
1044         rSet.DisableItem( SID_INSERT_FLD_PAGES );
1045         rSet.DisableItem( SID_INSERT_FLD_FILE );
1046 
1047         rSet.DisableItem( SID_INSERT_GRAPHIC );
1048         rSet.DisableItem( SID_INSERT_AVMEDIA );
1049         rSet.DisableItem( SID_INSERT_DIAGRAM );
1050         rSet.DisableItem( SID_INSERT_OBJECT );
1051         rSet.DisableItem( SID_INSERT_FLOATINGFRAME );
1052 
1053         rSet.DisableItem( SID_INSERT_MATH );
1054         rSet.DisableItem( SID_INSERT_FRAME );
1055         rSet.DisableItem( SID_INSERTFILE );
1056         rSet.DisableItem( SID_ATTR_TABLE );
1057         rSet.DisableItem( SID_COPYOBJECTS );
1058 
1059         rSet.DisableItem( SID_SCAN );
1060         rSet.DisableItem( SID_TWAIN_SELECT );
1061         rSet.DisableItem( SID_TWAIN_TRANSFER );
1062 
1063 //        rSet.DisableItem( SID_BEZIER_EDIT );
1064         rSet.DisableItem( SID_GLUE_EDITMODE );
1065         rSet.DisableItem( SID_OBJECT_ROTATE );
1066         rSet.DisableItem( SID_OBJECT_SHEAR );
1067         rSet.DisableItem( SID_OBJECT_MIRROR );
1068         rSet.DisableItem( SID_OBJECT_CROP );
1069         rSet.DisableItem( SID_ATTR_GRAF_CROP );
1070         rSet.DisableItem( SID_OBJECT_TRANSPARENCE );
1071         rSet.DisableItem( SID_OBJECT_GRADIENT );
1072         rSet.DisableItem( SID_OBJECT_CROOK_ROTATE );
1073         rSet.DisableItem( SID_OBJECT_CROOK_SLANT );
1074         rSet.DisableItem( SID_OBJECT_CROOK_STRETCH );
1075 
1076         // Disable all object-creating tools
1077         rSet.ClearItem( SID_ATTR_CHAR );
1078         rSet.DisableItem( SID_ATTR_CHAR );
1079         rSet.ClearItem( SID_ATTR_CHAR_VERTICAL );
1080         rSet.DisableItem( SID_ATTR_CHAR_VERTICAL );
1081         rSet.ClearItem(SID_DRAW_LINE);
1082         rSet.DisableItem(SID_DRAW_LINE);
1083         rSet.ClearItem(SID_DRAW_MEASURELINE);
1084         rSet.DisableItem(SID_DRAW_MEASURELINE);
1085         rSet.ClearItem(SID_DRAW_XLINE);
1086         rSet.DisableItem(SID_DRAW_XLINE);
1087         rSet.ClearItem( SID_LINE_ARROW_START );
1088         rSet.DisableItem( SID_LINE_ARROW_START );
1089         rSet.ClearItem( SID_LINE_ARROW_END );
1090         rSet.DisableItem( SID_LINE_ARROW_END );
1091         rSet.ClearItem( SID_LINE_ARROWS );
1092         rSet.DisableItem( SID_LINE_ARROWS );
1093         rSet.ClearItem( SID_LINE_ARROW_CIRCLE );
1094         rSet.DisableItem( SID_LINE_ARROW_CIRCLE );
1095         rSet.ClearItem( SID_LINE_CIRCLE_ARROW );
1096         rSet.DisableItem( SID_LINE_CIRCLE_ARROW );
1097         rSet.ClearItem( SID_LINE_ARROW_SQUARE );
1098         rSet.DisableItem( SID_LINE_ARROW_SQUARE );
1099         rSet.ClearItem( SID_LINE_SQUARE_ARROW );
1100         rSet.DisableItem( SID_LINE_SQUARE_ARROW );
1101 
1102         rSet.ClearItem(SID_DRAW_RECT);
1103         rSet.DisableItem(SID_DRAW_RECT);
1104         rSet.ClearItem(SID_DRAW_RECT_NOFILL);
1105         rSet.DisableItem(SID_DRAW_RECT_NOFILL);
1106         rSet.ClearItem(SID_DRAW_RECT_ROUND);
1107         rSet.DisableItem(SID_DRAW_RECT_ROUND);
1108         rSet.ClearItem(SID_DRAW_RECT_ROUND_NOFILL);
1109         rSet.DisableItem(SID_DRAW_RECT_ROUND_NOFILL);
1110         rSet.ClearItem(SID_DRAW_SQUARE);
1111         rSet.DisableItem(SID_DRAW_SQUARE);
1112         rSet.ClearItem(SID_DRAW_SQUARE_NOFILL);
1113         rSet.DisableItem(SID_DRAW_SQUARE_NOFILL);
1114         rSet.ClearItem(SID_DRAW_SQUARE_ROUND);
1115         rSet.DisableItem(SID_DRAW_SQUARE_ROUND);
1116         rSet.ClearItem(SID_DRAW_SQUARE_ROUND_NOFILL);
1117         rSet.DisableItem(SID_DRAW_SQUARE_ROUND_NOFILL);
1118         rSet.ClearItem(SID_DRAW_ELLIPSE);
1119         rSet.DisableItem(SID_DRAW_ELLIPSE);
1120         rSet.ClearItem(SID_DRAW_ELLIPSE_NOFILL);
1121         rSet.DisableItem(SID_DRAW_ELLIPSE_NOFILL);
1122         rSet.ClearItem(SID_DRAW_CIRCLE);
1123         rSet.DisableItem(SID_DRAW_CIRCLE);
1124         rSet.ClearItem(SID_DRAW_CIRCLE_NOFILL);
1125         rSet.DisableItem(SID_DRAW_CIRCLE_NOFILL);
1126         rSet.ClearItem(SID_DRAW_CAPTION);
1127         rSet.DisableItem(SID_DRAW_CAPTION);
1128         rSet.ClearItem(SID_DRAW_FONTWORK);
1129         rSet.DisableItem(SID_DRAW_FONTWORK);
1130         rSet.ClearItem(SID_DRAW_FONTWORK_VERTICAL);
1131         rSet.DisableItem(SID_DRAW_FONTWORK_VERTICAL);
1132         rSet.ClearItem(SID_DRAW_CAPTION_VERTICAL);
1133         rSet.DisableItem(SID_DRAW_CAPTION_VERTICAL);
1134         rSet.ClearItem(SID_TEXT_FITTOSIZE);
1135         rSet.DisableItem(SID_TEXT_FITTOSIZE);
1136         rSet.ClearItem(SID_TEXT_FITTOSIZE_VERTICAL);
1137         rSet.DisableItem(SID_TEXT_FITTOSIZE_VERTICAL);
1138         rSet.ClearItem(SID_TOOL_CONNECTOR);
1139         rSet.DisableItem(SID_TOOL_CONNECTOR);
1140         rSet.ClearItem(SID_CONNECTOR_ARROW_START);
1141         rSet.DisableItem(SID_CONNECTOR_ARROW_START);
1142         rSet.ClearItem(SID_CONNECTOR_ARROW_END);
1143         rSet.DisableItem(SID_CONNECTOR_ARROW_END);
1144         rSet.ClearItem(SID_CONNECTOR_ARROWS);
1145         rSet.DisableItem(SID_CONNECTOR_ARROWS);
1146         rSet.ClearItem(SID_CONNECTOR_CIRCLE_START);
1147         rSet.DisableItem(SID_CONNECTOR_CIRCLE_START);
1148         rSet.ClearItem(SID_CONNECTOR_CIRCLE_END);
1149         rSet.DisableItem(SID_CONNECTOR_CIRCLE_END);
1150         rSet.ClearItem(SID_CONNECTOR_CIRCLES);
1151         rSet.DisableItem(SID_CONNECTOR_CIRCLES);
1152         rSet.ClearItem(SID_CONNECTOR_LINE);
1153         rSet.DisableItem(SID_CONNECTOR_LINE);
1154         rSet.ClearItem(SID_CONNECTOR_LINE_ARROW_START);
1155         rSet.DisableItem(SID_CONNECTOR_LINE_ARROW_START);
1156         rSet.ClearItem(SID_CONNECTOR_LINE_ARROW_END);
1157         rSet.DisableItem(SID_CONNECTOR_LINE_ARROW_END);
1158         rSet.ClearItem(SID_CONNECTOR_LINE_ARROWS);
1159         rSet.DisableItem(SID_CONNECTOR_LINE_ARROWS);
1160         rSet.ClearItem(SID_CONNECTOR_LINE_CIRCLE_START);
1161         rSet.DisableItem(SID_CONNECTOR_LINE_CIRCLE_START);
1162         rSet.ClearItem(SID_CONNECTOR_LINE_CIRCLE_END);
1163         rSet.DisableItem(SID_CONNECTOR_LINE_CIRCLE_END);
1164         rSet.ClearItem(SID_CONNECTOR_LINE_CIRCLES);
1165         rSet.DisableItem(SID_CONNECTOR_LINE_CIRCLES);
1166         rSet.ClearItem(SID_CONNECTOR_CURVE);
1167         rSet.DisableItem(SID_CONNECTOR_CURVE);
1168         rSet.ClearItem(SID_CONNECTOR_CURVE_ARROW_START);
1169         rSet.DisableItem(SID_CONNECTOR_CURVE_ARROW_START);
1170         rSet.ClearItem(SID_CONNECTOR_CURVE_ARROW_END);
1171         rSet.DisableItem(SID_CONNECTOR_CURVE_ARROW_END);
1172         rSet.ClearItem(SID_CONNECTOR_CURVE_ARROWS);
1173         rSet.DisableItem(SID_CONNECTOR_CURVE_ARROWS);
1174         rSet.ClearItem(SID_CONNECTOR_CURVE_CIRCLE_START);
1175         rSet.DisableItem(SID_CONNECTOR_CURVE_CIRCLE_START);
1176         rSet.ClearItem(SID_CONNECTOR_CURVE_CIRCLE_END);
1177         rSet.DisableItem(SID_CONNECTOR_CURVE_CIRCLE_END);
1178         rSet.ClearItem(SID_CONNECTOR_CURVE_CIRCLES);
1179         rSet.DisableItem(SID_CONNECTOR_CURVE_CIRCLES);
1180         rSet.ClearItem(SID_CONNECTOR_LINES);
1181         rSet.DisableItem(SID_CONNECTOR_LINES);
1182         rSet.ClearItem(SID_CONNECTOR_LINES_ARROW_START);
1183         rSet.DisableItem(SID_CONNECTOR_LINES_ARROW_START);
1184         rSet.ClearItem(SID_CONNECTOR_LINES_ARROW_END);
1185         rSet.DisableItem(SID_CONNECTOR_LINES_ARROW_END);
1186         rSet.ClearItem(SID_CONNECTOR_LINES_ARROWS);
1187         rSet.DisableItem(SID_CONNECTOR_LINES_ARROWS);
1188         rSet.ClearItem(SID_CONNECTOR_LINES_CIRCLE_START);
1189         rSet.DisableItem(SID_CONNECTOR_LINES_CIRCLE_START);
1190         rSet.ClearItem(SID_CONNECTOR_LINES_CIRCLE_END);
1191         rSet.DisableItem(SID_CONNECTOR_LINES_CIRCLE_END);
1192         rSet.ClearItem(SID_CONNECTOR_LINES_CIRCLES);
1193         rSet.DisableItem(SID_CONNECTOR_LINES_CIRCLES);
1194         rSet.ClearItem(SID_DRAW_ARC);
1195         rSet.DisableItem(SID_DRAW_ARC);
1196         rSet.ClearItem(SID_DRAW_CIRCLEARC);
1197         rSet.DisableItem(SID_DRAW_CIRCLEARC);
1198         rSet.ClearItem(SID_DRAW_PIE);
1199         rSet.DisableItem(SID_DRAW_PIE);
1200         rSet.ClearItem(SID_DRAW_PIE_NOFILL);
1201         rSet.DisableItem(SID_DRAW_PIE_NOFILL);
1202         rSet.ClearItem(SID_DRAW_CIRCLEPIE);
1203         rSet.DisableItem(SID_DRAW_CIRCLEPIE);
1204         rSet.ClearItem(SID_DRAW_CIRCLEPIE_NOFILL);
1205         rSet.DisableItem(SID_DRAW_CIRCLEPIE_NOFILL);
1206         rSet.ClearItem(SID_DRAW_ELLIPSECUT);
1207         rSet.DisableItem(SID_DRAW_ELLIPSECUT);
1208         rSet.ClearItem(SID_DRAW_ELLIPSECUT_NOFILL);
1209         rSet.DisableItem(SID_DRAW_ELLIPSECUT_NOFILL);
1210         rSet.ClearItem(SID_DRAW_CIRCLECUT);
1211         rSet.DisableItem(SID_DRAW_CIRCLECUT);
1212         rSet.ClearItem(SID_DRAW_CIRCLECUT_NOFILL);
1213         rSet.DisableItem(SID_DRAW_CIRCLECUT_NOFILL);
1214         rSet.ClearItem(SID_DRAW_POLYGON);
1215         rSet.DisableItem(SID_DRAW_POLYGON);
1216         rSet.ClearItem(SID_DRAW_POLYGON_NOFILL);
1217         rSet.DisableItem(SID_DRAW_POLYGON_NOFILL);
1218         rSet.ClearItem(SID_DRAW_FREELINE);
1219         rSet.DisableItem(SID_DRAW_FREELINE);
1220         rSet.ClearItem(SID_DRAW_FREELINE_NOFILL);
1221         rSet.DisableItem(SID_DRAW_FREELINE_NOFILL);
1222         rSet.ClearItem(SID_DRAW_XPOLYGON);
1223         rSet.DisableItem(SID_DRAW_XPOLYGON);
1224         rSet.ClearItem(SID_DRAW_XPOLYGON_NOFILL);
1225         rSet.DisableItem(SID_DRAW_XPOLYGON_NOFILL);
1226         rSet.ClearItem(SID_DRAW_BEZIER_FILL);
1227         rSet.DisableItem(SID_DRAW_BEZIER_FILL);
1228         rSet.ClearItem(SID_DRAW_BEZIER_NOFILL);
1229         rSet.DisableItem(SID_DRAW_BEZIER_NOFILL);
1230         rSet.ClearItem(SID_3D_CUBE);
1231         rSet.DisableItem(SID_3D_CUBE);
1232         rSet.ClearItem(SID_3D_SHELL);
1233         rSet.DisableItem(SID_3D_SHELL);
1234         rSet.ClearItem(SID_3D_SPHERE);
1235         rSet.DisableItem(SID_3D_SPHERE);
1236         rSet.ClearItem(SID_3D_HALF_SPHERE);
1237         rSet.DisableItem(SID_3D_HALF_SPHERE);
1238         rSet.ClearItem(SID_3D_CYLINDER);
1239         rSet.DisableItem(SID_3D_CYLINDER);
1240         rSet.ClearItem(SID_3D_CONE);
1241         rSet.DisableItem(SID_3D_CONE);
1242         rSet.ClearItem(SID_3D_TORUS);
1243         rSet.DisableItem(SID_3D_TORUS);
1244         rSet.ClearItem(SID_3D_PYRAMID);
1245         rSet.DisableItem(SID_3D_PYRAMID);
1246     }
1247 
1248     // are the modules available?
1249 
1250     if (!SvtModuleOptions().IsCalc())
1251     {
1252         // remove menu entry if module is not available
1253         rSet.Put( SfxVisibilityItem( SID_ATTR_TABLE, false ) );
1254     }
1255     if (!SvtModuleOptions().IsChart())
1256     {
1257         rSet.DisableItem( SID_INSERT_DIAGRAM );
1258     }
1259     if (!SvtModuleOptions().IsMath())
1260     {
1261         rSet.DisableItem( SID_INSERT_MATH );
1262     }
1263 
1264     rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetViewShellBase() ) );
1265     if( (xSlideshow.is() && xSlideshow->isRunning() && (xSlideshow->getAnimationMode() != ANIMATIONMODE_PREVIEW) ) || GetDocSh()->IsPreview() )
1266     {
1267         // Own Slots
1268         rSet.DisableItem( SID_PRESENTATION );
1269         rSet.DisableItem( SID_ZOOM_IN );
1270         rSet.DisableItem( SID_ZOOM_OUT );
1271         rSet.DisableItem( SID_ZOOM_PANNING );
1272         rSet.DisableItem( SID_ZOOM_MODE );
1273         rSet.DisableItem( SID_ZOOM_NEXT );
1274         rSet.DisableItem( SID_ZOOM_PREV );
1275         rSet.DisableItem( SID_SIZE_REAL );
1276         rSet.DisableItem( SID_SIZE_OPTIMAL );
1277         rSet.DisableItem( SID_SIZE_ALL );
1278         rSet.DisableItem( SID_SIZE_PAGE_WIDTH );
1279         rSet.DisableItem( SID_SIZE_PAGE );
1280         rSet.DisableItem( SID_INSERTPAGE );
1281         rSet.DisableItem( SID_DUPLICATE_PAGE );
1282         rSet.DisableItem( SID_MODIFYPAGE );
1283         rSet.DisableItem( SID_RENAMEPAGE );
1284         rSet.DisableItem( SID_RENAMEPAGE_QUICK );
1285         rSet.DisableItem( SID_DELETE_PAGE );
1286         rSet.DisableItem( SID_PAGESETUP );
1287 
1288         if( xSlideshow.is() && xSlideshow->isRunning() )
1289         {
1290             rSet.ClearItem(SID_INSERTFILE);
1291             rSet.ClearItem(SID_OBJECT_ROTATE);
1292             rSet.ClearItem(SID_FM_CONFIG);
1293             rSet.ClearItem(SID_ANIMATION_EFFECTS);
1294             rSet.ClearItem(SID_ANIMATION_OBJECTS);
1295             rSet.ClearItem(SID_3D_WIN);
1296 
1297             rSet.DisableItem(SID_OBJECT_ALIGN);
1298             rSet.DisableItem(SID_ZOOM_TOOLBOX);
1299             rSet.DisableItem(SID_OBJECT_CHOOSE_MODE);
1300             rSet.DisableItem(SID_DRAWTBX_TEXT);
1301             rSet.DisableItem(SID_DRAWTBX_RECTANGLES);
1302             rSet.DisableItem(SID_DRAWTBX_ELLIPSES);
1303             rSet.DisableItem(SID_DRAWTBX_LINES);
1304             rSet.DisableItem(SID_DRAWTBX_ARROWS);
1305             rSet.DisableItem(SID_DRAWTBX_3D_OBJECTS);
1306             rSet.DisableItem(SID_DRAWTBX_CONNECTORS);
1307             rSet.DisableItem(SID_OBJECT_CHOOSE_MODE );
1308             rSet.DisableItem(SID_DRAWTBX_INSERT);
1309             rSet.DisableItem(SID_INSERTFILE);
1310             rSet.DisableItem(SID_OBJECT_ROTATE);
1311             rSet.DisableItem(SID_POSITION);
1312             rSet.DisableItem(SID_FM_CONFIG);
1313             rSet.DisableItem(SID_ANIMATION_EFFECTS);
1314             rSet.DisableItem(SID_ANIMATION_OBJECTS);
1315             rSet.DisableItem(SID_3D_WIN);
1316         }
1317     }
1318 
1319     // Menuoption: Change->Convert->To Bitmap, Change->Convert->To Metafile
1320     //             disable, if there only Bitmap or Metafiles marked
1321     // Menuoption: Format->Area, Format->Line
1322     //             disabled, if the marked objects not able to handle
1323     //             these attributes
1324 
1325     bool bSingleGraphicSelected = false;
1326 
1327     if (!mpDrawView->AreObjectsMarked())
1328     {
1329         rSet.DisableItem (SID_CONVERT_TO_METAFILE);
1330         rSet.DisableItem (SID_CONVERT_TO_BITMAP);
1331     }
1332     else
1333     {
1334         // get marklist
1335         SdrMarkList aMarkList = mpDrawView->GetMarkedObjectList();
1336 
1337         bool bFoundBitmap         = false;
1338         bool bFoundMetafile       = false;
1339         bool bFoundObjNoArea      = false;
1340         bool bFoundNoGraphicObj = false;
1341         bool bFoundAny            = false;
1342         bool bFoundTable = false;
1343 
1344 //      const size_t nMarkCount = aMarkList.GetMarkCount();
1345         for (size_t i=0; i < nMarkCount && !bFoundAny; ++i)
1346         {
1347             SdrObject*  pObj = aMarkList.GetMark(i)->GetMarkedSdrObj();
1348             sal_uInt16  nId  = pObj->GetObjIdentifier();
1349             SdrInventor nInv = pObj->GetObjInventor();
1350 
1351             if(nInv == SdrInventor::Default)
1352             {
1353                 // 2D objects
1354                 switch( nId )
1355                 {
1356                     case OBJ_PATHLINE :
1357                     case OBJ_PLIN :
1358                     case OBJ_LINE:
1359                     case OBJ_FREELINE :
1360                     case OBJ_EDGE:
1361                     case OBJ_CARC :
1362                         bFoundObjNoArea      = true;
1363                         bFoundNoGraphicObj = true;
1364                         break;
1365                     case OBJ_OLE2 :
1366                         // #i118485# #i118525# Allow Line, Area and Graphic (Metafile, Bitmap)
1367                         bSingleGraphicSelected = nMarkCount == 1;
1368                         bFoundBitmap = true;
1369                         bFoundMetafile = true;
1370                         break;
1371                     case OBJ_GRAF :
1372                     {
1373                         bSingleGraphicSelected = nMarkCount == 1;
1374                         const SdrGrafObj* pSdrGrafObj = static_cast< const SdrGrafObj* >(pObj);
1375 
1376                         // Current size of the OBJ_GRAF
1377                         const ::tools::Rectangle aRect = pObj->GetLogicRect();
1378                         const Size aCurrentSizeofObj = aRect.GetSize();
1379 
1380                         // Original size of the OBJ_GRAF
1381                         const Size aOriginalSizeofObj = pSdrGrafObj->getOriginalSize();
1382 
1383                         if(aCurrentSizeofObj == aOriginalSizeofObj )
1384                             rSet.DisableItem(SID_ORIGINAL_SIZE);
1385 
1386                         switch(pSdrGrafObj->GetGraphicType())
1387                         {
1388                             case GraphicType::Bitmap :
1389                                 bFoundBitmap = true;
1390                                 if(pSdrGrafObj->isEmbeddedVectorGraphicData())
1391                                 {
1392                                     bFoundMetafile = true;
1393                                 }
1394                                 break;
1395                             case GraphicType::GdiMetafile :
1396                                 bFoundMetafile = true;
1397                                 break;
1398                             default:
1399                                 break;
1400                         }
1401                         break;
1402                     }
1403                     case OBJ_TABLE:
1404                         bFoundTable = true;
1405                         break;
1406                     default :
1407                         bFoundAny = true;
1408                 }
1409             }
1410             else if(nInv == SdrInventor::E3d)
1411             {
1412                 // 3D objects
1413                 bFoundAny = true;
1414             }
1415         }
1416 
1417         if( bFoundTable )
1418             rSet.DisableItem( SID_ATTRIBUTES_LINE );
1419 
1420         if (!bFoundAny)
1421         {
1422             // Disable menuitem for area-dialog
1423             if( bFoundObjNoArea ) // #i25616#
1424                 rSet.DisableItem( SID_ATTRIBUTES_AREA );
1425 
1426             if( bFoundBitmap && !bFoundMetafile && !bFoundNoGraphicObj )    // only Bitmaps marked
1427                 rSet.DisableItem( SID_CONVERT_TO_BITMAP );
1428             else if( !bFoundBitmap && bFoundMetafile && !bFoundNoGraphicObj )   // only Metafiles marked
1429                 rSet.DisableItem( SID_CONVERT_TO_METAFILE );
1430             else if( !bFoundBitmap && !bFoundMetafile && !bFoundNoGraphicObj )  // nothing to do
1431             {
1432                 rSet.DisableItem( SID_CONVERT_TO_BITMAP );
1433                 rSet.DisableItem( SID_CONVERT_TO_METAFILE );
1434             }
1435         }
1436     }
1437 
1438     if( !bSingleGraphicSelected )
1439     {
1440         rSet.DisableItem (SID_OBJECT_CROP);
1441         rSet.DisableItem (SID_ATTR_GRAF_CROP);
1442     }
1443 
1444     // Menuoption: Edit->Hyperlink
1445     // Disable, if there is no hyperlink
1446 
1447     bool bDisableEditHyperlink = true;
1448     if( mpDrawView->AreObjectsMarked() && ( mpDrawView->GetMarkedObjectList().GetMarkCount() == 1 ) )
1449     {
1450         if( mpDrawView->IsTextEdit() )
1451         {
1452             OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
1453             if (pOLV)
1454             {
1455                 const SvxFieldItem* pFieldItem = pOLV->GetFieldAtSelection();
1456                 if (pFieldItem)
1457                 {
1458                     ESelection aSel = pOLV->GetSelection();
1459                     if ( abs( aSel.nEndPos - aSel.nStartPos ) == 1 )
1460                     {
1461                         const SvxFieldData* pField = pFieldItem->GetField();
1462                         if ( dynamic_cast< const SvxURLField *>( pField ) !=  nullptr )
1463                             bDisableEditHyperlink = false;
1464                     }
1465                 }
1466             }
1467         }
1468         else
1469         {
1470             SdrUnoObj* pUnoCtrl = dynamic_cast<SdrUnoObj*>( mpDrawView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj() );
1471 
1472             if ( pUnoCtrl && SdrInventor::FmForm == pUnoCtrl->GetObjInventor() )
1473             {
1474                 uno::Reference< awt::XControlModel > xControlModel( pUnoCtrl->GetUnoControlModel() );
1475                 if( xControlModel.is() )
1476                 {
1477                     uno::Reference< beans::XPropertySet > xPropSet( xControlModel, uno::UNO_QUERY );
1478                     if( xPropSet.is() )
1479                     {
1480                         uno::Reference< beans::XPropertySetInfo > xPropInfo( xPropSet->getPropertySetInfo() );
1481                         if( xPropInfo.is() && xPropInfo->hasPropertyByName( "TargetURL") )
1482                         {
1483                             bDisableEditHyperlink = false;
1484                         }
1485                     }
1486                 }
1487             }
1488         }
1489     }
1490 
1491     //highlight selected custom shape
1492     {
1493         if(HasCurrentFunction())
1494         {
1495             rtl::Reference< FuPoor > xFunc( GetCurrentFunction() );
1496             FuConstructCustomShape* pShapeFunc = dynamic_cast< FuConstructCustomShape* >( xFunc.get() );
1497 
1498             static const sal_uInt16 nCSTbArray[] = { SID_DRAWTBX_CS_BASIC, SID_DRAWTBX_CS_SYMBOL,
1499                                                      SID_DRAWTBX_CS_ARROW, SID_DRAWTBX_CS_FLOWCHART,
1500                                                      SID_DRAWTBX_CS_CALLOUT, SID_DRAWTBX_CS_STAR };
1501 
1502             const sal_uInt16 nCurrentSId = GetCurrentFunction()->GetSlotID();
1503             for (sal_uInt16 i : nCSTbArray)
1504             {
1505                 rSet.ClearItem( i ); // Why is this necessary?
1506                 rSet.Put( SfxStringItem( i, nCurrentSId == i && pShapeFunc
1507                                          ? pShapeFunc->GetShapeType() : OUString() ) );
1508             }
1509         }
1510     }
1511 
1512     if ( bDisableEditHyperlink || GetDocSh()->IsReadOnly() )
1513         rSet.DisableItem( SID_EDIT_HYPERLINK );
1514 
1515     if ( bDisableEditHyperlink )
1516         rSet.DisableItem( SID_OPEN_HYPERLINK );
1517 
1518     //fdo#78151 enable show next level/hide last level if editing a master page
1519     //PRESOBJ_OUTLINE object and the current selection allow that to happen
1520     {
1521         bool bDisableShowNextLevel = true;
1522         bool bDisableHideLastLevel = true;
1523 
1524         ESelection aSel;
1525         ::Outliner* pOL = GetOutlinerForMasterPageOutlineTextObj(aSel);
1526         if (pOL)
1527         {
1528             //and are on the last paragraph
1529             aSel.Adjust();
1530             if (aSel.nEndPara == pOL->GetParagraphCount() - 1)
1531             {
1532                 sal_uInt16 nDepth = pOL->GetDepth(aSel.nEndPara);
1533                 if (nDepth != sal_uInt16(-1))
1534                 {
1535                     //there exists another numbering level that
1536                     //is currently hidden
1537                     if (nDepth < 8)
1538                         bDisableShowNextLevel = false;
1539                     //there exists a previous numbering level
1540                     if (nDepth > 0)
1541                         bDisableHideLastLevel = false;
1542                 }
1543             }
1544         }
1545 
1546         if (bDisableShowNextLevel)
1547             rSet.DisableItem(SID_SHOW_NEXT_LEVEL);
1548 
1549         if (bDisableHideLastLevel)
1550             rSet.DisableItem(SID_HIDE_LAST_LEVEL);
1551     }
1552 
1553 #if defined(_WIN32) || defined UNX
1554     if( !mxScannerManager.is() )
1555     {
1556         rSet.DisableItem( SID_TWAIN_SELECT );
1557         rSet.DisableItem( SID_TWAIN_TRANSFER );
1558     }
1559 #endif
1560 
1561     // Set the state of two entries in the 'Slide' context sub-menu
1562     // concerning the visibility of master page background and master page
1563     // shapes.
1564     if (rSet.GetItemState(SID_DISPLAY_MASTER_BACKGROUND) == SfxItemState::DEFAULT
1565         || rSet.GetItemState(SID_DISPLAY_MASTER_OBJECTS) == SfxItemState::DEFAULT)
1566     {
1567         SdPage* pPage = GetActualPage();
1568         if (pPage != nullptr && GetDoc() != nullptr)
1569         {
1570             SdrLayerIDSet aVisibleLayers = pPage->TRG_GetMasterPageVisibleLayers();
1571             SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin();
1572             SdrLayerID aBackgroundId = rLayerAdmin.GetLayerID(SdResId(STR_LAYER_BCKGRND));
1573             SdrLayerID aObjectId = rLayerAdmin.GetLayerID(SdResId(STR_LAYER_BCKGRNDOBJ));
1574             rSet.Put(SfxBoolItem(SID_DISPLAY_MASTER_BACKGROUND,
1575                     aVisibleLayers.IsSet(aBackgroundId)));
1576             rSet.Put(SfxBoolItem(SID_DISPLAY_MASTER_OBJECTS,
1577                     aVisibleLayers.IsSet(aObjectId)));
1578         }
1579     }
1580 
1581     if (rSet.GetItemState(SID_SAVE_BACKGROUND) == SfxItemState::DEFAULT)
1582     {
1583         bool bDisableSaveBackground = true;
1584         SdPage* pPage = GetActualPage();
1585         if (pPage != nullptr && GetDoc() != nullptr)
1586         {
1587             SfxItemSet aMergedAttr(GetDoc()->GetPool(), svl::Items<XATTR_FILL_FIRST, XATTR_FILL_LAST>{});
1588             SdStyleSheet* pStyleSheet = pPage->getPresentationStyle(HID_PSEUDOSHEET_BACKGROUND);
1589             MergePageBackgroundFilling(pPage, pStyleSheet, meEditMode == EditMode::MasterPage, aMergedAttr);
1590             if (drawing::FillStyle_BITMAP == aMergedAttr.Get(XATTR_FILLSTYLE).GetValue())
1591             {
1592                 bDisableSaveBackground = false;
1593             }
1594         }
1595         if (bDisableSaveBackground)
1596             rSet.DisableItem(SID_SAVE_BACKGROUND);
1597     }
1598 
1599     GetModeSwitchingMenuState (rSet);
1600 }
1601 
1602 void DrawViewShell::GetModeSwitchingMenuState (SfxItemSet &rSet)
1603 {
1604     //DrawView
1605     rSet.Put(SfxBoolItem(SID_SLIDE_SORTER_MODE, false));
1606     rSet.Put(SfxBoolItem(SID_OUTLINE_MODE, false));
1607     rSet.Put(SfxBoolItem(SID_SLIDE_MASTER_MODE, false));
1608     rSet.Put(SfxBoolItem(SID_NOTES_MASTER_MODE, false));
1609     if (mePageKind == PageKind::Notes)
1610     {
1611         rSet.Put(SfxBoolItem(SID_DRAWINGMODE, false));
1612         rSet.Put(SfxBoolItem(SID_NOTES_MODE, true));
1613         rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false));
1614     }
1615     else if (mePageKind == PageKind::Handout)
1616     {
1617         rSet.Put(SfxBoolItem(SID_DRAWINGMODE, false));
1618         rSet.Put(SfxBoolItem(SID_NOTES_MODE, false));
1619         rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, true));
1620     }
1621     else
1622     {
1623         rSet.Put(SfxBoolItem(SID_DRAWINGMODE, true));
1624         rSet.Put(SfxBoolItem(SID_NOTES_MODE, false));
1625         rSet.Put(SfxBoolItem(SID_HANDOUT_MASTER_MODE, false));
1626     }
1627 
1628     // Removed [GetDocSh()->GetCurrentFunction() ||] from the following
1629     // clause because the current function of the docshell can only be
1630     // search and replace or spell checking and in that case switching the
1631     // view mode is allowed.
1632     const bool bIsRunning = SlideShow::IsRunning(GetViewShellBase());
1633 
1634     if (GetViewFrame()->GetFrame().IsInPlace() || bIsRunning)
1635     {
1636         if ( !GetViewFrame()->GetFrame().IsInPlace() )
1637         {
1638             rSet.ClearItem( SID_DRAWINGMODE );
1639             rSet.DisableItem( SID_DRAWINGMODE );
1640         }
1641 
1642         rSet.ClearItem( SID_NOTES_MODE );
1643         rSet.DisableItem( SID_NOTES_MODE );
1644 
1645         rSet.ClearItem( SID_HANDOUT_MASTER_MODE );
1646         rSet.DisableItem( SID_HANDOUT_MASTER_MODE );
1647 
1648         rSet.ClearItem( SID_OUTLINE_MODE );
1649         rSet.DisableItem( SID_OUTLINE_MODE );
1650 
1651         rSet.ClearItem( SID_SLIDE_MASTER_MODE );
1652         rSet.DisableItem( SID_SLIDE_MASTER_MODE );
1653 
1654         rSet.ClearItem( SID_NOTES_MASTER_MODE );
1655         rSet.DisableItem( SID_NOTES_MASTER_MODE );
1656 
1657         rSet.ClearItem( SID_SLIDE_SORTER_MODE );
1658         rSet.DisableItem( SID_SLIDE_SORTER_MODE );
1659     }
1660 
1661     if (GetDocSh()->GetCreateMode() == SfxObjectCreateMode::EMBEDDED)
1662     {
1663         // Outplace-Edit: do not allow switch
1664         rSet.ClearItem( SID_OUTLINE_MODE );
1665         rSet.DisableItem( SID_OUTLINE_MODE );
1666 
1667         rSet.ClearItem( SID_SLIDE_SORTER_MODE );
1668         rSet.DisableItem( SID_SLIDE_SORTER_MODE );
1669 
1670         rSet.ClearItem( SID_NOTES_MODE );
1671         rSet.DisableItem( SID_NOTES_MODE );
1672 
1673         rSet.ClearItem( SID_HANDOUT_MASTER_MODE );
1674         rSet.DisableItem( SID_HANDOUT_MASTER_MODE );
1675 
1676         rSet.ClearItem( SID_SLIDE_MASTER_MODE );
1677         rSet.DisableItem( SID_SLIDE_MASTER_MODE );
1678 
1679         rSet.ClearItem( SID_NOTES_MASTER_MODE );
1680         rSet.DisableItem( SID_NOTES_MASTER_MODE );
1681     }
1682 
1683     svx::ExtrusionBar::getState( mpDrawView.get(), rSet );
1684     svx::FontworkBar::getState( mpDrawView.get(), rSet );
1685 }
1686 
1687 void DrawViewShell::GetPageProperties( SfxItemSet &rSet )
1688 {
1689     SdPage *pPage = getCurrentPage();
1690 
1691     if (pPage != nullptr && GetDoc() != nullptr)
1692     {
1693         SvxPageItem aPageItem(SID_ATTR_PAGE);
1694         aPageItem.SetLandscape( pPage->GetOrientation() == Orientation::Landscape );
1695 
1696         rSet.Put(SvxSizeItem( SID_ATTR_PAGE_SIZE, pPage->GetSize() ));
1697         rSet.Put(aPageItem);
1698 
1699         const SfxItemSet &rPageAttr = pPage->getSdrPageProperties().GetItemSet();
1700         drawing::FillStyle eXFS = rPageAttr.GetItem( XATTR_FILLSTYLE )->GetValue();
1701         XFillStyleItem aFillStyleItem( eXFS );
1702         aFillStyleItem.SetWhich( SID_ATTR_PAGE_FILLSTYLE );
1703         rSet.Put(aFillStyleItem);
1704 
1705         switch (eXFS)
1706         {
1707             case drawing::FillStyle_SOLID:
1708             {
1709                 Color aColor =  rPageAttr.GetItem( XATTR_FILLCOLOR )->GetColorValue();
1710                 XFillColorItem aFillColorItem( OUString(), aColor );
1711                 aFillColorItem.SetWhich( SID_ATTR_PAGE_COLOR );
1712                 rSet.Put( aFillColorItem );
1713             }
1714             break;
1715 
1716             case drawing::FillStyle_GRADIENT:
1717             {
1718                 const XFillGradientItem *pGradient =  rPageAttr.GetItem( XATTR_FILLGRADIENT );
1719                 XFillGradientItem aFillGradientItem( pGradient->GetName(), pGradient->GetGradientValue(), SID_ATTR_PAGE_GRADIENT );
1720                 rSet.Put( aFillGradientItem );
1721             }
1722             break;
1723 
1724             case drawing::FillStyle_HATCH:
1725             {
1726                 const XFillHatchItem *pFillHatchItem( rPageAttr.GetItem( XATTR_FILLHATCH ) );
1727                 XFillHatchItem aFillHatchItem( pFillHatchItem->GetName(), pFillHatchItem->GetHatchValue());
1728                 aFillHatchItem.SetWhich( SID_ATTR_PAGE_HATCH );
1729                 rSet.Put( aFillHatchItem );
1730             }
1731             break;
1732 
1733             case drawing::FillStyle_BITMAP:
1734             {
1735                 const XFillBitmapItem *pFillBitmapItem = rPageAttr.GetItem( XATTR_FILLBITMAP );
1736                 XFillBitmapItem aFillBitmapItem( pFillBitmapItem->GetName(), pFillBitmapItem->GetGraphicObject() );
1737                 aFillBitmapItem.SetWhich( SID_ATTR_PAGE_BITMAP );
1738                 rSet.Put( aFillBitmapItem );
1739             }
1740             break;
1741 
1742             default:
1743             break;
1744         }
1745     }
1746 }
1747 
1748 void DrawViewShell::SetPageProperties (SfxRequest& rReq)
1749 {
1750     SdPage *pPage = getCurrentPage();
1751     if (!pPage)
1752         return;
1753     sal_uInt16 nSlotId = rReq.GetSlot();
1754     const SfxItemSet *pArgs = rReq.GetArgs();
1755     if (!pArgs)
1756         return;
1757 
1758     if ( ( nSlotId >= SID_ATTR_PAGE_COLOR ) && ( nSlotId <= SID_ATTR_PAGE_FILLSTYLE ) )
1759     {
1760         SdrPageProperties& rPageProperties = pPage->getSdrPageProperties();
1761         const SfxItemSet &aPageItemSet = rPageProperties.GetItemSet();
1762         std::unique_ptr<SfxItemSet> pTempSet = aPageItemSet.Clone(false, &mpDrawView->GetModel()->GetItemPool());
1763 
1764         rPageProperties.ClearItem(XATTR_FILLSTYLE);
1765         rPageProperties.ClearItem(XATTR_FILLGRADIENT);
1766         rPageProperties.ClearItem(XATTR_FILLHATCH);
1767         rPageProperties.ClearItem(XATTR_FILLBITMAP);
1768 
1769         switch (nSlotId)
1770         {
1771             case SID_ATTR_PAGE_FILLSTYLE:
1772             {
1773                 XFillStyleItem aFSItem( pArgs->Get( XATTR_FILLSTYLE ) );
1774                 drawing::FillStyle eXFS = aFSItem.GetValue();
1775 
1776                 if ( eXFS == drawing::FillStyle_NONE )
1777                      rPageProperties.PutItem( XFillStyleItem( eXFS ) );
1778             }
1779             break;
1780 
1781             case SID_ATTR_PAGE_COLOR:
1782             {
1783                 XFillColorItem aColorItem( pArgs->Get( XATTR_FILLCOLOR ) );
1784                 rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_SOLID ) );
1785                 rPageProperties.PutItem( aColorItem );
1786             }
1787             break;
1788 
1789             case SID_ATTR_PAGE_GRADIENT:
1790             {
1791                 XFillGradientItem aGradientItem( pArgs->Get( XATTR_FILLGRADIENT ) );
1792 
1793                 // MigrateItemSet guarantees unique gradient names
1794                 SfxItemSet aMigrateSet( mpDrawView->GetModel()->GetItemPool(), svl::Items<XATTR_FILLGRADIENT, XATTR_FILLGRADIENT>{} );
1795                 aMigrateSet.Put( aGradientItem );
1796                 SdrModel::MigrateItemSet( &aMigrateSet, pTempSet.get(), mpDrawView->GetModel() );
1797 
1798                 rPageProperties.PutItemSet( *pTempSet );
1799                 rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_GRADIENT ) );
1800             }
1801             break;
1802 
1803             case SID_ATTR_PAGE_HATCH:
1804             {
1805                 XFillHatchItem aHatchItem( pArgs->Get( XATTR_FILLHATCH ) );
1806                 rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_HATCH ) );
1807                 rPageProperties.PutItem( aHatchItem );
1808             }
1809             break;
1810 
1811             case SID_ATTR_PAGE_BITMAP:
1812             {
1813                 XFillBitmapItem aBitmapItem( pArgs->Get( XATTR_FILLBITMAP ) );
1814                 rPageProperties.PutItem( XFillStyleItem( drawing::FillStyle_BITMAP ) );
1815                 rPageProperties.PutItem( aBitmapItem );
1816             }
1817             break;
1818 
1819             default:
1820             break;
1821         }
1822 
1823         rReq.Done();
1824     }
1825     else
1826     {
1827         PageKind            ePageKind = GetPageKind();
1828         const SfxPoolItem*  pPoolItem = nullptr;
1829         Size                aNewSize(pPage->GetSize());
1830         sal_Int32           nLeft  = -1, nRight = -1, nUpper = -1, nLower = -1;
1831         bool                bScaleAll = true;
1832         Orientation         eOrientation = pPage->GetOrientation();
1833         SdPage*             pMasterPage = pPage->IsMasterPage() ? pPage : &static_cast<SdPage&>(pPage->TRG_GetMasterPage());
1834         bool                bFullSize = pMasterPage->IsBackgroundFullSize();
1835         sal_uInt16          nPaperBin = pPage->GetPaperBin();
1836 
1837         switch (nSlotId)
1838         {
1839             case SID_ATTR_PAGE_LRSPACE:
1840                 if( pArgs->GetItemState(GetPool().GetWhich(SID_ATTR_PAGE_LRSPACE),
1841                                         true,&pPoolItem) == SfxItemState::SET )
1842                 {
1843                     nLeft = static_cast<const SvxLongLRSpaceItem*>(pPoolItem)->GetLeft();
1844                     nRight = static_cast<const SvxLongLRSpaceItem*>(pPoolItem)->GetRight();
1845                     if (nLeft != -1 && nUpper == -1)
1846                     {
1847                         nUpper  = pPage->GetUpperBorder();
1848                         nLower  = pPage->GetLowerBorder();
1849                     }
1850                     SetPageSizeAndBorder(ePageKind, aNewSize, nLeft, nRight, nUpper, nLower, bScaleAll, eOrientation, nPaperBin, bFullSize );
1851                 }
1852                 break;
1853 
1854             case SID_ATTR_PAGE_ULSPACE:
1855                 if( pArgs->GetItemState(SID_ATTR_PAGE_ULSPACE,
1856                                         true,&pPoolItem) == SfxItemState::SET )
1857                 {
1858                     nUpper = static_cast<const SvxLongULSpaceItem*>(pPoolItem)->GetUpper();
1859                     nLower = static_cast<const SvxLongULSpaceItem*>(pPoolItem)->GetLower();
1860                     if (nLeft == -1 && nUpper != -1)
1861                     {
1862                         nLeft   = pPage->GetLeftBorder();
1863                         nRight  = pPage->GetRightBorder();
1864                     }
1865                     SetPageSizeAndBorder(ePageKind, aNewSize, nLeft, nRight, nUpper, nLower, bScaleAll, eOrientation, nPaperBin, bFullSize );
1866                 }
1867                 break;
1868 
1869             default:
1870             break;
1871         }
1872     }
1873 }
1874 
1875 void DrawViewShell::GetState (SfxItemSet& rSet)
1876 {
1877     // Iterate over all requested items in the set.
1878     SfxWhichIter aIter( rSet );
1879     sal_uInt16 nWhich = aIter.FirstWhich();
1880     while (nWhich)
1881     {
1882         switch (nWhich)
1883         {
1884             case SID_SEARCH_ITEM:
1885             case SID_SEARCH_OPTIONS:
1886                 // Forward this request to the common (old) code of the
1887                 // document shell.
1888                 GetDocSh()->GetState (rSet);
1889                 break;
1890             default:
1891                 SAL_WARN("sd", "DrawViewShell::GetState(): can not handle which id " << nWhich);
1892                 break;
1893         }
1894         nWhich = aIter.NextWhich();
1895     }
1896 }
1897 
1898 void DrawViewShell::Execute (SfxRequest& rReq)
1899 {
1900     if(SlideShow::IsRunning(GetViewShellBase()))
1901     {
1902         // Do not execute anything during a native slide show.
1903         return;
1904     }
1905 
1906     switch (rReq.GetSlot())
1907     {
1908         case SID_SEARCH_ITEM:
1909             // Forward this request to the common (old) code of the
1910             // document shell.
1911             GetDocSh()->Execute (rReq);
1912         break;
1913 
1914         case SID_SPELL_DIALOG:
1915         {
1916             SfxViewFrame* pViewFrame = GetViewFrame();
1917             if (rReq.GetArgs() != nullptr)
1918                 pViewFrame->SetChildWindow (SID_SPELL_DIALOG,
1919                     static_cast<const SfxBoolItem&>(rReq.GetArgs()->
1920                         Get(SID_SPELL_DIALOG)).GetValue());
1921             else
1922                 pViewFrame->ToggleChildWindow(SID_SPELL_DIALOG);
1923 
1924             pViewFrame->GetBindings().Invalidate(SID_SPELL_DIALOG);
1925             rReq.Ignore ();
1926         }
1927         break;
1928 
1929         default:
1930             SAL_WARN("sd", "DrawViewShell::Execute(): can not handle slot " << rReq.GetSlot());
1931             break;
1932     }
1933 }
1934 
1935 } // end of namespace sd
1936 
1937 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
1938