xref: /aoo4110/main/sd/source/ui/func/fupage.cxx (revision b1cdbd2c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26 
27 
28 #include "fupage.hxx"
29 
30 #include <sfx2/viewfrm.hxx>
31 
32 // Seite einrichten Tab-Page
33 
34 #include <svx/svxids.hrc>
35 #include <svx/dialogs.hrc>
36 #include <svl/itempool.hxx>
37 #include <vcl/msgbox.hxx>
38 #include <sfx2/request.hxx>
39 #include <svl/stritem.hxx>
40 #include <vcl/prntypes.hxx>
41 #include <svl/style.hxx>
42 #include <stlsheet.hxx>
43 #include <svx/svdorect.hxx>
44 #include <svx/svdundo.hxx>
45 #include <editeng/eeitem.hxx>
46 #include <editeng/frmdiritem.hxx>
47 #include <svx/xbtmpit.hxx>
48 #include <svx/xsetit.hxx>
49 #include <svl/itempool.hxx>
50 #include <editeng/ulspitem.hxx>
51 #include <editeng/lrspitem.hxx>
52 #include <svx/sdr/properties/properties.hxx>
53 
54 #include "glob.hrc"
55 #include <editeng/shaditem.hxx>
56 #include <editeng/boxitem.hxx>
57 #include <editeng/sizeitem.hxx>
58 #include <editeng/ulspitem.hxx>
59 #include <editeng/lrspitem.hxx>
60 #include <editeng/pbinitem.hxx>
61 #include <sfx2/app.hxx>
62 #include <sfx2/opengrf.hxx>
63 
64 #include "strings.hrc"
65 #include "sdpage.hxx"
66 #include "View.hxx"
67 #include "Window.hxx"
68 #include "pres.hxx"
69 #include "drawdoc.hxx"
70 #include "DrawDocShell.hxx"
71 #include "ViewShell.hxx"
72 #include "DrawViewShell.hxx"
73 #include "app.hrc"
74 #include "unchss.hxx"
75 #include "undoback.hxx"
76 #include "sdabstdlg.hxx"
77 #include "sdresid.hxx"
78 #include "sdundogr.hxx"
79 #include "helpids.h"
80 
81 namespace sd {
82 
83 class Window;
84 
85 // 50 cm 28350
86 // erstmal vom Writer uebernommen
87 #define MAXHEIGHT 28350
88 #define MAXWIDTH  28350
89 
90 
91 TYPEINIT1( FuPage, FuPoor );
92 
mergeItemSetsImpl(SfxItemSet & rTarget,const SfxItemSet & rSource)93 void mergeItemSetsImpl( SfxItemSet& rTarget, const SfxItemSet& rSource )
94 {
95 	const sal_uInt16* pPtr = rSource.GetRanges();
96 	sal_uInt16 p1, p2;
97 	while( *pPtr )
98 	{
99 		p1 = pPtr[0];
100 		p2 = pPtr[1];
101 
102 		// make ranges discret
103 		while(pPtr[2] && (pPtr[2] - p2 == 1))
104 		{
105 			p2 = pPtr[3];
106 			pPtr += 2;
107 		}
108 		rTarget.MergeRange( p1, p2 );
109 		pPtr += 2;
110 	}
111 
112 	rTarget.Put(rSource);
113 }
114 
115 /*************************************************************************
116 |*
117 |* Konstruktor
118 |*
119 \************************************************************************/
120 
FuPage(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)121 FuPage::FuPage( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView,
122 				 SdDrawDocument* pDoc, SfxRequest& rReq )
123 :	FuPoor(pViewSh, pWin, pView, pDoc, rReq),
124 	mrReq(rReq),
125 	mpArgs( rReq.GetArgs() ),
126     mpBackgroundObjUndoAction( 0 ),
127 	mbPageBckgrdDeleted( false ),
128 	mbMasterPage( false ),
129 	mbDisplayBackgroundTabPage( true ),
130 	mpPage(0)
131 {
132 }
133 
Create(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)134 FunctionReference FuPage::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
135 {
136 	FunctionReference xFunc( new FuPage( pViewSh, pWin, pView, pDoc, rReq ) );
137 	xFunc->DoExecute(rReq);
138 	return xFunc;
139 }
140 
DoExecute(SfxRequest &)141 void FuPage::DoExecute( SfxRequest& )
142 {
143 	mpDrawViewShell = dynamic_cast<DrawViewShell*>(mpViewShell);
144 	DBG_ASSERT( mpDrawViewShell, "sd::FuPage::FuPage(), called without a current DrawViewShell!" );
145 	if( mpDrawViewShell )
146 	{
147 		mbMasterPage = mpDrawViewShell->GetEditMode() == EM_MASTERPAGE;
148 		mbDisplayBackgroundTabPage = (mpDrawViewShell->GetPageKind() == PK_STANDARD);
149 		mpPage = mpDrawViewShell->getCurrentPage();
150 	}
151 
152 	if( mpPage )
153 	{
154 		// if there are no arguments given, open the dialog
155 		if( !mpArgs )
156 		{
157 			mpView->SdrEndTextEdit();
158 			mpArgs = ExecuteDialog(mpWindow);
159 		}
160 
161 		// if we now have arguments, apply them to current page
162 		if( mpArgs )
163 			ApplyItemSet( mpArgs );
164 	}
165 }
166 
~FuPage()167 FuPage::~FuPage()
168 {
169 	delete mpBackgroundObjUndoAction;
170 }
171 
Activate()172 void FuPage::Activate()
173 {
174 }
175 
Deactivate()176 void FuPage::Deactivate()
177 {
178 }
179 
ExecuteDialog(Window * pParent)180 const SfxItemSet* FuPage::ExecuteDialog( Window* pParent )
181 {
182 	PageKind ePageKind = mpDrawViewShell->GetPageKind();
183 
184 	SfxItemSet aNewAttr(mpDoc->GetPool(),
185 						mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE),
186 						mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE),
187 						SID_ATTR_PAGE, SID_ATTR_PAGE_BSP,
188 						SID_ATTR_BORDER_OUTER, SID_ATTR_BORDER_OUTER,
189 						SID_ATTR_BORDER_SHADOW, SID_ATTR_BORDER_SHADOW,
190 						XATTR_FILL_FIRST, XATTR_FILL_LAST,
191 						EE_PARA_WRITINGDIR, EE_PARA_WRITINGDIR,
192 						0);
193 
194 	///////////////////////////////////////////////////////////////////////
195 	// Retrieve additional data for dialog
196 
197     SvxShadowItem aShadowItem(SID_ATTR_BORDER_SHADOW);
198 	aNewAttr.Put( aShadowItem );
199     SvxBoxItem aBoxItem( SID_ATTR_BORDER_OUTER );
200 	aNewAttr.Put( aBoxItem );
201 
202     aNewAttr.Put( SvxFrameDirectionItem(
203         mpDoc->GetDefaultWritingMode() == ::com::sun::star::text::WritingMode_RL_TB ? FRMDIR_HORI_RIGHT_TOP : FRMDIR_HORI_LEFT_TOP,
204         EE_PARA_WRITINGDIR ) );
205 
206 	///////////////////////////////////////////////////////////////////////
207 	// Retrieve page-data for dialog
208 
209     SvxPageItem aPageItem( SID_ATTR_PAGE );
210 	aPageItem.SetDescName( mpPage->GetName() );
211 	aPageItem.SetPageUsage( (SvxPageUsage) SVX_PAGE_ALL );
212 	aPageItem.SetLandscape( mpPage->GetOrientation() == ORIENTATION_LANDSCAPE ? sal_True: sal_False );
213 	aPageItem.SetNumType( mpDoc->GetPageNumType() );
214 	aNewAttr.Put( aPageItem );
215 
216 	// size
217 	maSize = mpPage->GetSize();
218 	SvxSizeItem aSizeItem( SID_ATTR_PAGE_SIZE, maSize );
219 	aNewAttr.Put( aSizeItem );
220 
221 	// Max size
222 	SvxSizeItem aMaxSizeItem( SID_ATTR_PAGE_MAXSIZE, Size( MAXWIDTH, MAXHEIGHT ) );
223 	aNewAttr.Put( aMaxSizeItem );
224 
225 	// paperbin
226 	SvxPaperBinItem aPaperBinItem( SID_ATTR_PAGE_PAPERBIN, (const sal_uInt8)mpPage->GetPaperBin() );
227 	aNewAttr.Put( aPaperBinItem );
228 
229 	SvxLRSpaceItem aLRSpaceItem( (sal_uInt16)mpPage->GetLftBorder(), (sal_uInt16)mpPage->GetRgtBorder(), 0, 0, mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE));
230 	aNewAttr.Put( aLRSpaceItem );
231 
232 	SvxULSpaceItem aULSpaceItem( (sal_uInt16)mpPage->GetUppBorder(), (sal_uInt16)mpPage->GetLwrBorder(), mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE));
233 	aNewAttr.Put( aULSpaceItem );
234 
235 	// Applikation
236 	bool bScale = mpDoc->GetDocumentType() != DOCUMENT_TYPE_DRAW;
237 	aNewAttr.Put( SfxBoolItem( SID_ATTR_PAGE_EXT1, bScale ? sal_True : sal_False ) );
238 
239 	sal_Bool bFullSize = mpPage->IsMasterPage() ?
240 		mpPage->IsBackgroundFullSize() : ((SdPage&)mpPage->TRG_GetMasterPage()).IsBackgroundFullSize();
241 
242 	aNewAttr.Put( SfxBoolItem( SID_ATTR_PAGE_EXT2, bFullSize ) );
243 
244 	///////////////////////////////////////////////////////////////////////
245 	// Merge ItemSet for dialog
246 
247 	const sal_uInt16* pPtr = aNewAttr.GetRanges();
248 	sal_uInt16 p1 = pPtr[0], p2 = pPtr[1];
249 	while(pPtr[2] && (pPtr[2] - p2 == 1))
250 	{
251 		p2 = pPtr[3];
252 		pPtr += 2;
253 	}
254 	pPtr += 2;
255 	SfxItemSet aMergedAttr( *aNewAttr.GetPool(), p1, p2 );
256 
257 	mergeItemSetsImpl( aMergedAttr, aNewAttr );
258 
259 	SdStyleSheet* pStyleSheet = mpPage->getPresentationStyle(HID_PSEUDOSHEET_BACKGROUND);
260 
261 	// merge page background filling to the dialogs input set
262 	if( mbDisplayBackgroundTabPage )
263 	{
264 		if( mbMasterPage )
265 		{
266 			if(pStyleSheet)
267 				mergeItemSetsImpl( aMergedAttr, pStyleSheet->GetItemSet() );
268 		}
269 		else
270 		{
271             // Only this page, get attributes for background fill
272             const SfxItemSet& rBackgroundAttributes = mpPage->getSdrPageProperties().GetItemSet();
273 
274             if(XFILL_NONE != ((const XFillStyleItem&)rBackgroundAttributes.Get(XATTR_FILLSTYLE)).GetValue())
275             {
276                 // page attributes are used, take them
277     			aMergedAttr.Put(rBackgroundAttributes);
278             }
279             else
280             {
281 				if(pStyleSheet
282                     && XFILL_NONE != ((const XFillStyleItem&)pStyleSheet->GetItemSet().Get(XATTR_FILLSTYLE)).GetValue())
283                 {
284     				// if the page has no fill style, use the settings from the
285 					// background stylesheet (if used)
286 					mergeItemSetsImpl(aMergedAttr, pStyleSheet->GetItemSet());
287                 }
288 				else
289                 {
290                     // no fill style from page, start with no fill style
291 					aMergedAttr.Put(XFillStyleItem(XFILL_NONE));
292                 }
293             }
294 		}
295 	}
296 
297 	std::auto_ptr< SfxItemSet > pTempSet;
298 
299 	if( GetSlotID() == SID_SELECT_BACKGROUND )
300 	{
301 	    SvxOpenGraphicDialog	aDlg(SdResId(STR_SET_BACKGROUND_PICTURE));
302 
303 	    if( aDlg.Execute() == GRFILTER_OK )
304 	    {
305 			Graphic		aGraphic;
306 			int nError = aDlg.GetGraphic(aGraphic);
307 			if( nError == GRFILTER_OK )
308 			{
309 				pTempSet.reset( new SfxItemSet( mpDoc->GetPool(), XATTR_FILL_FIRST, XATTR_FILL_LAST, 0) );
310 
311 				pTempSet->Put( XFillStyleItem( XFILL_BITMAP ) );
312 
313 				// MigrateItemSet makes sure the XFillBitmapItem will have a unique name
314 				SfxItemSet aMigrateSet( mpDoc->GetPool(), XATTR_FILLBITMAP, XATTR_FILLBITMAP );
315 				aMigrateSet.Put(XFillBitmapItem(String(RTL_CONSTASCII_USTRINGPARAM("background")), aGraphic));
316 				mpDoc->MigrateItemSet( &aMigrateSet, pTempSet.get(), NULL );
317 
318 				pTempSet->Put( XFillBmpStretchItem( sal_True ));
319 				pTempSet->Put( XFillBmpTileItem( sal_False ));
320 			}
321 		}
322 	}
323 	else
324 	{
325 		// create the dialog
326 		SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
327 		std::auto_ptr<SfxAbstractTabDialog> pDlg( pFact ? pFact->CreateSdTabPageDialog(NULL, &aMergedAttr, mpDocSh, mbDisplayBackgroundTabPage ) : 0 );
328 		if( pDlg.get() && pDlg->Execute() == RET_OK )
329 			pTempSet.reset( new SfxItemSet(*pDlg->GetOutputItemSet()) );
330 	}
331 
332 	if( pTempSet.get() )
333 	{
334 		pStyleSheet->AdjustToFontHeight(*pTempSet);
335 
336 		if( mbDisplayBackgroundTabPage )
337 		{
338 			// if some fillstyle-items are not set in the dialog, then
339 			// try to use the items before
340 			sal_Bool bChanges = sal_False;
341 			for( sal_uInt16 i=XATTR_FILL_FIRST; i<XATTR_FILL_LAST; i++ )
342 			{
343 				if( aMergedAttr.GetItemState( i ) != SFX_ITEM_DEFAULT )
344 				{
345 					if( pTempSet->GetItemState( i ) == SFX_ITEM_DEFAULT )
346 						pTempSet->Put( aMergedAttr.Get( i ) );
347 					else
348 						if( aMergedAttr.GetItem( i ) != pTempSet->GetItem( i ) )
349 							bChanges = sal_True;
350 				}
351 			}
352 
353 			// if the background for this page was set to invisible, the background-object has to be deleted, too.
354 			if( ( ( (XFillStyleItem*) pTempSet->GetItem( XATTR_FILLSTYLE ) )->GetValue() == XFILL_NONE ) ||
355 				( ( pTempSet->GetItemState( XATTR_FILLSTYLE ) == SFX_ITEM_DEFAULT ) &&
356 					( ( (XFillStyleItem*) aMergedAttr.GetItem( XATTR_FILLSTYLE ) )->GetValue() == XFILL_NONE ) ) )
357 				mbPageBckgrdDeleted = sal_True;
358 
359 			bool bSetToAllPages = false;
360 
361 			// Ask, wether the setting are for the background-page or for the current page
362 			if( !mbMasterPage && bChanges )
363 			{
364 				// But don't ask in notice-view, because we can't change the background of
365 				// notice-masterpage (at the moment)
366 				if( ePageKind != PK_NOTES )
367 				{
368 					String aTit(SdResId( STR_PAGE_BACKGROUND_TITLE ));
369 					String aTxt(SdResId( STR_PAGE_BACKGROUND_TXT ));
370 					MessBox aQuestionBox (
371                         pParent,
372                         WB_YES_NO | WB_DEF_YES,
373                         aTit,
374                         aTxt );
375 					aQuestionBox.SetImage( QueryBox::GetStandardImage() );
376 					bSetToAllPages = ( RET_YES == aQuestionBox.Execute() );
377 				}
378 
379                 if( mbPageBckgrdDeleted )
380 				{
381                     mpBackgroundObjUndoAction = new SdBackgroundObjUndoAction(
382                         *mpDoc, *mpPage, mpPage->getSdrPageProperties().GetItemSet());
383 
384                     if(!mpPage->IsMasterPage())
385                     {
386                         // on normal pages, switch off fill attribute usage
387 						SdrPageProperties& rPageProperties = mpPage->getSdrPageProperties();
388 						rPageProperties.ClearItem( XATTR_FILLBITMAP );
389 						rPageProperties.ClearItem( XATTR_FILLGRADIENT );
390 						rPageProperties.ClearItem( XATTR_FILLHATCH );
391                         rPageProperties.PutItem(XFillStyleItem(XFILL_NONE));
392                     }
393 				}
394 			}
395 
396 			// Sonderbehandlung: die INVALIDS auf NULL-Pointer
397 			// zurueckgesetzen (sonst landen INVALIDs oder
398 			// Pointer auf die DefaultItems in der Vorlage;
399 			// beides wuerde die Attribut-Vererbung unterbinden)
400 			pTempSet->ClearInvalidItems();
401 
402 			if( mbMasterPage )
403 			{
404 				StyleSheetUndoAction* pAction = new StyleSheetUndoAction(mpDoc, (SfxStyleSheet*)pStyleSheet, &(*pTempSet.get()));
405 				mpDocSh->GetUndoManager()->AddUndoAction(pAction);
406 				pStyleSheet->GetItemSet().Put( *(pTempSet.get()) );
407 				sdr::properties::CleanupFillProperties( pStyleSheet->GetItemSet() );
408 				pStyleSheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
409 			}
410 			else if( bSetToAllPages )
411 			{
412 				String aComment(SdResId(STR_UNDO_CHANGE_PAGEFORMAT));
413 				::svl::IUndoManager* pUndoMgr = mpDocSh->GetUndoManager();
414 				pUndoMgr->EnterListAction(aComment, aComment);
415 				SdUndoGroup* pUndoGroup = new SdUndoGroup(mpDoc);
416 				pUndoGroup->SetComment(aComment);
417 
418 				//Set background on all master pages
419 				sal_uInt16 nMasterPageCount = mpDoc->GetMasterSdPageCount(ePageKind);
420 				for (sal_uInt16 i = 0; i < nMasterPageCount; ++i)
421 				{
422 					SdPage *pMasterPage = mpDoc->GetMasterSdPage(i, ePageKind);
423 					SdStyleSheet *pStyle =
424 						pMasterPage->getPresentationStyle(HID_PSEUDOSHEET_BACKGROUND);
425 					StyleSheetUndoAction* pAction =
426 						new StyleSheetUndoAction(mpDoc, (SfxStyleSheet*)pStyle, &(*pTempSet.get()));
427 					pUndoGroup->AddAction(pAction);
428 					pStyle->GetItemSet().Put( *(pTempSet.get()) );
429 					sdr::properties::CleanupFillProperties( pStyleSheet->GetItemSet() );
430 					pStyle->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
431 				}
432 
433 				//Remove background from all pages to reset to the master bg
434 				sal_uInt16 nPageCount(mpDoc->GetSdPageCount(ePageKind));
435 				for(sal_uInt16 i=0; i<nPageCount; ++i)
436 				{
437 					SdPage *pPage = mpDoc->GetSdPage(i, ePageKind);
438 
439 					const SfxItemSet& rFillAttributes = pPage->getSdrPageProperties().GetItemSet();
440    					if(XFILL_NONE != ((const XFillStyleItem&)rFillAttributes.Get(XATTR_FILLSTYLE)).GetValue())
441 				    {
442 						SdBackgroundObjUndoAction *pBackgroundObjUndoAction = new SdBackgroundObjUndoAction(*mpDoc, *pPage, rFillAttributes);
443 						pUndoGroup->AddAction(pBackgroundObjUndoAction);
444 
445 						SdrPageProperties& rPageProperties = pPage->getSdrPageProperties();
446 						rPageProperties.ClearItem( XATTR_FILLBITMAP );
447 						rPageProperties.ClearItem( XATTR_FILLGRADIENT );
448 						rPageProperties.ClearItem( XATTR_FILLHATCH );
449                         rPageProperties.PutItem(XFillStyleItem(XFILL_NONE));
450 
451 						pPage->ActionChanged();
452 					}
453 				}
454 
455 				pUndoMgr->AddUndoAction(pUndoGroup);
456 				pUndoMgr->LeaveListAction();
457 
458 			}
459 
460 			// if background filling is set to master pages then clear from page set
461 			if( mbMasterPage || bSetToAllPages )
462 			{
463 				for( sal_uInt16 nWhich = XATTR_FILL_FIRST; nWhich <= XATTR_FILL_LAST; nWhich++ )
464 				{
465 					pTempSet->ClearItem( nWhich );
466 				}
467 				pTempSet->Put(XFillStyleItem(XFILL_NONE));
468 			}
469 
470 			const SfxPoolItem *pItem;
471 			if( SFX_ITEM_SET == pTempSet->GetItemState( EE_PARA_WRITINGDIR, sal_False, &pItem ) )
472 			{
473 				sal_uInt32 nVal = ((SvxFrameDirectionItem*)pItem)->GetValue();
474 				mpDoc->SetDefaultWritingMode( nVal == FRMDIR_HORI_RIGHT_TOP ? ::com::sun::star::text::WritingMode_RL_TB : ::com::sun::star::text::WritingMode_LR_TB );
475 			}
476 
477 			mpDoc->SetChanged(sal_True);
478 
479 			// BackgroundFill of Masterpage: no hard attributes allowed
480             SdrPage& rUsedMasterPage = mpPage->IsMasterPage() ? *mpPage : mpPage->TRG_GetMasterPage();
481             OSL_ENSURE(rUsedMasterPage.IsMasterPage(), "No MasterPage (!)");
482             rUsedMasterPage.getSdrPageProperties().ClearItem();
483             OSL_ENSURE(0 != rUsedMasterPage.getSdrPageProperties().GetStyleSheet(),
484                 "MasterPage without StyleSheet detected (!)");
485 		}
486 
487 		aNewAttr.Put(*(pTempSet.get()));
488 		mrReq.Done( aNewAttr );
489 
490 		return mrReq.GetArgs();
491 	}
492 	else
493 	{
494 		return 0;
495 	}
496 }
497 
ApplyItemSet(const SfxItemSet * pArgs)498 void FuPage::ApplyItemSet( const SfxItemSet* pArgs )
499 {
500 	if( !pArgs )
501 		return;
502 
503 	///////////////////////////////////////////////////////////////////////////
504 	// Set new page-attributes
505 	PageKind ePageKind = mpDrawViewShell->GetPageKind();
506 	const SfxPoolItem*  pPoolItem;
507 	sal_Bool                bSetPageSizeAndBorder = sal_False;
508 	Size                aNewSize(maSize);
509 	sal_Int32	            nLeft  = -1, nRight = -1, nUpper = -1, nLower = -1;
510 	sal_Bool	            bScaleAll = sal_True;
511 	Orientation         eOrientation = mpPage->GetOrientation();
512 	SdPage*				pMasterPage = mpPage->IsMasterPage() ? mpPage : &(SdPage&)(mpPage->TRG_GetMasterPage());
513 	sal_Bool                bFullSize = pMasterPage->IsBackgroundFullSize();
514 	sal_uInt16              nPaperBin = mpPage->GetPaperBin();
515 
516 	if( pArgs->GetItemState(SID_ATTR_PAGE, sal_True, &pPoolItem) == SFX_ITEM_SET )
517 	{
518 		mpDoc->SetPageNumType(((const SvxPageItem*) pPoolItem)->GetNumType());
519 
520 		eOrientation = (((const SvxPageItem*) pPoolItem)->IsLandscape() == ORIENTATION_LANDSCAPE) ?
521 			ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT;
522 
523 		if( mpPage->GetOrientation() != eOrientation )
524 			bSetPageSizeAndBorder = sal_True;
525 
526 		mpDrawViewShell->ResetActualPage();
527 	}
528 
529 	if( pArgs->GetItemState(SID_ATTR_PAGE_SIZE, sal_True, &pPoolItem) == SFX_ITEM_SET )
530 	{
531 		aNewSize = ((const SvxSizeItem*) pPoolItem)->GetSize();
532 
533 		if( mpPage->GetSize() != aNewSize )
534 			bSetPageSizeAndBorder = sal_True;
535 	}
536 
537 	if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE),
538 							sal_True, &pPoolItem) == SFX_ITEM_SET )
539 	{
540 		nLeft = ((const SvxLRSpaceItem*) pPoolItem)->GetLeft();
541 		nRight = ((const SvxLRSpaceItem*) pPoolItem)->GetRight();
542 
543 		if( mpPage->GetLftBorder() != nLeft || mpPage->GetRgtBorder() != nRight )
544 			bSetPageSizeAndBorder = sal_True;
545 
546 	}
547 
548 	if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE),
549 							sal_True, &pPoolItem) == SFX_ITEM_SET )
550 	{
551 		nUpper = ((const SvxULSpaceItem*) pPoolItem)->GetUpper();
552 		nLower = ((const SvxULSpaceItem*) pPoolItem)->GetLower();
553 
554 		if( mpPage->GetUppBorder() != nUpper || mpPage->GetLwrBorder() != nLower )
555 			bSetPageSizeAndBorder = sal_True;
556 	}
557 
558 	if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_PAGE_EXT1), sal_True, &pPoolItem) == SFX_ITEM_SET )
559 	{
560 		bScaleAll = ((const SfxBoolItem*) pPoolItem)->GetValue();
561 	}
562 
563 	if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_PAGE_EXT2), sal_True, &pPoolItem) == SFX_ITEM_SET )
564 	{
565 		bFullSize = ((const SfxBoolItem*) pPoolItem)->GetValue();
566 
567 		if(pMasterPage->IsBackgroundFullSize() != bFullSize )
568 			bSetPageSizeAndBorder = sal_True;
569 	}
570 
571 	// Papierschacht (PaperBin)
572 	if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_PAGE_PAPERBIN), sal_True, &pPoolItem) == SFX_ITEM_SET )
573 	{
574 		nPaperBin = ((const SvxPaperBinItem*) pPoolItem)->GetValue();
575 
576 		if( mpPage->GetPaperBin() != nPaperBin )
577 			bSetPageSizeAndBorder = sal_True;
578 	}
579 
580 	if (nLeft == -1 && nUpper != -1)
581 	{
582 		bSetPageSizeAndBorder = sal_True;
583 		nLeft  = mpPage->GetLftBorder();
584 		nRight = mpPage->GetRgtBorder();
585 	}
586 	else if (nLeft != -1 && nUpper == -1)
587 	{
588 		bSetPageSizeAndBorder = sal_True;
589 		nUpper = mpPage->GetUppBorder();
590 		nLower = mpPage->GetLwrBorder();
591 	}
592 
593 	if( bSetPageSizeAndBorder || !mbMasterPage )
594 		mpDrawViewShell->SetPageSizeAndBorder(ePageKind, aNewSize, nLeft, nRight, nUpper, nLower, bScaleAll, eOrientation, nPaperBin, bFullSize );
595 
596 	////////////////////////////////////////////////////////////////////////////////
597 	//
598 	// if bMasterPage==sal_False then create a background-object for this page with the
599 	// properties set in the dialog before, but if mbPageBckgrdDeleted==sal_True then
600 	// the background of this page was set to invisible, so it would be a mistake
601 	// to create a new background-object for this page !
602 	//
603 
604 	if( mbDisplayBackgroundTabPage )
605 	{
606 		if( !mbMasterPage && !mbPageBckgrdDeleted )
607 		{
608 			// Only this page
609 			delete mpBackgroundObjUndoAction;
610 			mpBackgroundObjUndoAction = new SdBackgroundObjUndoAction(
611                 *mpDoc, *mpPage, mpPage->getSdrPageProperties().GetItemSet());
612 			SfxItemSet aSet( *pArgs );
613 			sdr::properties::CleanupFillProperties(aSet);
614 			mpPage->getSdrPageProperties().ClearItem();
615             mpPage->getSdrPageProperties().PutItemSet(aSet);
616 		}
617 	}
618 
619 	// add undo action for background object
620 	if( mpBackgroundObjUndoAction )
621 	{
622 		// set merge flag, because a SdUndoGroupAction could have been inserted before
623 		mpDocSh->GetUndoManager()->AddUndoAction( mpBackgroundObjUndoAction, sal_True );
624 		mpBackgroundObjUndoAction = 0;
625 	}
626 
627 	///////////////////////////////////////////////////////////////////////////
628 	//
629 	// Objekte koennen max. so gross wie die ViewSize werden
630 	//
631 	Size aPageSize = mpDoc->GetSdPage(0, ePageKind)->GetSize();
632 	Size aViewSize = Size(aPageSize.Width() * 3, aPageSize.Height() * 2);
633 	mpDoc->SetMaxObjSize(aViewSize);
634 
635 	///////////////////////////////////////////////////////////////////////////
636 	//
637 	// ggfs. Preview den neuen Kontext mitteilen
638 	//
639 	mpDrawViewShell->UpdatePreview( mpDrawViewShell->GetActualPage() );
640 }
641 
642 } // end of namespace sd
643