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