/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



#ifndef _DRAWDOC_HXX
#define _DRAWDOC_HXX

#include <com/sun/star/lang/Locale.hpp>
#include <com/sun/star/text/WritingMode.hpp>
#include <com/sun/star/frame/XModel.hdl>
#include <vcl/print.hxx>
#include <svx/fmmodel.hxx>
#include "pres.hxx"
#include <svx/pageitem.hxx>
#include <unotools/charclass.hxx>
#include <sot/storage.hxx>
#include <rsc/rscsfx.hxx>
#include <com/sun/star/lang/Locale.hpp>
#include <com/sun/star/text/WritingMode.hpp>

// #107844#
#include <svx/svdundo.hxx>

#include <vector>

#ifndef INCLUDED_MEMORY
#include <memory>
#define INCLUDED_MEMORY
#endif
#include "sddllapi.h"
#include "sdpage.hxx"

namespace com
{
    namespace sun
    {
        namespace star
        {
            namespace embed
            {
                class XStorage;
            }
            namespace io
            {
                class XStream;
            }
			namespace presentation
			{
				class XPresentation2;
			}
        }
    }
}

namespace sd
{
	class FrameView;
	class Outliner;
}


class Timer;
class SfxObjectShell;
class SdDrawDocShell;
class SdPage;
class SdAnimationInfo;
class SdIMapInfo;
class IMapObject;
class SdStyleSheetPool;
class SfxMedium;
class SvxSearchItem;
class SdrOle2Obj;
class EditStatus;
class Graphic;
class Point;
class Window;
class SdTransferable;
struct SpellCallbackInfo;
struct StyleRequestData;
class SdDrawDocument;

namespace sd
{
#ifndef SV_DECL_DRAW_DOC_SHELL_DEFINED
#define SV_DECL_DRAW_DOC_SHELL_DEFINED
SV_DECL_REF(DrawDocShell)
#endif
class DrawDocShell;
class UndoManager;
class ShapeList;
}

class ImpDrawPageListWatcher;
class ImpMasterPageListWatcher;

struct StyleReplaceData
{
	SfxStyleFamily  nFamily;
	SfxStyleFamily  nNewFamily;
	String          aName;
	String          aNewName;
};

enum DocCreationMode
{
	NEW_DOC,
	DOC_LOADED
};

namespace sd
{
	struct PresentationSettings
	{
		rtl::OUString maPresPage;
		sal_Bool mbAll;
		sal_Bool mbEndless;
		sal_Bool mbCustomShow;
		sal_Bool mbManual;
		sal_Bool mbMouseVisible;
		sal_Bool mbMouseAsPen;
		sal_Bool mbLockedPages;
		sal_Bool mbAlwaysOnTop;
		sal_Bool mbFullScreen;
		sal_Bool mbAnimationAllowed;
		sal_Int32 mnPauseTimeout;
		sal_Bool mbShowPauseLogo;
		sal_Bool mbStartWithNavigator;

		PresentationSettings();
		PresentationSettings( const PresentationSettings& r );
	};
}

// ------------------
// - SdDrawDocument -
// ------------------

class SdDrawDocument : public FmFormModel
{
private:
	::sd::Outliner*		mpOutliner;		    // local outliner for outline mode
	::sd::Outliner*		mpInternalOutliner;  // internal outliner for creation of text objects
	Timer*			    mpWorkStartupTimer;
	Timer*              mpOnlineSpellingTimer;
	sd::ShapeList*		mpOnlineSpellingList;
	SvxSearchItem*      mpOnlineSearchItem;
	List*               mpFrameViewList;
	List*               mpCustomShowList;
	::sd::DrawDocShell* mpDocSh;
    SdTransferable *    mpCreatingTransferable;
	sal_Bool                mbHasOnlineSpellErrors;
	sal_Bool                mbInitialOnlineSpellingEnabled;
	String              maBookmarkFile; 
	::sd::DrawDocShellRef   mxBookmarkDocShRef; 

	sd::PresentationSettings maPresentationSettings;

	::com::sun::star::uno::Reference< ::com::sun::star::presentation::XPresentation2 > mxPresentation;

	sal_Bool			    mbNewOrLoadCompleted;

	sal_Bool			    mbOnlineSpell;
    sal_Bool                mbSummationOfParagraphs;
	bool				mbStartWithPresentation;		// is set to true when starting with command line parameter -start
	LanguageType	    meLanguage;
	LanguageType	    meLanguageCJK;
	LanguageType	    meLanguageCTL;
	SvxNumType		    mePageNumType;
	::sd::DrawDocShellRef   mxAllocedDocShRef;   // => AllocModel()
	sal_Bool			    mbAllocDocSh;		// => AllocModel()
	DocumentType        meDocType;
	CharClass*		    mpCharClass;
	::com::sun::star::lang::Locale* mpLocale;

	// #109538#
	::std::auto_ptr<ImpDrawPageListWatcher> mpDrawPageListWatcher;
	::std::auto_ptr<ImpMasterPageListWatcher> mpMasterPageListWatcher;

	void                UpdatePageObjectsInNotes(sal_uInt16 nStartPos);
    void                UpdatePageRelativeURLs(SdPage* pPage, sal_uInt16 nPos, sal_Int32 nIncrement);
	void                FillOnlineSpellingList(SdPage* pPage);
	void                SpellObject(SdrTextObj* pObj);

	                    DECL_LINK(WorkStartupHdl, Timer*);
	                    DECL_LINK(OnlineSpellingHdl, Timer*);
	                    DECL_LINK(OnlineSpellEventHdl, EditStatus*);

    std::vector< rtl::OUString > maAnnotationAuthors;
    
protected:

	virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > createUnoModel();

public:

    class InsertBookmarkAsPage_PageFunctorBase;

                	    TYPEINFO();

	                    SdDrawDocument(DocumentType eType, SfxObjectShell* pDocSh);
	                    ~SdDrawDocument();

	virtual SdrModel*   AllocModel() const;
	virtual SdrPage*    AllocPage(FASTBOOL bMasterPage);
	virtual const SdrModel* LoadModel(const String& rFileName);
	virtual void        DisposeLoadedModels();
	virtual FASTBOOL    IsReadOnly() const;
	virtual void        SetChanged(sal_Bool bFlag = sal_True);
	virtual SvStream*   GetDocumentStream(SdrDocumentStreamInfo& rStreamInfo) const;

	SfxItemPool&	    GetPool() { return( *pItemPool ); }

	::sd::Outliner* GetOutliner(sal_Bool bCreateOutliner=sal_True);
	SD_DLLPUBLIC ::sd::Outliner* GetInternalOutliner(sal_Bool bCreateOutliner=sal_True);
                        
	::sd::DrawDocShell*     GetDocSh() const { return mpDocSh; }

	LanguageType	    GetLanguage( const sal_uInt16 nId ) const;
	void			    SetLanguage( const LanguageType eLang, const sal_uInt16 nId );

	SvxNumType          GetPageNumType() const;
	void			    SetPageNumType(SvxNumType eType) { mePageNumType = eType; }
	SD_DLLPUBLIC String              CreatePageNumValue(sal_uInt16 nNum) const;

	DocumentType        GetDocumentType() const { return meDocType; }

	void			    SetAllocDocSh(sal_Bool bAlloc);

	void	            CreatingDataObj( SdTransferable* pTransferable ) { mpCreatingTransferable = pTransferable; }
                        
	/** if the document does not contain at least one handout, one slide and one notes page with
		at least one master each this methods creates them.
		If a reference document is given, the sizes and border settings of that document are used
		for newly created slides.
	*/
	SD_DLLPUBLIC void	CreateFirstPages( SdDrawDocument* pRefDocument = 0 );
	SD_DLLPUBLIC sal_Bool                CreateMissingNotesAndHandoutPages();

	void	            MovePage(sal_uInt16 nPgNum, sal_uInt16 nNewPos);
	void	            InsertPage(SdrPage* pPage, sal_uInt16 nPos=0xFFFF);
	void	            DeletePage(sal_uInt16 nPgNum);
	SdrPage*            RemovePage(sal_uInt16 nPgNum);

    virtual void     InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos=0xFFFF);
	virtual SdrPage* RemoveMasterPage(sal_uInt16 nPgNum);

	void	            RemoveUnnecessaryMasterPages( SdPage* pMaster=NULL, sal_Bool bOnlyDuplicatePages=sal_False, sal_Bool bUndo=sal_True );
	SD_DLLPUBLIC void 	SetMasterPage(sal_uInt16 nSdPageNum, const String& rLayoutName,
					    	          SdDrawDocument* pSourceDoc, sal_Bool bMaster, sal_Bool bCheckMasters);
                        
	SD_DLLPUBLIC SdDrawDocument* OpenBookmarkDoc(const String& rBookmarkFile);
	SdDrawDocument*     OpenBookmarkDoc(SfxMedium& rMedium);
	sal_Bool                InsertBookmark(List* pBookmarkList, List* pExchangeList, sal_Bool bLink,
			            				sal_Bool bReplace, sal_uInt16 nPgPos, sal_Bool bNoDialogs,
			            				::sd::DrawDocShell* pBookmarkDocSh, sal_Bool bCopy,
			            				Point* pObjPos);

	bool IsStartWithPresentation() const;
	void SetStartWithPresentation( bool bStartWithPresentation );

	/** Insert pages into this document

    	This method inserts whole pages into this document, either
    	selected ones (specified via pBookmarkList/pExchangeList), or
    	all from the source document.

        @attention Beware! This method in it's current state does not
        handle all combinations of their input parameters
        correctly. For example, for pBookmarkList=NULL, bReplace=sal_True
        is ignored (no replace happens).

        @param pBookmarkList
        A list of strings, denoting the names of the pages to be copied

        @param pExchangeList
        A list of strings, denoting the names of the pages to be renamed

        @param bLink
        Whether the inserted pages should be links to the bookmark document

        @param bReplace
        Whether the pages should not be inserted, but replace the pages in
        the destination document

        @param nPgPos
        Insertion point/start of replacement

        @param bNoDialogs
        Whether query dialogs are allowed (e.g. for page scaling)

        @param pBookmarkDocSh
        DocShell of the source document (used e.g. to extract the filename
        for linked pages)

        @param bCopy
        Whether the source document should be treated as immutable (i.e.
        inserted pages are not removed from it, but cloned)

        @param bMergeMasterPages
        Whether the source document's master pages should be copied, too.

        @param bPreservePageNames
        Whether the replace operation should take the name from the new
        page, or preserve the old name
     */
	sal_Bool                InsertBookmarkAsPage(List* pBookmarkList, List* pExchangeList,
			            					  sal_Bool bLink, sal_Bool bReplace, sal_uInt16 nPgPos,
			            					  sal_Bool bNoDialogs, ::sd::DrawDocShell* pBookmarkDocSh,
			            					  sal_Bool bCopy, sal_Bool bMergeMasterPages,
                                              sal_Bool bPreservePageNames);
	sal_Bool                InsertBookmarkAsObject(List* pBookmarkList, List* pExchangeListL,
			            						sal_Bool bLink, ::sd::DrawDocShell* pBookmarkDocSh,
			            						Point* pObjPos);
    void 				IterateBookmarkPages( SdDrawDocument* pBookmarkDoc, List* pBookmarkList,
                                              sal_uInt16 nBMSdPageCount,
                                              InsertBookmarkAsPage_PageFunctorBase& rPageIterator );
	SD_DLLPUBLIC void	CloseBookmarkDoc();
                        
	SdrObject*          GetObj(const String& rObjName) const;

    /** Return the first page that has the given name.  Regular pages and
        notes pages are searched first.  When not found then the master
        pages are searched.
        @param rPgName
            Name of the page to return.
        @param rbIsMasterPage
            Is set by the method to indicate whether the returned index
            belongs to a master page (<TRUE/>) or a regular or notes page
            (<FALSE/>). The given value is ignored.
        @return
            Returns the index of the page with the given name or
            SDRPAGE_NOTFOUND (=0xffff) when such a page does not exist.
    */
	sal_uInt16 GetPageByName(const String& rPgName, sal_Bool& rbIsMasterPage ) const;
	SD_DLLPUBLIC SdPage*GetSdPage(sal_uInt16 nPgNum, PageKind ePgKind) const;
	SD_DLLPUBLIC sal_uInt16	GetSdPageCount(PageKind ePgKind) const;

	void	            SetSelected(SdPage* pPage, sal_Bool bSelect);
	sal_Bool	            MovePages(sal_uInt16 nTargetPage);
                        
	SD_DLLPUBLIC SdPage*GetMasterSdPage(sal_uInt16 nPgNum, PageKind ePgKind);
	SD_DLLPUBLIC sal_uInt16	GetMasterSdPageCount(PageKind ePgKind) const;
                        
	sal_uInt16	            GetMasterPageUserCount(SdrPage* pMaster) const;
                        
	const sd::PresentationSettings& getPresentationSettings() const { return maPresentationSettings; }
	sd::PresentationSettings& getPresentationSettings() { return maPresentationSettings; }
                                            
	const ::com::sun::star::uno::Reference< ::com::sun::star::presentation::XPresentation2 >& getPresentation() const;

   	void                SetSummationOfParagraphs( sal_Bool bOn = sal_True ) { mbSummationOfParagraphs = bOn; }
	sal_Bool	        IsSummationOfParagraphs() const { return mbSummationOfParagraphs; }

    /** Set the mode that controls whether (and later how) the formatting of the document
        depends on the current printer metrics.
        @param nMode
            Use <const
            scope="com::sun::star::document::PrinterIndependentLayout">ENABLED</const>
            to make formatting printer-independent and <const
            scope="com::sun::star::document::PrinterIndependentLayout">DISABLED</const>
            to make formatting depend on the current printer metrics.
    */
    void SetPrinterIndependentLayout (sal_Int32 nMode);

    /** Get the flag that controls whether the formatting of the document
        depends on the current printer metrics.
        @return
            Use <const
            scope="com::sun::star::document::PrinterIndependentLayout">ENABLED</const>
            when formatting is printer-independent and <const
            scope="com::sun::star::document::PrinterIndependentLayout">DISABLED</const>
            when formatting depends on the current printer metrics.
    */
    sal_Int32 GetPrinterIndependentLayout (void);

	void                SetOnlineSpell( sal_Bool bIn );
	sal_Bool                GetOnlineSpell() const { return mbOnlineSpell; }
	void                StopOnlineSpelling();
	void                StartOnlineSpelling(sal_Bool bForceSpelling=sal_True);

	void                ImpOnlineSpellCallback(SpellCallbackInfo* pInfo, SdrObject* pObj, SdrOutliner* pOutl);

	void                InsertObject(SdrObject* pObj, SdPage* pPage);
	void                RemoveObject(SdrObject* pObj, SdPage* pPage);

	sal_uLong               GetLinkCount();

	List*               GetFrameViewList() const { return mpFrameViewList; }
	SD_DLLPUBLIC List*  GetCustomShowList(sal_Bool bCreate = sal_False);
                        
	void                NbcSetChanged(sal_Bool bFlag = sal_True);

	void                SetTextDefaults() const;

	void                CreateLayoutTemplates();
	void                RenameLayoutTemplate(const String& rOldLayoutName, const String& rNewName);
                        
	void				CreateDefaultCellStyles();

	SD_DLLPUBLIC void   StopWorkStartupDelay();
                        
	void                NewOrLoadCompleted(DocCreationMode eMode);
	void				NewOrLoadCompleted( SdPage* pPage, SdStyleSheetPool* pSPool );
	sal_Bool                IsNewOrLoadCompleted() const {return mbNewOrLoadCompleted; }

	::sd::FrameView* GetFrameView(sal_uLong nPos) {
        return static_cast< ::sd::FrameView*>(
            mpFrameViewList->GetObject(nPos));}

	/** deprecated*/
	SdAnimationInfo*    GetAnimationInfo(SdrObject* pObject) const;

	SD_DLLPUBLIC static 	SdAnimationInfo* GetShapeUserData(SdrObject& rObject, bool bCreate = false );

	SdIMapInfo*         GetIMapInfo( SdrObject* pObject ) const;
	IMapObject*         GetHitIMapObject( SdrObject* pObject, const Point& rWinPoint, const ::Window& rCmpWnd );

	CharClass*	        GetCharClass() const { return mpCharClass; }

	void                RestoreLayerNames();

	void	            UpdateAllLinks();

	void                CheckMasterPages();

	void                Merge(SdrModel& rSourceModel,
			                    sal_uInt16 nFirstPageNum=0, sal_uInt16 nLastPageNum=0xFFFF,
			                    sal_uInt16 nDestPos=0xFFFF,
			                    FASTBOOL bMergeMasterPages=sal_False, FASTBOOL bAllMasterPages=sal_False,
			                    FASTBOOL bUndo=sal_True, FASTBOOL bTreadSourceAsConst=sal_False);
                        
    SD_DLLPUBLIC ::com::sun::star::text::WritingMode GetDefaultWritingMode() const;
    void SetDefaultWritingMode( ::com::sun::star::text::WritingMode eMode );

	/** replacespOldPage from all custom shows with pNewPage or removes pOldPage from
		all custom shows if pNewPage is 0.
	*/
	void ReplacePageInCustomShows( const SdPage* pOldPage, const SdPage* pNewPage );

public:

    static SdDrawDocument* pDocLockedInsertingLinks;  // static to prevent recursions while resolving links

    /** Create and insert a set of two new pages: a standard (draw) page and
        the associated notes page.  The new pages are inserted direclty
        after the specified page set.
        @param pCurrentPage
            This page is used to retrieve the layout for the page to
            create.
        @param ePageKind
            This specifies whether <argument>pCurrentPage</argument> is a
            standard (draw) page or a notes page.
        @param sStandardPageName
            Name of the standard page.  An empty string leads to using an
            automatically created name.
        @param sNotesPageName
            Name of the standard page.  An empty string leads to using an
            automatically created name.
        @param eStandardLayout
            Layout to use for the new standard page.  Note that this layout
            is not used when the given <argument>pCurrentPage</argument> is
            not a standard page.  In this case the layout is taken from the
            standard page associated with <argument>pCurrentPage</argument>.
        @param eNotesLayout
            Layout to use for the new notes page.  Note that this layout
            is not used when the given <argument>pCurrentPage</argument> is
            not a notes page.  In this case the layout is taken from the
            notes page associated with <argument>pCurrentPage</argument>.
        @param bIsPageBack
            This flag indicates whether to show the background shape.
        @param bIsPageObj
            This flag indicates whether to show the shapes on the master page.
        @param nInsertPosition
            Position where to insert the standard page.  When -1 then the
            new page set is inserted after the current page.

        @return
            Returns an index of the inserted pages that can be used with the
            <member>GetSdPage()</member> method.
    */
    sal_uInt16 CreatePage (
        SdPage* pCurrentPage,
        PageKind ePageKind,
        const String& sStandardPageName,
        const String& sNotesPageName,
        AutoLayout eStandardLayout,
        AutoLayout eNotesLayout,
        sal_Bool bIsPageBack,
        sal_Bool bIsPageObj,
        const sal_Int32 nInsertPosition = -1);

    /** This method acts as a simplified front end for the more complex
        <member>DuplicatePage()</member> method.
        @param nPageNum
            The page number as passed to the <member>GetSdPage()</member>
            method for which the standard page and the notes page are to be
            copied.
        @return
            Returns an index of the inserted pages that can be used with the
            <member>GetSdPage()</member> method.
    */
    sal_uInt16 DuplicatePage (sal_uInt16 nPageNum);

    /** Create and insert a set of two new pages that are copies of the
        given <argument>pCurrentPage</argument> and its associated notes
        resp. standard page.  The copies are inserted directly after the
        specified page set.
        @param pCurrentPage
            This page and its associated notes/standard page is copied.
        @param ePageKind
            This specifies whether <argument>pCurrentPage</argument> is a
            standard (draw) page or a notes page.
        @param sStandardPageName
            Name of the standard page.  An empty string leads to using an
            automatically created name.
        @param sNotesPageName
            Name of the standard page.  An empty string leads to using an
            automatically created name.
        @param eStandardLayout
            Layout to use for the new standard page.  Note that this layout
            is not used when the given <argument>pCurrentPage</argument> is
            not a standard page.  In this case the layout is taken from the
            standard page associated with <argument>pCurrentPage</argument>.
        @param eNotesLayout
            Layout to use for the new notes page.  Note that this layout
            is not used when the given <argument>pCurrentPage</argument> is
            not a notes page.  In this case the layout is taken from the
            notes page associated with <argument>pCurrentPage</argument>.
        @param bIsPageBack
            This flag indicates whether to show the background shape.
        @param bIsPageObj
            This flag indicates whether to show the shapes on the master page.
        @param nInsertPosition
            Position where to insert the standard page.  When -1 then the
            new page set is inserted after the current page.

        @return
            Returns an index of the inserted pages that can be used with the
            <member>GetSdPage()</member> method.
    */
    sal_uInt16 DuplicatePage (
        SdPage* pCurrentPage,
        PageKind ePageKind,
        const String& sStandardPageName,
        const String& sNotesPageName,
        AutoLayout eStandardLayout,
        AutoLayout eNotesLayout,
        sal_Bool bIsPageBack,
        sal_Bool bIsPageObj,
        const sal_Int32 nInsertPosition = -1);

	/** return the document fonts for latin, cjk and ctl according to the current
		languages set at this document */
	void getDefaultFonts( Font& rLatinFont, Font& rCJKFont, Font& rCTLFont );

	sd::UndoManager* GetUndoManager() const;

	/* converts the given western font height to a corresponding ctl font height, deppending on the system language */
	static sal_uInt32 convertFontHeightToCTL( sal_uInt32 nWesternFontHeight );

	/** Get the style sheet pool if it was a SdStyleSheetPool.
	 */
	SD_DLLPUBLIC SdStyleSheetPool* GetSdStyleSheetPool() const;

   	void UpdatePageRelativeURLs(const String& rOldName, const String& rNewName);

	void SetCalcFieldValueHdl( ::Outliner* pOutliner);

    sal_uInt16 GetAnnotationAuthorIndex( const rtl::OUString& rAuthor );

private:
    /** This member stores the printer independent layout mode.  Please
        refer to <member>SetPrinterIndependentLayout()</member> for its
        values.
    */
    sal_Int32 mnPrinterIndependentLayout;

    /** Insert a given set of standard and notes page after the given <argument>pCurrentPage</argument>.
        @param pCurrentPage
            This page and its associated notes/standard page is copied.
        @param ePageKind
            This specifies whether <argument>pCurrentPage</argument> is a
            standard (draw) page or a notes page.
        @param sStandardPageName
            Name of the standard page.  An empty string leads to using an
            automatically created name.
        @param sNotesPageName
            Name of the standard page.  An empty string leads to using an
            automatically created name.
        @param eStandardLayout
            Layout to use for the new standard page.  Note that this layout
            is not used when the given <argument>pCurrentPage</argument> is
            not a standard page.  In this case the layout is taken from the
            standard page associated with <argument>pCurrentPage</argument>.
        @param eNotesLayout
            Layout to use for the new notes page.  Note that this layout
            is not used when the given <argument>pCurrentPage</argument> is
            not a notes page.  In this case the layout is taken from the
            notes page associated with <argument>pCurrentPage</argument>.
        @param bIsPageBack
            This flag indicates whether to show the background shape.
        @param bIsPageObj
            This flag indicates whether to show the shapes on the master page.
        @param pStandardPage
            The standard page to insert.
        @param pNotesPage
            The notes page to insert.
        @param nInsertPosition
            Position where to insert the standard page.  When -1 then the
            new page set is inserted after the current page.

        @return
            Returns an index of the inserted pages that can be used with the
            <member>GetSdPage()</member> method.
    */
    sal_uInt16 InsertPageSet (
        SdPage* pCurrentPage,
        PageKind ePageKind,
        const String& sStandardPageName,
        const String& sNotesPageName,
        AutoLayout eStandardLayout,
        AutoLayout eNotesLayout,
        sal_Bool bIsPageBack,
        sal_Bool bIsPageObj,
        SdPage* pStandardPage,
        SdPage* pNotesPage,
        sal_Int32 nInsertPosition = -1);

    /** Set up a newly created page and insert it into the list of pages.
        @param pPreviousPage
            A page to take the size and border geometry from.
        @param pPage
            This is the page to set up and insert.
        @param sPageName
            The name of the new page.
        @param nInsertionPoint
            Index of the page before which the new page will be inserted.
        @param bIsPageBack
            This flag indicates whether to show the background shape.
        @param bIsPageObj
            This flag indicates whether to show the shapes on the master
            page.
    */
    void SetupNewPage (
        SdPage* pPreviousPage,
        SdPage* pPage,
        const String& sPageName,
        sal_uInt16 nInsertionPoint,
        sal_Bool bIsPageBack,
        sal_Bool bIsPageObj);

	// #109538#
	virtual void PageListChanged();
	virtual void MasterPageListChanged();
};

namespace sd
{

// an instance of this guard disables modification of a document
// during its lifetime
class ModifyGuard
{
public:
	ModifyGuard( SdDrawDocument* pDoc );
	~ModifyGuard();

private:
	void init();

	DrawDocShell* mpDocShell;
	SdDrawDocument* mpDoc;
	sal_Bool mbIsEnableSetModified;
	sal_Bool mbIsDocumentChanged;
};

}

#endif // _DRAWDOC_HXX
