Files
libreoffice/sd/source/core/drawdoc2.cxx

1641 lines
51 KiB
C++
Raw Normal View History

2000-09-18 23:16:46 +00:00
/*************************************************************************
*
* OpenOffice.org - a multi-platform office productivity suite
2000-09-18 23:16:46 +00:00
*
* $RCSfile: drawdoc2.cxx,v $
2000-09-18 23:16:46 +00:00
*
* $Revision: 1.38 $
2000-09-18 23:16:46 +00:00
*
* last change: $Author: vg $ $Date: 2006-11-01 10:14:59 $
2000-09-18 23:16:46 +00:00
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
2000-09-18 23:16:46 +00:00
*
*
* GNU Lesser General Public License Version 2.1
* =============================================
* Copyright 2005 by Sun Microsystems, Inc.
* 901 San Antonio Road, Palo Alto, CA 94303, USA
2000-09-18 23:16:46 +00:00
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
2000-09-18 23:16:46 +00:00
*
* This library 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 for more details.
2000-09-18 23:16:46 +00:00
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
2000-09-18 23:16:46 +00:00
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sd.hxx"
2000-09-18 23:16:46 +00:00
#ifndef _COM_SUN_STAR_EMBED_XVISUALOBJECT_HPP_
#include <com/sun/star/embed/XVisualObject.hpp>
#endif
#ifndef _COM_SUN_STAR_EMBED_NOVISUALAREASIZEEXCEPTION_HPP_
#include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
#endif
2000-09-18 23:16:46 +00:00
#ifndef _SV_WRKWIN_HXX
#include <vcl/wrkwin.hxx>
#endif
#ifndef _SFX_PRINTER_HXX
#include <sfx2/printer.hxx>
#endif
#ifndef _SFXAPP_HXX //autogen
#include <sfx2/app.hxx>
#endif
#ifndef SD_OUTLINE_HXX
#include "Outliner.hxx"
#endif
2000-09-18 23:16:46 +00:00
#ifndef _SVX_PAPERINF_HXX
#include <svx/paperinf.hxx>
#endif
#ifndef _SVDOPAGE_HXX //autogen
#include <svx/svdopage.hxx>
#endif
#ifndef _SVDOOLE2_HXX //autogen
#include <svx/svdoole2.hxx>
#endif
#ifndef _SVDOTEXT_HXX //autogen
#include <svx/svdotext.hxx>
#endif
#ifndef _SVDOGRAF_HXX //autogen
#include <svx/svdograf.hxx>
#endif
#ifndef _SVDUNDO_HXX //autogen
#include <svx/svdundo.hxx>
#endif
#ifndef _SV_SVAPP_HXX
#include <vcl/svapp.hxx>
#endif
2000-12-05 12:49:50 +00:00
#ifndef _EEITEM_HXX //autogen
#include <svx/eeitem.hxx>
#endif
#ifndef _EEITEMID_HXX //autogen
#include <svx/eeitemid.hxx>
#endif
#ifndef _SVX_LANGITEM_HXX
#include <svx/langitem.hxx>
#endif
#ifndef _SFXITEMPOOL_HXX
#include <svtools/itempool.hxx>
#endif
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"
#ifndef _SVDITER_HXX //autogen
#include <svx/svditer.hxx>
#endif
#ifndef _GOODIES_IMAPOBJ_HXX //autogen
#include <svtools/imapobj.hxx>
#endif
#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"
2000-09-18 23:16:46 +00:00
#ifdef MAC
#ifndef SD_DRAW_DOC_SHELL_HXX
#include "::ui:inc:DrawDocShell.hxx"
#endif
#ifndef SD_FRAME_VIEW_HXX
#include "::ui:inc:FrameView.hxx"
#endif
2000-09-18 23:16:46 +00:00
#include "::ui:inc:cfgids.hxx"
#include "::ui:inc:strings.hrc"
#else
#ifdef UNX
#ifndef SD_DRAW_DOC_SHELL_HXX
#include "../ui/inc/DrawDocShell.hxx"
#endif
#ifndef SD_FRAME_VIEW_HXX
#include "../ui/inc/FrameView.hxx"
#endif
2000-09-18 23:16:46 +00:00
#include "../ui/inc/cfgids.hxx"
#include "../ui/inc/strings.hrc"
#else
#ifndef SD_DRAW_DOC_SHELL_HXX
#include "..\ui\inc\DrawDocShell.hxx"
#endif
#ifndef SD_FRAME_VIEW_HXX
#include "..\ui\inc\FrameView.hxx"
#endif
2000-09-18 23:16:46 +00:00
#include "..\ui\inc\cfgids.hxx"
#include "..\ui\inc\strings.hrc"
#endif
#endif
#include "PageListWatcher.hxx"
using namespace ::sd;
2000-09-18 23:16:46 +00:00
const long PRINT_OFFSET = 30; // siehe \svx\source\dialog\page.cxx (PB)
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();
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();
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
|*
\************************************************************************/
USHORT SdDrawDocument::GetPageByName(const String& rPgName, BOOL& rbIsMasterPage) const
2000-09-18 23:16:46 +00:00
{
SdPage* pPage = NULL;
SdPage* pPageFound = 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.)
2000-09-18 23:16:46 +00:00
while (nPage < nMaxPages && nPageNum == SDRPAGE_NOTFOUND)
{
pPage = const_cast<SdPage*>(static_cast<const SdPage*>(
GetPage(nPage)));
2000-09-18 23:16:46 +00:00
if (pPage != NULL
&& pPage->GetPageKind() != PK_HANDOUT
&& pPage->GetName() == rPgName)
2000-09-18 23:16:46 +00:00
{
nPageNum = nPage;
}
nPage++;
}
// 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)
{
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;
rbIsMasterPage = TRUE;
2000-09-18 23:16:46 +00:00
}
nPage++;
}
return nPageNum;
2000-09-18 23:16:46 +00:00
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
SdPage* SdDrawDocument::GetSdPage(USHORT nPgNum, PageKind ePgKind) const
{
// #109538#
return mpDrawPageListWatcher->GetSdPage(ePgKind, sal_uInt32(nPgNum));
2000-09-18 23:16:46 +00:00
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
USHORT SdDrawDocument::GetSdPageCount(PageKind ePgKind) const
{
// #109538#
return (sal_uInt16)mpDrawPageListWatcher->GetSdPageCount(ePgKind);
2000-09-18 23:16:46 +00:00
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
SdPage* SdDrawDocument::GetMasterSdPage(USHORT nPgNum, PageKind ePgKind)
{
// #109538#
return mpMasterPageListWatcher->GetSdPage(ePgKind, sal_uInt32(nPgNum));
2000-09-18 23:16:46 +00:00
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
USHORT SdDrawDocument::GetMasterSdPageCount(PageKind ePgKind) const
{
// #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)
((SdrPageObj*)pObj)->SetReferencedPage(GetPage(nPage - 1));
2000-09-18 23:16:46 +00:00
}
}
}
}
}
/*************************************************************************
|*
|* Seite verschieben
|*
\************************************************************************/
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
|*
\************************************************************************/
void SdDrawDocument::InsertPage(SdrPage* pPage, USHORT nPos)
2000-09-18 23:16:46 +00:00
{
FmFormModel::InsertPage(pPage, nPos);
((SdPage*)pPage)->ConnectLink();
UpdatePageObjectsInNotes(nPos);
}
/*************************************************************************
|*
|* Seite loeschen
|*
\************************************************************************/
void SdDrawDocument::DeletePage(USHORT nPgNum)
2000-09-18 23:16:46 +00:00
{
FmFormModel::DeletePage(nPgNum);
UpdatePageObjectsInNotes(nPgNum);
}
/*************************************************************************
|*
|* Seite entfernen
|*
\************************************************************************/
SdrPage* SdDrawDocument::RemovePage(USHORT nPgNum)
2000-09-18 23:16:46 +00:00
{
SdrPage* pPage = FmFormModel::RemovePage(nPgNum);
((SdPage*)pPage)->DisconnectLink();
if (pCustomShowList)
{
for (ULONG i = 0; i < pCustomShowList->Count(); i++)
{
// Ggf. Seite aus der CustomShows ausfuegen
SdCustomShow* pCustomShow = (SdCustomShow*) pCustomShowList->GetObject(i);
pCustomShow->Remove(pPage);
}
}
UpdatePageObjectsInNotes(nPgNum);
return pPage;
}
/*************************************************************************
|*
|* 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);
}
2000-09-18 23:16:46 +00:00
if (pNotesPage && pNotesPage->GetPageKind() == PK_NOTES)
{
2000-09-18 23:16:46 +00:00
pNotesPage->SetSelected(bSelect);
}
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
|*
\************************************************************************/
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)
{
/**********************************************************************
* Default-Papiergroesse vom Drucker holen
**********************************************************************/
SdPage* pRefPage = NULL;
if( pRefDocument )
SdPage* pRefHandout = pRefDocument->GetSdPage( 0, PK_HANDOUT );
/*
if(pDocSh)
2000-09-18 23:16:46 +00:00
{
SfxPrinter* pPrinter = pDocSh->GetPrinter(TRUE);
2000-09-18 23:16:46 +00:00
if (pPrinter->IsValid())
{
// Der Printer gibt leider kein exaktes Format (z.B. A4) zurueck
aDefSize = pPrinter->GetPaperSize();
SvxPaper ePaper = SvxPaperInfo::GetSvxPaper(aDefSize, MAP_100TH_MM, TRUE);
if (ePaper != SVX_PAPER_USER)
{
// Korrekte Size holen
aDefSize = SvxPaperInfo::GetPaperSize(ePaper, MAP_100TH_MM);
}
}
}
*/
// #i57181# Paper size depends on Language, like in Writer
SvxPaper ePaper = SvxPaperInfo::GetDefaultSvxPaper( Application::GetSettings().GetLanguage() );
Size aDefSize( SvxPaperInfo::GetPaperSize(ePaper, MAP_100TH_MM) );
2000-09-18 23:16:46 +00:00
/**********************************************************************
* Handzettel-Seite einfuegen
**********************************************************************/
BOOL bMasterPage;
SdPage* pHandoutPage = dynamic_cast< SdPage* >( AllocPage(bMasterPage=FALSE) );
2000-09-18 23:16:46 +00:00
if( pRefPage )
2000-09-18 23:16:46 +00:00
{
pHandoutPage->SetSize( pRefPage->GetSize() );
pHandoutPage->SetBorder( pRefPage->GetLftBorder(), pRefPage->GetUppBorder(), pRefPage->GetRgtBorder(), pRefPage->GetLwrBorder() );
2000-09-18 23:16:46 +00:00
}
else
{
// Stets Querformat
if (aDefSize.Height() <= aDefSize.Width())
{
pHandoutPage->SetSize(aDefSize);
}
else
{
pHandoutPage->SetSize( Size(aDefSize.Height(), aDefSize.Width()) );
}
2000-09-18 23:16:46 +00:00
pHandoutPage->SetBorder(0, 0, 0, 0);
}
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);
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;
if( pRefDocument )
pRefPage = pRefDocument->GetSdPage( 0, PK_STANDARD );
2000-09-18 23:16:46 +00:00
if (nPageCount == 0)
{
pPage = dynamic_cast< SdPage* >( AllocPage(bMasterPage=FALSE) );
2000-09-18 23:16:46 +00:00
if( pRefPage )
{
pPage->SetSize( pRefPage->GetSize() );
pPage->SetBorder( pRefPage->GetLftBorder(), pRefPage->GetUppBorder(), pRefPage->GetRgtBorder(), pRefPage->GetLwrBorder() );
}
else if (eDocType == DOCUMENT_TYPE_DRAW)
2000-09-18 23:16:46 +00:00
{
// Draw: stets Default-Groesse mit Raendern
pPage->SetSize(aDefSize);
SfxPrinter* pPrinter = pDocSh->GetPrinter(FALSE);
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
{
// 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
{
// Impress: stets Bildschirmformat, quer
Size aSz( SvxPaperInfo::GetPaperSize(SVX_PAPER_SCREEN, MAP_100TH_MM) );
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);
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);
if( pRefDocument )
pRefPage = pRefDocument->GetSdPage( 0, PK_NOTES );
if( pRefPage )
2000-09-18 23:16:46 +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
{
// 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
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);
pNotesPage->TRG_SetMasterPage( *pNotesMPage );
2000-09-18 23:16:46 +00:00
if( bClipboard )
pNotesMPage->SetLayoutName( pPage->GetLayoutName() );
pWorkStartupTimer = new Timer();
pWorkStartupTimer->SetTimeoutHdl( LINK(this, SdDrawDocument, WorkStartupHdl) );
pWorkStartupTimer->SetTimeout(2000);
pWorkStartupTimer->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 );
2000-09-18 23:16:46 +00:00
for (USHORT i = 1; i < nPageCount; i = i + 2)
{
SdPage* pPage = (SdPage*) GetPage(i);
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)
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
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;
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);
AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage, 1));
2000-09-18 23:16:46 +00:00
MovePage(nPage, 1);
pPg = GetPage(nPage+1);
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);
AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage, nTargetPage));
2000-09-18 23:16:46 +00:00
MovePage(nPage, nTargetPage);
pPg = GetPage(nPage+1);
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);
AddUndo(GetSdrUndoFactory().CreateUndoSetPageNum(*pPg, nPage+1, nTargetPage+1));
2000-09-18 23:16:46 +00:00
MovePage(nPage+1, nTargetPage+1);
pPg = GetPage(nPage);
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();
}
}
EndUndo();
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;
if( nId == EE_CHAR_LANGUAGE && eLanguage != eLang )
{
eLanguage = eLang;
bChanged = TRUE;
}
else if( nId == EE_CHAR_LANGUAGE_CJK && eLanguageCJK != eLang )
{
eLanguageCJK = eLang;
bChanged = TRUE;
}
else if( nId == EE_CHAR_LANGUAGE_CTL && eLanguageCTL != eLang )
{
eLanguageCTL = eLang;
bChanged = TRUE;
}
if( bChanged )
2000-11-27 08:13:01 +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
{
2000-12-08 12:31:46 +00:00
LanguageType eLangType = eLanguage;
2000-11-27 08:13:01 +00:00
2000-12-08 12:31:46 +00:00
if( nId == EE_CHAR_LANGUAGE_CJK )
eLangType = eLanguageCJK;
else if( nId == EE_CHAR_LANGUAGE_CTL )
eLangType = eLanguageCTL;
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
|*
\************************************************************************/
IMPL_LINK( SdDrawDocument, WorkStartupHdl, Timer *, pTimer )
{
if( pDocSh )
pDocSh->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);
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
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
pNotesPage->SetAutoLayout(AUTOLAYOUT_NOTES, TRUE, TRUE);
2000-09-18 23:16:46 +00:00
}
SetChanged(bChanged || FALSE);
if( pDocSh )
pDocSh->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 (pWorkStartupTimer)
{
if ( pWorkStartupTimer->IsActive() )
{
// Timer war noch nicht abgelaufen -> WorkStartup wird eingeleitet
pWorkStartupTimer->Stop();
WorkStartupHdl(NULL);
}
delete pWorkStartupTimer;
pWorkStartupTimer = 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 */ )
{
2000-09-18 23:16:46 +00:00
USHORT nUD = 0;
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++)
{
pUD = rObject.GetUserData(nUD);
if((pUD->GetInventor() == SdUDInventor) && (pUD->GetId() == SD_ANIMATIONINFO_ID))
2000-09-18 23:16:46 +00:00
{
pRet = dynamic_cast<SdAnimationInfo*>(pUD);
break;
2000-09-18 23:16:46 +00:00
}
}
if( (pRet == 0) && bCreate )
{
pRet = new SdAnimationInfo;
rObject.InsertUserData( pRet );
}
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,
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
{
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;
}
/*************************************************************************
|*
|*
|*
\************************************************************************/
Graphic SdDrawDocument::GetGraphicFromOle2Obj( const SdrOle2Obj* pOle2Obj )
{
Graphic aGraphic;
/*
::uno::Reference < embed::XVisualObject > xObj( ( (SdrOle2Obj*) pObj )->GetObjRef(), UNO_QUERY );
if ( xObj.is() )
2000-09-18 23:16:46 +00:00
{
VirtualDevice aVDev;
GDIMetaFile aGDIMtf;
const MapMode aMap100( MAP_100TH_MM );
awt::Size aSz = xObj->getVisualAreaSize();
Size aSize = Size( aSz.Width, aSz.Height );
2000-09-18 23:16:46 +00:00
aVDev.SetMapMode( aMap100 );
aGDIMtf.Record( &aVDev );
aIPObjRef->DoDraw( &aVDev, Point(), aSize, JobSetup() );
2000-09-18 23:16:46 +00:00
aGDIMtf.Stop();
aGDIMtf.WindStart();
aGDIMtf.SetPrefMapMode( aMap100 );
aGDIMtf.SetPrefSize( rSize );
aGraphic = Graphic( aGDIMtf );
}*/
2000-09-18 23:16:46 +00:00
return aGraphic;
}
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;
SdPage* pNotesPage = static_cast<SdPage*>(AllocPage(sal_True));
pNotesPage->SetPageKind(PK_NOTES);
if( pRefNotesPage )
{
pNotesPage->SetSize( pRefNotesPage->GetSize() );
pNotesPage->SetBorder( pRefNotesPage->GetLftBorder(),
pRefNotesPage->GetUppBorder(),
pRefNotesPage->GetRgtBorder(),
pRefNotesPage->GetLwrBorder() );
}
InsertMasterPage(pNotesPage, nPage );
pNotesPage->SetLayoutName( pPage->GetLayoutName() );
pNotesPage->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);
}
}
}
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);
SetOfByte aVisibleLayers = pActualPage->TRG_GetMasterPageVisibleLayers();
// 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);
// #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() );
// 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 pDocSh ? dynamic_cast< sd::UndoManager* >(pDocSh->GetUndoManager()) : 0;
}
// eof