/**************************************************************
 *
 * 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 "FrameView.hxx"

#ifndef _SVXIDS_HRC
#include <svx/svxids.hrc>
#endif
#include <com/sun/star/awt/Rectangle.hpp>
#include <com/sun/star/drawing/framework/ResourceId.hpp>
#include <rtl/ustrbuf.hxx>
#include "unokywds.hxx"

#include <vector>
#include "ViewShell.hxx"
#include "drawdoc.hxx"
#include "DrawDocShell.hxx"
#include "optsitem.hxx"
#include "ViewShellBase.hxx"
#include "DrawViewShell.hxx"
#include "OutlineViewShell.hxx"
#include "app.hxx"
#include "sdresid.hxx"
#include "pres.hxx"
#include "glob.hrc"
#include "sdiocmpt.hxx"
#include "framework/FrameworkHelper.hxx"
#include <comphelper/processfactory.hxx>
#include <sfx2/viewfrm.hxx>

using namespace ::com::sun::star;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::beans;
using namespace ::std;
using ::rtl::OUString;

namespace sd {

/*************************************************************************
|*
|* Ctor
|*
\************************************************************************/

FrameView::FrameView(SdDrawDocument* pDrawDoc, FrameView* pFrameView /* = NULK */)
  : SdrView(pDrawDoc, (OutputDevice*) NULL),
    mnRefCount(0),
    mnPresViewShellId(SID_VIEWSHELL0),
    mnSlotId(SID_OBJECT_SELECT),
    mbIsNavigatorShowingAllShapes(false)
{
	EndListening(*pDrawDoc);

	EnableExtendedKeyInputDispatcher(sal_False);
	EnableExtendedMouseEventDispatcher(sal_False);
	EnableExtendedCommandEventDispatcher(sal_False);

	SetGridFront( sal_False );
	SetHlplFront( sal_False );
	SetOConSnap( sal_False );
	SetFrameDragSingles( sal_True );
	SetSlidesPerRow(4);

	if( NULL == pFrameView )
	{
		DrawDocShell* pDocShell = pDrawDoc->GetDocSh();

		if ( pDocShell )
		{
			/**********************************************************************
			* Das Dokument wurde geladen, ist eine FrameView vorhanden?
			**********************************************************************/
			sal_uLong nSdViewShellCount = 0;
			ViewShellBase* pBase = NULL;
			SfxViewShell* pSfxViewSh = NULL;
			SfxViewFrame* pSfxViewFrame = SfxViewFrame::GetFirst(pDocShell);

			while (pSfxViewFrame)
			{
				// Count the FrameViews and remember the type of the main
				// view shell.
				pSfxViewSh = pSfxViewFrame->GetViewShell();
				pBase = PTR_CAST(ViewShellBase, pSfxViewSh );

				if (pBase != NULL)
				{
					nSdViewShellCount++;

                    ::rtl::OUString sViewURL;
                    Reference<drawing::framework::XView> xView (
                        framework::FrameworkHelper::Instance(*pBase)->GetView(
                            drawing::framework::ResourceId::create(
                                ::comphelper::getProcessComponentContext(),
                                framework::FrameworkHelper::msCenterPaneURL)));
                    if (xView.is())
                        sViewURL = xView->getResourceId()->getResourceURL();

                    switch (framework::FrameworkHelper::GetViewId(sViewURL))
                    {
						default:
//                        case ViewShell::ST_IMPRESS:
//	                      case ViewShell::ST_NOTES:
//                        case ViewShell::ST_HANDOUT:
                            mnPresViewShellId = SID_VIEWSHELL0;
                            break;

                        case ViewShell::ST_SLIDE_SORTER:
                            mnPresViewShellId = SID_VIEWSHELL1;
                            break;

                        case ViewShell::ST_OUTLINE:
                            mnPresViewShellId = SID_VIEWSHELL2;
                            break;
					}
				}

				pSfxViewFrame = SfxViewFrame::GetNext(*pSfxViewFrame, pDocShell);
			}

			SdDrawDocument* pDoc = pDocShell->GetDoc();
			pFrameView = pDoc->GetFrameView(nSdViewShellCount);
		}
	}

	if (pFrameView)
	{
		/**********************************************************************
		* FrameView mit der FrameView der DocShell initialisieren
		**********************************************************************/
		SetRuler( pFrameView->HasRuler() );
		SetGridCoarse( pFrameView->GetGridCoarse() );
		SetGridFine( pFrameView->GetGridFine() );
		SetSnapGridWidth(pFrameView->GetSnapGridWidthX(), pFrameView->GetSnapGridWidthY());
		SetGridVisible( pFrameView->IsGridVisible() );
		SetGridFront( pFrameView->IsGridFront() );
		SetSnapAngle( pFrameView->GetSnapAngle() );
		SetGridSnap( pFrameView->IsGridSnap() );
		SetBordSnap( pFrameView->IsBordSnap() );
		SetHlplSnap( pFrameView->IsHlplSnap() );
		SetOFrmSnap( pFrameView->IsOFrmSnap() );
		SetOPntSnap( pFrameView->IsOPntSnap() );
		SetOConSnap( pFrameView->IsOConSnap() );
		SetHlplVisible( pFrameView->IsHlplVisible() );
		SetDragStripes( pFrameView->IsDragStripes() );
		SetPlusHandlesAlwaysVisible( pFrameView->IsPlusHandlesAlwaysVisible() );
		SetFrameDragSingles( pFrameView->IsFrameDragSingles() );
		SetSnapMagneticPixel( pFrameView->GetSnapMagneticPixel() );
		SetMarkedHitMovesAlways( pFrameView->IsMarkedHitMovesAlways() );
		SetMoveOnlyDragging( pFrameView->IsMoveOnlyDragging() );
		SetCrookNoContortion( pFrameView->IsCrookNoContortion() );
		SetSlantButShear( pFrameView->IsSlantButShear() );
		SetNoDragXorPolys( pFrameView->IsNoDragXorPolys() );
		SetAngleSnapEnabled( pFrameView->IsAngleSnapEnabled() );
		SetBigOrtho( pFrameView->IsBigOrtho() );
		SetOrtho( pFrameView->IsOrtho() );
		SetEliminatePolyPointLimitAngle( pFrameView->GetEliminatePolyPointLimitAngle() );
		SetEliminatePolyPoints( pFrameView->IsEliminatePolyPoints() );
// #110094#-7
//		SetMasterPagePaintCaching( pFrameView->IsMasterPagePaintCaching() );
		SetDesignMode( pFrameView->IsDesignMode() );

		SetSolidMarkHdl( pFrameView->IsSolidMarkHdl() );
		SetSolidDragging( pFrameView->IsSolidDragging() );

		maVisibleLayers = pFrameView->GetVisibleLayers();
		maPrintableLayers = pFrameView->GetPrintableLayers();
		maLockedLayers = pFrameView->GetLockedLayers();
		maStandardHelpLines = pFrameView->GetStandardHelpLines();
		maNotesHelpLines = pFrameView->GetNotesHelpLines();
		maHandoutHelpLines = pFrameView->GetHandoutHelpLines();
		SetActiveLayer( pFrameView->GetActiveLayer() );
		mbNoColors = pFrameView->IsNoColors();
		mbNoAttribs = pFrameView->IsNoAttribs() ;
		maVisArea = pFrameView->GetVisArea();
		mePageKind = pFrameView->GetPageKind();
		mePageKindOnLoad = pFrameView->GetPageKindOnLoad();
		mnSelectedPage = pFrameView->GetSelectedPage();
		mnSelectedPageOnLoad = pFrameView->GetSelectedPageOnLoad();
		meStandardEditMode = pFrameView->GetViewShEditMode(PK_STANDARD);
		meNotesEditMode = pFrameView->GetViewShEditMode(PK_NOTES);
		meHandoutEditMode = pFrameView->GetViewShEditMode(PK_HANDOUT);
		SetViewShEditModeOnLoad(pFrameView->GetViewShEditModeOnLoad());
		mbLayerMode = pFrameView->IsLayerMode();
		mbQuickEdit = pFrameView->IsQuickEdit();

		// #i26631#
		SetMasterPagePaintCaching( pFrameView->IsMasterPagePaintCaching() );

		SetDragWithCopy( pFrameView->IsDragWithCopy() );
		mbBigHandles 		 = pFrameView->IsBigHandles();
		mbDoubleClickTextEdit = pFrameView->IsDoubleClickTextEdit();
		mbClickChangeRotation = pFrameView->IsClickChangeRotation();
		mnSlidesPerRow = pFrameView->GetSlidesPerRow();
		mnDrawMode = pFrameView->GetDrawMode();
		mnTabCtrlPercent = pFrameView->GetTabCtrlPercent();
        mbIsNavigatorShowingAllShapes = pFrameView->IsNavigatorShowingAllShapes();
        SetPreviousViewShellType (pFrameView->GetPreviousViewShellType());
        SetViewShellTypeOnLoad (pFrameView->GetViewShellTypeOnLoad());
	}
	else
	{
		/**********************************************************************
		* FrameView mit den Applikationsdaten initialisieren
		**********************************************************************/
		maVisibleLayers.SetAll();
		maPrintableLayers.SetAll();
		SetGridCoarse( Size( 1000, 1000 ) );
		SetSnapGridWidth(Fraction(1000, 1), Fraction(1000, 1));
		SetActiveLayer( String( SdResId(STR_LAYER_LAYOUT) ) );
		mbNoColors = sal_True;
		mbNoAttribs = sal_False;
		maVisArea = Rectangle( Point(), Size(0, 0) );
		mePageKind = PK_STANDARD;
		mePageKindOnLoad = PK_STANDARD;
		mnSelectedPage = 0;
		mnSelectedPageOnLoad = 0;
		meStandardEditMode = EM_PAGE;
		meNotesEditMode = EM_PAGE;
		meHandoutEditMode = EM_MASTERPAGE;
        SetViewShEditModeOnLoad(EM_PAGE);
		mbLayerMode = sal_False;
		SetEliminatePolyPoints(sal_False);
		mbBigHandles = sal_False;
		mbDoubleClickTextEdit = sal_False;
		mbClickChangeRotation = sal_False;
		mnSlidesPerRow = 4;

		{
			bool bUseContrast = Application::GetSettings().GetStyleSettings().GetHighContrastMode();
			mnDrawMode = bUseContrast ? OUTPUT_DRAWMODE_CONTRAST : OUTPUT_DRAWMODE_COLOR;
		}
		mnTabCtrlPercent = 0.0;
        mbIsNavigatorShowingAllShapes = false;
        SetPreviousViewShellType (ViewShell::ST_NONE);
        SetViewShellTypeOnLoad (ViewShell::ST_IMPRESS);

		// get default for design mode
		sal_Bool bInitDesignMode = pDrawDoc->GetOpenInDesignMode();
		if( pDrawDoc->OpenInDesignModeIsDefaulted() )
		{
			bInitDesignMode = sal_True;
		}

		SfxObjectShell* pObjShell = pDrawDoc->GetObjectShell();
		if( pObjShell && pObjShell->IsReadOnly() )
			bInitDesignMode = sal_False;
		SetDesignMode( bInitDesignMode );

		Update( SD_MOD()->GetSdOptions(pDrawDoc->GetDocumentType()) );
	}

}

/*************************************************************************
|*
|* Dtor
|*
\************************************************************************/

FrameView::~FrameView()
{
}


/*************************************************************************
|*
|* Verbindung herstellen
|*
\************************************************************************/

void FrameView::Connect()
{
	mnRefCount++;
}


/*************************************************************************
|*
|* Verbindung loesen
|*
\************************************************************************/

void FrameView::Disconnect()
{
	if (mnRefCount > 0)
	{
		mnRefCount--;
	}

	if (mnRefCount == 0)
	{
		delete this;
	}
}

/*************************************************************************
|*
|* Update mit Daten der SdOptions
|*
\************************************************************************/

void FrameView::Update(SdOptions* pOptions)
{
	if (pOptions)
	{
		mbRuler = pOptions->IsRulerVisible();
		SetGridVisible( pOptions->IsGridVisible() );
		SetSnapAngle( pOptions->GetAngle() );
		SetGridSnap( pOptions->IsUseGridSnap() );
		SetBordSnap( pOptions->IsSnapBorder()  );
		SetHlplSnap( pOptions->IsSnapHelplines() );
		SetOFrmSnap( pOptions->IsSnapFrame() );
		SetOPntSnap( pOptions->IsSnapPoints() );
		SetHlplVisible( pOptions->IsHelplines() );
		SetDragStripes( pOptions->IsDragStripes() );
		SetPlusHandlesAlwaysVisible( pOptions->IsHandlesBezier() );
		SetSnapMagneticPixel( pOptions->GetSnapArea() );
		SetMarkedHitMovesAlways( pOptions->IsMarkedHitMovesAlways() );
		SetMoveOnlyDragging( pOptions->IsMoveOnlyDragging() );
		SetSlantButShear( pOptions->IsMoveOnlyDragging() );
		SetNoDragXorPolys ( !pOptions->IsMoveOutline() );
		SetCrookNoContortion( pOptions->IsCrookNoContortion() );
		SetAngleSnapEnabled( pOptions->IsRotate() );
		SetBigOrtho( pOptions->IsBigOrtho() );
		SetOrtho( pOptions->IsOrtho() );
		SetEliminatePolyPointLimitAngle( pOptions->GetEliminatePolyPointLimitAngle() );
// #110094#-7
//		SetMasterPagePaintCaching( pOptions->IsMasterPagePaintCaching() );
		GetModel()->SetPickThroughTransparentTextFrames( pOptions->IsPickThrough() );

		SetSolidMarkHdl( pOptions->IsSolidMarkHdl() );
		SetSolidDragging( pOptions->IsSolidDragging() );

		SetGridCoarse( Size( pOptions->GetFldDrawX(), pOptions->GetFldDrawY() ) );
		SetGridFine( Size( pOptions->GetFldDivisionX(), pOptions->GetFldDivisionY() ) );
		Fraction aFractX(pOptions->GetFldDrawX(), pOptions->GetFldDrawX() / ( pOptions->GetFldDivisionX() ? pOptions->GetFldDivisionX() : 1 ));
		Fraction aFractY(pOptions->GetFldDrawY(), pOptions->GetFldDrawY() / ( pOptions->GetFldDivisionY() ? pOptions->GetFldDivisionY() : 1 ));
		SetSnapGridWidth(aFractX, aFractY);
		SetQuickEdit(pOptions->IsQuickEdit());

		// #i26631#
		SetMasterPagePaintCaching( pOptions->IsMasterPagePaintCaching() );

		SetDragWithCopy(pOptions->IsDragWithCopy());
		SetBigHandles( pOptions->IsBigHandles() );
		SetDoubleClickTextEdit( pOptions->IsDoubleClickTextEdit() );
		SetClickChangeRotation( pOptions->IsClickChangeRotation() );
	}
}


/*************************************************************************
|*
|* EditMode (Page oder MasterPage) des Arbeitsmodus setzen
|*
\************************************************************************/

void FrameView::SetViewShEditMode(EditMode eMode, PageKind eKind)
{
	if (eKind == PK_STANDARD)
	{
		meStandardEditMode = eMode;
	}
	else if (eKind == PK_NOTES)
	{
		meNotesEditMode = eMode;
	}
	else if (eKind == PK_HANDOUT)
	{
		meHandoutEditMode = eMode;
	}
}


/*************************************************************************
|*
|* EditMode (Page oder MasterPage) des Arbeitsmodus zurueckgeben
|*
\************************************************************************/

EditMode FrameView::GetViewShEditMode(PageKind eKind)
{
	EditMode eMode = EM_PAGE;

	if (eKind == PK_STANDARD)
	{
		eMode = meStandardEditMode;
	}
	else if (eKind == PK_NOTES)
	{
		eMode = meNotesEditMode;
	}
	else if (eKind == PK_HANDOUT)
	{
		eMode = meHandoutEditMode;
	}

	return (eMode);
}




void FrameView::SetViewShEditModeOnLoad (EditMode eMode)
{
    meEditModeOnLoad = eMode;
}




EditMode FrameView::GetViewShEditModeOnLoad (void) const
{
    return meEditModeOnLoad;
}




static OUString createHelpLinesString( const SdrHelpLineList& rHelpLines )
{
	::rtl::OUStringBuffer aLines;

	const sal_uInt16 nCount = rHelpLines.GetCount();
	for( sal_uInt16 nHlpLine = 0; nHlpLine < nCount; nHlpLine++ )
	{
		const SdrHelpLine& rHelpLine = rHelpLines[nHlpLine];
		const Point& rPos = rHelpLine.GetPos();

		switch( rHelpLine.GetKind() )
		{
			case SDRHELPLINE_POINT:
				aLines.append( (sal_Unicode)'P' );
				aLines.append( (sal_Int32)rPos.X() );
				aLines.append( (sal_Unicode)',' );
				aLines.append( (sal_Int32)rPos.Y() );
				break;
			case SDRHELPLINE_VERTICAL:
				aLines.append( (sal_Unicode)'V' );
				aLines.append( (sal_Int32)rPos.X() );
				break;
			case SDRHELPLINE_HORIZONTAL:
				aLines.append( (sal_Unicode)'H' );
				aLines.append( (sal_Int32)rPos.Y() );
				break;
			default:
				DBG_ERROR( "Unsupported helpline Kind!" );
		}
	}

	return aLines.makeStringAndClear();
}

#define addValue( n, v ) push_back( std::pair< OUString, Any >( OUString( RTL_CONSTASCII_USTRINGPARAM( n ) ), v ) )
void FrameView::WriteUserDataSequence ( ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& rValues, sal_Bool )
{
	std::vector< std::pair< OUString, Any > > aUserData;

	aUserData.addValue( sUNO_View_GridIsVisible, makeAny( (sal_Bool)IsGridVisible() ) );
	aUserData.addValue( sUNO_View_GridIsFront, makeAny( (sal_Bool)IsGridFront() ) );
	aUserData.addValue( sUNO_View_IsSnapToGrid, makeAny( (sal_Bool)IsGridSnap() ) );
	aUserData.addValue( sUNO_View_IsSnapToPageMargins, makeAny( (sal_Bool)IsBordSnap() ) );
	aUserData.addValue( sUNO_View_IsSnapToSnapLines, makeAny( (sal_Bool)IsHlplSnap() ) );
	aUserData.addValue( sUNO_View_IsSnapToObjectFrame, makeAny( (sal_Bool)IsOFrmSnap() ) );
	aUserData.addValue( sUNO_View_IsSnapToObjectPoints, makeAny( (sal_Bool)IsOPntSnap() ) );

//	pValue->Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( sUNO_View_IsSnapLinesVisible ) );
//	pValue->Value <<= (sal_Bool)IsHlplVisible();
//  pValue++;nIndex++;

//	pValue->Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( sUNO_View_IsDragStripes ) );
//	pValue->Value <<= (sal_Bool)IsDragStripes();
//  pValue++;nIndex++;

	aUserData.addValue( sUNO_View_IsPlusHandlesAlwaysVisible, makeAny( (sal_Bool)IsPlusHandlesAlwaysVisible() ) );
	aUserData.addValue( sUNO_View_IsFrameDragSingles, makeAny( (sal_Bool)IsFrameDragSingles() ) );

//	pValue->Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( sUNO_View_IsMarkedHitMovesAlways ) );
//	pValue->Value <<= (sal_Bool)IsMarkedHitMovesAlways();
//  pValue++;nIndex++;

	aUserData.addValue( sUNO_View_EliminatePolyPointLimitAngle, makeAny( (sal_Int32)GetEliminatePolyPointLimitAngle() ) );
	aUserData.addValue( sUNO_View_IsEliminatePolyPoints, makeAny( (sal_Bool)IsEliminatePolyPoints() ) );

//	pValue->Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( sUNO_View_IsLineDraft ) );
//	pValue->Value <<= (sal_Bool)IsLineDraft();
//  pValue++;nIndex++;

//	pValue->Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( sUNO_View_IsFillDraft ) );
//	pValue->Value <<= (sal_Bool)IsFillDraft();
//  pValue++;nIndex++;

//	pValue->Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( sUNO_View_IsTextDraft ) );
//	pValue->Value <<= (sal_Bool)IsTextDraft();
//  pValue++;nIndex++;

//	pValue->Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( sUNO_View_IsGrafDraft ) );
//	pValue->Value <<= (sal_Bool)IsGrafDraft();
//  pValue++;nIndex++;

	Any aAny;
	GetVisibleLayers().QueryValue( aAny );
	aUserData.addValue( sUNO_View_VisibleLayers, aAny );

	GetPrintableLayers().QueryValue( aAny );
	aUserData.addValue( sUNO_View_PrintableLayers, aAny );

	GetLockedLayers().QueryValue( aAny );
	aUserData.addValue( sUNO_View_LockedLayers, aAny );

	aUserData.addValue( sUNO_View_NoAttribs, makeAny( (sal_Bool)IsNoAttribs() ) );
	aUserData.addValue( sUNO_View_NoColors, makeAny( (sal_Bool)IsNoColors() ) );

	if( GetStandardHelpLines().GetCount() )
		aUserData.addValue( sUNO_View_SnapLinesDrawing, makeAny( createHelpLinesString( GetStandardHelpLines() ) ) );

	if( GetNotesHelpLines().GetCount() )
		aUserData.addValue( sUNO_View_SnapLinesNotes, makeAny( createHelpLinesString( GetNotesHelpLines() ) ) );

	if( GetHandoutHelpLines().GetCount() )
		aUserData.addValue( sUNO_View_SnapLinesHandout, makeAny( createHelpLinesString( GetHandoutHelpLines() ) ) );

	aUserData.addValue( sUNO_View_RulerIsVisible, makeAny( (sal_Bool)HasRuler() ) );
	aUserData.addValue( sUNO_View_PageKind, makeAny( (sal_Int16)GetPageKind() ) );
	aUserData.addValue( sUNO_View_SelectedPage, makeAny( (sal_Int16)GetSelectedPage() ) );
	aUserData.addValue( sUNO_View_IsLayerMode, makeAny( (sal_Bool)IsLayerMode() ) );

//	pValue->Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( sUNO_View_IsQuickEdit ) );
//	pValue->Value <<= (sal_Bool)IsQuickEdit();
//  pValue++;nIndex++;

	aUserData.addValue( sUNO_View_IsBigHandles, makeAny( (sal_Bool)IsBigHandles() ) );
	aUserData.addValue( sUNO_View_IsDoubleClickTextEdit,  makeAny( (sal_Bool)IsDoubleClickTextEdit() ) );
	aUserData.addValue( sUNO_View_IsClickChangeRotation, makeAny( (sal_Bool)IsClickChangeRotation() ) );

//	pValue->Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( sUNO_View_IsDragWithCopy ) );
//	pValue->Value <<= (sal_Bool)IsDragWithCopy();
//  pValue++;nIndex++;

	aUserData.addValue( sUNO_View_SlidesPerRow, makeAny( (sal_Int16)GetSlidesPerRow() ) );
/* #107128# Product management decided to not make this persistent
	aUserData.addValue( sUNO_View_DrawMode, makeAny( (sal_Int32)GetDrawMode() ) );
	aUserData.addValue( sUNO_View_PreviewDrawMode, makeAny( (sal_Int32)GetPreviewDrawMode() ) );
*/
    aUserData.addValue( sUNO_View_EditModeStandard, makeAny( (sal_Int32)GetViewShEditMode( PK_STANDARD ) ) );
	aUserData.addValue( sUNO_View_EditModeNotes, makeAny( (sal_Int32)GetViewShEditMode( PK_NOTES ) ) );
	aUserData.addValue( sUNO_View_EditModeHandout, makeAny( (sal_Int32)GetViewShEditMode( PK_HANDOUT ) ) );

	{
		const Rectangle aVisArea = GetVisArea();

		aUserData.addValue( sUNO_View_VisibleAreaTop, makeAny( (sal_Int32)aVisArea.Top() ) );
		aUserData.addValue( sUNO_View_VisibleAreaLeft, makeAny( (sal_Int32)aVisArea.Left() ) );
		aUserData.addValue( sUNO_View_VisibleAreaWidth, makeAny( (sal_Int32)aVisArea.GetWidth() ) );
		aUserData.addValue( sUNO_View_VisibleAreaHeight, makeAny( (sal_Int32)aVisArea.GetHeight() ) );
	}

	aUserData.addValue( sUNO_View_GridCoarseWidth, makeAny( (sal_Int32)GetGridCoarse().Width() ) );
	aUserData.addValue( sUNO_View_GridCoarseHeight, makeAny( (sal_Int32)GetGridCoarse().Height() ) );
	aUserData.addValue( sUNO_View_GridFineWidth, makeAny( (sal_Int32)GetGridFine().Width() ) );
	aUserData.addValue( sUNO_View_GridFineHeight, makeAny( (sal_Int32)GetGridFine().Height() ) );
	aUserData.addValue( sUNO_View_GridSnapWidthXNumerator, makeAny( (sal_Int32)GetSnapGridWidthX().GetNumerator() ) );
	aUserData.addValue( sUNO_View_GridSnapWidthXDenominator, makeAny( (sal_Int32)GetSnapGridWidthX().GetDenominator() ) );
	aUserData.addValue( sUNO_View_GridSnapWidthYNumerator, makeAny( (sal_Int32)GetSnapGridWidthY().GetNumerator() ) );
	aUserData.addValue( sUNO_View_GridSnapWidthYDenominator, makeAny( (sal_Int32)GetSnapGridWidthY().GetDenominator() ) );
	aUserData.addValue( sUNO_View_IsAngleSnapEnabled, makeAny( (sal_Bool)IsAngleSnapEnabled() ) );
    aUserData.addValue( sUNO_View_SnapAngle, makeAny( (sal_Int32)GetSnapAngle() ) );

	const sal_Int32 nOldLength = rValues.getLength();
	rValues.realloc( nOldLength + aUserData.size() );

	PropertyValue* pValue = &(rValues.getArray()[nOldLength]);

	std::vector< std::pair< OUString, Any > >::iterator aIter( aUserData.begin() );
	for( ; aIter != aUserData.end(); aIter++, pValue++ )
	{
		pValue->Name = (*aIter).first;
		pValue->Value = (*aIter).second;
	}
}
#undef addValue

static void createHelpLinesFromString( const rtl::OUString& rLines, SdrHelpLineList& rHelpLines )
{
	const sal_Unicode * pStr = rLines.getStr();
	SdrHelpLine aNewHelpLine;
	rtl::OUStringBuffer sBuffer;

	while( *pStr )
	{
		Point aPoint;

		switch( *pStr )
		{
		case (sal_Unicode)'P':
			aNewHelpLine.SetKind( SDRHELPLINE_POINT );
			break;
		case (sal_Unicode)'V':
			aNewHelpLine.SetKind( SDRHELPLINE_VERTICAL );
			break;
		case (sal_Unicode)'H':
			aNewHelpLine.SetKind( SDRHELPLINE_HORIZONTAL );
			break;
		default:
			DBG_ERROR( "syntax error in snap lines settings string" );
			return;
		}

		pStr++;

		while( (*pStr >= sal_Unicode('0') && *pStr <= sal_Unicode('9')) || (*pStr == '+') || (*pStr == '-') )
		{
			sBuffer.append( *pStr++ );
		}

		sal_Int32 nValue = sBuffer.makeStringAndClear().toInt32();

		if( aNewHelpLine.GetKind() == SDRHELPLINE_HORIZONTAL )
		{
			aPoint.Y() = nValue;
		}
		else
		{
			aPoint.X() = nValue;

			if( aNewHelpLine.GetKind() == SDRHELPLINE_POINT )
			{
				if( *pStr++ != ',' )
					return;

				while( (*pStr >= sal_Unicode('0') && *pStr <= sal_Unicode('9')) || (*pStr == '+') || (*pStr == '-')  )
				{
					sBuffer.append( *pStr++ );
				}

				aPoint.Y() = sBuffer.makeStringAndClear().toInt32();

			}
		}

		aNewHelpLine.SetPos( aPoint );
		rHelpLines.Insert( aNewHelpLine );
	}
}

void FrameView::ReadUserDataSequence ( const ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& rSequence, sal_Bool )
{
	const sal_Int32 nLength = rSequence.getLength();
    if (nLength)
    {
		const bool bImpress = dynamic_cast< SdDrawDocument* >(GetModel())->GetDocumentType() == DOCUMENT_TYPE_IMPRESS;

		sal_Bool bBool = sal_False;
		sal_Int32 nInt32 = 0;
		sal_Int16 nInt16 = 0;
		rtl::OUString aString;

		sal_Int32 aSnapGridWidthXNum = GetSnapGridWidthX().GetNumerator();
		sal_Int32 aSnapGridWidthXDom = GetSnapGridWidthX().GetDenominator();

		sal_Int32 aSnapGridWidthYNum = GetSnapGridWidthY().GetNumerator();
		sal_Int32 aSnapGridWidthYDom = GetSnapGridWidthY().GetDenominator();

        EditMode eStandardEditMode;
        EditMode eNotesEditMode;
        EditMode eHandoutEditMode;

        const com::sun::star::beans::PropertyValue *pValue = rSequence.getConstArray();
        for (sal_Int16 i = 0 ; i < nLength; i++, pValue++ )
        {
            if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_ViewId ) ) )
            {
            }
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_SnapLinesDrawing ) ) )
			{
				if( pValue->Value >>= aString )
				{
					SdrHelpLineList aHelpLines;
					createHelpLinesFromString( aString, aHelpLines );
					SetStandardHelpLines( aHelpLines );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_SnapLinesNotes ) ) )
			{
				if( pValue->Value >>= aString )
				{
					SdrHelpLineList aHelpLines;
					createHelpLinesFromString( aString, aHelpLines );
					SetNotesHelpLines( aHelpLines );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_SnapLinesHandout ) ) )
			{
				if( pValue->Value >>= aString )
				{
					SdrHelpLineList aHelpLines;
					createHelpLinesFromString( aString, aHelpLines );
					SetHandoutHelpLines( aHelpLines );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_RulerIsVisible ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetRuler( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_PageKind ) ) )
			{
				if( pValue->Value >>= nInt16 )
				{
					SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( GetModel() );
					if( pDoc && pDoc->GetDocSh() && ( SFX_CREATE_MODE_EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) )
                        SetPageKind( (PageKind)nInt16 );

					SetPageKindOnLoad( (PageKind)nInt16 );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_SelectedPage ) ) )
			{
				if( pValue->Value >>= nInt16 )
				{
					SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( GetModel() );
					if( pDoc && pDoc->GetDocSh() && ( SFX_CREATE_MODE_EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) )
						SetSelectedPage( (sal_uInt16)nInt16 );

					SetSelectedPageOnLoad( (sal_uInt16)nInt16 );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsLayerMode ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetLayerMode( bBool );
				}
			}
/*			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsQuickEdit ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetQuickEdit( bBool );
				}
			}
*/			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsBigHandles ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetBigHandles( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsDoubleClickTextEdit ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetDoubleClickTextEdit( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsClickChangeRotation ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetClickChangeRotation( bBool );
				}
			}
/*			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsDragWithCopy ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetDragWithCopy( bBool );
				}
			}
*/			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_SlidesPerRow ) ) )
			{
				if( pValue->Value >>= nInt16 )
				{
					SetSlidesPerRow( (sal_uInt16)nInt16 );
				}
			}
/* #107128# Product management decided to not make this persistent
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_DrawMode ) ) )
			{
				if( pValue->Value >>= nInt32 )
				{
					const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
					if( rStyleSettings.GetHighContrastMode() )
						continue;
					SetDrawMode( (sal_uLong)nInt32 );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_PreviewDrawMode ) ) )
			{
				if( pValue->Value >>= nInt32 )
				{
					const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
					SvtAccessibilityOptions aAccOptions;
					if( rStyleSettings.GetHighContrastMode() && aAccOptions.GetIsForPagePreviews() )
						continue;
					SetPreviewDrawMode( (sal_uLong)nInt32 );
				}
			}
*/
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_EditModeStandard ) ) )
			{
				if( pValue->Value >>= nInt32 )
				{
					SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( GetModel() );
					if( pDoc && pDoc->GetDocSh() && ( SFX_CREATE_MODE_EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) )
                        SetViewShEditMode( (EditMode)nInt32, PK_STANDARD );
					eStandardEditMode = (EditMode)nInt32;
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_EditModeNotes ) ) )
			{
				if( pValue->Value >>= nInt32 )
				{
					SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( GetModel() );
					if( pDoc && pDoc->GetDocSh() && ( SFX_CREATE_MODE_EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) )
                        SetViewShEditMode( (EditMode)nInt32, PK_NOTES );
					eNotesEditMode = (EditMode)nInt32;
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_EditModeHandout ) ) )
			{
				if( pValue->Value >>= nInt32 )
				{
					SdDrawDocument* pDoc = dynamic_cast< SdDrawDocument* >( GetModel() );
					if( pDoc && pDoc->GetDocSh() && ( SFX_CREATE_MODE_EMBEDDED == pDoc->GetDocSh()->GetCreateMode() ) )
                        SetViewShEditMode( (EditMode)nInt32, PK_HANDOUT );
					eHandoutEditMode = (EditMode)nInt32;
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_VisibleAreaTop ) ) )
			{
				sal_Int32 nTop = 0;
				if( pValue->Value >>= nTop )
				{
					Rectangle aVisArea( GetVisArea() );
					aVisArea.nBottom += nTop - aVisArea.nTop;
					aVisArea.nTop = nTop;
					SetVisArea( aVisArea );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_VisibleAreaLeft ) ) )
			{
				sal_Int32 nLeft = 0;
				if( pValue->Value >>= nLeft )
				{
					Rectangle aVisArea( GetVisArea() );
					aVisArea.nRight += nLeft - aVisArea.nLeft;
					aVisArea.nLeft = nLeft;
					SetVisArea( aVisArea );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_VisibleAreaWidth ) ) )
			{
				sal_Int32 nWidth = 0;
				if( pValue->Value >>= nWidth )
				{
					Rectangle aVisArea( GetVisArea() );
					aVisArea.nRight = aVisArea.nLeft + nWidth - 1;
					SetVisArea( aVisArea );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_VisibleAreaHeight ) ) )
			{
				sal_Int32 nHeight = 0;
				if( pValue->Value >>= nHeight )
				{
					Rectangle aVisArea( GetVisArea() );
					aVisArea.nBottom = nHeight + aVisArea.nTop - 1;
					SetVisArea( aVisArea );
				}
			}

			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_GridIsVisible ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetGridVisible( bBool );
				}
			}

			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsSnapToGrid ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetGridSnap( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_GridIsFront ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetGridFront( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsSnapToPageMargins ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetBordSnap( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsSnapToSnapLines ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetHlplSnap( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsSnapToObjectFrame ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetOFrmSnap( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsSnapToObjectPoints ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetOPntSnap( bBool );
				}
			}
/*			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsSnapLinesVisible ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetHlplVisible( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsDragStripes ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetDragStripes( bBool );
				}
			}
*/			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsPlusHandlesAlwaysVisible ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetPlusHandlesAlwaysVisible( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsFrameDragSingles ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetFrameDragSingles( bBool );
				}
			}
/*			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsMarkedHitMovesAlways ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetMarkedHitMovesAlways( bBool );
				}
			}
*/			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_EliminatePolyPointLimitAngle ) ) )
			{
				if( pValue->Value >>= nInt32 )
				{
					SetEliminatePolyPointLimitAngle( nInt32 );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsEliminatePolyPoints ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetEliminatePolyPoints( bBool );
				}
			}
/*
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsLineDraft ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetLineDraft( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsFillDraft ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetFillDraft( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsTextDraft ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetTextDraft( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsGrafDraft ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetGrafDraft( bBool );
				}
			}
*/
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_ActiveLayer ) ) )
			{
				if( pValue->Value >>= aString )
				{
					SetActiveLayer( aString );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_NoAttribs ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetNoAttribs( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_NoColors ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetNoColors( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_GridCoarseWidth ) ) )
			{
				if( pValue->Value >>= nInt32 )
				{
					const Size aCoarse( nInt32, GetGridCoarse().Height() );
					SetGridCoarse( aCoarse );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_GridCoarseHeight ) ) )
			{
				if( pValue->Value >>= nInt32 )
				{
					const Size aCoarse( GetGridCoarse().Width(), nInt32 );
					SetGridCoarse( aCoarse );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_GridFineWidth ) ) )
			{
				if( pValue->Value >>= nInt32 )
				{
					const Size aCoarse( nInt32, GetGridFine().Height() );
					SetGridFine( aCoarse );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_GridFineHeight ) ) )
			{
				if( pValue->Value >>= nInt32 )
				{
					const Size aCoarse( GetGridFine().Width(), nInt32 );
					SetGridFine( aCoarse );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_IsAngleSnapEnabled ) ) )
			{
				if( pValue->Value >>= bBool )
				{
					SetAngleSnapEnabled( bBool );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_SnapAngle ) ) )
			{
				if( pValue->Value >>= nInt32 )
				{
					SetSnapAngle( nInt32 );
				}
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_GridSnapWidthXNumerator ) ) )
			{
				pValue->Value >>= aSnapGridWidthXNum;
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_GridSnapWidthXDenominator ) ) )
			{
				pValue->Value >>= aSnapGridWidthXDom;
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_GridSnapWidthYNumerator ) ) )
			{
				pValue->Value >>= aSnapGridWidthYNum;
			}
			else if (pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_GridSnapWidthYDenominator ) ) )
			{
				pValue->Value >>= aSnapGridWidthYDom;
			}
			else if (!bImpress && pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_VisibleLayers ) ) )
			{
				SetOfByte aSetOfBytes;
				aSetOfBytes.PutValue( pValue->Value );
				SetVisibleLayers( aSetOfBytes );
			}
			else if (!bImpress && pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_PrintableLayers ) ) )
			{
				SetOfByte aSetOfBytes;
				aSetOfBytes.PutValue( pValue->Value );
				SetPrintableLayers( aSetOfBytes );
			}
			else if (!bImpress && pValue->Name.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( sUNO_View_LockedLayers ) ) )
			{
				SetOfByte aSetOfBytes;
				aSetOfBytes.PutValue( pValue->Value );
				SetLockedLayers( aSetOfBytes );
			}
		}

        switch (GetPageKindOnLoad())
        {
            case PK_STANDARD: SetViewShEditModeOnLoad(meStandardEditMode); break;
            case PK_NOTES: SetViewShEditModeOnLoad(meNotesEditMode); break;
            case PK_HANDOUT: SetViewShEditModeOnLoad(meHandoutEditMode); break;
            default: SetViewShEditModeOnLoad(EM_PAGE); break;
        }

		const Fraction aSnapGridWidthX( aSnapGridWidthXNum, aSnapGridWidthXDom );
		const Fraction aSnapGridWidthY( aSnapGridWidthYNum, aSnapGridWidthYDom );

		SetSnapGridWidth( aSnapGridWidthX, aSnapGridWidthY );
	}
}




void FrameView::SetPreviousViewShellType (ViewShell::ShellType eType)
{
    mePreviousViewShellType = eType;
}




ViewShell::ShellType FrameView::GetPreviousViewShellType (void) const
{
    return mePreviousViewShellType;
}




void FrameView::SetViewShellTypeOnLoad (ViewShell::ShellType eType)
{
    meViewShellTypeOnLoad = eType;
}




ViewShell::ShellType FrameView::GetViewShellTypeOnLoad (void) const
{
    return meViewShellTypeOnLoad;
}




void FrameView::SetSelectedPage(sal_uInt16 nPage)
{
    mnSelectedPage = nPage;
}




sal_uInt16 FrameView::GetSelectedPage (void) const
{
    return mnSelectedPage;
}




void FrameView::SetIsNavigatorShowingAllShapes (const bool bIsNavigatorShowingAllShapes)
{
    mbIsNavigatorShowingAllShapes = bIsNavigatorShowingAllShapes;
}




bool FrameView::IsNavigatorShowingAllShapes (void) const
{
    return mbIsNavigatorShowingAllShapes;
}


} // end of namespace sd
