2000-09-18 23:16:46 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-10 17:36:22 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 17:36:22 +00:00
|
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 17:36:22 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 17:36:22 +00:00
|
|
|
* $RCSfile: drawdoc2.cxx,v $
|
2008-11-20 14:55:36 +00:00
|
|
|
* $Revision: 1.46.76.1 $
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 17:36:22 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 17:36:22 +00:00
|
|
|
* 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.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 17:36:22 +00:00
|
|
|
* 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).
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
2008-04-10 17:36:22 +00:00
|
|
|
* 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.
|
2000-09-18 23:16:46 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-16 17:14:21 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_sd.hxx"
|
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2004-10-04 17:16:28 +00:00
|
|
|
#include <com/sun/star/embed/XVisualObject.hpp>
|
2005-03-15 10:20:46 +00:00
|
|
|
#include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
|
2000-09-18 23:16:46 +00:00
|
|
|
#include <vcl/wrkwin.hxx>
|
|
|
|
#include <sfx2/printer.hxx>
|
|
|
|
#include <sfx2/app.hxx>
|
2004-01-20 09:26:13 +00:00
|
|
|
#ifndef SD_OUTLINE_HXX
|
|
|
|
#include "Outliner.hxx"
|
|
|
|
#endif
|
2000-09-18 23:16:46 +00:00
|
|
|
#include <svx/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>
|
2000-12-05 12:49:50 +00:00
|
|
|
#include <svx/eeitem.hxx>
|
|
|
|
#include <svx/langitem.hxx>
|
2009-10-16 00:05:16 +02:00
|
|
|
#include <svl/itempool.hxx>
|
2009-05-19 16:03:18 +00:00
|
|
|
#include <svx/svdpool.hxx>
|
2009-05-19 09:32:45 +00:00
|
|
|
#include <svx/flditem.hxx>
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
#include <svx/linkmgr.hxx>
|
|
|
|
#include <svx/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"
|
2006-01-10 13:25:31 +00:00
|
|
|
#include "undo/undomanager.hxx"
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2004-01-20 09:26:13 +00:00
|
|
|
#include "../ui/inc/DrawDocShell.hxx"
|
|
|
|
#include "../ui/inc/FrameView.hxx"
|
2000-09-18 23:16:46 +00:00
|
|
|
#include "../ui/inc/cfgids.hxx"
|
|
|
|
#include "../ui/inc/strings.hrc"
|
|
|
|
|
2004-01-20 09:26:13 +00:00
|
|
|
#include "PageListWatcher.hxx"
|
2006-11-14 13:21:14 +00:00
|
|
|
#include <vcl/virdev.hxx>
|
|
|
|
|
2004-03-30 14:44:14 +00:00
|
|
|
using namespace ::sd;
|
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
const long PRINT_OFFSET = 30; // siehe \svx\source\dialog\page.cxx (PB)
|
|
|
|
|
2004-10-04 17:16:28 +00:00
|
|
|
using namespace com::sun::star;
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|* 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();
|
|
|
|
|
2002-04-08 13:02:54 +00:00
|
|
|
if( ( rObjName == pObj->GetName() ) ||
|
|
|
|
( SdrInventor == pObj->GetObjInventor() &&
|
|
|
|
OBJ_OLE2 == pObj->GetObjIdentifier() &&
|
|
|
|
rObjName == static_cast< SdrOle2Obj* >( pObj )->GetPersistName() ) )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
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();
|
|
|
|
|
2002-04-08 13:02:54 +00:00
|
|
|
if( ( rObjName == pObj->GetName() ) ||
|
|
|
|
( SdrInventor == pObj->GetObjInventor() &&
|
|
|
|
OBJ_OLE2 == pObj->GetObjIdentifier() &&
|
|
|
|
rObjName == static_cast< SdrOle2Obj* >( pObj )->GetPersistName() ) )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
pObjFound = pObj;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
nPage++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (pObjFound);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|* Sucht die SdPage per Name
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
2001-05-16 12:51:30 +00:00
|
|
|
USHORT SdDrawDocument::GetPageByName(const String& rPgName, BOOL& rbIsMasterPage) const
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
SdPage* pPage = NULL;
|
|
|
|
USHORT nPage = 0;
|
|
|
|
const USHORT nMaxPages = GetPageCount();
|
|
|
|
USHORT nPageNum = SDRPAGE_NOTFOUND;
|
|
|
|
|
2001-05-16 12:51:30 +00:00
|
|
|
rbIsMasterPage = FALSE;
|
|
|
|
|
2004-07-13 12:45:18 +00:00
|
|
|
// Search all regular pages and all notes pages (handout pages are
|
|
|
|
// ignored.)
|
2000-09-18 23:16:46 +00:00
|
|
|
while (nPage < nMaxPages && nPageNum == SDRPAGE_NOTFOUND)
|
|
|
|
{
|
2004-07-13 12:45:18 +00:00
|
|
|
pPage = const_cast<SdPage*>(static_cast<const SdPage*>(
|
|
|
|
GetPage(nPage)));
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2004-07-13 12:45:18 +00:00
|
|
|
if (pPage != NULL
|
|
|
|
&& pPage->GetPageKind() != PK_HANDOUT
|
|
|
|
&& pPage->GetName() == rPgName)
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
nPageNum = nPage;
|
|
|
|
}
|
|
|
|
|
|
|
|
nPage++;
|
|
|
|
}
|
|
|
|
|
2004-07-13 12:45:18 +00:00
|
|
|
// Search all master pages when not found among non-master pages.
|
2000-09-18 23:16:46 +00:00
|
|
|
const USHORT nMaxMasterPages = GetMasterPageCount();
|
|
|
|
nPage = 0;
|
|
|
|
|
|
|
|
while (nPage < nMaxMasterPages && nPageNum == SDRPAGE_NOTFOUND)
|
|
|
|
{
|
2004-07-13 12:45:18 +00:00
|
|
|
pPage = const_cast<SdPage*>(static_cast<const SdPage*>(
|
|
|
|
GetMasterPage(nPage)));
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
if (pPage && pPage->GetName() == rPgName)
|
|
|
|
{
|
|
|
|
nPageNum = nPage;
|
2001-05-16 12:51:30 +00:00
|
|
|
rbIsMasterPage = TRUE;
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
nPage++;
|
|
|
|
}
|
|
|
|
|
2004-07-13 12:45:18 +00:00
|
|
|
return nPageNum;
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|*
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
|
|
|
SdPage* SdDrawDocument::GetSdPage(USHORT nPgNum, PageKind ePgKind) const
|
|
|
|
{
|
2003-10-27 12:29:37 +00:00
|
|
|
// #109538#
|
|
|
|
return mpDrawPageListWatcher->GetSdPage(ePgKind, sal_uInt32(nPgNum));
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|*
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
|
|
|
USHORT SdDrawDocument::GetSdPageCount(PageKind ePgKind) const
|
|
|
|
{
|
2003-10-27 12:29:37 +00:00
|
|
|
// #109538#
|
|
|
|
return (sal_uInt16)mpDrawPageListWatcher->GetSdPageCount(ePgKind);
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|*
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
|
|
|
SdPage* SdDrawDocument::GetMasterSdPage(USHORT nPgNum, PageKind ePgKind)
|
|
|
|
{
|
2003-10-27 12:29:37 +00:00
|
|
|
// #109538#
|
|
|
|
return mpMasterPageListWatcher->GetSdPage(ePgKind, sal_uInt32(nPgNum));
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|*
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
|
|
|
USHORT SdDrawDocument::GetMasterSdPageCount(PageKind ePgKind) const
|
|
|
|
{
|
2003-10-27 12:29:37 +00:00
|
|
|
// #109538#
|
|
|
|
return (sal_uInt16)mpMasterPageListWatcher->GetSdPageCount(ePgKind);
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|* 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)
|
2003-11-24 16:07:50 +00:00
|
|
|
((SdrPageObj*)pObj)->SetReferencedPage(GetPage(nPage - 1));
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-05-19 16:03:18 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-05-19 09:32:45 +00:00
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|* Seite verschieben
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
2001-10-22 12:36:57 +00:00
|
|
|
void SdDrawDocument::MovePage(USHORT nPgNum, USHORT nNewPos)
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
// Seite verschieben
|
|
|
|
FmFormModel::MovePage(nPgNum, nNewPos);
|
|
|
|
|
|
|
|
USHORT nMin = Min(nPgNum, nNewPos);
|
|
|
|
|
|
|
|
UpdatePageObjectsInNotes(nMin);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|* Seite einfuegen
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
2001-10-22 12:36:57 +00:00
|
|
|
void SdDrawDocument::InsertPage(SdrPage* pPage, USHORT nPos)
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
2009-05-19 16:03:18 +00:00
|
|
|
bool bLast = (nPos == GetPageCount());
|
2009-05-19 09:32:45 +00:00
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
FmFormModel::InsertPage(pPage, nPos);
|
|
|
|
|
|
|
|
((SdPage*)pPage)->ConnectLink();
|
|
|
|
|
|
|
|
UpdatePageObjectsInNotes(nPos);
|
2009-05-19 09:32:45 +00:00
|
|
|
|
2009-05-19 16:03:18 +00:00
|
|
|
if (!bLast)
|
|
|
|
UpdatePageRelativeURLs(static_cast<SdPage*>( pPage ), nPos, 1);
|
2009-05-19 09:32:45 +00:00
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|* Seite loeschen
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
2001-10-22 12:36:57 +00:00
|
|
|
void SdDrawDocument::DeletePage(USHORT nPgNum)
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
FmFormModel::DeletePage(nPgNum);
|
|
|
|
|
|
|
|
UpdatePageObjectsInNotes(nPgNum);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|* Seite entfernen
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
2001-10-22 12:36:57 +00:00
|
|
|
SdrPage* SdDrawDocument::RemovePage(USHORT nPgNum)
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
SdrPage* pPage = FmFormModel::RemovePage(nPgNum);
|
2009-05-19 16:03:18 +00:00
|
|
|
|
|
|
|
bool bLast = ((nPgNum+1)/2 == (GetPageCount()+1)/2);
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
((SdPage*)pPage)->DisconnectLink();
|
2007-01-23 07:53:57 +00:00
|
|
|
ReplacePageInCustomShows( dynamic_cast< SdPage* >( pPage ), 0 );
|
2000-09-18 23:16:46 +00:00
|
|
|
UpdatePageObjectsInNotes(nPgNum);
|
|
|
|
|
2009-05-19 16:03:18 +00:00
|
|
|
if (!bLast)
|
|
|
|
UpdatePageRelativeURLs((SdPage*)pPage, nPgNum, -1);
|
2009-05-19 09:32:45 +00:00
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
return pPage;
|
|
|
|
}
|
|
|
|
|
2008-11-20 14:55:36 +00:00
|
|
|
// 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);
|
|
|
|
}
|
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|* Seiten selektieren
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
|
|
|
void SdDrawDocument::SetSelected(SdPage* pPage, BOOL bSelect)
|
|
|
|
{
|
|
|
|
PageKind ePageKind = pPage->GetPageKind();
|
|
|
|
|
|
|
|
if (ePageKind == PK_STANDARD)
|
|
|
|
{
|
|
|
|
pPage->SetSelected(bSelect);
|
2004-07-12 13:55:25 +00:00
|
|
|
|
|
|
|
const sal_uInt16 nDestPageNum(pPage->GetPageNum() + 1);
|
|
|
|
SdPage* pNotesPage = 0L;
|
|
|
|
|
|
|
|
if(nDestPageNum < GetPageCount())
|
|
|
|
{
|
|
|
|
pNotesPage = (SdPage*)GetPage(nDestPageNum);
|
|
|
|
}
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
if (pNotesPage && pNotesPage->GetPageKind() == PK_NOTES)
|
2004-07-12 13:55:25 +00:00
|
|
|
{
|
2000-09-18 23:16:46 +00:00
|
|
|
pNotesPage->SetSelected(bSelect);
|
2004-07-12 13:55:25 +00:00
|
|
|
}
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
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
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
2005-10-19 11:23:18 +00:00
|
|
|
void SdDrawDocument::CreateFirstPages( SdDrawDocument* pRefDocument /* = 0 */ )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
/**************************************************************************
|
|
|
|
* Wenn noch keine Seite im Model vorhanden ist (Datei-Neu), wird
|
|
|
|
* eine neue Seite eingefuegt
|
|
|
|
**************************************************************************/
|
|
|
|
USHORT nPageCount = GetPageCount();
|
|
|
|
|
|
|
|
if (nPageCount <= 1)
|
|
|
|
{
|
2006-05-04 13:54:32 +00:00
|
|
|
// #i57181# Paper size depends on Language, like in Writer
|
2009-06-12 09:36:34 +00:00
|
|
|
Size aDefSize = SvxPaperInfo::GetDefaultPaperSize( MAP_100TH_MM );
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
* Handzettel-Seite einfuegen
|
|
|
|
**********************************************************************/
|
|
|
|
BOOL bMasterPage;
|
2005-10-19 11:23:18 +00:00
|
|
|
SdPage* pHandoutPage = dynamic_cast< SdPage* >( AllocPage(bMasterPage=FALSE) );
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2006-12-12 15:31:25 +00:00
|
|
|
SdPage* pRefPage = NULL;
|
|
|
|
|
|
|
|
if( pRefDocument )
|
|
|
|
pRefPage = pRefDocument->GetSdPage( 0, PK_HANDOUT );
|
|
|
|
|
2005-10-19 11:23:18 +00:00
|
|
|
if( pRefPage )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
2008-07-01 12:33:01 +00:00
|
|
|
pHandoutPage->SetSize(pRefPage->GetSize());
|
2005-10-19 11:23:18 +00:00
|
|
|
pHandoutPage->SetBorder( pRefPage->GetLftBorder(), pRefPage->GetUppBorder(), pRefPage->GetRgtBorder(), pRefPage->GetLwrBorder() );
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2008-07-01 12:33:01 +00:00
|
|
|
pHandoutPage->SetSize(aDefSize);
|
2005-10-19 11:23:18 +00:00
|
|
|
pHandoutPage->SetBorder(0, 0, 0, 0);
|
|
|
|
}
|
2008-07-01 12:33:01 +00:00
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
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(bMasterPage=TRUE);
|
|
|
|
pHandoutMPage->SetSize( pHandoutPage->GetSize() );
|
|
|
|
pHandoutMPage->SetPageKind(PK_HANDOUT);
|
|
|
|
pHandoutMPage->SetBorder( pHandoutPage->GetLftBorder(),
|
|
|
|
pHandoutPage->GetUppBorder(),
|
|
|
|
pHandoutPage->GetRgtBorder(),
|
|
|
|
pHandoutPage->GetLwrBorder() );
|
|
|
|
InsertMasterPage(pHandoutMPage, 0);
|
2004-07-12 13:55:25 +00:00
|
|
|
pHandoutPage->TRG_SetMasterPage( *pHandoutMPage );
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
* Seite einfuegen
|
|
|
|
* Sofern nPageCount==1 ist, wurde das Model fuers Clipboad erzeugt.
|
|
|
|
* Eine Standard-Seite ist daher schon vorhanden.
|
|
|
|
**********************************************************************/
|
|
|
|
SdPage* pPage;
|
|
|
|
BOOL bClipboard = FALSE;
|
|
|
|
|
2005-10-19 11:23:18 +00:00
|
|
|
if( pRefDocument )
|
|
|
|
pRefPage = pRefDocument->GetSdPage( 0, PK_STANDARD );
|
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
if (nPageCount == 0)
|
|
|
|
{
|
2005-10-19 11:23:18 +00:00
|
|
|
pPage = dynamic_cast< SdPage* >( AllocPage(bMasterPage=FALSE) );
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2005-10-19 11:23:18 +00:00
|
|
|
if( pRefPage )
|
|
|
|
{
|
|
|
|
pPage->SetSize( pRefPage->GetSize() );
|
|
|
|
pPage->SetBorder( pRefPage->GetLftBorder(), pRefPage->GetUppBorder(), pRefPage->GetRgtBorder(), pRefPage->GetLwrBorder() );
|
|
|
|
}
|
2006-12-12 15:31:25 +00:00
|
|
|
else if (meDocType == DOCUMENT_TYPE_DRAW)
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
// Draw: stets Default-Groesse mit Raendern
|
|
|
|
pPage->SetSize(aDefSize);
|
|
|
|
|
2006-12-12 15:31:25 +00:00
|
|
|
SfxPrinter* pPrinter = mpDocSh->GetPrinter(FALSE);
|
2006-05-04 13:54:32 +00:00
|
|
|
if (pPrinter && pPrinter->IsValid())
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
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
|
|
|
|
{
|
2006-11-01 09:14:59 +00:00
|
|
|
// 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);
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-05-04 13:54:32 +00:00
|
|
|
// Impress: stets Bildschirmformat, quer
|
2009-06-12 09:36:34 +00:00
|
|
|
Size aSz( SvxPaperInfo::GetPaperSize(PAPER_SCREEN, MAP_100TH_MM) );
|
2006-05-04 13:54:32 +00:00
|
|
|
pPage->SetSize( Size( aSz.Height(), aSz.Width() ) );
|
2000-09-18 23:16:46 +00:00
|
|
|
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(bMasterPage=TRUE);
|
|
|
|
pMPage->SetSize( pPage->GetSize() );
|
|
|
|
pMPage->SetBorder( pPage->GetLftBorder(),
|
|
|
|
pPage->GetUppBorder(),
|
|
|
|
pPage->GetRgtBorder(),
|
|
|
|
pPage->GetLwrBorder() );
|
|
|
|
InsertMasterPage(pMPage, 1);
|
2004-07-12 13:55:25 +00:00
|
|
|
pPage->TRG_SetMasterPage( *pMPage );
|
2000-09-18 23:16:46 +00:00
|
|
|
if( bClipboard )
|
|
|
|
pMPage->SetLayoutName( pPage->GetLayoutName() );
|
|
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
* Notizen-Seite einfuegen
|
|
|
|
**********************************************************************/
|
|
|
|
SdPage* pNotesPage = (SdPage*) AllocPage(bMasterPage=FALSE);
|
|
|
|
|
2005-10-19 11:23:18 +00:00
|
|
|
if( pRefDocument )
|
|
|
|
pRefPage = pRefDocument->GetSdPage( 0, PK_NOTES );
|
|
|
|
|
|
|
|
if( pRefPage )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
2005-10-19 11:23:18 +00:00
|
|
|
pNotesPage->SetSize( pRefPage->GetSize() );
|
|
|
|
pNotesPage->SetBorder( pRefPage->GetLftBorder(), pRefPage->GetUppBorder(), pRefPage->GetRgtBorder(), pRefPage->GetLwrBorder() );
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-10-19 11:23:18 +00:00
|
|
|
// Stets Hochformat
|
|
|
|
if (aDefSize.Height() >= aDefSize.Width())
|
|
|
|
{
|
|
|
|
pNotesPage->SetSize(aDefSize);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pNotesPage->SetSize( Size(aDefSize.Height(), aDefSize.Width()) );
|
|
|
|
}
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2005-10-19 11:23:18 +00:00
|
|
|
pNotesPage->SetBorder(0, 0, 0, 0);
|
|
|
|
}
|
2000-09-18 23:16:46 +00:00
|
|
|
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(bMasterPage=TRUE);
|
|
|
|
pNotesMPage->SetSize( pNotesPage->GetSize() );
|
|
|
|
pNotesMPage->SetPageKind(PK_NOTES);
|
|
|
|
pNotesMPage->SetBorder( pNotesPage->GetLftBorder(),
|
|
|
|
pNotesPage->GetUppBorder(),
|
|
|
|
pNotesPage->GetRgtBorder(),
|
|
|
|
pNotesPage->GetLwrBorder() );
|
|
|
|
InsertMasterPage(pNotesMPage, 2);
|
2004-07-12 13:55:25 +00:00
|
|
|
pNotesPage->TRG_SetMasterPage( *pNotesMPage );
|
2000-09-18 23:16:46 +00:00
|
|
|
if( bClipboard )
|
|
|
|
pNotesMPage->SetLayoutName( pPage->GetLayoutName() );
|
|
|
|
|
2006-12-12 15:31:25 +00:00
|
|
|
mpWorkStartupTimer = new Timer();
|
|
|
|
mpWorkStartupTimer->SetTimeoutHdl( LINK(this, SdDrawDocument, WorkStartupHdl) );
|
|
|
|
mpWorkStartupTimer->SetTimeout(2000);
|
|
|
|
mpWorkStartupTimer->Start();
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
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);
|
2004-07-12 13:55:25 +00:00
|
|
|
pHandoutPage->TRG_SetMasterPage( *pHandoutMPage );
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
for (USHORT i = 1; i < nPageCount; i = i + 2)
|
|
|
|
{
|
|
|
|
SdPage* pPage = (SdPage*) GetPage(i);
|
|
|
|
|
2004-07-12 13:55:25 +00:00
|
|
|
if(!pPage->TRG_HasMasterPage())
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
// Keine MasterPage gesetzt -> erste Standard-MasterPage nehmen
|
|
|
|
// (Wenn bei PPT keine Standard-Seite vorhanden war)
|
2004-07-12 13:55:25 +00:00
|
|
|
pPage->TRG_SetMasterPage(*GetMasterPage(1));
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
SdPage* pNotesPage = (SdPage*) GetPage(i+1);
|
|
|
|
pNotesPage->SetPageKind(PK_NOTES);
|
|
|
|
|
|
|
|
// Notiz-MasterPages setzen
|
2004-07-12 13:55:25 +00:00
|
|
|
sal_uInt16 nMasterPageAfterPagesMasterPage = (pPage->TRG_GetMasterPage()).GetPageNum() + 1;
|
|
|
|
pNotesPage->TRG_SetMasterPage(*GetMasterPage(nMasterPageAfterPagesMasterPage));
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
2009-06-04 16:21:29 +00:00
|
|
|
const bool bUndo = IsUndoEnabled();
|
|
|
|
|
|
|
|
if( bUndo )
|
|
|
|
BegUndo(String(SdResId(STR_UNDO_MOVEPAGES)));
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
// 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);
|
2009-06-04 16:21:29 +00:00
|
|
|
if( bUndo )
|
|
|
|
AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage, 1));
|
2000-09-18 23:16:46 +00:00
|
|
|
MovePage(nPage, 1);
|
|
|
|
pPg = GetPage(nPage+1);
|
2009-06-04 16:21:29 +00:00
|
|
|
if( bUndo )
|
|
|
|
AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage+1, 2));
|
2000-09-18 23:16:46 +00:00
|
|
|
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);
|
2009-06-04 16:21:29 +00:00
|
|
|
if( bUndo )
|
|
|
|
AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage, nTargetPage));
|
2000-09-18 23:16:46 +00:00
|
|
|
MovePage(nPage, nTargetPage);
|
|
|
|
pPg = GetPage(nPage+1);
|
2009-06-04 16:21:29 +00:00
|
|
|
if( bUndo )
|
|
|
|
AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage+1, nTargetPage+1));
|
2000-09-18 23:16:46 +00:00
|
|
|
MovePage(nPage+1, nTargetPage+1);
|
|
|
|
bSomethingHappened = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (nPage != nTargetPage)
|
|
|
|
{
|
|
|
|
SdrPage* pPg = GetPage(nPage+1);
|
2009-06-04 16:21:29 +00:00
|
|
|
if( bUndo )
|
|
|
|
AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage+1, nTargetPage+1));
|
2000-09-18 23:16:46 +00:00
|
|
|
MovePage(nPage+1, nTargetPage+1);
|
|
|
|
pPg = GetPage(nPage);
|
2009-06-04 16:21:29 +00:00
|
|
|
if( bUndo )
|
|
|
|
AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage, nTargetPage));
|
2000-09-18 23:16:46 +00:00
|
|
|
MovePage(nPage, nTargetPage);
|
|
|
|
bSomethingHappened = TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
aPageList.Remove((ULONG)0);
|
|
|
|
nTargetPage = pPage->GetPageNum();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-06-04 16:21:29 +00:00
|
|
|
if( bUndo )
|
|
|
|
EndUndo();
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
return bSomethingHappened;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|* Anzahl der Links im LinkManager zurueckgeben
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
|
|
|
ULONG SdDrawDocument::GetLinkCount()
|
|
|
|
{
|
|
|
|
return ( pLinkManager->GetLinks().Count() );
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
2000-11-27 08:13:01 +00:00
|
|
|
|* Language setzen
|
2000-09-18 23:16:46 +00:00
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
2000-12-08 12:31:46 +00:00
|
|
|
void SdDrawDocument::SetLanguage( const LanguageType eLang, const USHORT nId )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
2000-12-08 12:31:46 +00:00
|
|
|
BOOL bChanged = FALSE;
|
|
|
|
|
2006-12-12 15:31:25 +00:00
|
|
|
if( nId == EE_CHAR_LANGUAGE && meLanguage != eLang )
|
2000-12-08 12:31:46 +00:00
|
|
|
{
|
2006-12-12 15:31:25 +00:00
|
|
|
meLanguage = eLang;
|
2000-12-08 12:31:46 +00:00
|
|
|
bChanged = TRUE;
|
|
|
|
}
|
2006-12-12 15:31:25 +00:00
|
|
|
else if( nId == EE_CHAR_LANGUAGE_CJK && meLanguageCJK != eLang )
|
2000-12-08 12:31:46 +00:00
|
|
|
{
|
2006-12-12 15:31:25 +00:00
|
|
|
meLanguageCJK = eLang;
|
2000-12-08 12:31:46 +00:00
|
|
|
bChanged = TRUE;
|
|
|
|
}
|
2006-12-12 15:31:25 +00:00
|
|
|
else if( nId == EE_CHAR_LANGUAGE_CTL && meLanguageCTL != eLang )
|
2000-12-08 12:31:46 +00:00
|
|
|
{
|
2006-12-12 15:31:25 +00:00
|
|
|
meLanguageCTL = eLang;
|
2000-12-08 12:31:46 +00:00
|
|
|
bChanged = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( bChanged )
|
2000-11-27 08:13:01 +00:00
|
|
|
{
|
2003-06-26 10:11:28 +00:00
|
|
|
GetDrawOutliner().SetDefaultLanguage( Application::GetSettings().GetLanguage() );
|
|
|
|
pHitTestOutliner->SetDefaultLanguage( Application::GetSettings().GetLanguage() );
|
2000-12-13 15:05:11 +00:00
|
|
|
pItemPool->SetPoolDefaultItem( SvxLanguageItem( eLang, nId ) );
|
2000-12-08 12:31:46 +00:00
|
|
|
SetChanged( bChanged );
|
2000-11-27 08:13:01 +00:00
|
|
|
}
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
2000-11-27 08:13:01 +00:00
|
|
|
|
2000-09-18 23:16:46 +00:00
|
|
|
/*************************************************************************
|
|
|
|
|*
|
2000-12-08 12:31:46 +00:00
|
|
|
|* Return language
|
2000-09-18 23:16:46 +00:00
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
2000-12-08 12:31:46 +00:00
|
|
|
LanguageType SdDrawDocument::GetLanguage( const USHORT nId ) const
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
2006-12-12 15:31:25 +00:00
|
|
|
LanguageType eLangType = meLanguage;
|
2000-11-27 08:13:01 +00:00
|
|
|
|
2000-12-08 12:31:46 +00:00
|
|
|
if( nId == EE_CHAR_LANGUAGE_CJK )
|
2006-12-12 15:31:25 +00:00
|
|
|
eLangType = meLanguageCJK;
|
2000-12-08 12:31:46 +00:00
|
|
|
else if( nId == EE_CHAR_LANGUAGE_CTL )
|
2006-12-12 15:31:25 +00:00
|
|
|
eLangType = meLanguageCTL;
|
2000-11-27 08:13:01 +00:00
|
|
|
|
2000-12-08 12:31:46 +00:00
|
|
|
return eLangType;
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|* WorkStartup einleiten
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
2006-12-12 15:31:25 +00:00
|
|
|
IMPL_LINK( SdDrawDocument, WorkStartupHdl, Timer *, EMPTYARG )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
2006-12-12 15:31:25 +00:00
|
|
|
if( mpDocSh )
|
|
|
|
mpDocSh->SetWaitCursor( TRUE );
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
BOOL bChanged = IsChanged(); // merken
|
|
|
|
|
|
|
|
// Autolayouts initialisieren
|
|
|
|
SdPage* pHandoutMPage = GetMasterSdPage(0, PK_HANDOUT);
|
|
|
|
|
|
|
|
if (pHandoutMPage->GetAutoLayout() == AUTOLAYOUT_NONE)
|
|
|
|
{
|
|
|
|
// AutoLayout wurde noch nicht umgesetzt -> Initialisieren
|
2004-03-30 14:44:14 +00:00
|
|
|
pHandoutMPage->SetAutoLayout(AUTOLAYOUT_HANDOUT6, TRUE, TRUE);
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
SdPage* pPage = GetSdPage(0, PK_STANDARD);
|
|
|
|
|
|
|
|
if (pPage->GetAutoLayout() == AUTOLAYOUT_NONE)
|
|
|
|
{
|
|
|
|
// AutoLayout wurde noch nicht umgesetzt -> Initialisieren
|
2004-03-30 14:44:14 +00:00
|
|
|
pPage->SetAutoLayout(AUTOLAYOUT_NONE, TRUE, TRUE);
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
SdPage* pNotesPage = GetSdPage(0, PK_NOTES);
|
|
|
|
|
|
|
|
if (pNotesPage->GetAutoLayout() == AUTOLAYOUT_NONE)
|
|
|
|
{
|
|
|
|
// AutoLayout wurde noch nicht umgesetzt -> Initialisieren
|
2004-03-30 14:44:14 +00:00
|
|
|
pNotesPage->SetAutoLayout(AUTOLAYOUT_NOTES, TRUE, TRUE);
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
SetChanged(bChanged || FALSE);
|
|
|
|
|
2006-12-12 15:31:25 +00:00
|
|
|
if( mpDocSh )
|
|
|
|
mpDocSh->SetWaitCursor( FALSE );
|
2000-09-18 23:16:46 +00:00
|
|
|
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()
|
|
|
|
{
|
2006-12-12 15:31:25 +00:00
|
|
|
if (mpWorkStartupTimer)
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
2006-12-12 15:31:25 +00:00
|
|
|
if ( mpWorkStartupTimer->IsActive() )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
// Timer war noch nicht abgelaufen -> WorkStartup wird eingeleitet
|
2006-12-12 15:31:25 +00:00
|
|
|
mpWorkStartupTimer->Stop();
|
2000-09-18 23:16:46 +00:00
|
|
|
WorkStartupHdl(NULL);
|
|
|
|
}
|
|
|
|
|
2006-12-12 15:31:25 +00:00
|
|
|
delete mpWorkStartupTimer;
|
|
|
|
mpWorkStartupTimer = NULL;
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|* 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
|
|
|
|
{
|
2006-01-10 13:25:31 +00:00
|
|
|
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 */ )
|
|
|
|
{
|
2000-09-18 23:16:46 +00:00
|
|
|
USHORT nUD = 0;
|
2006-01-10 13:25:31 +00:00
|
|
|
USHORT nUDCount = rObject.GetUserDataCount();
|
|
|
|
SdrObjUserData* pUD = 0;
|
|
|
|
SdAnimationInfo* pRet = 0;
|
2000-09-18 23:16:46 +00:00
|
|
|
|
|
|
|
// gibt es in den User-Daten eine Animationsinformation?
|
|
|
|
for (nUD = 0; nUD < nUDCount; nUD++)
|
|
|
|
{
|
2006-01-10 13:25:31 +00:00
|
|
|
pUD = rObject.GetUserData(nUD);
|
|
|
|
if((pUD->GetInventor() == SdUDInventor) && (pUD->GetId() == SD_ANIMATIONINFO_ID))
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
2006-01-10 13:25:31 +00:00
|
|
|
pRet = dynamic_cast<SdAnimationInfo*>(pUD);
|
|
|
|
break;
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
}
|
2006-01-10 13:25:31 +00:00
|
|
|
|
|
|
|
if( (pRet == 0) && bCreate )
|
|
|
|
{
|
2009-05-19 09:32:45 +00:00
|
|
|
pRet = new SdAnimationInfo( rObject );
|
|
|
|
rObject.InsertUserData( pRet);
|
2006-01-10 13:25:31 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return pRet;
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
|*
|
|
|
|
|*
|
|
|
|
|*
|
|
|
|
\************************************************************************/
|
|
|
|
|
|
|
|
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,
|
2006-12-12 15:31:25 +00:00
|
|
|
const ::Window& /* rCmpWnd */ )
|
2000-09-18 23:16:46 +00:00
|
|
|
{
|
|
|
|
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
|
|
|
|
{
|
2006-10-13 10:01:37 +00:00
|
|
|
aGraphSize = ( (SdrOle2Obj*) pObj )->GetOrigObjSize();
|
|
|
|
bObjSupported = TRUE;
|
2000-09-18 23:16:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
}
|
|
|
|
|
2002-01-18 14:36:06 +00:00
|
|
|
/** 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;
|
|
|
|
}
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2002-01-18 14:36:06 +00:00
|
|
|
nFound++;
|
|
|
|
}
|
|
|
|
|
|
|
|
// looks like we lost a notes page
|
|
|
|
if( nMaxPages == nFound )
|
|
|
|
{
|
|
|
|
// so create one
|
2000-09-18 23:16:46 +00:00
|
|
|
|
2002-01-18 14:36:06 +00:00
|
|
|
// 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;
|
|
|
|
|
2006-12-12 15:31:25 +00:00
|
|
|
SdPage* pNewNotesPage = static_cast<SdPage*>(AllocPage(sal_True));
|
|
|
|
pNewNotesPage->SetPageKind(PK_NOTES);
|
2002-01-18 14:36:06 +00:00
|
|
|
if( pRefNotesPage )
|
|
|
|
{
|
2006-12-12 15:31:25 +00:00
|
|
|
pNewNotesPage->SetSize( pRefNotesPage->GetSize() );
|
|
|
|
pNewNotesPage->SetBorder( pRefNotesPage->GetLftBorder(),
|
2002-01-18 14:36:06 +00:00
|
|
|
pRefNotesPage->GetUppBorder(),
|
|
|
|
pRefNotesPage->GetRgtBorder(),
|
|
|
|
pRefNotesPage->GetLwrBorder() );
|
|
|
|
}
|
2006-12-12 15:31:25 +00:00
|
|
|
InsertMasterPage(pNewNotesPage, nPage );
|
|
|
|
pNewNotesPage->SetLayoutName( pPage->GetLayoutName() );
|
|
|
|
pNewNotesPage->SetAutoLayout(AUTOLAYOUT_NOTES, sal_True, sal_True );
|
2002-01-18 14:36:06 +00:00
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
2002-11-04 13:39:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
USHORT SdDrawDocument::CreatePage (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);
|
2004-07-12 13:55:25 +00:00
|
|
|
SetOfByte aVisibleLayers = pActualPage->TRG_GetMasterPageVisibleLayers();
|
2002-11-04 13:39:19 +00:00
|
|
|
|
|
|
|
// Get layout from current page.
|
|
|
|
AutoLayout eAutoLayout = pActualPage->GetAutoLayout();
|
|
|
|
|
|
|
|
return CreatePage (
|
|
|
|
pActualPage, ePageKind,
|
|
|
|
// No names for the new slides.
|
|
|
|
String(), String(),
|
|
|
|
eAutoLayout, eAutoLayout,
|
|
|
|
aVisibleLayers.IsSet(aBckgrnd),
|
|
|
|
aVisibleLayers.IsSet(aBckgrndObj));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
2003-04-24 13:36:05 +00:00
|
|
|
|
|
|
|
// #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() );
|
|
|
|
|
2002-11-04 13:39:19 +00:00
|
|
|
// Use master page of current page.
|
2004-07-12 13:55:25 +00:00
|
|
|
pStandardPage->TRG_SetMasterPage(pPreviousStandardPage->TRG_GetMasterPage());
|
|
|
|
|
2002-11-04 13:39:19 +00:00
|
|
|
// User layout of current standard page.
|
|
|
|
pStandardPage->SetLayoutName( pPreviousStandardPage->GetLayoutName() );
|
|
|
|
pStandardPage->SetAutoLayout(eStandardLayout, TRUE);
|
2005-01-13 16:25:27 +00:00
|
|
|
pStandardPage->setHeaderFooterSettings( pPreviousStandardPage->getHeaderFooterSettings() );
|
2002-11-04 13:39:19 +00:00
|
|
|
|
2005-07-14 09:43:34 +00:00
|
|
|
// 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() );
|
|
|
|
|
2008-04-02 08:42:42 +00:00
|
|
|
// apply previous animation timing
|
|
|
|
pStandardPage->SetPresChange( pPreviousStandardPage->GetPresChange() );
|
|
|
|
pStandardPage->SetTime( pPreviousStandardPage->GetTime() );
|
|
|
|
|
2002-11-04 13:39:19 +00:00
|
|
|
// Create new notes page and set it up.
|
|
|
|
pNotesPage = (SdPage*) AllocPage(FALSE);
|
2002-11-18 16:35:08 +00:00
|
|
|
pNotesPage->SetPageKind(PK_NOTES);
|
2004-07-12 13:55:25 +00:00
|
|
|
|
2002-11-04 13:39:19 +00:00
|
|
|
// Use master page of current page.
|
2004-07-12 13:55:25 +00:00
|
|
|
pNotesPage->TRG_SetMasterPage(pPreviousNotesPage->TRG_GetMasterPage());
|
|
|
|
|
2002-11-04 13:39:19 +00:00
|
|
|
// Use layout of current notes page.
|
|
|
|
pNotesPage->SetLayoutName( pPreviousNotesPage->GetLayoutName() );
|
|
|
|
pNotesPage->SetAutoLayout(eNotesLayout, TRUE);
|
2005-01-13 16:25:27 +00:00
|
|
|
pNotesPage->setHeaderFooterSettings( pPreviousNotesPage->getHeaderFooterSettings() );
|
2002-11-04 13:39:19 +00:00
|
|
|
|
|
|
|
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);
|
2004-07-12 13:55:25 +00:00
|
|
|
SetOfByte aVisibleLayers = pActualPage->TRG_GetMasterPageVisibleLayers();
|
2002-11-04 13:39:19 +00:00
|
|
|
|
|
|
|
// 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);
|
2004-07-12 13:55:25 +00:00
|
|
|
SetOfByte aVisibleLayers = pPreviousPage->TRG_GetMasterPageVisibleLayers();
|
2002-11-04 13:39:19 +00:00
|
|
|
aVisibleLayers.Set(aBckgrnd, bIsPageBack);
|
|
|
|
aVisibleLayers.Set(aBckgrndObj, bIsPageObj);
|
2004-07-12 13:55:25 +00:00
|
|
|
pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
|
2002-11-04 13:39:19 +00:00
|
|
|
}
|
|
|
|
}
|
2003-10-27 12:29:37 +00:00
|
|
|
|
2006-01-10 13:25:31 +00:00
|
|
|
sd::UndoManager* SdDrawDocument::GetUndoManager() const
|
|
|
|
{
|
2006-12-12 15:31:25 +00:00
|
|
|
return mpDocSh ? dynamic_cast< sd::UndoManager* >(mpDocSh->GetUndoManager()) : 0;
|
2006-01-10 13:25:31 +00:00
|
|
|
}
|
|
|
|
|
2003-10-27 12:29:37 +00:00
|
|
|
// eof
|