/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sd.hxx"


#include "fupage.hxx"

#include <sfx2/viewfrm.hxx>

// Seite einrichten Tab-Page

#include <svx/svxids.hrc>
#include <svx/dialogs.hrc>
#include <svl/itempool.hxx>
#include <vcl/msgbox.hxx>
#include <sfx2/request.hxx>
#include <svl/stritem.hxx>
#include <vcl/prntypes.hxx>
#include <svl/style.hxx>
#include <stlsheet.hxx>
#include <svx/svdorect.hxx>
#include <svx/svdundo.hxx>
#include <editeng/eeitem.hxx>
#include <editeng/frmdiritem.hxx>
#include <svx/xbtmpit.hxx>
#include <svx/xsetit.hxx>
#include <svl/itempool.hxx>
#include <editeng/ulspitem.hxx>
#include <editeng/lrspitem.hxx>
#include <svx/sdr/properties/properties.hxx>

#include "glob.hrc"
#include <editeng/shaditem.hxx>
#include <editeng/boxitem.hxx>
#include <editeng/sizeitem.hxx>
#include <editeng/ulspitem.hxx>
#include <editeng/lrspitem.hxx>
#include <editeng/pbinitem.hxx>
#include <sfx2/app.hxx>
#include <sfx2/opengrf.hxx>

#include "strings.hrc"
#include "sdpage.hxx"
#include "View.hxx"
#include "Window.hxx"
#include "pres.hxx"
#include "drawdoc.hxx"
#include "DrawDocShell.hxx"
#include "ViewShell.hxx"
#include "DrawViewShell.hxx"
#include "app.hrc"
#include "unchss.hxx"
#include "undoback.hxx"
#include "sdabstdlg.hxx"
#include "sdresid.hxx"
#include "sdundogr.hxx"
#include "helpids.h"

namespace sd {

class Window;

// 50 cm 28350
// erstmal vom Writer uebernommen
#define MAXHEIGHT 28350
#define MAXWIDTH  28350


TYPEINIT1( FuPage, FuPoor );

void mergeItemSetsImpl( SfxItemSet& rTarget, const SfxItemSet& rSource )
{
	const sal_uInt16* pPtr = rSource.GetRanges();
	sal_uInt16 p1, p2;
	while( *pPtr )
	{
		p1 = pPtr[0];
		p2 = pPtr[1];

		// make ranges discret
		while(pPtr[2] && (pPtr[2] - p2 == 1))
		{
			p2 = pPtr[3];
			pPtr += 2;
		}
		rTarget.MergeRange( p1, p2 );
		pPtr += 2;
	}

	rTarget.Put(rSource);
}

/*************************************************************************
|*
|* Konstruktor
|*
\************************************************************************/

FuPage::FuPage( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView,
				 SdDrawDocument* pDoc, SfxRequest& rReq )
:	FuPoor(pViewSh, pWin, pView, pDoc, rReq),
	mrReq(rReq),
	mpArgs( rReq.GetArgs() ),
    mpBackgroundObjUndoAction( 0 ),
	mbPageBckgrdDeleted( false ),
	mbMasterPage( false ),
	mbDisplayBackgroundTabPage( true ),
	mpPage(0)
{
}

FunctionReference FuPage::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
{
	FunctionReference xFunc( new FuPage( pViewSh, pWin, pView, pDoc, rReq ) );
	xFunc->DoExecute(rReq);
	return xFunc;
}

void FuPage::DoExecute( SfxRequest& )
{
	mpDrawViewShell = dynamic_cast<DrawViewShell*>(mpViewShell);
	DBG_ASSERT( mpDrawViewShell, "sd::FuPage::FuPage(), called without a current DrawViewShell!" );
	if( mpDrawViewShell )
	{
		mbMasterPage = mpDrawViewShell->GetEditMode() == EM_MASTERPAGE;
		mbDisplayBackgroundTabPage = (mpDrawViewShell->GetPageKind() == PK_STANDARD);
		mpPage = mpDrawViewShell->getCurrentPage();
	}

	if( mpPage )
	{
		// if there are no arguments given, open the dialog
		if( !mpArgs )
		{
			mpView->SdrEndTextEdit();
			mpArgs = ExecuteDialog(mpWindow);
		}

		// if we now have arguments, apply them to current page
		if( mpArgs )
			ApplyItemSet( mpArgs );
	}
}

FuPage::~FuPage()
{
	delete mpBackgroundObjUndoAction;
}

void FuPage::Activate()
{
}

void FuPage::Deactivate()
{
}

const SfxItemSet* FuPage::ExecuteDialog( Window* pParent )
{
	PageKind ePageKind = mpDrawViewShell->GetPageKind();

	SfxItemSet aNewAttr(mpDoc->GetPool(),
						mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE),
						mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE),
						SID_ATTR_PAGE, SID_ATTR_PAGE_BSP,
						SID_ATTR_BORDER_OUTER, SID_ATTR_BORDER_OUTER,
						SID_ATTR_BORDER_SHADOW, SID_ATTR_BORDER_SHADOW,
						XATTR_FILL_FIRST, XATTR_FILL_LAST,
						EE_PARA_WRITINGDIR, EE_PARA_WRITINGDIR,
						0);

	///////////////////////////////////////////////////////////////////////
	// Retrieve additional data for dialog

    SvxShadowItem aShadowItem(SID_ATTR_BORDER_SHADOW);
	aNewAttr.Put( aShadowItem );
    SvxBoxItem aBoxItem( SID_ATTR_BORDER_OUTER );
	aNewAttr.Put( aBoxItem );

    aNewAttr.Put( SvxFrameDirectionItem(
        mpDoc->GetDefaultWritingMode() == ::com::sun::star::text::WritingMode_RL_TB ? FRMDIR_HORI_RIGHT_TOP : FRMDIR_HORI_LEFT_TOP,
        EE_PARA_WRITINGDIR ) );

	///////////////////////////////////////////////////////////////////////
	// Retrieve page-data for dialog

    SvxPageItem aPageItem( SID_ATTR_PAGE );
	aPageItem.SetDescName( mpPage->GetName() );
	aPageItem.SetPageUsage( (SvxPageUsage) SVX_PAGE_ALL );
	aPageItem.SetLandscape( mpPage->GetOrientation() == ORIENTATION_LANDSCAPE ? sal_True: sal_False );
	aPageItem.SetNumType( mpDoc->GetPageNumType() );
	aNewAttr.Put( aPageItem );

	// size
	maSize = mpPage->GetSize();
	SvxSizeItem aSizeItem( SID_ATTR_PAGE_SIZE, maSize );
	aNewAttr.Put( aSizeItem );

	// Max size
	SvxSizeItem aMaxSizeItem( SID_ATTR_PAGE_MAXSIZE, Size( MAXWIDTH, MAXHEIGHT ) );
	aNewAttr.Put( aMaxSizeItem );

	// paperbin
	SvxPaperBinItem aPaperBinItem( SID_ATTR_PAGE_PAPERBIN, (const sal_uInt8)mpPage->GetPaperBin() );
	aNewAttr.Put( aPaperBinItem );

	SvxLRSpaceItem aLRSpaceItem( (sal_uInt16)mpPage->GetLftBorder(), (sal_uInt16)mpPage->GetRgtBorder(), 0, 0, mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE));
	aNewAttr.Put( aLRSpaceItem );

	SvxULSpaceItem aULSpaceItem( (sal_uInt16)mpPage->GetUppBorder(), (sal_uInt16)mpPage->GetLwrBorder(), mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE));
	aNewAttr.Put( aULSpaceItem );

	// Applikation
	bool bScale = mpDoc->GetDocumentType() != DOCUMENT_TYPE_DRAW;
	aNewAttr.Put( SfxBoolItem( SID_ATTR_PAGE_EXT1, bScale ? sal_True : sal_False ) );

	sal_Bool bFullSize = mpPage->IsMasterPage() ?
		mpPage->IsBackgroundFullSize() : ((SdPage&)mpPage->TRG_GetMasterPage()).IsBackgroundFullSize();

	aNewAttr.Put( SfxBoolItem( SID_ATTR_PAGE_EXT2, bFullSize ) );

	///////////////////////////////////////////////////////////////////////
	// Merge ItemSet for dialog

	const sal_uInt16* pPtr = aNewAttr.GetRanges();
	sal_uInt16 p1 = pPtr[0], p2 = pPtr[1];
	while(pPtr[2] && (pPtr[2] - p2 == 1))
	{
		p2 = pPtr[3];
		pPtr += 2;
	}
	pPtr += 2;
	SfxItemSet aMergedAttr( *aNewAttr.GetPool(), p1, p2 );

	mergeItemSetsImpl( aMergedAttr, aNewAttr );

	SdStyleSheet* pStyleSheet = mpPage->getPresentationStyle(HID_PSEUDOSHEET_BACKGROUND);

	// merge page background filling to the dialogs input set
	if( mbDisplayBackgroundTabPage )
	{
		if( mbMasterPage )
		{
			if(pStyleSheet)
				mergeItemSetsImpl( aMergedAttr, pStyleSheet->GetItemSet() );
		}
		else
		{
            // Only this page, get attributes for background fill
            const SfxItemSet& rBackgroundAttributes = mpPage->getSdrPageProperties().GetItemSet();

            if(XFILL_NONE != ((const XFillStyleItem&)rBackgroundAttributes.Get(XATTR_FILLSTYLE)).GetValue())
            {
                // page attributes are used, take them
    			aMergedAttr.Put(rBackgroundAttributes);
            }
            else
            {
				if(pStyleSheet 
                    && XFILL_NONE != ((const XFillStyleItem&)pStyleSheet->GetItemSet().Get(XATTR_FILLSTYLE)).GetValue())
                {
    				// if the page has no fill style, use the settings from the 
					// background stylesheet (if used)
					mergeItemSetsImpl(aMergedAttr, pStyleSheet->GetItemSet());
                }
				else
                {
                    // no fill style from page, start with no fill style
					aMergedAttr.Put(XFillStyleItem(XFILL_NONE));
                }
            }
		}
	}

	std::auto_ptr< SfxItemSet > pTempSet;

	if( GetSlotID() == SID_SELECT_BACKGROUND )
	{
	    SvxOpenGraphicDialog	aDlg(SdResId(STR_SET_BACKGROUND_PICTURE));

	    if( aDlg.Execute() == GRFILTER_OK )
	    {
			Graphic		aGraphic;
			int nError = aDlg.GetGraphic(aGraphic);
			if( nError == GRFILTER_OK )
			{
				pTempSet.reset( new SfxItemSet( mpDoc->GetPool(), XATTR_FILL_FIRST, XATTR_FILL_LAST, 0) );

				pTempSet->Put( XFillStyleItem( XFILL_BITMAP ) );
				
				// MigrateItemSet makes sure the XFillBitmapItem will have a unique name
				SfxItemSet aMigrateSet( mpDoc->GetPool(), XATTR_FILLBITMAP, XATTR_FILLBITMAP );
				aMigrateSet.Put(XFillBitmapItem(String(RTL_CONSTASCII_USTRINGPARAM("background")), aGraphic));
				mpDoc->MigrateItemSet( &aMigrateSet, pTempSet.get(), NULL );

				pTempSet->Put( XFillBmpStretchItem( sal_True ));
				pTempSet->Put( XFillBmpTileItem( sal_False ));
			}
		}
	}
	else
	{
		// create the dialog
		SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
		std::auto_ptr<SfxAbstractTabDialog> pDlg( pFact ? pFact->CreateSdTabPageDialog(NULL, &aMergedAttr, mpDocSh, mbDisplayBackgroundTabPage ) : 0 );
		if( pDlg.get() && pDlg->Execute() == RET_OK )
			pTempSet.reset( new SfxItemSet(*pDlg->GetOutputItemSet()) );
	}

	if( pTempSet.get() )
	{
		pStyleSheet->AdjustToFontHeight(*pTempSet);

		if( mbDisplayBackgroundTabPage )
		{
			// if some fillstyle-items are not set in the dialog, then
			// try to use the items before
			sal_Bool bChanges = sal_False;
			for( sal_uInt16 i=XATTR_FILL_FIRST; i<XATTR_FILL_LAST; i++ )
			{
				if( aMergedAttr.GetItemState( i ) != SFX_ITEM_DEFAULT )
				{
					if( pTempSet->GetItemState( i ) == SFX_ITEM_DEFAULT )
						pTempSet->Put( aMergedAttr.Get( i ) );
					else
						if( aMergedAttr.GetItem( i ) != pTempSet->GetItem( i ) )
							bChanges = sal_True;
				}
			}

			// if the background for this page was set to invisible, the background-object has to be deleted, too.
			if( ( ( (XFillStyleItem*) pTempSet->GetItem( XATTR_FILLSTYLE ) )->GetValue() == XFILL_NONE ) ||
				( ( pTempSet->GetItemState( XATTR_FILLSTYLE ) == SFX_ITEM_DEFAULT ) &&
					( ( (XFillStyleItem*) aMergedAttr.GetItem( XATTR_FILLSTYLE ) )->GetValue() == XFILL_NONE ) ) )
				mbPageBckgrdDeleted = sal_True;

			bool bSetToAllPages = false;

			// Ask, wether the setting are for the background-page or for the current page
			if( !mbMasterPage && bChanges )
			{
				// But don't ask in notice-view, because we can't change the background of
				// notice-masterpage (at the moment)
				if( ePageKind != PK_NOTES )
				{
					String aTit(SdResId( STR_PAGE_BACKGROUND_TITLE ));
					String aTxt(SdResId( STR_PAGE_BACKGROUND_TXT ));
					MessBox aQuestionBox (
                        pParent,
                        WB_YES_NO | WB_DEF_YES,
                        aTit,
                        aTxt );
					aQuestionBox.SetImage( QueryBox::GetStandardImage() );
					bSetToAllPages = ( RET_YES == aQuestionBox.Execute() );
				}

                if( mbPageBckgrdDeleted )
				{
                    mpBackgroundObjUndoAction = new SdBackgroundObjUndoAction(
                        *mpDoc, *mpPage, mpPage->getSdrPageProperties().GetItemSet());

                    if(!mpPage->IsMasterPage())
                    {
                        // on normal pages, switch off fill attribute usage
						SdrPageProperties& rPageProperties = mpPage->getSdrPageProperties();
						rPageProperties.ClearItem( XATTR_FILLBITMAP );
						rPageProperties.ClearItem( XATTR_FILLGRADIENT );
						rPageProperties.ClearItem( XATTR_FILLHATCH );
                        rPageProperties.PutItem(XFillStyleItem(XFILL_NONE));
                    }
				}
			}

			// Sonderbehandlung: die INVALIDS auf NULL-Pointer
			// zurueckgesetzen (sonst landen INVALIDs oder
			// Pointer auf die DefaultItems in der Vorlage;
			// beides wuerde die Attribut-Vererbung unterbinden)
			pTempSet->ClearInvalidItems();

			if( mbMasterPage )
			{
				StyleSheetUndoAction* pAction = new StyleSheetUndoAction(mpDoc, (SfxStyleSheet*)pStyleSheet, &(*pTempSet.get()));
				mpDocSh->GetUndoManager()->AddUndoAction(pAction);
				pStyleSheet->GetItemSet().Put( *(pTempSet.get()) );
				sdr::properties::CleanupFillProperties( pStyleSheet->GetItemSet() );
				pStyleSheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
			}
			else if( bSetToAllPages )
			{
				String aComment(SdResId(STR_UNDO_CHANGE_PAGEFORMAT));
				::svl::IUndoManager* pUndoMgr = mpDocSh->GetUndoManager();
				pUndoMgr->EnterListAction(aComment, aComment);
				SdUndoGroup* pUndoGroup = new SdUndoGroup(mpDoc);
				pUndoGroup->SetComment(aComment);

				//Set background on all master pages
				sal_uInt16 nMasterPageCount = mpDoc->GetMasterSdPageCount(ePageKind);
				for (sal_uInt16 i = 0; i < nMasterPageCount; ++i)
				{
					SdPage *pMasterPage = mpDoc->GetMasterSdPage(i, ePageKind);
					SdStyleSheet *pStyle =
						pMasterPage->getPresentationStyle(HID_PSEUDOSHEET_BACKGROUND);
					StyleSheetUndoAction* pAction =
						new StyleSheetUndoAction(mpDoc, (SfxStyleSheet*)pStyle, &(*pTempSet.get()));
					pUndoGroup->AddAction(pAction);
					pStyle->GetItemSet().Put( *(pTempSet.get()) );
					sdr::properties::CleanupFillProperties( pStyleSheet->GetItemSet() );
					pStyle->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
				}

				//Remove background from all pages to reset to the master bg
				sal_uInt16 nPageCount(mpDoc->GetSdPageCount(ePageKind));
				for(sal_uInt16 i=0; i<nPageCount; ++i)
				{
					SdPage *pPage = mpDoc->GetSdPage(i, ePageKind);

					const SfxItemSet& rFillAttributes = pPage->getSdrPageProperties().GetItemSet();
   					if(XFILL_NONE != ((const XFillStyleItem&)rFillAttributes.Get(XATTR_FILLSTYLE)).GetValue())
				    {
						SdBackgroundObjUndoAction *pBackgroundObjUndoAction = new SdBackgroundObjUndoAction(*mpDoc, *pPage, rFillAttributes);
						pUndoGroup->AddAction(pBackgroundObjUndoAction);

						SdrPageProperties& rPageProperties = pPage->getSdrPageProperties();
						rPageProperties.ClearItem( XATTR_FILLBITMAP );
						rPageProperties.ClearItem( XATTR_FILLGRADIENT );
						rPageProperties.ClearItem( XATTR_FILLHATCH );
                        rPageProperties.PutItem(XFillStyleItem(XFILL_NONE));

						pPage->ActionChanged();
					}
				}

				pUndoMgr->AddUndoAction(pUndoGroup);
				pUndoMgr->LeaveListAction();

			}

			// if background filling is set to master pages then clear from page set
			if( mbMasterPage || bSetToAllPages )
			{
				for( sal_uInt16 nWhich = XATTR_FILL_FIRST; nWhich <= XATTR_FILL_LAST; nWhich++ )
				{
					pTempSet->ClearItem( nWhich );
				}
				pTempSet->Put(XFillStyleItem(XFILL_NONE));
			}

			const SfxPoolItem *pItem;
			if( SFX_ITEM_SET == pTempSet->GetItemState( EE_PARA_WRITINGDIR, sal_False, &pItem ) )
			{
				sal_uInt32 nVal = ((SvxFrameDirectionItem*)pItem)->GetValue();
				mpDoc->SetDefaultWritingMode( nVal == FRMDIR_HORI_RIGHT_TOP ? ::com::sun::star::text::WritingMode_RL_TB : ::com::sun::star::text::WritingMode_LR_TB );
			}

			mpDoc->SetChanged(sal_True);

			// BackgroundFill of Masterpage: no hard attributes allowed
            SdrPage& rUsedMasterPage = mpPage->IsMasterPage() ? *mpPage : mpPage->TRG_GetMasterPage();
            OSL_ENSURE(rUsedMasterPage.IsMasterPage(), "No MasterPage (!)");
            rUsedMasterPage.getSdrPageProperties().ClearItem();
            OSL_ENSURE(0 != rUsedMasterPage.getSdrPageProperties().GetStyleSheet(), 
                "MasterPage without StyleSheet detected (!)");
		}

		aNewAttr.Put(*(pTempSet.get()));
		mrReq.Done( aNewAttr );

		return mrReq.GetArgs();
	}
	else
	{
		return 0;
	}
}

void FuPage::ApplyItemSet( const SfxItemSet* pArgs )
{
	if( !pArgs )
		return;

	///////////////////////////////////////////////////////////////////////////
	// Set new page-attributes
	PageKind ePageKind = mpDrawViewShell->GetPageKind();
	const SfxPoolItem*  pPoolItem;
	sal_Bool                bSetPageSizeAndBorder = sal_False;
	Size                aNewSize(maSize);
	sal_Int32	            nLeft  = -1, nRight = -1, nUpper = -1, nLower = -1;
	sal_Bool	            bScaleAll = sal_True;
	Orientation         eOrientation = mpPage->GetOrientation();
	SdPage*				pMasterPage = mpPage->IsMasterPage() ? mpPage : &(SdPage&)(mpPage->TRG_GetMasterPage());
	sal_Bool                bFullSize = pMasterPage->IsBackgroundFullSize();
	sal_uInt16              nPaperBin = mpPage->GetPaperBin();

	if( pArgs->GetItemState(SID_ATTR_PAGE, sal_True, &pPoolItem) == SFX_ITEM_SET )
	{
		mpDoc->SetPageNumType(((const SvxPageItem*) pPoolItem)->GetNumType());

		eOrientation = (((const SvxPageItem*) pPoolItem)->IsLandscape() == ORIENTATION_LANDSCAPE) ?
			ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT;

		if( mpPage->GetOrientation() != eOrientation )
			bSetPageSizeAndBorder = sal_True;

		mpDrawViewShell->ResetActualPage();
	}

	if( pArgs->GetItemState(SID_ATTR_PAGE_SIZE, sal_True, &pPoolItem) == SFX_ITEM_SET )
	{
		aNewSize = ((const SvxSizeItem*) pPoolItem)->GetSize();

		if( mpPage->GetSize() != aNewSize )
			bSetPageSizeAndBorder = sal_True;
	}

	if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_LRSPACE),
							sal_True, &pPoolItem) == SFX_ITEM_SET )
	{
		nLeft = ((const SvxLRSpaceItem*) pPoolItem)->GetLeft();
		nRight = ((const SvxLRSpaceItem*) pPoolItem)->GetRight();

		if( mpPage->GetLftBorder() != nLeft || mpPage->GetRgtBorder() != nRight )
			bSetPageSizeAndBorder = sal_True;

	}

	if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_ULSPACE),
							sal_True, &pPoolItem) == SFX_ITEM_SET )
	{
		nUpper = ((const SvxULSpaceItem*) pPoolItem)->GetUpper();
		nLower = ((const SvxULSpaceItem*) pPoolItem)->GetLower();

		if( mpPage->GetUppBorder() != nUpper || mpPage->GetLwrBorder() != nLower )
			bSetPageSizeAndBorder = sal_True;
	}

	if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_PAGE_EXT1), sal_True, &pPoolItem) == SFX_ITEM_SET )
	{
		bScaleAll = ((const SfxBoolItem*) pPoolItem)->GetValue();
	}

	if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_PAGE_EXT2), sal_True, &pPoolItem) == SFX_ITEM_SET )
	{
		bFullSize = ((const SfxBoolItem*) pPoolItem)->GetValue();

		if(pMasterPage->IsBackgroundFullSize() != bFullSize )
			bSetPageSizeAndBorder = sal_True;
	}

	// Papierschacht (PaperBin)
	if( pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_ATTR_PAGE_PAPERBIN), sal_True, &pPoolItem) == SFX_ITEM_SET )
	{
		nPaperBin = ((const SvxPaperBinItem*) pPoolItem)->GetValue();

		if( mpPage->GetPaperBin() != nPaperBin )
			bSetPageSizeAndBorder = sal_True;
	}

	if (nLeft == -1 && nUpper != -1)
	{
		bSetPageSizeAndBorder = sal_True;
		nLeft  = mpPage->GetLftBorder();
		nRight = mpPage->GetRgtBorder();
	}
	else if (nLeft != -1 && nUpper == -1)
	{
		bSetPageSizeAndBorder = sal_True;
		nUpper = mpPage->GetUppBorder();
		nLower = mpPage->GetLwrBorder();
	}

	if( bSetPageSizeAndBorder || !mbMasterPage )
		mpDrawViewShell->SetPageSizeAndBorder(ePageKind, aNewSize, nLeft, nRight, nUpper, nLower, bScaleAll, eOrientation, nPaperBin, bFullSize );

	////////////////////////////////////////////////////////////////////////////////
	//
	// if bMasterPage==sal_False then create a background-object for this page with the
	// properties set in the dialog before, but if mbPageBckgrdDeleted==sal_True then
	// the background of this page was set to invisible, so it would be a mistake
	// to create a new background-object for this page !
	//

	if( mbDisplayBackgroundTabPage )
	{
		if( !mbMasterPage && !mbPageBckgrdDeleted )
		{
			// Only this page
			delete mpBackgroundObjUndoAction;
			mpBackgroundObjUndoAction = new SdBackgroundObjUndoAction(
                *mpDoc, *mpPage, mpPage->getSdrPageProperties().GetItemSet());
			SfxItemSet aSet( *pArgs );
			sdr::properties::CleanupFillProperties(aSet);
			mpPage->getSdrPageProperties().ClearItem();
            mpPage->getSdrPageProperties().PutItemSet(aSet);
		}
	}

	// add undo action for background object
	if( mpBackgroundObjUndoAction )
	{
		// set merge flag, because a SdUndoGroupAction could have been inserted before
		mpDocSh->GetUndoManager()->AddUndoAction( mpBackgroundObjUndoAction, sal_True );
		mpBackgroundObjUndoAction = 0;
	}

	///////////////////////////////////////////////////////////////////////////
	//
	// Objekte koennen max. so gross wie die ViewSize werden
	//
	Size aPageSize = mpDoc->GetSdPage(0, ePageKind)->GetSize();
	Size aViewSize = Size(aPageSize.Width() * 3, aPageSize.Height() * 2);
	mpDoc->SetMaxObjSize(aViewSize);

	///////////////////////////////////////////////////////////////////////////
	//
	// ggfs. Preview den neuen Kontext mitteilen
	//
	mpDrawViewShell->UpdatePreview( mpDrawViewShell->GetActualPage() );
}

} // end of namespace sd
