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 <fupage.hxx>
21 
22 // arrange Tab-Page
23 
24 #include <sfx2/sfxdlg.hxx>
25 #include <svx/pageitem.hxx>
26 #include <svx/svxids.hrc>
27 #include <svl/itempool.hxx>
28 #include <sfx2/request.hxx>
29 #include <vcl/prntypes.hxx>
30 #include <vcl/graphicfilter.hxx>
31 #include <stlsheet.hxx>
32 #include <editeng/eeitem.hxx>
33 #include <editeng/frmdiritem.hxx>
34 #include <svx/graphichelper.hxx>
35 #include <svx/xfillit0.hxx>
36 #include <svx/xbtmpit.hxx>
37 #include <svx/xflbstit.hxx>
38 #include <svx/xflbmtit.hxx>
39 #include <svx/xflgrit.hxx>
40 #include <editeng/ulspitem.hxx>
41 #include <editeng/lrspitem.hxx>
42 #include <svx/sdr/properties/properties.hxx>
43 #include <editeng/shaditem.hxx>
44 #include <editeng/boxitem.hxx>
45 #include <editeng/sizeitem.hxx>
46 #include <editeng/pbinitem.hxx>
47 #include <sfx2/opengrf.hxx>
48 
49 #include <strings.hrc>
50 #include <sdpage.hxx>
51 #include <View.hxx>
52 #include <Window.hxx>
53 #include <pres.hxx>
54 #include <drawdoc.hxx>
55 #include <DrawDocShell.hxx>
56 #include <ViewShell.hxx>
57 #include <DrawViewShell.hxx>
58 #include <app.hrc>
59 #include <unchss.hxx>
60 #include <undoback.hxx>
61 #include <sdabstdlg.hxx>
62 #include <sdresid.hxx>
63 
64 #include <memory>
65 
66 using namespace com::sun::star;
67 
68 namespace sd {
69 
70 // 50 cm 28350
71 // adapted from writer
72 #define MAXHEIGHT 28350
73 #define MAXWIDTH  28350
74 
75 
mergeItemSetsImpl(SfxItemSet & rTarget,const SfxItemSet & rSource)76 static void mergeItemSetsImpl( SfxItemSet& rTarget, const SfxItemSet& rSource )
77 {
78     const sal_uInt16* pPtr = rSource.GetRanges();
79     sal_uInt16 p1, p2;
80     while( *pPtr )
81     {
82         p1 = pPtr[0];
83         p2 = pPtr[1];
84 
85         // make ranges discrete
86         while(pPtr[2] && (pPtr[2] - p2 == 1))
87         {
88             p2 = pPtr[3];
89             pPtr += 2;
90         }
91         rTarget.MergeRange( p1, p2 );
92         pPtr += 2;
93     }
94 
95     rTarget.Put(rSource);
96 }
97 
FuPage(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)98 FuPage::FuPage( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView,
99                  SdDrawDocument* pDoc, SfxRequest& rReq )
100 :   FuPoor(pViewSh, pWin, pView, pDoc, rReq),
101     mrReq(rReq),
102     mpArgs( rReq.GetArgs() ),
103     mbPageBckgrdDeleted( false ),
104     mbMasterPage( false ),
105     mbDisplayBackgroundTabPage( true ),
106     mpPage(nullptr),
107     mpDrawViewShell(nullptr)
108 {
109 }
110 
Create(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)111 rtl::Reference<FuPoor> FuPage::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
112 {
113     rtl::Reference<FuPoor> xFunc( new FuPage( pViewSh, pWin, pView, pDoc, rReq ) );
114     xFunc->DoExecute(rReq);
115     return xFunc;
116 }
117 
DoExecute(SfxRequest & rReq)118 void FuPage::DoExecute(SfxRequest& rReq)
119 {
120     mpDrawViewShell = dynamic_cast<DrawViewShell*>(mpViewShell);
121     DBG_ASSERT( mpDrawViewShell, "sd::FuPage::FuPage(), called without a current DrawViewShell!" );
122 
123     if( mpDrawViewShell )
124     {
125         mbMasterPage = mpDrawViewShell->GetEditMode() == EditMode::MasterPage;
126         // we don't really want to format page background with SID_ATTR_PAGE[_SIZE] slots
127         mbDisplayBackgroundTabPage = ( mpDrawViewShell->GetPageKind() == PageKind::Standard) &&
128                                       ( nSlotId != SID_ATTR_PAGE_SIZE) && ( nSlotId != SID_ATTR_PAGE );
129         mpPage = mpDrawViewShell->getCurrentPage();
130     }
131 
132     if( !mpPage )
133         return;
134 
135     // if there are no arguments given, open the dialog
136     const SfxPoolItem* pItem;
137     if (!mpArgs || mpArgs->GetItemState(SID_SELECT_BACKGROUND, true, &pItem) == SfxItemState::SET)
138     {
139         mpView->SdrEndTextEdit();
140         mpArgs = ExecuteDialog(mpWindow ? mpWindow->GetFrameWeld() : nullptr, rReq);
141     }
142 
143     // if we now have arguments, apply them to current page
144     if( mpArgs )
145     {
146         ApplyItemSet( mpArgs );
147     }
148 }
149 
~FuPage()150 FuPage::~FuPage()
151 {
152 }
153 
Activate()154 void FuPage::Activate()
155 {
156 }
157 
Deactivate()158 void FuPage::Deactivate()
159 {
160 }
161 
MergePageBackgroundFilling(SdPage * pPage,SdStyleSheet * pStyleSheet,bool bMasterPage,SfxItemSet & rMergedAttr)162 void MergePageBackgroundFilling(SdPage *pPage, SdStyleSheet *pStyleSheet, bool bMasterPage, SfxItemSet& rMergedAttr)
163 {
164     if (bMasterPage)
165     {
166         if (pStyleSheet)
167             mergeItemSetsImpl(rMergedAttr, pStyleSheet->GetItemSet());
168     }
169     else
170     {
171         // Only this page, get attributes for background fill
172         const SfxItemSet& rBackgroundAttributes = pPage->getSdrPageProperties().GetItemSet();
173 
174         if(drawing::FillStyle_NONE != rBackgroundAttributes.Get(XATTR_FILLSTYLE).GetValue())
175         {
176             // page attributes are used, take them
177             rMergedAttr.Put(rBackgroundAttributes);
178         }
179         else
180         {
181             if(pStyleSheet
182                 && drawing::FillStyle_NONE != pStyleSheet->GetItemSet().Get(XATTR_FILLSTYLE).GetValue())
183             {
184                 // if the page has no fill style, use the settings from the
185                 // background stylesheet (if used)
186                 mergeItemSetsImpl(rMergedAttr, pStyleSheet->GetItemSet());
187             }
188             else
189             {
190                 // no fill style from page, start with no fill style
191                 rMergedAttr.Put(XFillStyleItem(drawing::FillStyle_NONE));
192             }
193         }
194     }
195 }
196 
ExecuteDialog(weld::Window * pParent,const SfxRequest & rReq)197 const SfxItemSet* FuPage::ExecuteDialog(weld::Window* pParent, const SfxRequest& rReq)
198 {
199     if (!mpDrawViewShell)
200         return nullptr;
201 
202     SfxItemSet aNewAttr(mpDoc->GetPool(),
203                         {{mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE),
204                         mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE)},
205                         {SID_ATTR_PAGE, SID_ATTR_PAGE_SHARED},
206                         {SID_ATTR_BORDER_OUTER, SID_ATTR_BORDER_OUTER},
207                         {SID_ATTR_BORDER_SHADOW, SID_ATTR_BORDER_SHADOW},
208                         {XATTR_FILL_FIRST, XATTR_FILL_LAST},
209                         {SID_ATTR_PAGE_COLOR,SID_ATTR_PAGE_FILLSTYLE},
210                         {EE_PARA_WRITINGDIR, EE_PARA_WRITINGDIR}});
211 
212     // Retrieve additional data for dialog
213 
214     SvxShadowItem aShadowItem(SID_ATTR_BORDER_SHADOW);
215     aNewAttr.Put( aShadowItem );
216     SvxBoxItem aBoxItem( SID_ATTR_BORDER_OUTER );
217     aNewAttr.Put( aBoxItem );
218 
219     aNewAttr.Put( SvxFrameDirectionItem(
220         mpDoc->GetDefaultWritingMode() == css::text::WritingMode_RL_TB ? SvxFrameDirection::Horizontal_RL_TB : SvxFrameDirection::Horizontal_LR_TB,
221         EE_PARA_WRITINGDIR ) );
222 
223     // Retrieve page-data for dialog
224 
225     SvxPageItem aPageItem( SID_ATTR_PAGE );
226     aPageItem.SetDescName( mpPage->GetName() );
227     aPageItem.SetPageUsage( SvxPageUsage::All );
228     aPageItem.SetLandscape( mpPage->GetOrientation() == Orientation::Landscape );
229     aPageItem.SetNumType( mpDoc->GetPageNumType() );
230     aNewAttr.Put( aPageItem );
231 
232     // size
233     maSize = mpPage->GetSize();
234     SvxSizeItem aSizeItem( SID_ATTR_PAGE_SIZE, maSize );
235     aNewAttr.Put( aSizeItem );
236 
237     // Max size
238     SvxSizeItem aMaxSizeItem( SID_ATTR_PAGE_MAXSIZE, Size( MAXWIDTH, MAXHEIGHT ) );
239     aNewAttr.Put( aMaxSizeItem );
240 
241     // paperbin
242     SvxPaperBinItem aPaperBinItem( SID_ATTR_PAGE_PAPERBIN, static_cast<sal_uInt8>(mpPage->GetPaperBin()) );
243     aNewAttr.Put( aPaperBinItem );
244 
245     SvxLRSpaceItem aLRSpaceItem( static_cast<sal_uInt16>(mpPage->GetLeftBorder()), static_cast<sal_uInt16>(mpPage->GetRightBorder()), 0, 0, mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE));
246     aNewAttr.Put( aLRSpaceItem );
247 
248     SvxULSpaceItem aULSpaceItem( static_cast<sal_uInt16>(mpPage->GetUpperBorder()), static_cast<sal_uInt16>(mpPage->GetLowerBorder()), mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE));
249     aNewAttr.Put( aULSpaceItem );
250 
251     // Application
252     bool bScale = mpDoc->GetDocumentType() != DocumentType::Draw;
253     aNewAttr.Put( SfxBoolItem( SID_ATTR_PAGE_EXT1, bScale ) );
254 
255     bool bFullSize = mpPage->IsMasterPage() ?
256         mpPage->IsBackgroundFullSize() : static_cast<SdPage&>(mpPage->TRG_GetMasterPage()).IsBackgroundFullSize();
257 
258     aNewAttr.Put( SfxBoolItem( SID_ATTR_PAGE_EXT2, bFullSize ) );
259 
260     // Merge ItemSet for dialog
261 
262     const sal_uInt16* pPtr = aNewAttr.GetRanges();
263     sal_uInt16 p1 = pPtr[0], p2 = pPtr[1];
264     while(pPtr[2] && (pPtr[2] - p2 == 1))
265     {
266         p2 = pPtr[3];
267         pPtr += 2;
268     }
269     SfxItemSet aMergedAttr( *aNewAttr.GetPool(), {{p1, p2}} );
270 
271     mergeItemSetsImpl( aMergedAttr, aNewAttr );
272 
273     SdStyleSheet* pStyleSheet = mpPage->getPresentationStyle(HID_PSEUDOSHEET_BACKGROUND);
274 
275     // merge page background filling to the dialogs input set
276     if( mbDisplayBackgroundTabPage )
277     {
278         MergePageBackgroundFilling(mpPage, pStyleSheet, mbMasterPage, aMergedAttr);
279     }
280 
281     std::unique_ptr< SfxItemSet > pTempSet;
282 
283     const sal_uInt16 nId = GetSlotID();
284     if (nId == SID_SAVE_BACKGROUND)
285     {
286         const XFillStyleItem& rStyleItem = aMergedAttr.Get(XATTR_FILLSTYLE);
287         if (drawing::FillStyle_BITMAP == rStyleItem.GetValue())
288         {
289             const XFillBitmapItem& rBitmap = aMergedAttr.Get(XATTR_FILLBITMAP);
290             const GraphicObject& rGraphicObj = rBitmap.GetGraphicObject();
291             GraphicHelper::ExportGraphic(pParent, rGraphicObj.GetGraphic(), "");
292         }
293     }
294     else if (nId == SID_SELECT_BACKGROUND)
295     {
296         Graphic aGraphic;
297         ErrCode nError = ERRCODE_GRFILTER_OPENERROR;
298 
299         const SfxItemSet* pArgs = rReq.GetArgs();
300         const SfxPoolItem* pItem;
301 
302         if (pArgs && pArgs->GetItemState(SID_SELECT_BACKGROUND, true, &pItem) == SfxItemState::SET)
303         {
304             OUString aFileName(static_cast<const SfxStringItem*>(pItem)->GetValue());
305             OUString aFilterName;
306 
307             if (pArgs->GetItemState(FN_PARAM_FILTER, true, &pItem) == SfxItemState::SET)
308                 aFilterName = static_cast<const SfxStringItem*>(pItem)->GetValue();
309 
310             nError = GraphicFilter::LoadGraphic(aFileName, aFilterName, aGraphic,
311                                                 &GraphicFilter::GetGraphicFilter());
312         }
313         else
314         {
315             SvxOpenGraphicDialog aDlg(SdResId(STR_SET_BACKGROUND_PICTURE), pParent);
316 
317             nError = aDlg.Execute();
318             if (nError == ERRCODE_NONE)
319             {
320                 nError = aDlg.GetGraphic(aGraphic);
321             }
322         }
323 
324         if (nError == ERRCODE_NONE)
325         {
326             pTempSet.reset( new SfxItemSet( mpDoc->GetPool(), svl::Items<XATTR_FILL_FIRST, XATTR_FILL_LAST>{}) );
327 
328             pTempSet->Put( XFillStyleItem( drawing::FillStyle_BITMAP ) );
329 
330             // MigrateItemSet makes sure the XFillBitmapItem will have a unique name
331             SfxItemSet aMigrateSet( mpDoc->GetPool(), svl::Items<XATTR_FILLBITMAP, XATTR_FILLBITMAP>{} );
332             aMigrateSet.Put(XFillBitmapItem("background", aGraphic));
333             SdrModel::MigrateItemSet( &aMigrateSet, pTempSet.get(), mpDoc );
334 
335             pTempSet->Put( XFillBmpStretchItem( true ));
336             pTempSet->Put( XFillBmpTileItem( false ));
337         }
338     }
339 
340     else
341     {
342         bool bIsImpressDoc = mpDrawViewShell->GetDoc()->GetDocumentType() == DocumentType::Impress;
343 
344         // create the dialog
345         SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
346         ScopedVclPtr<SfxAbstractTabDialog> pDlg( pFact->CreateSdTabPageDialog(mpViewShell->GetFrameWeld(), &aMergedAttr, mpDocSh, mbDisplayBackgroundTabPage, bIsImpressDoc) );
347         if( pDlg->Execute() == RET_OK )
348             pTempSet.reset( new SfxItemSet(*pDlg->GetOutputItemSet()) );
349     }
350 
351     if (pTempSet.get() && pStyleSheet)
352     {
353         pStyleSheet->AdjustToFontHeight(*pTempSet);
354 
355         if( mbDisplayBackgroundTabPage )
356         {
357             // if some fillstyle-items are not set in the dialog, then
358             // try to use the items before
359             bool bChanges = false;
360             for( sal_uInt16 i=XATTR_FILL_FIRST; i<XATTR_FILL_LAST; i++ )
361             {
362                 if( aMergedAttr.GetItemState( i ) != SfxItemState::DEFAULT )
363                 {
364                     if( pTempSet->GetItemState( i ) == SfxItemState::DEFAULT )
365                         pTempSet->Put( aMergedAttr.Get( i ) );
366                     else
367                         if( aMergedAttr.GetItem( i ) != pTempSet->GetItem( i ) )
368                             bChanges = true;
369                 }
370             }
371 
372             // if the background for this page was set to invisible, the background-object has to be deleted, too.
373             const XFillStyleItem* pTempFillStyleItem = pTempSet->GetItem<XFillStyleItem>(XATTR_FILLSTYLE);
374             assert(pTempFillStyleItem);
375             if (pTempFillStyleItem->GetValue() == drawing::FillStyle_NONE)
376                 mbPageBckgrdDeleted = true;
377             else
378             {
379                 if (pTempSet->GetItemState(XATTR_FILLSTYLE) == SfxItemState::DEFAULT)
380                 {
381                     const XFillStyleItem* pMergedFillStyleItem = aMergedAttr.GetItem<XFillStyleItem>(XATTR_FILLSTYLE);
382                     assert(pMergedFillStyleItem);
383                     if (pMergedFillStyleItem->GetValue() == drawing::FillStyle_NONE)
384                         mbPageBckgrdDeleted = true;
385                 }
386             }
387 
388             const XFillGradientItem* pTempGradItem = pTempSet->GetItem<XFillGradientItem>(XATTR_FILLGRADIENT);
389             if (pTempGradItem && pTempGradItem->GetName().isEmpty())
390             {
391                 // MigrateItemSet guarantees unique gradient names
392                 SfxItemSet aMigrateSet( mpDoc->GetPool(), svl::Items<XATTR_FILLGRADIENT, XATTR_FILLGRADIENT>{} );
393                 aMigrateSet.Put( XFillGradientItem("gradient", pTempGradItem->GetGradientValue()) );
394                 SdrModel::MigrateItemSet( &aMigrateSet, pTempSet.get(), mpDoc);
395             }
396 
397             if( !mbMasterPage && bChanges && mbPageBckgrdDeleted )
398             {
399                  mpBackgroundObjUndoAction.reset( new SdBackgroundObjUndoAction(
400                      *mpDoc, *mpPage, mpPage->getSdrPageProperties().GetItemSet()) );
401 
402                  if(!mpPage->IsMasterPage())
403                  {
404                      // on normal pages, switch off fill attribute usage
405                      SdrPageProperties& rPageProperties = mpPage->getSdrPageProperties();
406                      rPageProperties.ClearItem( XATTR_FILLBITMAP );
407                      rPageProperties.ClearItem( XATTR_FILLGRADIENT );
408                      rPageProperties.ClearItem( XATTR_FILLHATCH );
409                      rPageProperties.PutItem(XFillStyleItem(drawing::FillStyle_NONE));
410                  }
411             }
412 
413 
414             /* Special treatment: reset the INVALIDS to
415                NULL-Pointer (otherwise INVALIDs or pointer point
416                to DefaultItems in the template; both would
417                prevent the attribute inheritance) */
418             pTempSet->ClearInvalidItems();
419 
420             if( mbMasterPage )
421             {
422                 mpDocSh->GetUndoManager()->AddUndoAction(std::make_unique<StyleSheetUndoAction>(
423                     mpDoc, static_cast<SfxStyleSheet*>(pStyleSheet), &(*pTempSet)));
424                 pStyleSheet->GetItemSet().Put( *pTempSet );
425                 sdr::properties::CleanupFillProperties( pStyleSheet->GetItemSet() );
426                 pStyleSheet->Broadcast(SfxHint(SfxHintId::DataChanged));
427             }
428 
429             // if background filling is set to master pages then clear from page set
430             if( mbMasterPage )
431             {
432                 for( sal_uInt16 nWhich = XATTR_FILL_FIRST; nWhich <= XATTR_FILL_LAST; nWhich++ )
433                 {
434                     pTempSet->ClearItem( nWhich );
435                 }
436                 pTempSet->Put(XFillStyleItem(drawing::FillStyle_NONE));
437             }
438 
439             const SfxPoolItem *pItem;
440             if( SfxItemState::SET == pTempSet->GetItemState( EE_PARA_WRITINGDIR, false, &pItem ) )
441             {
442                 SvxFrameDirection nVal = static_cast<const SvxFrameDirectionItem*>(pItem)->GetValue();
443                 mpDoc->SetDefaultWritingMode( nVal == SvxFrameDirection::Horizontal_RL_TB ? css::text::WritingMode_RL_TB : css::text::WritingMode_LR_TB );
444             }
445 
446             mpDoc->SetChanged();
447 
448             // BackgroundFill of Masterpage: no hard attributes allowed
449             SdrPage& rUsedMasterPage = mpPage->IsMasterPage() ? *mpPage : mpPage->TRG_GetMasterPage();
450             OSL_ENSURE(rUsedMasterPage.IsMasterPage(), "No MasterPage (!)");
451             rUsedMasterPage.getSdrPageProperties().ClearItem();
452             OSL_ENSURE(nullptr != rUsedMasterPage.getSdrPageProperties().GetStyleSheet(),
453                 "MasterPage without StyleSheet detected (!)");
454         }
455 
456         aNewAttr.Put(*pTempSet);
457         mrReq.Done( aNewAttr );
458 
459         return mrReq.GetArgs();
460     }
461     else
462     {
463         return nullptr;
464     }
465 }
466 
ApplyItemSet(const SfxItemSet * pArgs)467 void FuPage::ApplyItemSet( const SfxItemSet* pArgs )
468 {
469     if (!pArgs || !mpDrawViewShell)
470         return;
471 
472     // Set new page-attributes
473     PageKind ePageKind = mpDrawViewShell->GetPageKind();
474     const SfxPoolItem*  pPoolItem;
475     bool                bSetPageSizeAndBorder = false;
476     Size                aNewSize(maSize);
477     sal_Int32               nLeft  = -1, nRight = -1, nUpper = -1, nLower = -1;
478     bool                bScaleAll = true;
479     Orientation         eOrientation = mpPage->GetOrientation();
480     SdPage*             pMasterPage = mpPage->IsMasterPage() ? mpPage : &static_cast<SdPage&>(mpPage->TRG_GetMasterPage());
481     bool                bFullSize = pMasterPage->IsBackgroundFullSize();
482     sal_uInt16          nPaperBin = mpPage->GetPaperBin();
483 
484     if( pArgs->GetItemState(SID_ATTR_PAGE, true, &pPoolItem) == SfxItemState::SET )
485     {
486         mpDoc->SetPageNumType(static_cast<const SvxPageItem*>(pPoolItem)->GetNumType());
487 
488         eOrientation = static_cast<const SvxPageItem*>(pPoolItem)->IsLandscape() ?
489             Orientation::Landscape : Orientation::Portrait;
490 
491         if( mpPage->GetOrientation() != eOrientation )
492             bSetPageSizeAndBorder = true;
493 
494         mpDrawViewShell->ResetActualPage();
495     }
496 
497     if( pArgs->GetItemState(SID_ATTR_PAGE_SIZE, true, &pPoolItem) == SfxItemState::SET )
498     {
499         aNewSize = static_cast<const SvxSizeItem*>(pPoolItem)->GetSize();
500 
501         if( mpPage->GetSize() != aNewSize )
502             bSetPageSizeAndBorder = true;
503     }
504 
505     if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE),
506                             true, &pPoolItem) == SfxItemState::SET )
507     {
508         nLeft = static_cast<const SvxLRSpaceItem*>(pPoolItem)->GetLeft();
509         nRight = static_cast<const SvxLRSpaceItem*>(pPoolItem)->GetRight();
510 
511         if( mpPage->GetLeftBorder() != nLeft || mpPage->GetRightBorder() != nRight )
512             bSetPageSizeAndBorder = true;
513 
514     }
515 
516     if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE),
517                             true, &pPoolItem) == SfxItemState::SET )
518     {
519         nUpper = static_cast<const SvxULSpaceItem*>(pPoolItem)->GetUpper();
520         nLower = static_cast<const SvxULSpaceItem*>(pPoolItem)->GetLower();
521 
522         if( mpPage->GetUpperBorder() != nUpper || mpPage->GetLowerBorder() != nLower )
523             bSetPageSizeAndBorder = true;
524     }
525 
526     if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_PAGE_EXT1), true, &pPoolItem) == SfxItemState::SET )
527     {
528         bScaleAll = static_cast<const SfxBoolItem*>(pPoolItem)->GetValue();
529     }
530 
531     if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_PAGE_EXT2), true, &pPoolItem) == SfxItemState::SET )
532     {
533         bFullSize = static_cast<const SfxBoolItem*>(pPoolItem)->GetValue();
534 
535         if(pMasterPage->IsBackgroundFullSize() != bFullSize )
536             bSetPageSizeAndBorder = true;
537     }
538 
539     // Paper Bin
540     if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_PAGE_PAPERBIN), true, &pPoolItem) == SfxItemState::SET )
541     {
542         nPaperBin = static_cast<const SvxPaperBinItem*>(pPoolItem)->GetValue();
543 
544         if( mpPage->GetPaperBin() != nPaperBin )
545             bSetPageSizeAndBorder = true;
546     }
547 
548     if (nLeft == -1 && nUpper != -1)
549     {
550         bSetPageSizeAndBorder = true;
551         nLeft  = mpPage->GetLeftBorder();
552         nRight = mpPage->GetRightBorder();
553     }
554     else if (nLeft != -1 && nUpper == -1)
555     {
556         bSetPageSizeAndBorder = true;
557         nUpper = mpPage->GetUpperBorder();
558         nLower = mpPage->GetLowerBorder();
559     }
560 
561     if( bSetPageSizeAndBorder || !mbMasterPage )
562         mpDrawViewShell->SetPageSizeAndBorder(ePageKind, aNewSize, nLeft, nRight, nUpper, nLower, bScaleAll, eOrientation, nPaperBin, bFullSize );
563 
564     // if bMasterPage==sal_False then create a background-object for this page with the
565     // properties set in the dialog before, but if mbPageBckgrdDeleted==sal_True then
566     // the background of this page was set to invisible, so it would be a mistake
567     // to create a new background-object for this page !
568 
569     if( mbDisplayBackgroundTabPage )
570     {
571         if( !mbMasterPage && !mbPageBckgrdDeleted )
572         {
573             // Only this page
574             mpBackgroundObjUndoAction.reset( new SdBackgroundObjUndoAction(
575                 *mpDoc, *mpPage, mpPage->getSdrPageProperties().GetItemSet()) );
576             SfxItemSet aSet( *pArgs );
577             sdr::properties::CleanupFillProperties(aSet);
578             mpPage->getSdrPageProperties().ClearItem();
579             mpPage->getSdrPageProperties().PutItemSet(aSet);
580         }
581     }
582 
583     // add undo action for background object
584     if( mpBackgroundObjUndoAction )
585     {
586         // set merge flag, because a SdUndoGroupAction could have been inserted before
587         mpDocSh->GetUndoManager()->AddUndoAction( std::move(mpBackgroundObjUndoAction), true );
588     }
589 
590     // Objects can not be bigger than ViewSize
591     Size aPageSize = mpDoc->GetSdPage(0, ePageKind)->GetSize();
592     Size aViewSize(aPageSize.Width() * 3, aPageSize.Height() * 2);
593     mpDoc->SetMaxObjSize(aViewSize);
594 
595     // if necessary, we tell Preview the new context
596     mpDrawViewShell->UpdatePreview( mpDrawViewShell->GetActualPage() );
597 }
598 
599 } // end of namespace sd
600 
601 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
602