summaryrefslogtreecommitdiff
path: root/sd/source/core/drawdoc2.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/core/drawdoc2.cxx')
-rw-r--r--sd/source/core/drawdoc2.cxx1585
1 files changed, 1585 insertions, 0 deletions
diff --git a/sd/source/core/drawdoc2.cxx b/sd/source/core/drawdoc2.cxx
new file mode 100644
index 000000000000..05aa502d67d6
--- /dev/null
+++ b/sd/source/core/drawdoc2.cxx
@@ -0,0 +1,1585 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sd.hxx"
+
+
+#include <com/sun/star/embed/XVisualObject.hpp>
+#include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
+#include <vcl/wrkwin.hxx>
+#include <sfx2/printer.hxx>
+#include <sfx2/app.hxx>
+#include "Outliner.hxx"
+#include <editeng/paperinf.hxx>
+#include <svx/svdopage.hxx>
+#include <svx/svdoole2.hxx>
+#include <svx/svdotext.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdundo.hxx>
+#include <vcl/svapp.hxx>
+#include <editeng/eeitem.hxx>
+#include <editeng/langitem.hxx>
+#include <svl/itempool.hxx>
+#include <svx/svdpool.hxx>
+#include <editeng/flditem.hxx>
+
+#include <sfx2/linkmgr.hxx>
+#include <editeng/editdata.hxx>
+#include <svx/dialogs.hrc>
+#include <svx/dialmgr.hxx> // SVX_RESSTR
+
+#include "eetext.hxx"
+#include <svx/svditer.hxx>
+#include <svtools/imapobj.hxx>
+
+
+#include "sdresid.hxx"
+#include "drawdoc.hxx"
+#include "sdpage.hxx"
+#include "pglink.hxx"
+#include "glob.hrc"
+#include "glob.hxx"
+#include "stlpool.hxx"
+#include "sdiocmpt.hxx"
+#include "anminfo.hxx"
+#include "imapinfo.hxx"
+#include "cusshow.hxx"
+#include "undo/undomanager.hxx"
+
+#include "../ui/inc/DrawDocShell.hxx"
+#include "../ui/inc/FrameView.hxx"
+#include "../ui/inc/cfgids.hxx"
+#include "../ui/inc/strings.hrc"
+
+#include "PageListWatcher.hxx"
+#include <vcl/virdev.hxx>
+
+using namespace ::sd;
+
+const long PRINT_OFFSET = 30; // siehe \svx\source\dialog\page.cxx (PB)
+
+using namespace com::sun::star;
+
+/*************************************************************************
+|*
+|* Sucht ein Objekt per Name
+|*
+\************************************************************************/
+
+SdrObject* SdDrawDocument::GetObj(const String& rObjName) const
+{
+ SdrObject* pObj = NULL;
+ SdrObject* pObjFound = NULL;
+ SdPage* pPage = NULL;
+
+ /**************************************************************************
+ * Zuerst alle Pages durchsuchen
+ **************************************************************************/
+ USHORT nPage = 0;
+ const USHORT nMaxPages = GetPageCount();
+
+ while (nPage < nMaxPages && !pObjFound)
+ {
+ pPage = (SdPage*) GetPage(nPage);
+ SdrObjListIter aIter(*pPage, IM_DEEPWITHGROUPS);
+
+ while (aIter.IsMore() && !pObjFound)
+ {
+ pObj = aIter.Next();
+
+ if( ( rObjName == pObj->GetName() ) ||
+ ( SdrInventor == pObj->GetObjInventor() &&
+ OBJ_OLE2 == pObj->GetObjIdentifier() &&
+ rObjName == static_cast< SdrOle2Obj* >( pObj )->GetPersistName() ) )
+ {
+ pObjFound = pObj;
+ }
+ }
+
+ nPage++;
+ }
+
+ /**************************************************************************
+ * Wenn nicht gefunden, dann alle MasterPages durchsuchen
+ **************************************************************************/
+ nPage = 0;
+ const USHORT nMaxMasterPages = GetMasterPageCount();
+
+ while (nPage < nMaxMasterPages && !pObjFound)
+ {
+ pPage = (SdPage*) GetMasterPage(nPage);
+ SdrObjListIter aIter(*pPage, IM_DEEPWITHGROUPS);
+
+ while (aIter.IsMore() && !pObjFound)
+ {
+ pObj = aIter.Next();
+
+ if( ( rObjName == pObj->GetName() ) ||
+ ( SdrInventor == pObj->GetObjInventor() &&
+ OBJ_OLE2 == pObj->GetObjIdentifier() &&
+ rObjName == static_cast< SdrOle2Obj* >( pObj )->GetPersistName() ) )
+ {
+ pObjFound = pObj;
+ }
+ }
+
+ nPage++;
+ }
+
+ return (pObjFound);
+}
+
+
+/*************************************************************************
+|*
+|* Sucht die SdPage per Name
+|*
+\************************************************************************/
+
+USHORT SdDrawDocument::GetPageByName(const String& rPgName, BOOL& rbIsMasterPage) const
+{
+ SdPage* pPage = NULL;
+ USHORT nPage = 0;
+ const USHORT nMaxPages = GetPageCount();
+ USHORT nPageNum = SDRPAGE_NOTFOUND;
+
+ rbIsMasterPage = FALSE;
+
+ // Search all regular pages and all notes pages (handout pages are
+ // ignored.)
+ while (nPage < nMaxPages && nPageNum == SDRPAGE_NOTFOUND)
+ {
+ pPage = const_cast<SdPage*>(static_cast<const SdPage*>(
+ GetPage(nPage)));
+
+ if (pPage != NULL
+ && pPage->GetPageKind() != PK_HANDOUT
+ && pPage->GetName() == rPgName)
+ {
+ nPageNum = nPage;
+ }
+
+ nPage++;
+ }
+
+ // Search all master pages when not found among non-master pages.
+ const USHORT nMaxMasterPages = GetMasterPageCount();
+ nPage = 0;
+
+ while (nPage < nMaxMasterPages && nPageNum == SDRPAGE_NOTFOUND)
+ {
+ pPage = const_cast<SdPage*>(static_cast<const SdPage*>(
+ GetMasterPage(nPage)));
+
+ if (pPage && pPage->GetName() == rPgName)
+ {
+ nPageNum = nPage;
+ rbIsMasterPage = TRUE;
+ }
+
+ nPage++;
+ }
+
+ return nPageNum;
+}
+
+SdPage* SdDrawDocument::GetSdPage(USHORT nPgNum, PageKind ePgKind) const
+{
+ // #109538#
+ return mpDrawPageListWatcher->GetSdPage(ePgKind, sal_uInt32(nPgNum));
+}
+
+USHORT SdDrawDocument::GetSdPageCount(PageKind ePgKind) const
+{
+ // #109538#
+ return (sal_uInt16)mpDrawPageListWatcher->GetSdPageCount(ePgKind);
+}
+
+SdPage* SdDrawDocument::GetMasterSdPage(USHORT nPgNum, PageKind ePgKind)
+{
+ // #109538#
+ return mpMasterPageListWatcher->GetSdPage(ePgKind, sal_uInt32(nPgNum));
+}
+
+USHORT SdDrawDocument::GetMasterSdPageCount(PageKind ePgKind) const
+{
+ // #109538#
+ return (sal_uInt16)mpMasterPageListWatcher->GetSdPageCount(ePgKind);
+}
+
+/*************************************************************************
+|*
+|* die in den Seitenobjekten der Notizseiten eingetragenen
+|* Seitennummern anpassen
+|*
+\************************************************************************/
+
+void SdDrawDocument::UpdatePageObjectsInNotes(USHORT nStartPos)
+{
+ USHORT nPageCount = GetPageCount();
+ SdPage* pPage = NULL;
+
+ for (USHORT nPage = nStartPos; nPage < nPageCount; nPage++)
+ {
+ pPage = (SdPage*)GetPage(nPage);
+
+ // wenn es eine Notizseite ist, Seitenobjekt suchen
+ // und Nummer korrigieren
+ if (pPage && pPage->GetPageKind() == PK_NOTES)
+ {
+ ULONG nObjCount = pPage->GetObjCount();
+ SdrObject* pObj = NULL;
+ for (ULONG nObj = 0; nObj < nObjCount; nObj++)
+ {
+ pObj = pPage->GetObj(nObj);
+ if (pObj->GetObjIdentifier() == OBJ_PAGE &&
+ pObj->GetObjInventor() == SdrInventor)
+ {
+ // das Seitenobjekt stellt die vorhergende Seite (also
+ // die Zeichenseite) dar
+ DBG_ASSERTWARNING(nStartPos, "Notizseitenpos. darf nicht 0 sein");
+
+ DBG_ASSERTWARNING(nPage > 1, "Seitenobjekt darf nicht Handzettel darstellen");
+
+ if (nStartPos > 0 && nPage > 1)
+ ((SdrPageObj*)pObj)->SetReferencedPage(GetPage(nPage - 1));
+ }
+ }
+ }
+ }
+}
+
+void SdDrawDocument::UpdatePageRelativeURLs(const String& rOldName, const String& rNewName)
+{
+ if (rNewName.Len() == 0)
+ return;
+
+ SfxItemPool& pPool(GetPool());
+ USHORT nCount = pPool.GetItemCount(EE_FEATURE_FIELD);
+ for (USHORT nOff = 0; nOff < nCount; nOff++)
+ {
+ const SfxPoolItem *pItem = pPool.GetItem(EE_FEATURE_FIELD, nOff);
+ const SvxFieldItem* pFldItem = dynamic_cast< const SvxFieldItem * > (pItem);
+
+ if(pFldItem)
+ {
+ SvxURLField* pURLField = const_cast< SvxURLField* >( dynamic_cast<const SvxURLField*>( pFldItem->GetField() ) );
+
+ if(pURLField)
+ {
+ XubString aURL = pURLField->GetURL();
+
+ if (aURL.Len() && (aURL.GetChar(0) == 35) && (aURL.Search(rOldName, 1) == 1))
+ {
+ if (aURL.Len() == rOldName.Len() + 1) // standard page name
+ {
+ aURL.Erase (1, aURL.Len() - 1);
+ aURL += rNewName;
+ pURLField->SetURL(aURL);
+ }
+ else
+ {
+ const XubString sNotes = SdResId(STR_NOTES);
+ if (aURL.Len() == rOldName.Len() + 2 + sNotes.Len() && aURL.Search(sNotes, rOldName.Len() + 2) == rOldName.Len() + 2)
+ {
+ aURL.Erase (1, aURL.Len() - 1);
+ aURL += rNewName;
+ aURL += ' ';
+ aURL += sNotes;
+ pURLField->SetURL(aURL);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void SdDrawDocument::UpdatePageRelativeURLs(SdPage* pPage, USHORT nPos, sal_Int32 nIncrement)
+{
+ bool bNotes = (pPage->GetPageKind() == PK_NOTES);
+
+ SfxItemPool& pPool(GetPool());
+ USHORT nCount = pPool.GetItemCount(EE_FEATURE_FIELD);
+ for (USHORT nOff = 0; nOff < nCount; nOff++)
+ {
+ const SfxPoolItem *pItem = pPool.GetItem(EE_FEATURE_FIELD, nOff);
+ const SvxFieldItem* pFldItem;
+
+ if ((pFldItem = dynamic_cast< const SvxFieldItem * > (pItem)) != 0)
+ {
+ SvxURLField* pURLField = const_cast< SvxURLField* >( dynamic_cast<const SvxURLField*>( pFldItem->GetField() ) );
+
+ if(pURLField)
+ {
+ XubString aURL = pURLField->GetURL();
+
+ if (aURL.Len() && (aURL.GetChar(0) == 35))
+ {
+ XubString aHashSlide('#');
+ aHashSlide += SdResId(STR_PAGE);
+
+ if (aURL.CompareTo(aHashSlide, aHashSlide.Len()) == COMPARE_EQUAL)
+ {
+ XubString aURLCopy = aURL;
+ const XubString sNotes = SdResId(STR_NOTES);
+
+ aURLCopy.Erase(0, aHashSlide.Len());
+
+ bool bNotesLink = (aURLCopy.Len() >= sNotes.Len() + 3 && aURLCopy.Search(sNotes, aURLCopy.Len() - sNotes.Len()) == aURLCopy.Len() - sNotes.Len());
+
+ if (bNotesLink ^ bNotes)
+ continue; // no compatible link and page
+
+ if (bNotes)
+ aURLCopy.Erase(aURLCopy.Len() - sNotes.Len(), sNotes.Len());
+
+ sal_Int32 number = aURLCopy.ToInt32();
+ USHORT realPageNumber = (nPos + 1)/ 2;
+
+ if ( number >= realPageNumber )
+ {
+ // update link page number
+ number += nIncrement;
+ aURL.Erase (aHashSlide.Len() + 1, aURL.Len() - aHashSlide.Len() - 1);
+ aURL += XubString::CreateFromInt32(number);
+ if (bNotes)
+ {
+ aURL += ' ';
+ aURL += sNotes;
+ }
+ pURLField->SetURL(aURL);
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+/*************************************************************************
+|*
+|* Seite verschieben
+|*
+\************************************************************************/
+
+void SdDrawDocument::MovePage(USHORT nPgNum, USHORT nNewPos)
+{
+ // Seite verschieben
+ FmFormModel::MovePage(nPgNum, nNewPos);
+
+ USHORT nMin = Min(nPgNum, nNewPos);
+
+ UpdatePageObjectsInNotes(nMin);
+}
+
+/*************************************************************************
+|*
+|* Seite einfuegen
+|*
+\************************************************************************/
+
+void SdDrawDocument::InsertPage(SdrPage* pPage, USHORT nPos)
+{
+ bool bLast = (nPos == GetPageCount());
+
+ FmFormModel::InsertPage(pPage, nPos);
+
+ ((SdPage*)pPage)->ConnectLink();
+
+ UpdatePageObjectsInNotes(nPos);
+
+ if (!bLast)
+ UpdatePageRelativeURLs(static_cast<SdPage*>( pPage ), nPos, 1);
+
+}
+
+/*************************************************************************
+|*
+|* Seite loeschen
+|*
+\************************************************************************/
+
+void SdDrawDocument::DeletePage(USHORT nPgNum)
+{
+ FmFormModel::DeletePage(nPgNum);
+
+ UpdatePageObjectsInNotes(nPgNum);
+}
+
+/*************************************************************************
+|*
+|* Seite entfernen
+|*
+\************************************************************************/
+
+SdrPage* SdDrawDocument::RemovePage(USHORT nPgNum)
+{
+ SdrPage* pPage = FmFormModel::RemovePage(nPgNum);
+
+ bool bLast = ((nPgNum+1)/2 == (GetPageCount()+1)/2);
+
+ ((SdPage*)pPage)->DisconnectLink();
+ ReplacePageInCustomShows( dynamic_cast< SdPage* >( pPage ), 0 );
+ UpdatePageObjectsInNotes(nPgNum);
+
+ if (!bLast)
+ UpdatePageRelativeURLs((SdPage*)pPage, nPgNum, -1);
+
+ return pPage;
+}
+
+// Warning: This is not called for new master pages created from SdrModel::Merge,
+// you also have to modify code in SdDrawDocument::Merge!
+void SdDrawDocument::InsertMasterPage(SdrPage* pPage, USHORT nPos )
+{
+ FmFormModel::InsertMasterPage( pPage, nPos );
+ if( pPage && pPage->IsMasterPage() && (static_cast<SdPage*>(pPage)->GetPageKind() == PK_STANDARD) )
+ {
+ // new master page created, add its style family
+ SdStyleSheetPool* pStylePool = (SdStyleSheetPool*) GetStyleSheetPool();
+ if( pStylePool )
+ pStylePool->AddStyleFamily( static_cast<SdPage*>(pPage) );
+ }
+}
+
+SdrPage* SdDrawDocument::RemoveMasterPage(USHORT nPgNum)
+{
+ SdPage* pPage = static_cast<SdPage*>(GetMasterPage(nPgNum ));
+ if( pPage && pPage->IsMasterPage() && (pPage->GetPageKind() == PK_STANDARD) )
+ {
+ // master page removed, remove its style family
+ SdStyleSheetPool* pStylePool = (SdStyleSheetPool*) GetStyleSheetPool();
+ if( pStylePool )
+ pStylePool->RemoveStyleFamily( pPage );
+ }
+
+ return FmFormModel::RemoveMasterPage(nPgNum);
+}
+
+/*************************************************************************
+|*
+|* Seiten selektieren
+|*
+\************************************************************************/
+
+void SdDrawDocument::SetSelected(SdPage* pPage, BOOL bSelect)
+{
+ PageKind ePageKind = pPage->GetPageKind();
+
+ if (ePageKind == PK_STANDARD)
+ {
+ pPage->SetSelected(bSelect);
+
+ const sal_uInt16 nDestPageNum(pPage->GetPageNum() + 1);
+ SdPage* pNotesPage = 0L;
+
+ if(nDestPageNum < GetPageCount())
+ {
+ pNotesPage = (SdPage*)GetPage(nDestPageNum);
+ }
+
+ if (pNotesPage && pNotesPage->GetPageKind() == PK_NOTES)
+ {
+ pNotesPage->SetSelected(bSelect);
+ }
+ }
+ else if (ePageKind == PK_NOTES)
+ {
+ pPage->SetSelected(bSelect);
+ SdPage* pStandardPage = (SdPage*) GetPage( pPage->GetPageNum() - 1 );
+
+ if (pStandardPage && pStandardPage->GetPageKind() == PK_STANDARD)
+ pStandardPage->SetSelected(bSelect);
+ }
+}
+
+/*************************************************************************
+|*
+|* Sofern noch keine Seiten vorhanden sind, werden nun Seiten erzeugt
+|*
+\************************************************************************/
+
+void SdDrawDocument::CreateFirstPages( SdDrawDocument* pRefDocument /* = 0 */ )
+{
+ /**************************************************************************
+ * Wenn noch keine Seite im Model vorhanden ist (Datei-Neu), wird
+ * eine neue Seite eingefuegt
+ **************************************************************************/
+ USHORT nPageCount = GetPageCount();
+
+ if (nPageCount <= 1)
+ {
+ // #i57181# Paper size depends on Language, like in Writer
+ Size aDefSize = SvxPaperInfo::GetDefaultPaperSize( MAP_100TH_MM );
+
+ /**********************************************************************
+ * Handzettel-Seite einfuegen
+ **********************************************************************/
+ SdPage* pHandoutPage = dynamic_cast< SdPage* >( AllocPage(FALSE) );
+
+ SdPage* pRefPage = NULL;
+
+ if( pRefDocument )
+ pRefPage = pRefDocument->GetSdPage( 0, PK_HANDOUT );
+
+ if( pRefPage )
+ {
+ pHandoutPage->SetSize(pRefPage->GetSize());
+ pHandoutPage->SetBorder( pRefPage->GetLftBorder(), pRefPage->GetUppBorder(), pRefPage->GetRgtBorder(), pRefPage->GetLwrBorder() );
+ }
+ else
+ {
+ pHandoutPage->SetSize(aDefSize);
+ pHandoutPage->SetBorder(0, 0, 0, 0);
+ }
+
+ pHandoutPage->SetPageKind(PK_HANDOUT);
+ pHandoutPage->SetName( String (SdResId(STR_HANDOUT) ) );
+ InsertPage(pHandoutPage, 0);
+
+ /**********************************************************************
+ * MasterPage einfuegen und an der Handzettel-Seite vermerken
+ **********************************************************************/
+ SdPage* pHandoutMPage = (SdPage*) AllocPage(TRUE);
+ pHandoutMPage->SetSize( pHandoutPage->GetSize() );
+ pHandoutMPage->SetPageKind(PK_HANDOUT);
+ pHandoutMPage->SetBorder( pHandoutPage->GetLftBorder(),
+ pHandoutPage->GetUppBorder(),
+ pHandoutPage->GetRgtBorder(),
+ pHandoutPage->GetLwrBorder() );
+ InsertMasterPage(pHandoutMPage, 0);
+ pHandoutPage->TRG_SetMasterPage( *pHandoutMPage );
+
+ /**********************************************************************
+ * Seite einfuegen
+ * Sofern nPageCount==1 ist, wurde das Model fuers Clipboad erzeugt.
+ * Eine Standard-Seite ist daher schon vorhanden.
+ **********************************************************************/
+ SdPage* pPage;
+ BOOL bClipboard = FALSE;
+
+ if( pRefDocument )
+ pRefPage = pRefDocument->GetSdPage( 0, PK_STANDARD );
+
+ if (nPageCount == 0)
+ {
+ pPage = dynamic_cast< SdPage* >( AllocPage(FALSE) );
+
+ if( pRefPage )
+ {
+ pPage->SetSize( pRefPage->GetSize() );
+ pPage->SetBorder( pRefPage->GetLftBorder(), pRefPage->GetUppBorder(), pRefPage->GetRgtBorder(), pRefPage->GetLwrBorder() );
+ }
+ else if (meDocType == DOCUMENT_TYPE_DRAW)
+ {
+ // Draw: stets Default-Groesse mit Raendern
+ pPage->SetSize(aDefSize);
+
+ SfxPrinter* pPrinter = mpDocSh->GetPrinter(FALSE);
+ if (pPrinter && pPrinter->IsValid())
+ {
+ Size aOutSize(pPrinter->GetOutputSize());
+ Point aPageOffset(pPrinter->GetPageOffset());
+ aPageOffset -= pPrinter->PixelToLogic( Point() );
+ long nOffset = !aPageOffset.X() && !aPageOffset.X() ? 0 : PRINT_OFFSET;
+
+ ULONG nTop = aPageOffset.Y();
+ ULONG nLeft = aPageOffset.X();
+ ULONG nBottom = Max((long)(aDefSize.Height() - aOutSize.Height() - nTop + nOffset), 0L);
+ ULONG nRight = Max((long)(aDefSize.Width() - aOutSize.Width() - nLeft + nOffset), 0L);
+
+ pPage->SetBorder(nLeft, nTop, nRight, nBottom);
+ }
+ else
+ {
+ // The printer is not available. Use a border of 10mm
+ // on each side instead.
+ // This has to be kept synchronized with the border
+ // width set in the
+ // SvxPageDescPage::PaperSizeSelect_Impl callback.
+ pPage->SetBorder(1000, 1000, 1000, 1000);
+ }
+ }
+ else
+ {
+ // Impress: stets Bildschirmformat, quer
+ Size aSz( SvxPaperInfo::GetPaperSize(PAPER_SCREEN, MAP_100TH_MM) );
+ pPage->SetSize( Size( aSz.Height(), aSz.Width() ) );
+ pPage->SetBorder(0, 0, 0, 0);
+ }
+
+ InsertPage(pPage, 1);
+ }
+ else
+ {
+ bClipboard = TRUE;
+ pPage = (SdPage*) GetPage(1);
+ }
+
+ /**********************************************************************
+ * MasterPage einfuegen und an der Seite vermerken
+ **********************************************************************/
+ SdPage* pMPage = (SdPage*) AllocPage(TRUE);
+ pMPage->SetSize( pPage->GetSize() );
+ pMPage->SetBorder( pPage->GetLftBorder(),
+ pPage->GetUppBorder(),
+ pPage->GetRgtBorder(),
+ pPage->GetLwrBorder() );
+ InsertMasterPage(pMPage, 1);
+ pPage->TRG_SetMasterPage( *pMPage );
+ if( bClipboard )
+ pMPage->SetLayoutName( pPage->GetLayoutName() );
+
+ /**********************************************************************
+ * Notizen-Seite einfuegen
+ **********************************************************************/
+ SdPage* pNotesPage = (SdPage*) AllocPage(FALSE);
+
+ if( pRefDocument )
+ pRefPage = pRefDocument->GetSdPage( 0, PK_NOTES );
+
+ if( pRefPage )
+ {
+ pNotesPage->SetSize( pRefPage->GetSize() );
+ pNotesPage->SetBorder( pRefPage->GetLftBorder(), pRefPage->GetUppBorder(), pRefPage->GetRgtBorder(), pRefPage->GetLwrBorder() );
+ }
+ else
+ {
+ // Stets Hochformat
+ if (aDefSize.Height() >= aDefSize.Width())
+ {
+ pNotesPage->SetSize(aDefSize);
+ }
+ else
+ {
+ pNotesPage->SetSize( Size(aDefSize.Height(), aDefSize.Width()) );
+ }
+
+ pNotesPage->SetBorder(0, 0, 0, 0);
+ }
+ pNotesPage->SetPageKind(PK_NOTES);
+ InsertPage(pNotesPage, 2);
+ if( bClipboard )
+ pNotesPage->SetLayoutName( pPage->GetLayoutName() );
+
+ /**********************************************************************
+ * MasterPage einfuegen und an der Notizen-Seite vermerken
+ **********************************************************************/
+ SdPage* pNotesMPage = (SdPage*) AllocPage(TRUE);
+ pNotesMPage->SetSize( pNotesPage->GetSize() );
+ pNotesMPage->SetPageKind(PK_NOTES);
+ pNotesMPage->SetBorder( pNotesPage->GetLftBorder(),
+ pNotesPage->GetUppBorder(),
+ pNotesPage->GetRgtBorder(),
+ pNotesPage->GetLwrBorder() );
+ InsertMasterPage(pNotesMPage, 2);
+ pNotesPage->TRG_SetMasterPage( *pNotesMPage );
+ if( bClipboard )
+ pNotesMPage->SetLayoutName( pPage->GetLayoutName() );
+
+
+ if( !pRefPage && (meDocType != DOCUMENT_TYPE_DRAW) )
+ pPage->SetAutoLayout( AUTOLAYOUT_TITLE, TRUE, TRUE );
+
+ mpWorkStartupTimer = new Timer();
+ mpWorkStartupTimer->SetTimeoutHdl( LINK(this, SdDrawDocument, WorkStartupHdl) );
+ mpWorkStartupTimer->SetTimeout(2000);
+ mpWorkStartupTimer->Start();
+
+ SetChanged(FALSE);
+ }
+}
+
+/*************************************************************************
+|*
+|* Erzeugt fehlende Notiz und Handzettelseiten (nach PowerPoint-Import)
+|* Es wird davon ausgegangen, dass mindestens eine Standard-Seite und
+|* eine Standard-MasterPage vorhanden sind.
+|*
+\************************************************************************/
+
+BOOL SdDrawDocument::CreateMissingNotesAndHandoutPages()
+{
+ BOOL bOK = FALSE;
+ USHORT nPageCount = GetPageCount();
+
+ if (nPageCount != 0)
+ {
+ /**********************************************************************
+ * PageKind setzen
+ **********************************************************************/
+ SdPage* pHandoutMPage = (SdPage*) GetMasterPage(0);
+ pHandoutMPage->SetPageKind(PK_HANDOUT);
+
+ SdPage* pHandoutPage = (SdPage*) GetPage(0);
+ pHandoutPage->SetPageKind(PK_HANDOUT);
+ pHandoutPage->TRG_SetMasterPage( *pHandoutMPage );
+
+ for (USHORT i = 1; i < nPageCount; i = i + 2)
+ {
+ SdPage* pPage = (SdPage*) GetPage(i);
+
+ if(!pPage->TRG_HasMasterPage())
+ {
+ // Keine MasterPage gesetzt -> erste Standard-MasterPage nehmen
+ // (Wenn bei PPT keine Standard-Seite vorhanden war)
+ pPage->TRG_SetMasterPage(*GetMasterPage(1));
+ }
+
+ SdPage* pNotesPage = (SdPage*) GetPage(i+1);
+ pNotesPage->SetPageKind(PK_NOTES);
+
+ // Notiz-MasterPages setzen
+ sal_uInt16 nMasterPageAfterPagesMasterPage = (pPage->TRG_GetMasterPage()).GetPageNum() + 1;
+ pNotesPage->TRG_SetMasterPage(*GetMasterPage(nMasterPageAfterPagesMasterPage));
+ }
+
+ bOK = TRUE;
+ StopWorkStartupDelay();
+ SetChanged(FALSE);
+ }
+
+ return(bOK);
+}
+
+/*************************************************************************
+|*
+|* - selektierte Seiten hinter genannte Seite schieben
+|* (nTargetPage = (USHORT)-1 --> vor erste Seite schieben)
+|* - ergibt TRUE, wenn Seiten verschoben wurden
+|*
+\************************************************************************/
+
+BOOL SdDrawDocument::MovePages(USHORT nTargetPage)
+{
+ SdPage* pTargetPage = NULL;
+ SdPage* pPage = NULL;
+ USHORT nPage;
+ USHORT nNoOfPages = GetSdPageCount(PK_STANDARD);
+ BOOL bSomethingHappened = FALSE;
+
+ const bool bUndo = IsUndoEnabled();
+
+ if( bUndo )
+ BegUndo(String(SdResId(STR_UNDO_MOVEPAGES)));
+
+ // Liste mit selektierten Seiten
+ List aPageList;
+ for (nPage = 0; nPage < nNoOfPages; nPage++)
+ {
+ pPage = GetSdPage(nPage, PK_STANDARD);
+ if (pPage->IsSelected())
+ {
+ aPageList.Insert(pPage, LIST_APPEND);
+ }
+ }
+
+ // falls noetig, nach vorne hangeln, bis nicht selektierte Seite gefunden
+ nPage = nTargetPage;
+ if (nPage != (USHORT)-1)
+ {
+ pPage = GetSdPage(nPage, PK_STANDARD);
+ while (nPage > 0 && pPage->IsSelected())
+ {
+ nPage--;
+ pPage = GetSdPage(nPage, PK_STANDARD);
+ }
+
+ if (pPage->IsSelected())
+ {
+ nPage = (USHORT)-1;
+ }
+ }
+
+ // vor der ersten Seite einfuegen
+ if (nPage == (USHORT)-1)
+ {
+ while (aPageList.Count() > 0)
+ {
+ aPageList.Last();
+
+ nPage = ( (SdPage*) aPageList.GetCurObject() )->GetPageNum();
+ if (nPage != 0)
+ {
+ SdrPage* pPg = GetPage(nPage);
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage, 1));
+ MovePage(nPage, 1);
+ pPg = GetPage(nPage+1);
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage+1, 2));
+ MovePage(nPage+1, 2);
+ bSomethingHappened = TRUE;
+ }
+ aPageList.Remove();
+ }
+ }
+ // hinter <nPage> einfuegen
+ else
+ {
+ pTargetPage = GetSdPage(nPage, PK_STANDARD);
+ nTargetPage = nPage;
+ nTargetPage = 2 * nTargetPage + 1; // PK_STANDARD --> absolut
+ while (aPageList.Count() > 0)
+ {
+ pPage = (SdPage*)aPageList.GetObject(0);
+ nPage = pPage->GetPageNum();
+ if (nPage > nTargetPage)
+ {
+ nTargetPage += 2; // hinter (!) der Seite einfuegen
+
+ if (nPage != nTargetPage)
+ {
+ SdrPage* pPg = GetPage(nPage);
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage, nTargetPage));
+ MovePage(nPage, nTargetPage);
+ pPg = GetPage(nPage+1);
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage+1, nTargetPage+1));
+ MovePage(nPage+1, nTargetPage+1);
+ bSomethingHappened = TRUE;
+ }
+ }
+ else
+ {
+ if (nPage != nTargetPage)
+ {
+ SdrPage* pPg = GetPage(nPage+1);
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage+1, nTargetPage+1));
+ MovePage(nPage+1, nTargetPage+1);
+ pPg = GetPage(nPage);
+ if( bUndo )
+ AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage, nTargetPage));
+ MovePage(nPage, nTargetPage);
+ bSomethingHappened = TRUE;
+ }
+ }
+ aPageList.Remove((ULONG)0);
+ nTargetPage = pPage->GetPageNum();
+ }
+ }
+
+ if( bUndo )
+ EndUndo();
+
+ return bSomethingHappened;
+}
+
+
+/*************************************************************************
+|*
+|* Anzahl der Links im sfx2::LinkManager zurueckgeben
+|*
+\************************************************************************/
+
+ULONG SdDrawDocument::GetLinkCount()
+{
+ return ( pLinkManager->GetLinks().Count() );
+}
+
+/*************************************************************************
+|*
+|* Language setzen
+|*
+\************************************************************************/
+
+void SdDrawDocument::SetLanguage( const LanguageType eLang, const USHORT nId )
+{
+ BOOL bChanged = FALSE;
+
+ if( nId == EE_CHAR_LANGUAGE && meLanguage != eLang )
+ {
+ meLanguage = eLang;
+ bChanged = TRUE;
+ }
+ else if( nId == EE_CHAR_LANGUAGE_CJK && meLanguageCJK != eLang )
+ {
+ meLanguageCJK = eLang;
+ bChanged = TRUE;
+ }
+ else if( nId == EE_CHAR_LANGUAGE_CTL && meLanguageCTL != eLang )
+ {
+ meLanguageCTL = eLang;
+ bChanged = TRUE;
+ }
+
+ if( bChanged )
+ {
+ GetDrawOutliner().SetDefaultLanguage( Application::GetSettings().GetLanguage() );
+ pHitTestOutliner->SetDefaultLanguage( Application::GetSettings().GetLanguage() );
+ pItemPool->SetPoolDefaultItem( SvxLanguageItem( eLang, nId ) );
+ SetChanged( bChanged );
+ }
+}
+
+
+/*************************************************************************
+|*
+|* Return language
+|*
+\************************************************************************/
+
+LanguageType SdDrawDocument::GetLanguage( const USHORT nId ) const
+{
+ LanguageType eLangType = meLanguage;
+
+ if( nId == EE_CHAR_LANGUAGE_CJK )
+ eLangType = meLanguageCJK;
+ else if( nId == EE_CHAR_LANGUAGE_CTL )
+ eLangType = meLanguageCTL;
+
+ return eLangType;
+}
+
+
+/*************************************************************************
+|*
+|* WorkStartup einleiten
+|*
+\************************************************************************/
+
+IMPL_LINK( SdDrawDocument, WorkStartupHdl, Timer *, EMPTYARG )
+{
+ if( mpDocSh )
+ mpDocSh->SetWaitCursor( TRUE );
+
+ BOOL bChanged = IsChanged(); // merken
+
+ // Autolayouts initialisieren
+ SdPage* pHandoutMPage = GetMasterSdPage(0, PK_HANDOUT);
+
+ if (pHandoutMPage->GetAutoLayout() == AUTOLAYOUT_NONE)
+ {
+ // AutoLayout wurde noch nicht umgesetzt -> Initialisieren
+ pHandoutMPage->SetAutoLayout(AUTOLAYOUT_HANDOUT6, TRUE, TRUE);
+ }
+
+ SdPage* pPage = GetSdPage(0, PK_STANDARD);
+
+ if (pPage->GetAutoLayout() == AUTOLAYOUT_NONE)
+ {
+ // AutoLayout wurde noch nicht umgesetzt -> Initialisieren
+ pPage->SetAutoLayout(AUTOLAYOUT_NONE, TRUE, TRUE);
+ }
+
+ SdPage* pNotesPage = GetSdPage(0, PK_NOTES);
+
+ if (pNotesPage->GetAutoLayout() == AUTOLAYOUT_NONE)
+ {
+ // AutoLayout wurde noch nicht umgesetzt -> Initialisieren
+ pNotesPage->SetAutoLayout(AUTOLAYOUT_NOTES, TRUE, TRUE);
+ }
+
+ SetChanged(bChanged || FALSE);
+
+ if( mpDocSh )
+ mpDocSh->SetWaitCursor( FALSE );
+ return 0;
+}
+
+
+/*************************************************************************
+|*
+|* Wenn der WorkStartupTimer erzeugt worden ist (das erfolgt ausschliesslich
+|* in SdDrawViewShell::Consruct() ), so wird der Timer ggf. gestoppt und
+|* das WorkStartup eingeleitet
+|*
+\************************************************************************/
+
+void SdDrawDocument::StopWorkStartupDelay()
+{
+ if (mpWorkStartupTimer)
+ {
+ if ( mpWorkStartupTimer->IsActive() )
+ {
+ // Timer war noch nicht abgelaufen -> WorkStartup wird eingeleitet
+ mpWorkStartupTimer->Stop();
+ WorkStartupHdl(NULL);
+ }
+
+ delete mpWorkStartupTimer;
+ mpWorkStartupTimer = NULL;
+ }
+}
+
+/*************************************************************************
+|*
+|* Wenn der WorkStartupTimer erzeugt worden ist (das erfolgt ausschliesslich
+|* in SdDrawViewShell::Consruct() ), so wird der Timer ggf. gestoppt und
+|* das WorkStartup eingeleitet
+|*
+\************************************************************************/
+
+SdAnimationInfo* SdDrawDocument::GetAnimationInfo(SdrObject* pObject) const
+{
+ DBG_ASSERT(pObject, "sd::SdDrawDocument::GetAnimationInfo(), invalid argument!");
+ if( pObject )
+ return GetShapeUserData( *pObject, false );
+ else
+ return 0;
+}
+
+SdAnimationInfo* SdDrawDocument::GetShapeUserData(SdrObject& rObject, bool bCreate /* = false */ )
+{
+ USHORT nUD = 0;
+ USHORT nUDCount = rObject.GetUserDataCount();
+ SdrObjUserData* pUD = 0;
+ SdAnimationInfo* pRet = 0;
+
+ // gibt es in den User-Daten eine Animationsinformation?
+ for (nUD = 0; nUD < nUDCount; nUD++)
+ {
+ pUD = rObject.GetUserData(nUD);
+ if((pUD->GetInventor() == SdUDInventor) && (pUD->GetId() == SD_ANIMATIONINFO_ID))
+ {
+ pRet = dynamic_cast<SdAnimationInfo*>(pUD);
+ break;
+ }
+ }
+
+ if( (pRet == 0) && bCreate )
+ {
+ pRet = new SdAnimationInfo( rObject );
+ rObject.InsertUserData( pRet);
+ }
+
+ return pRet;
+}
+
+SdIMapInfo* SdDrawDocument::GetIMapInfo( SdrObject* pObject ) const
+{
+ DBG_ASSERT(pObject, "ohne Objekt keine IMapInfo");
+
+ SdrObjUserData* pUserData = NULL;
+ SdIMapInfo* pIMapInfo = NULL;
+ USHORT nCount = pObject->GetUserDataCount();
+
+ // gibt es in den User-Daten eine IMap-Information?
+ for ( USHORT i = 0; i < nCount; i++ )
+ {
+ pUserData = pObject->GetUserData( i );
+
+ if ( ( pUserData->GetInventor() == SdUDInventor ) && ( pUserData->GetId() == SD_IMAPINFO_ID ) )
+ pIMapInfo = (SdIMapInfo*) pUserData;
+ }
+
+ return pIMapInfo;
+}
+
+IMapObject* SdDrawDocument::GetHitIMapObject( SdrObject* pObj,
+ const Point& rWinPoint,
+ const ::Window& /* rCmpWnd */ )
+{
+ SdIMapInfo* pIMapInfo = GetIMapInfo( pObj );
+ IMapObject* pIMapObj = NULL;
+
+ if ( pIMapInfo )
+ {
+ const MapMode aMap100( MAP_100TH_MM );
+ Size aGraphSize;
+ Point aRelPoint( rWinPoint );
+ ImageMap& rImageMap = (ImageMap&) pIMapInfo->GetImageMap();
+ const Rectangle& rRect = pObj->GetLogicRect();
+ BOOL bObjSupported = FALSE;
+
+ // HitTest ausfuehren
+ if ( pObj->ISA( SdrGrafObj ) ) // einfaches Grafik-Objekt
+ {
+ const SdrGrafObj* pGrafObj = (const SdrGrafObj*) pObj;
+ const GeoStat& rGeo = pGrafObj->GetGeoStat();
+ SdrGrafObjGeoData* pGeoData = (SdrGrafObjGeoData*) pGrafObj->GetGeoData();
+
+ // Drehung rueckgaengig
+ if ( rGeo.nDrehWink )
+ RotatePoint( aRelPoint, rRect.TopLeft(), -rGeo.nSin, rGeo.nCos );
+
+ // Spiegelung rueckgaengig
+ if ( pGeoData->bMirrored )
+ aRelPoint.X() = rRect.Right() + rRect.Left() - aRelPoint.X();
+
+ // ggf. Unshear:
+ if ( rGeo.nShearWink )
+ ShearPoint( aRelPoint, rRect.TopLeft(), -rGeo.nTan );
+
+ if ( pGrafObj->GetGrafPrefMapMode().GetMapUnit() == MAP_PIXEL )
+ aGraphSize = Application::GetDefaultDevice()->PixelToLogic( pGrafObj->GetGrafPrefSize(), aMap100 );
+ else
+ aGraphSize = OutputDevice::LogicToLogic( pGrafObj->GetGrafPrefSize(),
+ pGrafObj->GetGrafPrefMapMode(), aMap100 );
+
+ delete pGeoData;
+ bObjSupported = TRUE;
+ }
+ else if ( pObj->ISA( SdrOle2Obj ) ) // OLE-Objekt
+ {
+ aGraphSize = ( (SdrOle2Obj*) pObj )->GetOrigObjSize();
+ bObjSupported = TRUE;
+ }
+
+ // hat alles geklappt, dann HitTest ausfuehren
+ if ( bObjSupported )
+ {
+ // relativen Mauspunkt berechnen
+ aRelPoint -= rRect.TopLeft();
+ pIMapObj = rImageMap.GetHitIMapObject( aGraphSize, rRect.GetSize(), aRelPoint );
+
+ // Deaktivierte Objekte wollen wir nicht
+ if ( pIMapObj && !pIMapObj->IsActive() )
+ pIMapObj = NULL;
+ }
+ }
+
+ return pIMapObj;
+}
+
+/** this method enforces that the masterpages are in the currect order,
+ that is at position 1 is a PK_STANDARD masterpage followed by a
+ PK_NOTES masterpage and so on. #
+*/
+void SdDrawDocument::CheckMasterPages()
+{
+// RemoveMasterPage(2); // code to test the creation of notes pages
+
+ USHORT nMaxPages = GetMasterPageCount();
+
+ // we need at least a handout master and one master page
+ if( nMaxPages < 2 )
+ {
+ return;
+ }
+
+ SdPage* pPage = NULL;
+ SdPage* pNotesPage = NULL;
+
+ USHORT nPage;
+
+ // first see if the page order is correct
+ for( nPage = 1; nPage < nMaxPages; nPage++ )
+ {
+ pPage = static_cast<SdPage*> (GetMasterPage( nPage ));
+ // if an odd page is not a standard page or an even page is not a notes page
+ if( ((1 == (nPage & 1)) && (pPage->GetPageKind() != PK_STANDARD) ) ||
+ ((0 == (nPage & 1)) && (pPage->GetPageKind() != PK_NOTES) ) )
+ break; // then we have a fatal error
+ }
+
+ if( nPage < nMaxPages )
+ {
+ // there is a fatal error in the master page order,
+ // we need to repair the document
+ sal_Bool bChanged = sal_False;
+
+ nPage = 1;
+ while( nPage < nMaxPages )
+ {
+ pPage = static_cast<SdPage*> (GetMasterPage( nPage ));
+ if( pPage->GetPageKind() != PK_STANDARD )
+ {
+ bChanged = sal_True;
+ USHORT nFound = nPage + 1;
+ while( nFound < nMaxPages )
+ {
+ pPage = static_cast<SdPage*>(GetMasterPage( nFound ));
+ if( PK_STANDARD == pPage->GetPageKind() )
+ {
+ MoveMasterPage( nFound, nPage );
+ pPage->SetInserted(sal_True);
+ break;
+
+ }
+
+ nFound++;
+ }
+
+ // if we don't have any more standard pages, were done
+ if( nMaxPages == nFound )
+ break;
+ }
+
+ nPage++;
+
+ if( nPage < nMaxPages )
+ pNotesPage = static_cast<SdPage*>(GetMasterPage( nPage ));
+ else
+ pNotesPage = NULL;
+
+ if( (NULL == pNotesPage) || (pNotesPage->GetPageKind() != PK_NOTES) || ( pPage->GetLayoutName() != pNotesPage->GetLayoutName() ) )
+ {
+ bChanged = sal_True;
+
+ USHORT nFound = nPage + 1;
+ while( nFound < nMaxPages )
+ {
+ pNotesPage = static_cast<SdPage*>(GetMasterPage( nFound ));
+ if( (PK_NOTES == pNotesPage->GetPageKind()) && ( pPage->GetLayoutName() == pNotesPage->GetLayoutName() ) )
+ {
+ MoveMasterPage( nFound, nPage );
+ pNotesPage->SetInserted(sal_True);
+ break;
+ }
+
+ nFound++;
+ }
+
+ // looks like we lost a notes page
+ if( nMaxPages == nFound )
+ {
+ // so create one
+
+ // first find a reference notes page for size
+ SdPage* pRefNotesPage = NULL;
+ nFound = 0;
+ while( nFound < nMaxPages )
+ {
+ pRefNotesPage = static_cast<SdPage*>(GetMasterPage( nFound ));
+ if( PK_NOTES == pRefNotesPage->GetPageKind() )
+ break;
+ nFound++;
+ }
+ if( nFound == nMaxPages )
+ pRefNotesPage = NULL;
+
+ SdPage* pNewNotesPage = static_cast<SdPage*>(AllocPage(sal_True));
+ pNewNotesPage->SetPageKind(PK_NOTES);
+ if( pRefNotesPage )
+ {
+ pNewNotesPage->SetSize( pRefNotesPage->GetSize() );
+ pNewNotesPage->SetBorder( pRefNotesPage->GetLftBorder(),
+ pRefNotesPage->GetUppBorder(),
+ pRefNotesPage->GetRgtBorder(),
+ pRefNotesPage->GetLwrBorder() );
+ }
+ InsertMasterPage(pNewNotesPage, nPage );
+ pNewNotesPage->SetLayoutName( pPage->GetLayoutName() );
+ pNewNotesPage->SetAutoLayout(AUTOLAYOUT_NOTES, sal_True, sal_True );
+ nMaxPages++;
+ }
+ }
+
+ nPage++;
+ }
+
+ // now remove all remaining and unused non PK_STANDARD slides
+ while( nPage < nMaxPages )
+ {
+ bChanged = sal_True;
+
+ RemoveMasterPage( nPage );
+ nMaxPages--;
+ }
+
+ if( bChanged )
+ {
+ DBG_ERROR( "master pages where in a wrong order" );
+ RecalcPageNums( sal_True);
+ }
+ }
+}
+
+USHORT SdDrawDocument::CreatePage (
+ SdPage* pActualPage,
+ PageKind ePageKind,
+ const String& sStandardPageName,
+ const String& sNotesPageName,
+ AutoLayout eStandardLayout,
+ AutoLayout eNotesLayout,
+ BOOL bIsPageBack,
+ BOOL bIsPageObj)
+{
+ SdPage* pPreviousStandardPage;
+ SdPage* pPreviousNotesPage;
+ SdPage* pStandardPage;
+ SdPage* pNotesPage;
+
+ // From the given page determine the standard page and notes page of which
+ // to take the layout and the position where to insert the new pages.
+ if (ePageKind == PK_NOTES)
+ {
+ pPreviousNotesPage = pActualPage;
+ USHORT nNotesPageNum = pPreviousNotesPage->GetPageNum() + 2;
+ pPreviousStandardPage = (SdPage*) GetPage(nNotesPageNum - 3);
+ eStandardLayout = pPreviousStandardPage->GetAutoLayout();
+ }
+ else
+ {
+ pPreviousStandardPage = pActualPage;
+ USHORT nStandardPageNum = pPreviousStandardPage->GetPageNum() + 2;
+ pPreviousNotesPage = (SdPage*) GetPage(nStandardPageNum - 1);
+ eNotesLayout = pPreviousNotesPage->GetAutoLayout();
+ }
+
+ // Create new standard page and set it up.
+ pStandardPage = (SdPage*) AllocPage(FALSE);
+
+ // #108658#
+ // Set the size here since else the presobj autolayout
+ // will be wrong.
+ pStandardPage->SetSize( pPreviousStandardPage->GetSize() );
+ pStandardPage->SetBorder( pPreviousStandardPage->GetLftBorder(),
+ pPreviousStandardPage->GetUppBorder(),
+ pPreviousStandardPage->GetRgtBorder(),
+ pPreviousStandardPage->GetLwrBorder() );
+
+ // Use master page of current page.
+ pStandardPage->TRG_SetMasterPage(pPreviousStandardPage->TRG_GetMasterPage());
+
+ // User layout of current standard page.
+ pStandardPage->SetLayoutName( pPreviousStandardPage->GetLayoutName() );
+ pStandardPage->SetAutoLayout(eStandardLayout, TRUE);
+ pStandardPage->setHeaderFooterSettings( pPreviousStandardPage->getHeaderFooterSettings() );
+
+ // transition settings of current page
+ pStandardPage->setTransitionType( pPreviousStandardPage->getTransitionType() );
+ pStandardPage->setTransitionSubtype( pPreviousStandardPage->getTransitionSubtype() );
+ pStandardPage->setTransitionDirection( pPreviousStandardPage->getTransitionDirection() );
+ pStandardPage->setTransitionFadeColor( pPreviousStandardPage->getTransitionFadeColor() );
+ pStandardPage->setTransitionDuration( pPreviousStandardPage->getTransitionDuration() );
+
+ // apply previous animation timing
+ pStandardPage->SetPresChange( pPreviousStandardPage->GetPresChange() );
+ pStandardPage->SetTime( pPreviousStandardPage->GetTime() );
+
+ // Create new notes page and set it up.
+ pNotesPage = (SdPage*) AllocPage(FALSE);
+ pNotesPage->SetPageKind(PK_NOTES);
+
+ // Use master page of current page.
+ pNotesPage->TRG_SetMasterPage(pPreviousNotesPage->TRG_GetMasterPage());
+
+ // Use layout of current notes page.
+ pNotesPage->SetLayoutName( pPreviousNotesPage->GetLayoutName() );
+ pNotesPage->SetAutoLayout(eNotesLayout, TRUE);
+ pNotesPage->setHeaderFooterSettings( pPreviousNotesPage->getHeaderFooterSettings() );
+
+ return InsertPageSet (
+ pActualPage, ePageKind,
+ sStandardPageName,
+ sNotesPageName,
+ eStandardLayout,
+ eNotesLayout,
+ bIsPageBack,
+ bIsPageObj,
+
+ pStandardPage,
+ pNotesPage);
+}
+
+
+
+
+USHORT SdDrawDocument::DuplicatePage (USHORT nPageNum)
+{
+ PageKind ePageKind = PK_STANDARD;
+
+ // Get current page.
+ SdPage* pActualPage = GetSdPage(nPageNum, ePageKind);
+
+ // Get background flags.
+ SdrLayerAdmin& rLayerAdmin = GetLayerAdmin();
+ BYTE aBckgrnd = rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRND)), FALSE);
+ BYTE aBckgrndObj = rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRNDOBJ)), FALSE);
+ SetOfByte aVisibleLayers = pActualPage->TRG_GetMasterPageVisibleLayers();
+
+ // Get layout from current page.
+ AutoLayout eAutoLayout = pActualPage->GetAutoLayout();
+
+ return DuplicatePage (
+ pActualPage, ePageKind,
+ // No names for the new slides.
+ String(), String(),
+ eAutoLayout, eAutoLayout,
+ aVisibleLayers.IsSet(aBckgrnd),
+ aVisibleLayers.IsSet(aBckgrndObj));
+}
+
+
+
+
+USHORT SdDrawDocument::DuplicatePage (
+ SdPage* pActualPage,
+ PageKind ePageKind,
+ const String& sStandardPageName,
+ const String& sNotesPageName,
+ AutoLayout eStandardLayout,
+ AutoLayout eNotesLayout,
+ BOOL bIsPageBack,
+ BOOL bIsPageObj)
+{
+ SdPage* pPreviousStandardPage;
+ SdPage* pPreviousNotesPage;
+ SdPage* pStandardPage;
+ SdPage* pNotesPage;
+
+ // From the given page determine the standard page and the notes page
+ // of which to make copies.
+ if (ePageKind == PK_NOTES)
+ {
+ pPreviousNotesPage = pActualPage;
+ USHORT nNotesPageNum = pPreviousNotesPage->GetPageNum() + 2;
+ pPreviousStandardPage = (SdPage*) GetPage(nNotesPageNum - 3);
+ }
+ else
+ {
+ pPreviousStandardPage = pActualPage;
+ USHORT nStandardPageNum = pPreviousStandardPage->GetPageNum() + 2;
+ pPreviousNotesPage = (SdPage*) GetPage(nStandardPageNum - 1);
+ }
+
+ // Create duplicates of a standard page and the associated notes page.
+ pStandardPage = (SdPage*) pPreviousStandardPage->Clone();
+ pNotesPage = (SdPage*) pPreviousNotesPage->Clone();
+
+ return InsertPageSet (
+ pActualPage, ePageKind,
+ sStandardPageName,
+ sNotesPageName,
+ eStandardLayout,
+ eNotesLayout,
+ bIsPageBack,
+ bIsPageObj,
+
+ pStandardPage,
+ pNotesPage);
+}
+
+
+
+
+USHORT SdDrawDocument::InsertPageSet (
+ SdPage* pActualPage,
+ PageKind ePageKind,
+ const String& sStandardPageName,
+ const String& sNotesPageName,
+ AutoLayout eStandardLayout,
+ AutoLayout eNotesLayout,
+ BOOL bIsPageBack,
+ BOOL bIsPageObj,
+
+ SdPage* pStandardPage,
+ SdPage* pNotesPage)
+{
+ SdPage* pPreviousStandardPage;
+ SdPage* pPreviousNotesPage;
+ USHORT nStandardPageNum;
+ USHORT nNotesPageNum;
+ String aStandardPageName = sStandardPageName;
+ String aNotesPageName = sNotesPageName;
+
+ // Gather some information about the standard page and the notes page
+ // that are to be inserted. This makes sure that there is allways one
+ // standard page followed by one notes page.
+ if (ePageKind == PK_NOTES)
+ {
+ pPreviousNotesPage = pActualPage;
+ nNotesPageNum = pPreviousNotesPage->GetPageNum() + 2;
+ pPreviousStandardPage = (SdPage*) GetPage(nNotesPageNum - 3);
+ nStandardPageNum = nNotesPageNum - 1;
+ eStandardLayout = pPreviousStandardPage->GetAutoLayout();
+ }
+ else
+ {
+ pPreviousStandardPage = pActualPage;
+ nStandardPageNum = pPreviousStandardPage->GetPageNum() + 2;
+ pPreviousNotesPage = (SdPage*) GetPage(nStandardPageNum - 1);
+ nNotesPageNum = nStandardPageNum + 1;
+ aNotesPageName = aStandardPageName;
+ eNotesLayout = pPreviousNotesPage->GetAutoLayout();
+ }
+
+
+ // Set up and insert the standard page.
+ SetupNewPage (
+ pPreviousStandardPage,
+ pStandardPage,
+ aStandardPageName,
+ nStandardPageNum,
+ bIsPageBack,
+ bIsPageObj);
+
+ // Set up and insert the notes page.
+ pNotesPage->SetPageKind(PK_NOTES);
+ SetupNewPage (
+ pPreviousNotesPage,
+ pNotesPage,
+ aNotesPageName,
+ nNotesPageNum,
+ bIsPageBack,
+ bIsPageObj);
+
+ // Return an index that allows the caller to access the newly inserted
+ // pages by using GetSdPage().
+ return pStandardPage->GetPageNum() / 2;
+}
+
+
+
+
+void SdDrawDocument::SetupNewPage (
+ SdPage* pPreviousPage,
+ SdPage* pPage,
+ const String& sPageName,
+ USHORT nInsertionPoint,
+ BOOL bIsPageBack,
+ BOOL bIsPageObj)
+{
+ if (pPreviousPage != NULL)
+ {
+ pPage->SetSize( pPreviousPage->GetSize() );
+ pPage->SetBorder( pPreviousPage->GetLftBorder(),
+ pPreviousPage->GetUppBorder(),
+ pPreviousPage->GetRgtBorder(),
+ pPreviousPage->GetLwrBorder() );
+ }
+ pPage->SetName(sPageName);
+
+ InsertPage(pPage, nInsertionPoint);
+
+ if (pPreviousPage != NULL)
+ {
+ SdrLayerAdmin& rLayerAdmin = GetLayerAdmin();
+ BYTE aBckgrnd = rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRND)), FALSE);
+ BYTE aBckgrndObj = rLayerAdmin.GetLayerID(String(SdResId(STR_LAYER_BCKGRNDOBJ)), FALSE);
+ SetOfByte aVisibleLayers = pPreviousPage->TRG_GetMasterPageVisibleLayers();
+ aVisibleLayers.Set(aBckgrnd, bIsPageBack);
+ aVisibleLayers.Set(aBckgrndObj, bIsPageObj);
+ pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
+ }
+}
+
+sd::UndoManager* SdDrawDocument::GetUndoManager() const
+{
+ return mpDocSh ? dynamic_cast< sd::UndoManager* >(mpDocSh->GetUndoManager()) : 0;
+}
+
+// eof
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */