15b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
35b190011SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
45b190011SAndrew Rist * or more contributor license agreements. See the NOTICE file
55b190011SAndrew Rist * distributed with this work for additional information
65b190011SAndrew Rist * regarding copyright ownership. The ASF licenses this file
75b190011SAndrew Rist * to you under the Apache License, Version 2.0 (the
85b190011SAndrew Rist * "License"); you may not use this file except in compliance
95b190011SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
115b190011SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
135b190011SAndrew Rist * Unless required by applicable law or agreed to in writing,
145b190011SAndrew Rist * software distributed under the License is distributed on an
155b190011SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
165b190011SAndrew Rist * KIND, either express or implied. See the License for the
175b190011SAndrew Rist * specific language governing permissions and limitations
185b190011SAndrew Rist * under the License.
19cdf0e10cSrcweir *
205b190011SAndrew Rist *************************************************************/
215b190011SAndrew Rist
225b190011SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sd.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir
28cdf0e10cSrcweir #include <com/sun/star/embed/ElementModes.hpp>
29cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
30cdf0e10cSrcweir
31cdf0e10cSrcweir #include "comphelper/anytostring.hxx"
32cdf0e10cSrcweir #include "cppuhelper/exc_hlp.hxx"
33cdf0e10cSrcweir
34cdf0e10cSrcweir #include <utility>
35cdf0e10cSrcweir #include <algorithm>
36cdf0e10cSrcweir #include <vcl/wrkwin.hxx>
37cdf0e10cSrcweir #include <sfx2/docfile.hxx>
38cdf0e10cSrcweir #include <sot/storage.hxx>
39cdf0e10cSrcweir #include <sfx2/app.hxx>
40cdf0e10cSrcweir #include <svl/itemset.hxx>
41cdf0e10cSrcweir
42cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx>
43cdf0e10cSrcweir #include <sfx2/fcontnr.hxx>
44cdf0e10cSrcweir #include <svx/svdopath.hxx>
45cdf0e10cSrcweir #include <svx/svditer.hxx>
46cdf0e10cSrcweir #include <svl/style.hxx>
47cdf0e10cSrcweir #include <sfx2/linkmgr.hxx>
48cdf0e10cSrcweir #include <svx/svdpagv.hxx>
49cdf0e10cSrcweir #include <svx/svdogrp.hxx>
50cdf0e10cSrcweir #include <svx/svdundo.hxx>
51cdf0e10cSrcweir #include <vcl/msgbox.hxx>
52cdf0e10cSrcweir #include <sot/storage.hxx>
53cdf0e10cSrcweir #include <sot/formats.hxx>
54cdf0e10cSrcweir
55cdf0e10cSrcweir #include <set>
56cdf0e10cSrcweir #include <boost/bind.hpp>
57cdf0e10cSrcweir
58cdf0e10cSrcweir #include "glob.hrc"
59cdf0e10cSrcweir #include "drawdoc.hxx"
60cdf0e10cSrcweir #include "sdpage.hxx"
61cdf0e10cSrcweir #include "stlpool.hxx"
62cdf0e10cSrcweir #include "sdresid.hxx"
63cdf0e10cSrcweir #include "sdiocmpt.hxx"
64cdf0e10cSrcweir #include "strmname.h"
65cdf0e10cSrcweir #include "anminfo.hxx"
66cdf0e10cSrcweir
67cdf0e10cSrcweir #include "../ui/inc/unmovss.hxx"
68cdf0e10cSrcweir #include "../ui/inc/unchss.hxx"
69cdf0e10cSrcweir #include "../ui/inc/unprlout.hxx"
70cdf0e10cSrcweir #include "../ui/inc/DrawDocShell.hxx"
71cdf0e10cSrcweir #include "../ui/inc/GraphicDocShell.hxx"
72cdf0e10cSrcweir #include "../ui/inc/ViewShell.hxx"
73cdf0e10cSrcweir #include "../ui/inc/View.hxx"
74cdf0e10cSrcweir #include "../ui/inc/cfgids.hxx"
75cdf0e10cSrcweir #include "../ui/inc/strings.hrc"
76cdf0e10cSrcweir
77cdf0e10cSrcweir using namespace ::com::sun::star;
78cdf0e10cSrcweir
79cdf0e10cSrcweir #define POOL_BUFFER_SIZE (sal_uInt16)32768
80cdf0e10cSrcweir #define BASIC_BUFFER_SIZE (sal_uInt16)8192
81cdf0e10cSrcweir #define DOCUMENT_BUFFER_SIZE (sal_uInt16)32768
82cdf0e10cSrcweir
83cdf0e10cSrcweir /*************************************************************************
84cdf0e10cSrcweir |*
85cdf0e10cSrcweir |* Oeffnet ein Bookmark-Dokument
86cdf0e10cSrcweir |*
87cdf0e10cSrcweir \************************************************************************/
88cdf0e10cSrcweir /*
89cdf0e10cSrcweir SdStorageListener : public BaseImplHelper1 < lang::XEventListener >
90cdf0e10cSrcweir {
91cdf0e10cSrcweir uno::Reference < embed::XStorage >& xStor;
92cdf0e10cSrcweir public:
93cdf0e10cSrcweir SdStorageListener ( uno::Reference < embed::XStorage >& rStor )
94cdf0e10cSrcweir : xStor( rStor )
95cdf0e10cSrcweir {}
96cdf0e10cSrcweir
97cdf0e10cSrcweir void disposing ( const lang::EventObject& aEvent ) throw ( uno::RuntimeException );
98cdf0e10cSrcweir };
99cdf0e10cSrcweir
100cdf0e10cSrcweir void SdStorageListener::disposing( const lang::EventObject& aEvent ) throw ( uno::RuntimeException )
101cdf0e10cSrcweir {
102cdf0e10cSrcweir xStor = NULL;
103cdf0e10cSrcweir }*/
104cdf0e10cSrcweir
OpenBookmarkDoc(SfxMedium & rMedium)105cdf0e10cSrcweir SdDrawDocument* SdDrawDocument::OpenBookmarkDoc(SfxMedium& rMedium)
106cdf0e10cSrcweir {
107cdf0e10cSrcweir sal_Bool bOK = sal_True;
108cdf0e10cSrcweir SdDrawDocument* pBookmarkDoc = NULL;
109cdf0e10cSrcweir String aBookmarkName = rMedium.GetName();
110cdf0e10cSrcweir const SfxFilter* pFilter = rMedium.GetFilter();
111cdf0e10cSrcweir if ( !pFilter )
112cdf0e10cSrcweir {
113cdf0e10cSrcweir rMedium.UseInteractionHandler( sal_True );
114cdf0e10cSrcweir SFX_APP()->GetFilterMatcher().GuessFilter( rMedium, &pFilter );
115cdf0e10cSrcweir }
116cdf0e10cSrcweir
117cdf0e10cSrcweir if ( !pFilter )
118cdf0e10cSrcweir {
119cdf0e10cSrcweir bOK = sal_False;
120cdf0e10cSrcweir }
121cdf0e10cSrcweir else if ( maBookmarkFile != aBookmarkName && aBookmarkName.Len() )
122cdf0e10cSrcweir {
123cdf0e10cSrcweir sal_Bool bCreateGraphicShell = pFilter->GetServiceName().EqualsAscii( "com.sun.star.drawing.DrawingDocument" );
124cdf0e10cSrcweir sal_Bool bCreateImpressShell = pFilter->GetServiceName().EqualsAscii( "com.sun.star.presentation.PresentationDocument" );
125cdf0e10cSrcweir if ( bCreateGraphicShell || bCreateImpressShell )
126cdf0e10cSrcweir {
127cdf0e10cSrcweir CloseBookmarkDoc();
128cdf0e10cSrcweir
129cdf0e10cSrcweir // Es wird eine DocShell erzeugt, da in dem Dokument OLE-Objekte
130cdf0e10cSrcweir // enthalten sein koennten (Persist)
131cdf0e10cSrcweir // Wenn dem nicht so waere, so koennte man auch das Model
132cdf0e10cSrcweir // direkt laden
133cdf0e10cSrcweir if ( bCreateGraphicShell )
134cdf0e10cSrcweir // Draw
135cdf0e10cSrcweir mxBookmarkDocShRef = new ::sd::GraphicDocShell(SFX_CREATE_MODE_STANDARD, sal_True);
136cdf0e10cSrcweir else
137cdf0e10cSrcweir // Impress
138cdf0e10cSrcweir mxBookmarkDocShRef = new ::sd::DrawDocShell(SFX_CREATE_MODE_STANDARD, sal_True);
139cdf0e10cSrcweir
140cdf0e10cSrcweir bOK = mxBookmarkDocShRef->DoLoad(&rMedium);
141cdf0e10cSrcweir if( bOK )
142cdf0e10cSrcweir {
143cdf0e10cSrcweir maBookmarkFile = aBookmarkName;
144cdf0e10cSrcweir pBookmarkDoc = mxBookmarkDocShRef->GetDoc();
145cdf0e10cSrcweir }
146cdf0e10cSrcweir }
147cdf0e10cSrcweir }
148cdf0e10cSrcweir
149cdf0e10cSrcweir DBG_ASSERT(aBookmarkName.Len(), "Empty document name!");
150cdf0e10cSrcweir
151cdf0e10cSrcweir if (!bOK)
152cdf0e10cSrcweir {
153cdf0e10cSrcweir ErrorBox aErrorBox( NULL, (WinBits)WB_OK, String(SdResId(STR_READ_DATA_ERROR)));
154cdf0e10cSrcweir aErrorBox.Execute();
155cdf0e10cSrcweir
156cdf0e10cSrcweir CloseBookmarkDoc();
157cdf0e10cSrcweir pBookmarkDoc = NULL;
158cdf0e10cSrcweir }
159cdf0e10cSrcweir else if (mxBookmarkDocShRef.Is())
160cdf0e10cSrcweir {
161cdf0e10cSrcweir pBookmarkDoc = mxBookmarkDocShRef->GetDoc();
162cdf0e10cSrcweir }
163cdf0e10cSrcweir
164cdf0e10cSrcweir return(pBookmarkDoc);
165cdf0e10cSrcweir }
166cdf0e10cSrcweir
167cdf0e10cSrcweir /*************************************************************************
168cdf0e10cSrcweir |*
169cdf0e10cSrcweir |* Oeffnet ein Bookmark-Dokument
170cdf0e10cSrcweir |*
171cdf0e10cSrcweir \************************************************************************/
172cdf0e10cSrcweir
OpenBookmarkDoc(const String & rBookmarkFile)173cdf0e10cSrcweir SdDrawDocument* SdDrawDocument::OpenBookmarkDoc(const String& rBookmarkFile)
174cdf0e10cSrcweir {
175cdf0e10cSrcweir SdDrawDocument* pBookmarkDoc = NULL;
176cdf0e10cSrcweir
177cdf0e10cSrcweir if (maBookmarkFile != rBookmarkFile && rBookmarkFile.Len())
178cdf0e10cSrcweir {
179cdf0e10cSrcweir SfxMedium* pMedium = new SfxMedium( rBookmarkFile, STREAM_READ, sal_False );
180cdf0e10cSrcweir pBookmarkDoc = OpenBookmarkDoc(*pMedium);
181cdf0e10cSrcweir }
182cdf0e10cSrcweir else if (mxBookmarkDocShRef.Is())
183cdf0e10cSrcweir {
184cdf0e10cSrcweir pBookmarkDoc = mxBookmarkDocShRef->GetDoc();
185cdf0e10cSrcweir }
186cdf0e10cSrcweir
187cdf0e10cSrcweir return(pBookmarkDoc);
188cdf0e10cSrcweir }
189cdf0e10cSrcweir
190cdf0e10cSrcweir /*************************************************************************
191cdf0e10cSrcweir |*
192cdf0e10cSrcweir |* Fuegt ein Bookmark (Seite oder Objekt) ein
193cdf0e10cSrcweir |*
194cdf0e10cSrcweir \************************************************************************/
195cdf0e10cSrcweir
InsertBookmark(List * pBookmarkList,List * pExchangeList,sal_Bool bLink,sal_Bool bReplace,sal_uInt16 nInsertPos,sal_Bool bNoDialogs,::sd::DrawDocShell * pBookmarkDocSh,sal_Bool bCopy,Point * pObjPos)196cdf0e10cSrcweir sal_Bool SdDrawDocument::InsertBookmark(
197cdf0e10cSrcweir List* pBookmarkList, // Liste der Namen der einzufuegenden Bookmarks
198cdf0e10cSrcweir List* pExchangeList, // Liste der zu verwendenen Namen
199cdf0e10cSrcweir sal_Bool bLink, // Bookmarks sollen als Verknuepfung eingefuegt werden
200cdf0e10cSrcweir sal_Bool bReplace, // Aktuellen Seiten (Standard&Notiz) werden ersetzt
201cdf0e10cSrcweir sal_uInt16 nInsertPos, // Einfuegeposition fuer Seiten
202cdf0e10cSrcweir sal_Bool bNoDialogs, // Keine Dialoge anzeigen
203cdf0e10cSrcweir ::sd::DrawDocShell* pBookmarkDocSh, // Wenn gesetzt, so ist dieses das Source-Dokument
204cdf0e10cSrcweir sal_Bool bCopy, // Seiten werden kopiert
205cdf0e10cSrcweir Point* pObjPos) // Einfuegeposition fuer Objekte
206cdf0e10cSrcweir {
207cdf0e10cSrcweir sal_Bool bOK = sal_True;
208cdf0e10cSrcweir sal_Bool bInsertPages = sal_False;
209cdf0e10cSrcweir
210cdf0e10cSrcweir if (!pBookmarkList)
211cdf0e10cSrcweir {
212cdf0e10cSrcweir /**********************************************************************
213cdf0e10cSrcweir * Alle Seiten werden eingefuegt
214cdf0e10cSrcweir **********************************************************************/
215cdf0e10cSrcweir bInsertPages = sal_True;
216cdf0e10cSrcweir }
217cdf0e10cSrcweir else
218cdf0e10cSrcweir {
219cdf0e10cSrcweir SdDrawDocument* pBookmarkDoc = NULL;
220cdf0e10cSrcweir String aBookmarkName;
221cdf0e10cSrcweir
222cdf0e10cSrcweir if (pBookmarkDocSh)
223cdf0e10cSrcweir {
224cdf0e10cSrcweir pBookmarkDoc = pBookmarkDocSh->GetDoc();
225cdf0e10cSrcweir aBookmarkName = pBookmarkDocSh->GetMedium()->GetName();
226cdf0e10cSrcweir }
227cdf0e10cSrcweir else if ( mxBookmarkDocShRef.Is() )
228cdf0e10cSrcweir {
229cdf0e10cSrcweir pBookmarkDoc = mxBookmarkDocShRef->GetDoc();
230cdf0e10cSrcweir aBookmarkName = maBookmarkFile;
231cdf0e10cSrcweir }
232cdf0e10cSrcweir else
233cdf0e10cSrcweir bOK = sal_False;
234cdf0e10cSrcweir
235cdf0e10cSrcweir for (sal_uInt16 nPos = 0; bOK && ( nPos < pBookmarkList->Count() ) && !bInsertPages; nPos++)
236cdf0e10cSrcweir {
237cdf0e10cSrcweir /******************************************************************
238cdf0e10cSrcweir * Gibt es in der Bookmark-Liste einen Seitennamen?
239cdf0e10cSrcweir ******************************************************************/
240cdf0e10cSrcweir String aBMPgName (*(String*) pBookmarkList->GetObject(nPos));
241cdf0e10cSrcweir sal_Bool bIsMasterPage;
242cdf0e10cSrcweir
243cdf0e10cSrcweir if( pBookmarkDoc->GetPageByName( aBMPgName, bIsMasterPage ) != SDRPAGE_NOTFOUND )
244cdf0e10cSrcweir {
245cdf0e10cSrcweir // Seite gefunden
246cdf0e10cSrcweir bInsertPages = sal_True;
247cdf0e10cSrcweir }
248cdf0e10cSrcweir }
249cdf0e10cSrcweir }
250cdf0e10cSrcweir
251cdf0e10cSrcweir if ( bOK && bInsertPages )
252cdf0e10cSrcweir {
253cdf0e10cSrcweir // Zuerst werden alle Seiten-Bookmarks eingefuegt
254cdf0e10cSrcweir bOK = InsertBookmarkAsPage(pBookmarkList, pExchangeList, bLink, bReplace,
255cdf0e10cSrcweir nInsertPos, bNoDialogs, pBookmarkDocSh, bCopy, sal_True, sal_False);
256cdf0e10cSrcweir }
257cdf0e10cSrcweir
258cdf0e10cSrcweir if ( bOK && pBookmarkList )
259cdf0e10cSrcweir {
260cdf0e10cSrcweir // Es werden alle Objekt-Bookmarks eingefuegt
261cdf0e10cSrcweir bOK = InsertBookmarkAsObject(pBookmarkList, pExchangeList, bLink,
262cdf0e10cSrcweir pBookmarkDocSh, pObjPos);
263cdf0e10cSrcweir }
264cdf0e10cSrcweir
265cdf0e10cSrcweir return bOK;
266cdf0e10cSrcweir }
267cdf0e10cSrcweir
268cdf0e10cSrcweir /*************************************************************************
269cdf0e10cSrcweir |*
270cdf0e10cSrcweir |* Fuegt ein Bookmark als Seite ein
271cdf0e10cSrcweir |*
272cdf0e10cSrcweir \************************************************************************/
273cdf0e10cSrcweir
274cdf0e10cSrcweir /** Concrete incarnations get called by IterateBookmarkPages, for
275cdf0e10cSrcweir every page in the bookmark document/list
276cdf0e10cSrcweir */
277cdf0e10cSrcweir class SdDrawDocument::InsertBookmarkAsPage_PageFunctorBase
278cdf0e10cSrcweir {
279cdf0e10cSrcweir public:
280cdf0e10cSrcweir virtual ~InsertBookmarkAsPage_PageFunctorBase() = 0;
281cdf0e10cSrcweir virtual void operator()( SdDrawDocument&, SdPage* ) = 0;
282cdf0e10cSrcweir };
283cdf0e10cSrcweir
~InsertBookmarkAsPage_PageFunctorBase()284cdf0e10cSrcweir SdDrawDocument::InsertBookmarkAsPage_PageFunctorBase::~InsertBookmarkAsPage_PageFunctorBase()
285cdf0e10cSrcweir {
286cdf0e10cSrcweir }
287cdf0e10cSrcweir
IterateBookmarkPages(SdDrawDocument * pBookmarkDoc,List * pBookmarkList,sal_uInt16 nBMSdPageCount,SdDrawDocument::InsertBookmarkAsPage_PageFunctorBase & rPageIterator)288cdf0e10cSrcweir void SdDrawDocument::IterateBookmarkPages( SdDrawDocument* pBookmarkDoc, List* pBookmarkList, sal_uInt16 nBMSdPageCount,
289cdf0e10cSrcweir SdDrawDocument::InsertBookmarkAsPage_PageFunctorBase& rPageIterator )
290cdf0e10cSrcweir {
291cdf0e10cSrcweir //
292cdf0e10cSrcweir // #96029# Refactored copy'n'pasted layout name collection from InsertBookmarkAsPage
293cdf0e10cSrcweir //
294cdf0e10cSrcweir int nPos, nEndPos;
295cdf0e10cSrcweir
296cdf0e10cSrcweir if( !pBookmarkList )
297cdf0e10cSrcweir {
298cdf0e10cSrcweir // no list? whole source document
299cdf0e10cSrcweir nEndPos = nBMSdPageCount;
300cdf0e10cSrcweir }
301cdf0e10cSrcweir else
302cdf0e10cSrcweir {
303cdf0e10cSrcweir // bookmark list? number of entries
304cdf0e10cSrcweir nEndPos = pBookmarkList->Count();
305cdf0e10cSrcweir }
306cdf0e10cSrcweir
307cdf0e10cSrcweir SdPage* pBMPage;
308cdf0e10cSrcweir
309cdf0e10cSrcweir // iterate over number of pages to insert
310cdf0e10cSrcweir for (nPos = 0; nPos < nEndPos; ++nPos)
311cdf0e10cSrcweir {
312cdf0e10cSrcweir // the master page associated to the nPos'th page to insert
313cdf0e10cSrcweir SdPage* pBMMPage = NULL;
314cdf0e10cSrcweir
315cdf0e10cSrcweir if( !pBookmarkList )
316cdf0e10cSrcweir {
317cdf0e10cSrcweir // simply take master page of nPos'th page in source document
318cdf0e10cSrcweir pBMMPage = (SdPage*)(&(pBookmarkDoc->GetSdPage((sal_uInt16)nPos, PK_STANDARD)->TRG_GetMasterPage()));
319cdf0e10cSrcweir }
320cdf0e10cSrcweir else
321cdf0e10cSrcweir {
322cdf0e10cSrcweir // fetch nPos'th entry from bookmark list, and determine master page
323cdf0e10cSrcweir String aBMPgName (*(String*) pBookmarkList->GetObject(nPos));
324cdf0e10cSrcweir sal_Bool bIsMasterPage;
325cdf0e10cSrcweir
326cdf0e10cSrcweir sal_uInt16 nBMPage = pBookmarkDoc->GetPageByName( aBMPgName, bIsMasterPage );
327cdf0e10cSrcweir
328cdf0e10cSrcweir if (nBMPage != SDRPAGE_NOTFOUND)
329cdf0e10cSrcweir {
330cdf0e10cSrcweir pBMPage = (SdPage*) pBookmarkDoc->GetPage(nBMPage);
331cdf0e10cSrcweir }
332cdf0e10cSrcweir else
333cdf0e10cSrcweir {
334cdf0e10cSrcweir pBMPage = NULL;
335cdf0e10cSrcweir }
336cdf0e10cSrcweir
337cdf0e10cSrcweir // enforce that bookmarked page is a standard page and not already a master page
338cdf0e10cSrcweir if (pBMPage && pBMPage->GetPageKind()==PK_STANDARD && !pBMPage->IsMasterPage())
339cdf0e10cSrcweir {
340cdf0e10cSrcweir const sal_uInt16 nBMSdPage = (nBMPage - 1) / 2;
341cdf0e10cSrcweir pBMMPage = (SdPage*) (&(pBookmarkDoc->GetSdPage(nBMSdPage, PK_STANDARD)->TRG_GetMasterPage()));
342cdf0e10cSrcweir }
343cdf0e10cSrcweir }
344cdf0e10cSrcweir
345cdf0e10cSrcweir // successfully determined valid (bookmarked) page?
346cdf0e10cSrcweir if( pBMMPage )
347cdf0e10cSrcweir {
348cdf0e10cSrcweir // yes, call functor
349cdf0e10cSrcweir rPageIterator( *this, pBMMPage );
350cdf0e10cSrcweir }
351cdf0e10cSrcweir }
352cdf0e10cSrcweir }
353cdf0e10cSrcweir
354cdf0e10cSrcweir class InsertBookmarkAsPage_FindDuplicateLayouts : public SdDrawDocument::InsertBookmarkAsPage_PageFunctorBase
355cdf0e10cSrcweir {
356cdf0e10cSrcweir public:
InsertBookmarkAsPage_FindDuplicateLayouts(List * pLayoutsToTransfer,SdDrawDocument * pBookmarkDoc,List * pBookmarkList,sal_uInt16 nBMSdPageCount)357cdf0e10cSrcweir InsertBookmarkAsPage_FindDuplicateLayouts( List* pLayoutsToTransfer, SdDrawDocument* pBookmarkDoc,
358cdf0e10cSrcweir List* pBookmarkList, sal_uInt16 nBMSdPageCount ) :
359cdf0e10cSrcweir mpLayoutsToTransfer(pLayoutsToTransfer), mpBookmarkDoc(pBookmarkDoc),
360cdf0e10cSrcweir mpBookmarkList(pBookmarkList), mnBMSdPageCount(nBMSdPageCount) {}
~InsertBookmarkAsPage_FindDuplicateLayouts()361cdf0e10cSrcweir virtual ~InsertBookmarkAsPage_FindDuplicateLayouts() {};
362cdf0e10cSrcweir virtual void operator()( SdDrawDocument&, SdPage* );
363cdf0e10cSrcweir private:
364cdf0e10cSrcweir List* mpLayoutsToTransfer;
365cdf0e10cSrcweir SdDrawDocument* mpBookmarkDoc;
366cdf0e10cSrcweir List* mpBookmarkList;
367cdf0e10cSrcweir sal_uInt16 mnBMSdPageCount;
368cdf0e10cSrcweir };
369cdf0e10cSrcweir
operator ()(SdDrawDocument & rDoc,SdPage * pBMMPage)370cdf0e10cSrcweir void InsertBookmarkAsPage_FindDuplicateLayouts::operator()( SdDrawDocument& rDoc, SdPage* pBMMPage )
371cdf0e10cSrcweir {
372cdf0e10cSrcweir // now check for duplicate masterpage and layout names
373cdf0e10cSrcweir // ===================================================
374cdf0e10cSrcweir
375cdf0e10cSrcweir String sFullLayoutName( pBMMPage->GetLayoutName() );
376cdf0e10cSrcweir String* pLayout = new String(sFullLayoutName);
377cdf0e10cSrcweir pLayout->Erase( pLayout->SearchAscii( SD_LT_SEPARATOR ));
378cdf0e10cSrcweir
379cdf0e10cSrcweir String* pTest = (String*) mpLayoutsToTransfer->First();
380cdf0e10cSrcweir sal_Bool bFound = sal_False;
381cdf0e10cSrcweir
382cdf0e10cSrcweir while (pTest && !bFound) // found yet?
383cdf0e10cSrcweir {
384cdf0e10cSrcweir if (*pLayout == *pTest)
385cdf0e10cSrcweir bFound = sal_True;
386cdf0e10cSrcweir else
387cdf0e10cSrcweir pTest = (String*)mpLayoutsToTransfer->Next();
388cdf0e10cSrcweir }
389cdf0e10cSrcweir
390cdf0e10cSrcweir const sal_uInt16 nMPageCount = rDoc.GetMasterPageCount();
391cdf0e10cSrcweir for (sal_uInt16 nMPage = 0; nMPage < nMPageCount && !bFound; nMPage++)
392cdf0e10cSrcweir {
393cdf0e10cSrcweir /**************************************************************
394cdf0e10cSrcweir * Gibt es die Layouts schon im Dokument?
395cdf0e10cSrcweir **************************************************************/
396cdf0e10cSrcweir SdPage* pTestPage = (SdPage*) rDoc.GetMasterPage(nMPage);
397cdf0e10cSrcweir String aTest(pTestPage->GetLayoutName());
398cdf0e10cSrcweir aTest.Erase( aTest.SearchAscii( SD_LT_SEPARATOR ));
399cdf0e10cSrcweir
400cdf0e10cSrcweir if (aTest == *pLayout)
401cdf0e10cSrcweir bFound = sal_True;
402cdf0e10cSrcweir }
403cdf0e10cSrcweir
404cdf0e10cSrcweir if (!bFound)
405cdf0e10cSrcweir mpLayoutsToTransfer->Insert(pLayout, LIST_APPEND);
406cdf0e10cSrcweir else
407cdf0e10cSrcweir delete pLayout;
408cdf0e10cSrcweir }
409cdf0e10cSrcweir
410cdf0e10cSrcweir /** Just add one page to the container given to the constructor.
411cdf0e10cSrcweir */
412cdf0e10cSrcweir class InsertBookmarkAsPage_AddBookmarkedPages
413cdf0e10cSrcweir : public SdDrawDocument::InsertBookmarkAsPage_PageFunctorBase
414cdf0e10cSrcweir {
415cdf0e10cSrcweir public:
InsertBookmarkAsPage_AddBookmarkedPages(::std::vector<SdPage * > & rContainer)416cdf0e10cSrcweir InsertBookmarkAsPage_AddBookmarkedPages(::std::vector<SdPage*>& rContainer)
417cdf0e10cSrcweir : mrContainer(rContainer) {}
~InsertBookmarkAsPage_AddBookmarkedPages(void)418cdf0e10cSrcweir ~InsertBookmarkAsPage_AddBookmarkedPages(void) {}
operator ()(SdDrawDocument &,SdPage * pPage)419cdf0e10cSrcweir void operator() (SdDrawDocument&, SdPage* pPage) { mrContainer.push_back(pPage); }
420cdf0e10cSrcweir private:
421cdf0e10cSrcweir ::std::vector<SdPage*>& mrContainer;
422cdf0e10cSrcweir };
423cdf0e10cSrcweir
424cdf0e10cSrcweir
InsertBookmarkAsPage(List * pBookmarkList,List * pExchangeList,sal_Bool bLink,sal_Bool bReplace,sal_uInt16 nInsertPos,sal_Bool bNoDialogs,::sd::DrawDocShell * pBookmarkDocSh,sal_Bool bCopy,sal_Bool bMergeMasterPages,sal_Bool bPreservePageNames)425cdf0e10cSrcweir sal_Bool SdDrawDocument::InsertBookmarkAsPage(
426cdf0e10cSrcweir List* pBookmarkList,
427cdf0e10cSrcweir List* pExchangeList, // Liste der zu verwendenen Namen
428cdf0e10cSrcweir sal_Bool bLink,
429cdf0e10cSrcweir sal_Bool bReplace,
430cdf0e10cSrcweir sal_uInt16 nInsertPos,
431cdf0e10cSrcweir sal_Bool bNoDialogs,
432cdf0e10cSrcweir ::sd::DrawDocShell* pBookmarkDocSh,
433cdf0e10cSrcweir sal_Bool bCopy,
434cdf0e10cSrcweir sal_Bool bMergeMasterPages,
435cdf0e10cSrcweir sal_Bool bPreservePageNames)
436cdf0e10cSrcweir {
437cdf0e10cSrcweir sal_Bool bOK = sal_True;
438cdf0e10cSrcweir sal_Bool bContinue = sal_True;
439cdf0e10cSrcweir sal_Bool bScaleObjects = sal_False;
440cdf0e10cSrcweir sal_uInt16 nReplacedStandardPages = 0;
441cdf0e10cSrcweir
442cdf0e10cSrcweir SdDrawDocument* pBookmarkDoc = NULL;
443cdf0e10cSrcweir String aBookmarkName;
444cdf0e10cSrcweir
445cdf0e10cSrcweir if (pBookmarkDocSh)
446cdf0e10cSrcweir {
447cdf0e10cSrcweir pBookmarkDoc = pBookmarkDocSh->GetDoc();
448cdf0e10cSrcweir
449cdf0e10cSrcweir if (pBookmarkDocSh->GetMedium())
450cdf0e10cSrcweir {
451cdf0e10cSrcweir aBookmarkName = pBookmarkDocSh->GetMedium()->GetName();
452cdf0e10cSrcweir }
453cdf0e10cSrcweir }
454cdf0e10cSrcweir else if ( mxBookmarkDocShRef.Is() )
455cdf0e10cSrcweir {
456cdf0e10cSrcweir pBookmarkDoc = mxBookmarkDocShRef->GetDoc();
457cdf0e10cSrcweir aBookmarkName = maBookmarkFile;
458cdf0e10cSrcweir }
459cdf0e10cSrcweir else
460cdf0e10cSrcweir {
461cdf0e10cSrcweir return sal_False;
462cdf0e10cSrcweir }
463cdf0e10cSrcweir
464cdf0e10cSrcweir const sal_uInt16 nSdPageCount = GetSdPageCount(PK_STANDARD);
465cdf0e10cSrcweir const sal_uInt16 nBMSdPageCount = pBookmarkDoc->GetSdPageCount(PK_STANDARD);
466cdf0e10cSrcweir const sal_uInt16 nMPageCount = GetMasterPageCount();
467cdf0e10cSrcweir
468cdf0e10cSrcweir if (nSdPageCount==0 || nBMSdPageCount==0 || nMPageCount==0)
469cdf0e10cSrcweir {
470cdf0e10cSrcweir bContinue = bOK = sal_False;
471cdf0e10cSrcweir return(bContinue);
472cdf0e10cSrcweir }
473cdf0e10cSrcweir
474cdf0e10cSrcweir // Store the size and some other properties of the first page and notes
475cdf0e10cSrcweir // page so that inserted pages can be properly scaled even when inserted
476cdf0e10cSrcweir // before the first page.
477cdf0e10cSrcweir // Note that the pointers are used later on as general page pointers.
478cdf0e10cSrcweir SdPage* pRefPage = GetSdPage(0, PK_STANDARD);
479cdf0e10cSrcweir Size aSize(pRefPage->GetSize());
480cdf0e10cSrcweir sal_Int32 nLeft = pRefPage->GetLftBorder();
481cdf0e10cSrcweir sal_Int32 nRight = pRefPage->GetRgtBorder();
482cdf0e10cSrcweir sal_Int32 nUpper = pRefPage->GetUppBorder();
483cdf0e10cSrcweir sal_Int32 nLower = pRefPage->GetLwrBorder();
484cdf0e10cSrcweir Orientation eOrient = pRefPage->GetOrientation();
485cdf0e10cSrcweir
486cdf0e10cSrcweir SdPage* pNPage = GetSdPage(0, PK_NOTES);
487cdf0e10cSrcweir Size aNSize(GetSdPage(0, PK_NOTES)->GetSize());
488cdf0e10cSrcweir sal_Int32 nNLeft = pNPage->GetLftBorder();
489cdf0e10cSrcweir sal_Int32 nNRight = pNPage->GetRgtBorder();
490cdf0e10cSrcweir sal_Int32 nNUpper = pNPage->GetUppBorder();
491cdf0e10cSrcweir sal_Int32 nNLower = pNPage->GetLwrBorder();
492cdf0e10cSrcweir Orientation eNOrient = pRefPage->GetOrientation();
493cdf0e10cSrcweir
494cdf0e10cSrcweir // Seitengroesse und -raender an die Werte der letzten
495cdf0e10cSrcweir // Seiten anpassen?
496cdf0e10cSrcweir pRefPage = GetSdPage(nSdPageCount - 1, PK_STANDARD);
497cdf0e10cSrcweir
498cdf0e10cSrcweir if( bNoDialogs )
499cdf0e10cSrcweir {
500cdf0e10cSrcweir if( !pBookmarkList )
501cdf0e10cSrcweir bScaleObjects = pRefPage->IsScaleObjects();
502cdf0e10cSrcweir else
503cdf0e10cSrcweir bScaleObjects = sal_True;
504cdf0e10cSrcweir }
505cdf0e10cSrcweir else
506cdf0e10cSrcweir {
507cdf0e10cSrcweir SdPage* pBMPage = pBookmarkDoc->GetSdPage(0,PK_STANDARD);
508cdf0e10cSrcweir
509cdf0e10cSrcweir if (pBMPage->GetSize() != pRefPage->GetSize() ||
510cdf0e10cSrcweir pBMPage->GetLftBorder() != pRefPage->GetLftBorder() ||
511cdf0e10cSrcweir pBMPage->GetRgtBorder() != pRefPage->GetRgtBorder() ||
512cdf0e10cSrcweir pBMPage->GetUppBorder() != pRefPage->GetUppBorder() ||
513cdf0e10cSrcweir pBMPage->GetLwrBorder() != pRefPage->GetLwrBorder())
514cdf0e10cSrcweir {
515cdf0e10cSrcweir String aStr(SdResId(STR_SCALE_OBJECTS));
516cdf0e10cSrcweir sal_uInt16 nBut = QueryBox( NULL, WB_YES_NO_CANCEL, aStr).Execute();
517cdf0e10cSrcweir
518cdf0e10cSrcweir bScaleObjects = nBut == RET_YES;
519cdf0e10cSrcweir bContinue = nBut != RET_CANCEL;
520cdf0e10cSrcweir
521cdf0e10cSrcweir if (!bContinue)
522cdf0e10cSrcweir {
523cdf0e10cSrcweir return(bContinue);
524cdf0e10cSrcweir }
525cdf0e10cSrcweir }
526cdf0e10cSrcweir }
527cdf0e10cSrcweir
528cdf0e10cSrcweir
529cdf0e10cSrcweir /**************************************************************************
530cdf0e10cSrcweir |* Die benoetigten Praesentations-StyleSheets ermitteln und vor
531cdf0e10cSrcweir |* den Seiten transferieren, sonst verlieren die Textobjekte
532cdf0e10cSrcweir |* beim Transfer den Bezug zur Vorlage
533cdf0e10cSrcweir \*************************************************************************/
534cdf0e10cSrcweir ::svl::IUndoManager* pUndoMgr = NULL;
535cdf0e10cSrcweir if( mpDocSh )
536cdf0e10cSrcweir {
537cdf0e10cSrcweir pUndoMgr = mpDocSh->GetUndoManager();
538cdf0e10cSrcweir pUndoMgr->EnterListAction(String(SdResId(STR_UNDO_INSERTPAGES)), String());
539cdf0e10cSrcweir }
540cdf0e10cSrcweir
541cdf0e10cSrcweir List* pLayoutsToTransfer = new List;
542cdf0e10cSrcweir
543cdf0e10cSrcweir //
544cdf0e10cSrcweir // #96029# Refactored copy'n'pasted layout name collection into IterateBookmarkPages
545cdf0e10cSrcweir //
546cdf0e10cSrcweir InsertBookmarkAsPage_FindDuplicateLayouts aSearchFunctor( pLayoutsToTransfer, pBookmarkDoc,
547cdf0e10cSrcweir pBookmarkList, nBMSdPageCount );
548cdf0e10cSrcweir IterateBookmarkPages( pBookmarkDoc, pBookmarkList, nBMSdPageCount, aSearchFunctor );
549cdf0e10cSrcweir
550cdf0e10cSrcweir
551cdf0e10cSrcweir /**************************************************************************
552cdf0e10cSrcweir * Die tatsaechlich benoetigten Vorlagen kopieren
553cdf0e10cSrcweir **************************************************************************/
554cdf0e10cSrcweir SdStyleSheetPool* pBookmarkStyleSheetPool =
555cdf0e10cSrcweir (SdStyleSheetPool*) pBookmarkDoc->GetStyleSheetPool();
556cdf0e10cSrcweir String* pLayout = (String*) pLayoutsToTransfer->First();
557cdf0e10cSrcweir
558cdf0e10cSrcweir // Wenn Vorlagen kopiert werden muessen, dann muessen auch die
559cdf0e10cSrcweir // MasterPages kopiert werden!
560cdf0e10cSrcweir if( pLayout )
561cdf0e10cSrcweir bMergeMasterPages = sal_True;
562cdf0e10cSrcweir
563cdf0e10cSrcweir while (pLayout)
564cdf0e10cSrcweir {
565cdf0e10cSrcweir SdStyleSheetVector aCreatedStyles;
566cdf0e10cSrcweir
567cdf0e10cSrcweir ((SdStyleSheetPool*)GetStyleSheetPool())->CopyLayoutSheets(*pLayout, *pBookmarkStyleSheetPool,aCreatedStyles);
568cdf0e10cSrcweir
569cdf0e10cSrcweir if(!aCreatedStyles.empty())
570cdf0e10cSrcweir {
571cdf0e10cSrcweir if( pUndoMgr )
572cdf0e10cSrcweir {
573cdf0e10cSrcweir SdMoveStyleSheetsUndoAction* pMovStyles = new SdMoveStyleSheetsUndoAction(this, aCreatedStyles, sal_True);
574cdf0e10cSrcweir pUndoMgr->AddUndoAction(pMovStyles);
575cdf0e10cSrcweir }
576cdf0e10cSrcweir }
577cdf0e10cSrcweir
578cdf0e10cSrcweir delete pLayout;
579cdf0e10cSrcweir
580cdf0e10cSrcweir pLayout = (String*)pLayoutsToTransfer->Next();
581cdf0e10cSrcweir }
582cdf0e10cSrcweir
583cdf0e10cSrcweir delete pLayoutsToTransfer;
584cdf0e10cSrcweir
585cdf0e10cSrcweir /**************************************************************************
586cdf0e10cSrcweir * Dokument einfuegen
587cdf0e10cSrcweir **************************************************************************/
588cdf0e10cSrcweir
589cdf0e10cSrcweir const bool bUndo = IsUndoEnabled();
590cdf0e10cSrcweir
591cdf0e10cSrcweir if( bUndo )
592cdf0e10cSrcweir BegUndo(String(SdResId(STR_UNDO_INSERTPAGES)));
593cdf0e10cSrcweir
594cdf0e10cSrcweir if (!pBookmarkList)
595cdf0e10cSrcweir {
596cdf0e10cSrcweir if (nInsertPos >= GetPageCount())
597cdf0e10cSrcweir {
598cdf0e10cSrcweir // Seiten werden hinten angefuegt
599cdf0e10cSrcweir nInsertPos = GetPageCount();
600cdf0e10cSrcweir }
601cdf0e10cSrcweir
602cdf0e10cSrcweir sal_uInt16 nActualInsertPos = nInsertPos;
603cdf0e10cSrcweir
604cdf0e10cSrcweir List aNameList;
605cdf0e10cSrcweir std::set<sal_uInt16> aRenameSet;
606cdf0e10cSrcweir sal_uInt16 nBMSdPage;
607cdf0e10cSrcweir
608cdf0e10cSrcweir for (nBMSdPage=0; nBMSdPage < nBMSdPageCount; nBMSdPage++)
609cdf0e10cSrcweir {
610cdf0e10cSrcweir SdPage* pBMPage = pBookmarkDoc->GetSdPage(nBMSdPage, PK_STANDARD);
611cdf0e10cSrcweir String pName( pBMPage->GetName() );
612cdf0e10cSrcweir sal_Bool bIsMasterPage;
613cdf0e10cSrcweir
614cdf0e10cSrcweir if (bLink)
615cdf0e10cSrcweir {
616cdf0e10cSrcweir // Es werden sich die Namen aller Seiten gemerkt
617cdf0e10cSrcweir aNameList.Insert(new String(pName), nBMSdPage);
618cdf0e10cSrcweir }
619cdf0e10cSrcweir
620cdf0e10cSrcweir // #95677# Have to check for duplicate names here, too
621cdf0e10cSrcweir // #67905# don't change name if source and dest model are the same!
622cdf0e10cSrcweir if( pBookmarkDoc != this &&
623cdf0e10cSrcweir GetPageByName(pName, bIsMasterPage ) != SDRPAGE_NOTFOUND )
624cdf0e10cSrcweir {
625cdf0e10cSrcweir // #95991# delay renaming *after* pages are copied (might destroy source otherwise)
626cdf0e10cSrcweir aRenameSet.insert(nBMSdPage);
627cdf0e10cSrcweir }
628cdf0e10cSrcweir }
629cdf0e10cSrcweir
630cdf0e10cSrcweir Merge(*pBookmarkDoc,
631cdf0e10cSrcweir 1, // Nicht die Handzettelseite
632cdf0e10cSrcweir 0xFFFF, // Aber alle anderen
633cdf0e10cSrcweir nActualInsertPos, // An Position einfuegen
634cdf0e10cSrcweir bMergeMasterPages, // MasterPages mitnehmen
635cdf0e10cSrcweir sal_False, // Aber nur die benoetigten MasterPages
636cdf0e10cSrcweir sal_True, // Undo-Aktion erzeugen
637cdf0e10cSrcweir bCopy); // Seiten kopieren (oder mergen)
638cdf0e10cSrcweir
639cdf0e10cSrcweir for (nBMSdPage=0; nBMSdPage < nBMSdPageCount; nBMSdPage++)
640cdf0e10cSrcweir {
641cdf0e10cSrcweir SdPage* pPage = (SdPage*) GetPage(nActualInsertPos);
642cdf0e10cSrcweir SdPage* pNotesPage = (SdPage*) GetPage(nActualInsertPos+1);
643cdf0e10cSrcweir String* pName = (String*) aNameList.GetObject(nBMSdPage);
644cdf0e10cSrcweir
645cdf0e10cSrcweir // #95991# delay renaming *after* pages are copied (might destroy source otherwise)
646cdf0e10cSrcweir if( aRenameSet.find(nBMSdPage) != aRenameSet.end() )
647cdf0e10cSrcweir {
648cdf0e10cSrcweir // Seitenname schon vorhanden -> Defaultname
649cdf0e10cSrcweir // fuer Standard & Notizseite
650cdf0e10cSrcweir pPage->SetName(String());
651cdf0e10cSrcweir pNotesPage->SetName(String());
652cdf0e10cSrcweir }
653cdf0e10cSrcweir
654cdf0e10cSrcweir if (bLink)
655cdf0e10cSrcweir {
656cdf0e10cSrcweir // Nun werden die Link-Namen zusammengestellt
657cdf0e10cSrcweir pPage->SetFileName(aBookmarkName);
658cdf0e10cSrcweir pPage->SetBookmarkName(*(pName));
659cdf0e10cSrcweir delete pName;
660cdf0e10cSrcweir pPage->SetModel(this);
661cdf0e10cSrcweir }
662cdf0e10cSrcweir
663cdf0e10cSrcweir nActualInsertPos += 2;
664cdf0e10cSrcweir }
665cdf0e10cSrcweir }
666cdf0e10cSrcweir else
667cdf0e10cSrcweir {
668cdf0e10cSrcweir /**********************************************************************
669cdf0e10cSrcweir * Ausgewaehlte Seiten einfuegen
670cdf0e10cSrcweir **********************************************************************/
671cdf0e10cSrcweir SdPage* pBMPage;
672cdf0e10cSrcweir
673cdf0e10cSrcweir if (nInsertPos >= GetPageCount())
674cdf0e10cSrcweir {
675cdf0e10cSrcweir // Seiten werden hinten angefuegt
676cdf0e10cSrcweir bReplace = sal_False;
677cdf0e10cSrcweir nInsertPos = GetPageCount();
678cdf0e10cSrcweir }
679cdf0e10cSrcweir
680cdf0e10cSrcweir sal_uInt16 nActualInsertPos = nInsertPos;
681cdf0e10cSrcweir
682cdf0e10cSrcweir // Collect the bookmarked pages.
683cdf0e10cSrcweir ::std::vector<SdPage*> aBookmarkedPages (pBookmarkList->Count(), NULL);
684cdf0e10cSrcweir for (sal_uInt16 nPos = 0; nPos < pBookmarkList->Count(); nPos++)
685cdf0e10cSrcweir {
686cdf0e10cSrcweir String aPgName(*(String*) pBookmarkList->GetObject(nPos));
687cdf0e10cSrcweir sal_Bool bIsMasterPage;
688cdf0e10cSrcweir sal_uInt16 nBMPage = pBookmarkDoc->GetPageByName( aPgName, bIsMasterPage );
689cdf0e10cSrcweir
690cdf0e10cSrcweir if (nBMPage != SDRPAGE_NOTFOUND)
691cdf0e10cSrcweir {
692cdf0e10cSrcweir aBookmarkedPages[nPos] = dynamic_cast<SdPage*>(pBookmarkDoc->GetPage(nBMPage));
693cdf0e10cSrcweir }
694cdf0e10cSrcweir }
695cdf0e10cSrcweir
696cdf0e10cSrcweir for (sal_uInt16 nPos = 0; nPos < pBookmarkList->Count(); nPos++)
697cdf0e10cSrcweir {
698cdf0e10cSrcweir pBMPage = aBookmarkedPages[nPos];
699cdf0e10cSrcweir sal_uInt16 nBMPage = pBMPage!=NULL ? pBMPage->GetPageNum() : SDRPAGE_NOTFOUND;
700cdf0e10cSrcweir
701cdf0e10cSrcweir if (pBMPage && pBMPage->GetPageKind()==PK_STANDARD && !pBMPage->IsMasterPage())
702cdf0e10cSrcweir {
703cdf0e10cSrcweir /**************************************************************
704cdf0e10cSrcweir * Es muss eine StandardSeite sein
705cdf0e10cSrcweir **************************************************************/
706cdf0e10cSrcweir sal_Bool bMustRename = sal_False;
707cdf0e10cSrcweir
708cdf0e10cSrcweir // #95991# delay renaming *after* pages are copied (might destroy source otherwise)
709cdf0e10cSrcweir // #67905# don't change name if source and dest model are the same!
710cdf0e10cSrcweir // #96029# avoid renaming if replacing the same page
711cdf0e10cSrcweir String aPgName(*(String*) pBookmarkList->GetObject(nPos));
712cdf0e10cSrcweir sal_Bool bIsMasterPage;
713cdf0e10cSrcweir sal_uInt16 nPageSameName = GetPageByName(aPgName, bIsMasterPage);
714cdf0e10cSrcweir if( pBookmarkDoc != this &&
715cdf0e10cSrcweir nPageSameName != SDRPAGE_NOTFOUND &&
716cdf0e10cSrcweir ( !bReplace ||
717cdf0e10cSrcweir nPageSameName != nActualInsertPos ) )
718cdf0e10cSrcweir {
719cdf0e10cSrcweir bMustRename = sal_True;
720cdf0e10cSrcweir }
721cdf0e10cSrcweir
722cdf0e10cSrcweir SdPage* pBookmarkPage = pBMPage;
723cdf0e10cSrcweir if (bReplace )
724cdf0e10cSrcweir {
725cdf0e10cSrcweir ReplacePageInCustomShows( dynamic_cast< SdPage* >( GetPage( nActualInsertPos ) ), pBookmarkPage );
726cdf0e10cSrcweir }
727cdf0e10cSrcweir
728cdf0e10cSrcweir Merge(*pBookmarkDoc,
729cdf0e10cSrcweir nBMPage, // Von Seite (Standard)
730cdf0e10cSrcweir nBMPage+1, // Bis Seite (Notizen)
731cdf0e10cSrcweir nActualInsertPos, // An Position einfuegen
732cdf0e10cSrcweir bMergeMasterPages, // MasterPages mitnehmen
733cdf0e10cSrcweir sal_False, // Aber nur die benoetigten MasterPages
734cdf0e10cSrcweir sal_True, // Undo-Aktion erzeugen
735cdf0e10cSrcweir bCopy); // Seiten kopieren (oder mergen)
736cdf0e10cSrcweir
737cdf0e10cSrcweir if( bReplace )
738cdf0e10cSrcweir {
739cdf0e10cSrcweir if( GetPage( nActualInsertPos ) != pBookmarkPage )
740cdf0e10cSrcweir {
741cdf0e10cSrcweir // bookmark page was not moved but cloned, so update custom shows again
742cdf0e10cSrcweir ReplacePageInCustomShows( pBookmarkPage, dynamic_cast< SdPage* >( GetPage( nActualInsertPos ) ) );
743cdf0e10cSrcweir }
744cdf0e10cSrcweir }
745cdf0e10cSrcweir
746cdf0e10cSrcweir if( bMustRename )
747cdf0e10cSrcweir {
748cdf0e10cSrcweir // Seitenname schon vorhanden -> Defaultname
749cdf0e10cSrcweir // fuer Standard & Notizseite
750cdf0e10cSrcweir SdPage* pPage = (SdPage*) GetPage(nActualInsertPos);
751cdf0e10cSrcweir pPage->SetName(String());
752cdf0e10cSrcweir SdPage* pNotesPage = (SdPage*) GetPage(nActualInsertPos+1);
753cdf0e10cSrcweir pNotesPage->SetName(String());
754cdf0e10cSrcweir }
755cdf0e10cSrcweir
756cdf0e10cSrcweir if (bLink)
757cdf0e10cSrcweir {
758cdf0e10cSrcweir SdPage* pPage = (SdPage*) GetPage(nActualInsertPos);
759cdf0e10cSrcweir pPage->SetFileName(aBookmarkName);
760cdf0e10cSrcweir pPage->SetBookmarkName(aPgName);
761cdf0e10cSrcweir pPage->SetModel(this);
762cdf0e10cSrcweir }
763cdf0e10cSrcweir
764cdf0e10cSrcweir if (bReplace)
765cdf0e10cSrcweir {
766cdf0e10cSrcweir // Seite & Notizseite ausfuegen
767cdf0e10cSrcweir const sal_uInt16 nDestPageNum(nActualInsertPos + 2);
768cdf0e10cSrcweir SdPage* pStandardPage = 0L;
769cdf0e10cSrcweir
770cdf0e10cSrcweir if(nDestPageNum < GetPageCount())
771cdf0e10cSrcweir {
772cdf0e10cSrcweir pStandardPage = (SdPage*)GetPage(nDestPageNum);
773cdf0e10cSrcweir }
774cdf0e10cSrcweir
775cdf0e10cSrcweir if (pStandardPage)
776cdf0e10cSrcweir {
777cdf0e10cSrcweir if( bPreservePageNames )
778cdf0e10cSrcweir {
779cdf0e10cSrcweir // #96029# Take old slide names for inserted pages
780cdf0e10cSrcweir SdPage* pPage = (SdPage*) GetPage(nActualInsertPos);
781cdf0e10cSrcweir pPage->SetName( pStandardPage->GetRealName() );
782cdf0e10cSrcweir }
783cdf0e10cSrcweir
784cdf0e10cSrcweir if( bUndo )
785cdf0e10cSrcweir AddUndo(GetSdrUndoFactory().CreateUndoDeletePage(*pStandardPage));
786cdf0e10cSrcweir
787cdf0e10cSrcweir RemovePage(nDestPageNum);
788cdf0e10cSrcweir
789cdf0e10cSrcweir if( !bUndo )
790cdf0e10cSrcweir delete pStandardPage;
791cdf0e10cSrcweir }
792cdf0e10cSrcweir
793cdf0e10cSrcweir SdPage* pNotesPage = 0L;
794cdf0e10cSrcweir
795cdf0e10cSrcweir if(nDestPageNum < GetPageCount())
796cdf0e10cSrcweir {
797cdf0e10cSrcweir pNotesPage = (SdPage*)GetPage(nDestPageNum);
798cdf0e10cSrcweir }
799cdf0e10cSrcweir
800cdf0e10cSrcweir if (pNotesPage)
801cdf0e10cSrcweir {
802cdf0e10cSrcweir if( bPreservePageNames )
803cdf0e10cSrcweir {
804cdf0e10cSrcweir // #96029# Take old slide names for inserted pages
805cdf0e10cSrcweir SdPage* pNewNotesPage = (SdPage*) GetPage(nActualInsertPos+1);
806cdf0e10cSrcweir if( pNewNotesPage )
807cdf0e10cSrcweir pNewNotesPage->SetName( pStandardPage->GetRealName() );
808cdf0e10cSrcweir }
809cdf0e10cSrcweir
810cdf0e10cSrcweir if( bUndo )
811cdf0e10cSrcweir AddUndo(GetSdrUndoFactory().CreateUndoDeletePage(*pNotesPage));
812cdf0e10cSrcweir
813cdf0e10cSrcweir RemovePage(nDestPageNum);
814cdf0e10cSrcweir
815cdf0e10cSrcweir if( !bUndo )
816cdf0e10cSrcweir delete pNotesPage;
817cdf0e10cSrcweir }
818cdf0e10cSrcweir
819cdf0e10cSrcweir nReplacedStandardPages++;
820cdf0e10cSrcweir }
821cdf0e10cSrcweir
822cdf0e10cSrcweir nActualInsertPos += 2;
823cdf0e10cSrcweir }
824cdf0e10cSrcweir }
825cdf0e10cSrcweir }
826cdf0e10cSrcweir
827cdf0e10cSrcweir
828cdf0e10cSrcweir /**************************************************************************
829cdf0e10cSrcweir |* Dabei sind evtl. zu viele Masterpages ruebergekommen, da die
830cdf0e10cSrcweir |* DrawingEngine gleiche Praesentationslayouts nicht erkennen kann.
831cdf0e10cSrcweir |* Ueberzaehlige MasterPages entfernen.
832cdf0e10cSrcweir \*************************************************************************/
833cdf0e10cSrcweir sal_uInt16 nNewMPageCount = GetMasterPageCount();
834cdf0e10cSrcweir
835cdf0e10cSrcweir // rueckwaerts, damit Nummern nicht durcheinander geraten
836cdf0e10cSrcweir for (sal_uInt16 nPage = nNewMPageCount - 1; nPage >= nMPageCount; nPage--)
837cdf0e10cSrcweir {
838cdf0e10cSrcweir pRefPage = (SdPage*) GetMasterPage(nPage);
839cdf0e10cSrcweir String aMPLayout(pRefPage->GetLayoutName());
840cdf0e10cSrcweir PageKind eKind = pRefPage->GetPageKind();
841cdf0e10cSrcweir
842cdf0e10cSrcweir // gibt's den schon?
843cdf0e10cSrcweir for (sal_uInt16 nTest = 0; nTest < nMPageCount; nTest++)
844cdf0e10cSrcweir {
845cdf0e10cSrcweir SdPage* pTest = (SdPage*) GetMasterPage(nTest);
846cdf0e10cSrcweir String aTest(pTest->GetLayoutName());
847cdf0e10cSrcweir
848cdf0e10cSrcweir // #96029# nInsertPos > 2 is always true when inserting into non-empty models
849cdf0e10cSrcweir if ( nInsertPos > 2 &&
850cdf0e10cSrcweir aTest == aMPLayout &&
851cdf0e10cSrcweir eKind == pTest->GetPageKind() )
852cdf0e10cSrcweir {
853cdf0e10cSrcweir if( bUndo )
854cdf0e10cSrcweir AddUndo(GetSdrUndoFactory().CreateUndoDeletePage(*pRefPage));
855cdf0e10cSrcweir
856cdf0e10cSrcweir RemoveMasterPage(nPage);
857cdf0e10cSrcweir
858cdf0e10cSrcweir if( !bUndo )
859cdf0e10cSrcweir delete pRefPage;
860cdf0e10cSrcweir nNewMPageCount--;
861cdf0e10cSrcweir break;
862cdf0e10cSrcweir }
863cdf0e10cSrcweir }
864cdf0e10cSrcweir }
865cdf0e10cSrcweir
866cdf0e10cSrcweir // #96029# nInsertPos > 2 is always true when inserting into non-empty models
867cdf0e10cSrcweir if (nInsertPos > 0)
868cdf0e10cSrcweir {
869cdf0e10cSrcweir sal_uInt16 nSdPageStart = (nInsertPos - 1) / 2;
870cdf0e10cSrcweir sal_uInt16 nSdPageEnd = GetSdPageCount(PK_STANDARD) - nSdPageCount +
871cdf0e10cSrcweir nSdPageStart - 1;
872cdf0e10cSrcweir const bool bRemoveEmptyPresObj = pBookmarkDoc &&
873cdf0e10cSrcweir (pBookmarkDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS) &&
874cdf0e10cSrcweir (GetDocumentType() == DOCUMENT_TYPE_DRAW);
875cdf0e10cSrcweir
876cdf0e10cSrcweir if( bReplace )
877cdf0e10cSrcweir {
878cdf0e10cSrcweir nSdPageEnd = nSdPageStart + nReplacedStandardPages - 1;
879cdf0e10cSrcweir }
880cdf0e10cSrcweir
881cdf0e10cSrcweir for (sal_uInt16 nSdPage = nSdPageStart; nSdPage <= nSdPageEnd; nSdPage++)
882cdf0e10cSrcweir {
883cdf0e10cSrcweir pRefPage = GetSdPage(nSdPage, PK_STANDARD);
884cdf0e10cSrcweir
885cdf0e10cSrcweir if (pExchangeList)
886cdf0e10cSrcweir {
887cdf0e10cSrcweir // Zuverwendener Name aus Exchange-Liste holen
888cdf0e10cSrcweir if (pExchangeList->GetCurObject())
889cdf0e10cSrcweir {
890cdf0e10cSrcweir String aExchangeName (*(String*) pExchangeList->GetCurObject());
891cdf0e10cSrcweir pRefPage->SetName(aExchangeName);
892cdf0e10cSrcweir SdrHint aHint(HINT_PAGEORDERCHG);
893cdf0e10cSrcweir aHint.SetPage(pRefPage);
894cdf0e10cSrcweir Broadcast(aHint);
895cdf0e10cSrcweir SdPage* pNewNotesPage = GetSdPage(nSdPage, PK_NOTES);
896cdf0e10cSrcweir pNewNotesPage->SetName(aExchangeName);
897cdf0e10cSrcweir aHint.SetPage(pNewNotesPage);
898cdf0e10cSrcweir Broadcast(aHint);
899cdf0e10cSrcweir }
900cdf0e10cSrcweir
901cdf0e10cSrcweir pExchangeList->Next();
902cdf0e10cSrcweir }
903cdf0e10cSrcweir
904cdf0e10cSrcweir String aLayout(pRefPage->GetLayoutName());
905cdf0e10cSrcweir aLayout.Erase(aLayout.SearchAscii( SD_LT_SEPARATOR ));
906cdf0e10cSrcweir
907cdf0e10cSrcweir // update layout and referred master page
908cdf0e10cSrcweir pRefPage->SetPresentationLayout(aLayout);
909cdf0e10cSrcweir if( bUndo )
910cdf0e10cSrcweir AddUndo( GetSdrUndoFactory().CreateUndoPageChangeMasterPage( *pRefPage ) );
911cdf0e10cSrcweir
912cdf0e10cSrcweir if (bScaleObjects)
913cdf0e10cSrcweir {
914cdf0e10cSrcweir Rectangle aBorderRect(nLeft, nUpper, nRight, nLower);
915cdf0e10cSrcweir pRefPage->ScaleObjects(aSize, aBorderRect, sal_True);
916cdf0e10cSrcweir }
917cdf0e10cSrcweir pRefPage->SetSize(aSize);
918cdf0e10cSrcweir pRefPage->SetBorder(nLeft, nUpper, nRight, nLower);
919cdf0e10cSrcweir pRefPage->SetOrientation( eOrient );
920cdf0e10cSrcweir
921cdf0e10cSrcweir if( bRemoveEmptyPresObj )
922cdf0e10cSrcweir pRefPage->RemoveEmptyPresentationObjects();
923cdf0e10cSrcweir
924cdf0e10cSrcweir pRefPage = GetSdPage(nSdPage, PK_NOTES);
925cdf0e10cSrcweir
926cdf0e10cSrcweir // update layout and referred master page
927cdf0e10cSrcweir pRefPage->SetPresentationLayout(aLayout);
928cdf0e10cSrcweir if( bUndo )
929cdf0e10cSrcweir AddUndo( GetSdrUndoFactory().CreateUndoPageChangeMasterPage( *pRefPage ) );
930cdf0e10cSrcweir
931cdf0e10cSrcweir if (bScaleObjects)
932cdf0e10cSrcweir {
933cdf0e10cSrcweir Rectangle aBorderRect(nNLeft, nNUpper, nNRight, nNLower);
934cdf0e10cSrcweir pRefPage->ScaleObjects(aNSize, aBorderRect, sal_True);
935cdf0e10cSrcweir }
936cdf0e10cSrcweir
937cdf0e10cSrcweir pRefPage->SetSize(aNSize);
938cdf0e10cSrcweir pRefPage->SetBorder(nNLeft, nNUpper, nNRight, nNLower);
939cdf0e10cSrcweir pRefPage->SetOrientation( eNOrient );
940cdf0e10cSrcweir
941cdf0e10cSrcweir if( bRemoveEmptyPresObj )
942cdf0e10cSrcweir pRefPage->RemoveEmptyPresentationObjects();
943cdf0e10cSrcweir }
944cdf0e10cSrcweir
945cdf0e10cSrcweir for (sal_uInt16 nPage = nMPageCount; nPage < nNewMPageCount; nPage++)
946cdf0e10cSrcweir {
947cdf0e10cSrcweir pRefPage = (SdPage*) GetMasterPage(nPage);
948cdf0e10cSrcweir if (pRefPage->GetPageKind() == PK_STANDARD)
949cdf0e10cSrcweir {
950cdf0e10cSrcweir if (bScaleObjects)
951cdf0e10cSrcweir {
952cdf0e10cSrcweir Rectangle aBorderRect(nLeft, nUpper, nRight, nLower);
953cdf0e10cSrcweir pRefPage->ScaleObjects(aSize, aBorderRect, sal_True);
954cdf0e10cSrcweir }
955cdf0e10cSrcweir pRefPage->SetSize(aSize);
956cdf0e10cSrcweir pRefPage->SetBorder(nLeft, nUpper, nRight, nLower);
957cdf0e10cSrcweir pRefPage->SetOrientation( eOrient );
958cdf0e10cSrcweir }
959cdf0e10cSrcweir else // kann nur noch NOTES sein
960cdf0e10cSrcweir {
961cdf0e10cSrcweir if (bScaleObjects)
962cdf0e10cSrcweir {
963cdf0e10cSrcweir Rectangle aBorderRect(nNLeft, nNUpper, nNRight, nNLower);
964cdf0e10cSrcweir pRefPage->ScaleObjects(aNSize, aBorderRect, sal_True);
965cdf0e10cSrcweir }
966cdf0e10cSrcweir pRefPage->SetSize(aNSize);
967cdf0e10cSrcweir pRefPage->SetBorder(nNLeft, nNUpper, nNRight, nNLower);
968cdf0e10cSrcweir pRefPage->SetOrientation( eNOrient );
969cdf0e10cSrcweir }
970cdf0e10cSrcweir
971cdf0e10cSrcweir if( bRemoveEmptyPresObj )
972cdf0e10cSrcweir pRefPage->RemoveEmptyPresentationObjects();
973cdf0e10cSrcweir }
974cdf0e10cSrcweir }
975cdf0e10cSrcweir
976cdf0e10cSrcweir // #91146# Make absolutely sure no double masterpages are there
977cdf0e10cSrcweir RemoveUnnecessaryMasterPages(NULL, sal_True, sal_True);
978cdf0e10cSrcweir
979cdf0e10cSrcweir if( bUndo )
980cdf0e10cSrcweir EndUndo();
981cdf0e10cSrcweir pUndoMgr->LeaveListAction();
982cdf0e10cSrcweir
983cdf0e10cSrcweir return bContinue;
984cdf0e10cSrcweir }
985cdf0e10cSrcweir
986cdf0e10cSrcweir /*************************************************************************
987cdf0e10cSrcweir |*
988cdf0e10cSrcweir |* Fuegt ein Bookmark als Objekt ein
989cdf0e10cSrcweir |*
990cdf0e10cSrcweir \************************************************************************/
991cdf0e10cSrcweir
InsertBookmarkAsObject(List * pBookmarkList,List * pExchangeList,sal_Bool,::sd::DrawDocShell * pBookmarkDocSh,Point * pObjPos)992cdf0e10cSrcweir sal_Bool SdDrawDocument::InsertBookmarkAsObject(
993cdf0e10cSrcweir List* pBookmarkList,
994cdf0e10cSrcweir List* pExchangeList, // Liste der zu verwendenen Namen
995cdf0e10cSrcweir sal_Bool /* bLink */,
996cdf0e10cSrcweir ::sd::DrawDocShell* pBookmarkDocSh,
997cdf0e10cSrcweir Point* pObjPos)
998cdf0e10cSrcweir {
999cdf0e10cSrcweir sal_Bool bOK = sal_True;
1000cdf0e10cSrcweir sal_Bool bOLEObjFound = sal_False;
1001cdf0e10cSrcweir ::sd::View* pBMView = NULL;
1002cdf0e10cSrcweir
1003cdf0e10cSrcweir SdDrawDocument* pBookmarkDoc = NULL;
1004cdf0e10cSrcweir String aBookmarkName;
1005cdf0e10cSrcweir
1006cdf0e10cSrcweir if (pBookmarkDocSh)
1007cdf0e10cSrcweir {
1008cdf0e10cSrcweir pBookmarkDoc = pBookmarkDocSh->GetDoc();
1009cdf0e10cSrcweir
1010cdf0e10cSrcweir if (pBookmarkDocSh->GetMedium())
1011cdf0e10cSrcweir {
1012cdf0e10cSrcweir aBookmarkName = pBookmarkDocSh->GetMedium()->GetName();
1013cdf0e10cSrcweir }
1014cdf0e10cSrcweir }
1015cdf0e10cSrcweir else if ( mxBookmarkDocShRef.Is() )
1016cdf0e10cSrcweir {
1017cdf0e10cSrcweir pBookmarkDoc = mxBookmarkDocShRef->GetDoc();
1018cdf0e10cSrcweir aBookmarkName = maBookmarkFile;
1019cdf0e10cSrcweir }
1020cdf0e10cSrcweir else
1021cdf0e10cSrcweir {
1022cdf0e10cSrcweir return sal_False;
1023cdf0e10cSrcweir }
1024cdf0e10cSrcweir
1025cdf0e10cSrcweir if (!pBookmarkList)
1026cdf0e10cSrcweir {
1027cdf0e10cSrcweir pBMView = new ::sd::View(pBookmarkDoc, (OutputDevice*) NULL);
1028cdf0e10cSrcweir pBMView->EndListening(*pBookmarkDoc);
1029cdf0e10cSrcweir pBMView->MarkAll();
1030cdf0e10cSrcweir }
1031cdf0e10cSrcweir else
1032cdf0e10cSrcweir {
1033cdf0e10cSrcweir SdrPage* pPage;
1034cdf0e10cSrcweir SdrPageView* pPV;
1035cdf0e10cSrcweir
1036cdf0e10cSrcweir for (sal_uInt16 nPos = 0; nPos < pBookmarkList->Count(); nPos++)
1037cdf0e10cSrcweir {
1038cdf0e10cSrcweir /******************************************************************
1039cdf0e10cSrcweir * Namen der Bookmarks aus Liste holen
1040cdf0e10cSrcweir ******************************************************************/
1041cdf0e10cSrcweir String aBMName (*(String*) pBookmarkList->GetObject(nPos));
1042cdf0e10cSrcweir
1043cdf0e10cSrcweir SdrObject* pObj = pBookmarkDoc->GetObj(aBMName);
1044cdf0e10cSrcweir
1045cdf0e10cSrcweir if (pObj)
1046cdf0e10cSrcweir {
1047cdf0e10cSrcweir // Objekt gefunden
1048cdf0e10cSrcweir
1049cdf0e10cSrcweir if (pObj->GetObjInventor() == SdrInventor &&
1050cdf0e10cSrcweir pObj->GetObjIdentifier() == OBJ_OLE2)
1051cdf0e10cSrcweir {
1052cdf0e10cSrcweir bOLEObjFound = sal_True;
1053cdf0e10cSrcweir }
1054cdf0e10cSrcweir
1055cdf0e10cSrcweir if (!pBMView)
1056cdf0e10cSrcweir {
1057cdf0e10cSrcweir // View erstmalig erzeugen
1058cdf0e10cSrcweir pBMView = new ::sd::View(pBookmarkDoc, (OutputDevice*) NULL);
1059cdf0e10cSrcweir pBMView->EndListening(*pBookmarkDoc);
1060cdf0e10cSrcweir }
1061cdf0e10cSrcweir
1062cdf0e10cSrcweir pPage = pObj->GetPage();
1063cdf0e10cSrcweir
1064cdf0e10cSrcweir if (pPage->IsMasterPage())
1065cdf0e10cSrcweir {
1066cdf0e10cSrcweir pPV = pBMView->ShowSdrPage(pBMView->GetModel()->GetMasterPage(pPage->GetPageNum()));
1067cdf0e10cSrcweir }
1068cdf0e10cSrcweir else
1069cdf0e10cSrcweir {
1070cdf0e10cSrcweir pPV = pBMView->GetSdrPageView();
1071cdf0e10cSrcweir if( !pPV || (pPV->GetPage() != pPage))
1072cdf0e10cSrcweir pPV = pBMView->ShowSdrPage(pPage);
1073cdf0e10cSrcweir }
1074cdf0e10cSrcweir
1075cdf0e10cSrcweir pBMView->MarkObj(pObj, pPV, sal_False);
1076cdf0e10cSrcweir }
1077cdf0e10cSrcweir }
1078cdf0e10cSrcweir }
1079cdf0e10cSrcweir
1080cdf0e10cSrcweir if (pBMView)
1081cdf0e10cSrcweir {
1082cdf0e10cSrcweir /**********************************************************************
1083cdf0e10cSrcweir * Selektierte Objekte einfuegen
1084cdf0e10cSrcweir **********************************************************************/
1085cdf0e10cSrcweir ::sd::View* pView = new ::sd::View(this, (OutputDevice*) NULL);
1086cdf0e10cSrcweir pView->EndListening(*this);
1087cdf0e10cSrcweir
1088cdf0e10cSrcweir // Seite bestimmen, auf der die Objekte eingefuegt werden sollen
1089cdf0e10cSrcweir SdrPage* pPage = GetSdPage(0, PK_STANDARD);
1090cdf0e10cSrcweir
1091cdf0e10cSrcweir if (mpDocSh)
1092cdf0e10cSrcweir {
1093cdf0e10cSrcweir ::sd::ViewShell* pViewSh = mpDocSh->GetViewShell();
1094cdf0e10cSrcweir
1095cdf0e10cSrcweir if (pViewSh)
1096cdf0e10cSrcweir {
1097cdf0e10cSrcweir // Welche Seite wird denn aktuell angezeigt?
1098cdf0e10cSrcweir SdrPageView* pPV = pViewSh->GetView()->GetSdrPageView();
1099cdf0e10cSrcweir
1100cdf0e10cSrcweir if (pPV)
1101cdf0e10cSrcweir {
1102cdf0e10cSrcweir pPage = pPV->GetPage();
1103cdf0e10cSrcweir }
1104cdf0e10cSrcweir else if (pViewSh->GetActualPage())
1105cdf0e10cSrcweir {
1106cdf0e10cSrcweir pPage = pViewSh->GetActualPage();
1107cdf0e10cSrcweir }
1108cdf0e10cSrcweir }
1109cdf0e10cSrcweir }
1110cdf0e10cSrcweir
1111cdf0e10cSrcweir Point aObjPos;
1112cdf0e10cSrcweir
1113cdf0e10cSrcweir if (pObjPos)
1114cdf0e10cSrcweir {
1115cdf0e10cSrcweir aObjPos = *pObjPos;
1116cdf0e10cSrcweir }
1117cdf0e10cSrcweir else
1118cdf0e10cSrcweir {
1119cdf0e10cSrcweir aObjPos = Rectangle(Point(), pPage->GetSize()).Center();
1120cdf0e10cSrcweir }
1121cdf0e10cSrcweir
1122cdf0e10cSrcweir sal_uLong nCountBefore = 0;
1123cdf0e10cSrcweir
1124cdf0e10cSrcweir if (pExchangeList)
1125cdf0e10cSrcweir {
1126cdf0e10cSrcweir // OrdNums sortieren und Anzahl Objekte vor dem Einfuegen bestimmen
1127cdf0e10cSrcweir pPage->RecalcObjOrdNums();
1128cdf0e10cSrcweir nCountBefore = pPage->GetObjCount();
1129cdf0e10cSrcweir }
1130cdf0e10cSrcweir
1131cdf0e10cSrcweir if (bOLEObjFound)
1132cdf0e10cSrcweir pBMView->GetDoc()->SetAllocDocSh(sal_True);
1133cdf0e10cSrcweir
1134cdf0e10cSrcweir SdDrawDocument* pTmpDoc = (SdDrawDocument*) pBMView->GetAllMarkedModel();
1135cdf0e10cSrcweir bOK = pView->Paste(*pTmpDoc, aObjPos, pPage);
1136cdf0e10cSrcweir
1137cdf0e10cSrcweir if (bOLEObjFound)
1138cdf0e10cSrcweir pBMView->GetDoc()->SetAllocDocSh(sal_False);
1139cdf0e10cSrcweir
1140cdf0e10cSrcweir if (!bOLEObjFound)
1141cdf0e10cSrcweir delete pTmpDoc; // Wird ansonsten von der DocShell zerstoert
1142cdf0e10cSrcweir
1143cdf0e10cSrcweir delete pView;
1144cdf0e10cSrcweir
1145cdf0e10cSrcweir List* pList = pBookmarkList;
1146cdf0e10cSrcweir
1147cdf0e10cSrcweir if (pExchangeList)
1148cdf0e10cSrcweir {
1149cdf0e10cSrcweir // Anzahl Objekte nach dem Einfuegen bestimmen
1150cdf0e10cSrcweir sal_uLong nCount = pPage->GetObjCount();
1151cdf0e10cSrcweir
1152cdf0e10cSrcweir for (sal_uLong nObj = nCountBefore; nObj < nCount; nObj++)
1153cdf0e10cSrcweir {
1154cdf0e10cSrcweir // Zuverwendener Name aus Exchange-Liste holen
1155cdf0e10cSrcweir if (pExchangeList->GetCurObject())
1156cdf0e10cSrcweir {
1157cdf0e10cSrcweir String aExchangeName (*(String*) pExchangeList->GetCurObject());
1158cdf0e10cSrcweir
1159cdf0e10cSrcweir if (pPage->GetObj(nObj))
1160cdf0e10cSrcweir {
1161cdf0e10cSrcweir pPage->GetObj(nObj)->SetName(aExchangeName);
1162cdf0e10cSrcweir }
1163cdf0e10cSrcweir }
1164cdf0e10cSrcweir
1165cdf0e10cSrcweir pExchangeList->Next();
1166cdf0e10cSrcweir }
1167cdf0e10cSrcweir
1168cdf0e10cSrcweir pList = pExchangeList;
1169cdf0e10cSrcweir }
1170cdf0e10cSrcweir }
1171cdf0e10cSrcweir
1172cdf0e10cSrcweir delete pBMView;
1173cdf0e10cSrcweir
1174cdf0e10cSrcweir return bOK;
1175cdf0e10cSrcweir }
1176cdf0e10cSrcweir
1177cdf0e10cSrcweir /*************************************************************************
1178cdf0e10cSrcweir |*
1179cdf0e10cSrcweir |* Beendet das Einfuegen von Bookmarks
1180cdf0e10cSrcweir |*
1181cdf0e10cSrcweir \************************************************************************/
1182cdf0e10cSrcweir
CloseBookmarkDoc()1183cdf0e10cSrcweir void SdDrawDocument::CloseBookmarkDoc()
1184cdf0e10cSrcweir {
1185cdf0e10cSrcweir if (mxBookmarkDocShRef.Is())
1186cdf0e10cSrcweir {
1187cdf0e10cSrcweir mxBookmarkDocShRef->DoClose();
1188cdf0e10cSrcweir }
1189cdf0e10cSrcweir
1190cdf0e10cSrcweir mxBookmarkDocShRef.Clear();
1191cdf0e10cSrcweir maBookmarkFile = String();
1192cdf0e10cSrcweir }
1193cdf0e10cSrcweir
1194cdf0e10cSrcweir /*************************************************************************
1195cdf0e10cSrcweir |*
1196cdf0e10cSrcweir |* Dokument laden (fuer gelinkte Objekte)
1197cdf0e10cSrcweir |*
1198cdf0e10cSrcweir \************************************************************************/
1199cdf0e10cSrcweir
LoadModel(const String & rFileName)1200cdf0e10cSrcweir const SdrModel* SdDrawDocument::LoadModel(const String& rFileName)
1201cdf0e10cSrcweir {
1202cdf0e10cSrcweir return ( OpenBookmarkDoc(rFileName) );
1203cdf0e10cSrcweir }
1204cdf0e10cSrcweir
1205cdf0e10cSrcweir /*************************************************************************
1206cdf0e10cSrcweir |*
1207cdf0e10cSrcweir |* Dokument schliessen (fuer gelinkte Objekte)
1208cdf0e10cSrcweir |*
1209cdf0e10cSrcweir \************************************************************************/
1210cdf0e10cSrcweir
DisposeLoadedModels()1211cdf0e10cSrcweir void SdDrawDocument::DisposeLoadedModels()
1212cdf0e10cSrcweir {
1213cdf0e10cSrcweir CloseBookmarkDoc();
1214cdf0e10cSrcweir }
1215cdf0e10cSrcweir
1216cdf0e10cSrcweir /*************************************************************************
1217cdf0e10cSrcweir |*
1218cdf0e10cSrcweir |* Ist das Dokument read-only?
1219cdf0e10cSrcweir |*
1220cdf0e10cSrcweir \************************************************************************/
1221cdf0e10cSrcweir
IsReadOnly() const1222cdf0e10cSrcweir FASTBOOL SdDrawDocument::IsReadOnly() const
1223cdf0e10cSrcweir {
1224cdf0e10cSrcweir return sal_False;
1225cdf0e10cSrcweir }
1226cdf0e10cSrcweir
1227cdf0e10cSrcweir
1228cdf0e10cSrcweir /*************************************************************************
1229cdf0e10cSrcweir |*
1230cdf0e10cSrcweir |* In anschliessendem AllocModel() wird eine DocShell erzeugt
1231cdf0e10cSrcweir |* (xAllocedDocShRef). Eine bereits bestehende DocShell wird ggf. geloescht
1232cdf0e10cSrcweir |*
1233cdf0e10cSrcweir \************************************************************************/
1234cdf0e10cSrcweir
SetAllocDocSh(sal_Bool bAlloc)1235cdf0e10cSrcweir void SdDrawDocument::SetAllocDocSh(sal_Bool bAlloc)
1236cdf0e10cSrcweir {
1237cdf0e10cSrcweir mbAllocDocSh = bAlloc;
1238cdf0e10cSrcweir
1239cdf0e10cSrcweir if(mxAllocedDocShRef.Is())
1240cdf0e10cSrcweir {
1241cdf0e10cSrcweir mxAllocedDocShRef->DoClose();
1242cdf0e10cSrcweir }
1243cdf0e10cSrcweir
1244cdf0e10cSrcweir mxAllocedDocShRef.Clear();
1245cdf0e10cSrcweir }
1246cdf0e10cSrcweir
1247cdf0e10cSrcweir /*************************************************************************
1248cdf0e10cSrcweir |*
1249cdf0e10cSrcweir |* Liste der CustomShows zurueckgeben (ggf. zuerst erzeugen)
1250cdf0e10cSrcweir |*
1251cdf0e10cSrcweir \************************************************************************/
1252cdf0e10cSrcweir
GetCustomShowList(sal_Bool bCreate)1253cdf0e10cSrcweir List* SdDrawDocument::GetCustomShowList(sal_Bool bCreate)
1254cdf0e10cSrcweir {
1255cdf0e10cSrcweir if (!mpCustomShowList && bCreate)
1256cdf0e10cSrcweir {
1257cdf0e10cSrcweir // Liste erzeugen
1258cdf0e10cSrcweir mpCustomShowList = new List();
1259cdf0e10cSrcweir }
1260cdf0e10cSrcweir
1261cdf0e10cSrcweir return(mpCustomShowList);
1262cdf0e10cSrcweir }
1263cdf0e10cSrcweir
1264cdf0e10cSrcweir /*************************************************************************
1265cdf0e10cSrcweir |*
1266cdf0e10cSrcweir |* Document-Stream herausgeben (fuer load-on-demand Graphiken)
1267cdf0e10cSrcweir |*
1268cdf0e10cSrcweir \************************************************************************/
1269cdf0e10cSrcweir
GetDocumentStream(SdrDocumentStreamInfo & rStreamInfo) const1270cdf0e10cSrcweir SvStream* SdDrawDocument::GetDocumentStream(SdrDocumentStreamInfo& rStreamInfo) const
1271cdf0e10cSrcweir {
1272cdf0e10cSrcweir uno::Reference < embed::XStorage > xStor;
1273cdf0e10cSrcweir if (mpDocSh)
1274cdf0e10cSrcweir xStor = mpDocSh->GetStorage();
1275cdf0e10cSrcweir SvStream* pRet = NULL;
1276cdf0e10cSrcweir
1277cdf0e10cSrcweir if( xStor.is() )
1278cdf0e10cSrcweir {
1279cdf0e10cSrcweir //TODO/MBA: binary format removed, needs testing
1280cdf0e10cSrcweir if( rStreamInfo.maUserData.Len() &&
1281cdf0e10cSrcweir ( rStreamInfo.maUserData.GetToken( 0, ':' ) ==
1282cdf0e10cSrcweir String( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package" ) ) ) )
1283cdf0e10cSrcweir {
1284cdf0e10cSrcweir const String aPicturePath( rStreamInfo.maUserData.GetToken( 1, ':' ) );
1285cdf0e10cSrcweir
1286cdf0e10cSrcweir // graphic from picture stream in picture storage in XML package
1287cdf0e10cSrcweir if( aPicturePath.GetTokenCount( '/' ) == 2 ) try
1288cdf0e10cSrcweir {
1289cdf0e10cSrcweir const String aPictureStreamName( aPicturePath.GetToken( 1, '/' ) );
1290cdf0e10cSrcweir const String aPictureStorageName( aPicturePath.GetToken( 0, '/' ) );
1291cdf0e10cSrcweir if( xStor->isStorageElement( aPictureStorageName ) )
1292cdf0e10cSrcweir {
1293cdf0e10cSrcweir uno::Reference < embed::XStorage > xPictureStorage =
1294cdf0e10cSrcweir xStor->openStorageElement( aPictureStorageName, embed::ElementModes::READ );
1295cdf0e10cSrcweir try
1296cdf0e10cSrcweir {
1297cdf0e10cSrcweir if( xPictureStorage.is() && xPictureStorage->isStreamElement( aPictureStreamName ) )
1298cdf0e10cSrcweir {
1299cdf0e10cSrcweir uno::Reference < io::XStream > xStream = xPictureStorage->openStreamElement( aPictureStreamName, embed::ElementModes::READ );
1300cdf0e10cSrcweir if( xStream.is() )
1301cdf0e10cSrcweir pRet = ::utl::UcbStreamHelper::CreateStream( xStream );
1302cdf0e10cSrcweir }
1303cdf0e10cSrcweir }
1304cdf0e10cSrcweir catch( container::NoSuchElementException& )
1305cdf0e10cSrcweir {
1306cdf0e10cSrcweir }
1307cdf0e10cSrcweir }
1308cdf0e10cSrcweir }
1309cdf0e10cSrcweir catch( uno::Exception& e )
1310cdf0e10cSrcweir {
1311cdf0e10cSrcweir (void)e;
1312cdf0e10cSrcweir DBG_ERROR(
1313cdf0e10cSrcweir (rtl::OString("sd::SdDrawDocument::GetDocumentStream(), "
1314cdf0e10cSrcweir "exception caught: ") +
1315cdf0e10cSrcweir rtl::OUStringToOString(
1316cdf0e10cSrcweir comphelper::anyToString( cppu::getCaughtException() ),
1317cdf0e10cSrcweir RTL_TEXTENCODING_UTF8 ) +
1318cdf0e10cSrcweir rtl::OString("\r\nATTENTION: Graphics may get lost now, please inform CL or KA!") ).getStr() );
1319cdf0e10cSrcweir }
1320cdf0e10cSrcweir
1321cdf0e10cSrcweir rStreamInfo.mbDeleteAfterUse = ( pRet != NULL );
1322cdf0e10cSrcweir }
1323cdf0e10cSrcweir }
1324cdf0e10cSrcweir
1325cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 1
1326cdf0e10cSrcweir if( pRet )
1327cdf0e10cSrcweir {
1328cdf0e10cSrcweir // try to get some information from stream
1329cdf0e10cSrcweir const sal_uLong nStartPos = pRet->Tell();
1330cdf0e10cSrcweir const sal_uLong nEndPos = pRet->Seek( STREAM_SEEK_TO_END );
1331cdf0e10cSrcweir const sal_uLong nStmLen = nEndPos - nStartPos;
1332cdf0e10cSrcweir sal_uChar aTestByte;
1333cdf0e10cSrcweir
1334cdf0e10cSrcweir // try to read one byte
1335cdf0e10cSrcweir if( nStmLen )
1336cdf0e10cSrcweir *pRet >> aTestByte;
1337cdf0e10cSrcweir
1338cdf0e10cSrcweir pRet->Seek( nStartPos );
1339cdf0e10cSrcweir }
1340cdf0e10cSrcweir #endif
1341cdf0e10cSrcweir
1342cdf0e10cSrcweir return pRet;
1343cdf0e10cSrcweir }
1344cdf0e10cSrcweir
1345cdf0e10cSrcweir
1346cdf0e10cSrcweir /*************************************************************************
1347cdf0e10cSrcweir |*
1348cdf0e10cSrcweir |* Nicht benutzte MasterPages und Layouts entfernen
1349cdf0e10cSrcweir |*
1350cdf0e10cSrcweir \************************************************************************/
1351cdf0e10cSrcweir
RemoveUnnecessaryMasterPages(SdPage * pMasterPage,sal_Bool bOnlyDuplicatePages,sal_Bool bUndo)1352cdf0e10cSrcweir void SdDrawDocument::RemoveUnnecessaryMasterPages(SdPage* pMasterPage, sal_Bool bOnlyDuplicatePages, sal_Bool bUndo)
1353cdf0e10cSrcweir {
1354cdf0e10cSrcweir ::sd::View* pView = NULL;
1355cdf0e10cSrcweir ::svl::IUndoManager* pUndoMgr = NULL;
1356cdf0e10cSrcweir
1357cdf0e10cSrcweir if( bUndo && !IsUndoEnabled() )
1358cdf0e10cSrcweir bUndo = sal_False;
1359cdf0e10cSrcweir
1360cdf0e10cSrcweir if (mpDocSh)
1361cdf0e10cSrcweir {
1362cdf0e10cSrcweir pUndoMgr = mpDocSh->GetUndoManager();
1363cdf0e10cSrcweir
1364cdf0e10cSrcweir if (mpDocSh->GetViewShell())
1365cdf0e10cSrcweir pView = mpDocSh->GetViewShell()->GetView();
1366cdf0e10cSrcweir }
1367cdf0e10cSrcweir
1368cdf0e10cSrcweir /***********************************************************
1369cdf0e10cSrcweir * Alle MasterPages pruefen
1370cdf0e10cSrcweir ***********************************************************/
1371cdf0e10cSrcweir sal_uInt16 nSdMasterPageCount = GetMasterSdPageCount( PK_STANDARD );
1372cdf0e10cSrcweir for (sal_Int32 nMPage = nSdMasterPageCount - 1; nMPage >= 0; nMPage--)
1373cdf0e10cSrcweir {
1374cdf0e10cSrcweir SdPage* pMaster = pMasterPage;
1375cdf0e10cSrcweir SdPage* pNotesMaster = NULL;
1376cdf0e10cSrcweir
1377cdf0e10cSrcweir if (!pMaster)
1378cdf0e10cSrcweir {
1379cdf0e10cSrcweir pMaster = (SdPage*) GetMasterSdPage( (sal_uInt16) nMPage, PK_STANDARD );
1380cdf0e10cSrcweir pNotesMaster = (SdPage*) GetMasterSdPage( (sal_uInt16) nMPage, PK_NOTES );
1381cdf0e10cSrcweir }
1382cdf0e10cSrcweir else
1383cdf0e10cSrcweir {
1384cdf0e10cSrcweir for ( sal_uInt16 nMPg = 0; nMPg < GetMasterPageCount(); nMPg++ )
1385cdf0e10cSrcweir {
1386cdf0e10cSrcweir if ( pMaster == GetMasterPage( nMPg ) )
1387cdf0e10cSrcweir {
1388cdf0e10cSrcweir pNotesMaster = (SdPage*) GetMasterPage( ++nMPg );
1389cdf0e10cSrcweir break;
1390cdf0e10cSrcweir }
1391cdf0e10cSrcweir }
1392cdf0e10cSrcweir }
1393cdf0e10cSrcweir
1394cdf0e10cSrcweir DBG_ASSERT( pMaster->GetPageKind() == PK_STANDARD, "wrong page kind" );
1395cdf0e10cSrcweir
1396cdf0e10cSrcweir if ( pMaster->GetPageKind() == PK_STANDARD &&
1397cdf0e10cSrcweir GetMasterPageUserCount( pMaster ) == 0 &&
1398cdf0e10cSrcweir pNotesMaster )
1399cdf0e10cSrcweir {
1400cdf0e10cSrcweir // Do not delete master pages that have their precious flag set.
1401cdf0e10cSrcweir sal_Bool bDeleteMaster = !pMaster->IsPrecious();
1402cdf0e10cSrcweir String aLayoutName = pMaster->GetLayoutName();
1403cdf0e10cSrcweir
1404cdf0e10cSrcweir if(bOnlyDuplicatePages )
1405cdf0e10cSrcweir {
1406cdf0e10cSrcweir // remove only duplicate pages
1407cdf0e10cSrcweir bDeleteMaster = sal_False;
1408cdf0e10cSrcweir for (sal_uInt16 i = 0; i < GetMasterSdPageCount( PK_STANDARD ); i++)
1409cdf0e10cSrcweir {
1410cdf0e10cSrcweir SdPage* pMPg = (SdPage*) GetMasterSdPage( i, PK_STANDARD );
1411cdf0e10cSrcweir if( pMPg != pMaster &&
1412cdf0e10cSrcweir pMPg->GetLayoutName() == aLayoutName )
1413cdf0e10cSrcweir {
1414cdf0e10cSrcweir // duplicate page found -> remove it
1415cdf0e10cSrcweir bDeleteMaster = sal_True;
1416cdf0e10cSrcweir }
1417cdf0e10cSrcweir }
1418cdf0e10cSrcweir }
1419cdf0e10cSrcweir
1420cdf0e10cSrcweir if( bDeleteMaster )
1421cdf0e10cSrcweir {
1422cdf0e10cSrcweir if (pView)
1423cdf0e10cSrcweir {
1424cdf0e10cSrcweir // if MasterPage is visible hide on pageview
1425cdf0e10cSrcweir SdrPageView* pPgView = pView->GetSdrPageView();
1426cdf0e10cSrcweir if (pPgView)
1427cdf0e10cSrcweir {
1428cdf0e10cSrcweir SdrPage* pShownPage = pPgView->GetPage();
1429cdf0e10cSrcweir if( (pShownPage == pMaster) || (pShownPage == pNotesMaster) )
1430cdf0e10cSrcweir {
1431cdf0e10cSrcweir pView->HideSdrPage();
1432cdf0e10cSrcweir pView->ShowSdrPage( GetSdPage( 0, PK_STANDARD ) );
1433cdf0e10cSrcweir }
1434cdf0e10cSrcweir }
1435cdf0e10cSrcweir }
1436cdf0e10cSrcweir
1437cdf0e10cSrcweir if( bUndo )
1438cdf0e10cSrcweir {
1439cdf0e10cSrcweir BegUndo();
1440cdf0e10cSrcweir AddUndo( GetSdrUndoFactory().CreateUndoDeletePage( *pNotesMaster ) );
1441cdf0e10cSrcweir }
1442cdf0e10cSrcweir
1443cdf0e10cSrcweir RemoveMasterPage( pNotesMaster->GetPageNum() );
1444cdf0e10cSrcweir
1445cdf0e10cSrcweir if( !bUndo )
1446cdf0e10cSrcweir delete pNotesMaster;
1447cdf0e10cSrcweir
1448cdf0e10cSrcweir if( bUndo )
1449cdf0e10cSrcweir AddUndo(GetSdrUndoFactory().CreateUndoDeletePage(*pMaster));
1450cdf0e10cSrcweir
1451cdf0e10cSrcweir RemoveMasterPage( pMaster->GetPageNum() );
1452cdf0e10cSrcweir
1453cdf0e10cSrcweir if( !bUndo )
1454cdf0e10cSrcweir delete pMaster;
1455cdf0e10cSrcweir
1456cdf0e10cSrcweir if( bUndo )
1457cdf0e10cSrcweir EndUndo(); // schon hier, damit sich Joes Actions ZWISCHEN unsere eigenen schieben
1458cdf0e10cSrcweir
1459cdf0e10cSrcweir // alte Layoutvorlagen loeschen, wenn sie nicht mehr benoetigt werden
1460cdf0e10cSrcweir sal_Bool bDeleteOldStyleSheets = sal_True;
1461cdf0e10cSrcweir for ( sal_uInt16 nMPg = 0;
1462cdf0e10cSrcweir nMPg < GetMasterPageCount() && bDeleteOldStyleSheets;
1463cdf0e10cSrcweir nMPg++ )
1464cdf0e10cSrcweir {
1465cdf0e10cSrcweir SdPage* pMPg = (SdPage*) GetMasterPage(nMPg);
1466cdf0e10cSrcweir if (pMPg->GetLayoutName() == aLayoutName)
1467cdf0e10cSrcweir {
1468cdf0e10cSrcweir bDeleteOldStyleSheets = sal_False;
1469cdf0e10cSrcweir }
1470cdf0e10cSrcweir }
1471cdf0e10cSrcweir
1472cdf0e10cSrcweir if (bDeleteOldStyleSheets)
1473cdf0e10cSrcweir {
1474cdf0e10cSrcweir SdStyleSheetVector aRemove;
1475cdf0e10cSrcweir static_cast<SdStyleSheetPool*>( mxStyleSheetPool.get())->CreateLayoutSheetList( aLayoutName, aRemove );
1476cdf0e10cSrcweir
1477cdf0e10cSrcweir if( bUndo )
1478cdf0e10cSrcweir {
1479cdf0e10cSrcweir // die Liste gehoert der UndoAction
1480cdf0e10cSrcweir SdMoveStyleSheetsUndoAction* pMovStyles = new SdMoveStyleSheetsUndoAction( this, aRemove, false );
1481cdf0e10cSrcweir
1482cdf0e10cSrcweir if (pUndoMgr)
1483cdf0e10cSrcweir pUndoMgr->AddUndoAction(pMovStyles);
1484cdf0e10cSrcweir }
1485cdf0e10cSrcweir
1486cdf0e10cSrcweir for( SdStyleSheetVector::iterator iter = aRemove.begin(); iter != aRemove.end(); iter++ )
1487cdf0e10cSrcweir static_cast<SdStyleSheetPool*>( mxStyleSheetPool.get())->Remove((*iter).get());
1488cdf0e10cSrcweir }
1489cdf0e10cSrcweir }
1490cdf0e10cSrcweir }
1491cdf0e10cSrcweir
1492cdf0e10cSrcweir if (pMasterPage)
1493cdf0e10cSrcweir break; // Nur diese eine MasterPage!
1494cdf0e10cSrcweir }
1495cdf0e10cSrcweir }
1496cdf0e10cSrcweir
1497cdf0e10cSrcweir
1498cdf0e10cSrcweir /*************************************************************************
1499cdf0e10cSrcweir |*
1500cdf0e10cSrcweir |* MasterPage austauschen
1501cdf0e10cSrcweir |*
1502cdf0e10cSrcweir |* Entweder erhaelt nSdPageNum eine neue, eigene MasterPage, oder die MasterPage
1503cdf0e10cSrcweir |* wird komplett ausgetauscht (gilt dann fuer alle Seiten).
1504cdf0e10cSrcweir |*
1505cdf0e10cSrcweir |* nSdPageNum : Nummer der Seite, welche die neue MasterPage erhalten soll
1506cdf0e10cSrcweir |* rLayoutName : LayoutName der neuen MasterPage
1507cdf0e10cSrcweir |* pSourceDoc : Dokument (Vorlage) aus dem die MasterPage geholt wird
1508cdf0e10cSrcweir |* bMaster : Die MasterPage von nSdPageNum soll ausgetauscht werden
1509cdf0e10cSrcweir |* bCheckMasters: Nicht benutzte MasterPages sollen entfernt werden
1510cdf0e10cSrcweir |*
1511cdf0e10cSrcweir |* Ist pSourceDoc == NULL, so wird eine leere MasterPage zugewiesen.
1512cdf0e10cSrcweir |* Ist rLayoutName leer, so wird die erste MasterPage genommen
1513cdf0e10cSrcweir \************************************************************************/
1514cdf0e10cSrcweir
1515*26a7fe9cSArmin Le Grand // #121863# factored out functionality
isMasterPageLayoutNameUnique(const SdDrawDocument & rDoc,const String & rCandidate)1516*26a7fe9cSArmin Le Grand bool isMasterPageLayoutNameUnique(const SdDrawDocument& rDoc, const String& rCandidate)
1517*26a7fe9cSArmin Le Grand {
1518*26a7fe9cSArmin Le Grand if(!rCandidate.Len())
1519*26a7fe9cSArmin Le Grand {
1520*26a7fe9cSArmin Le Grand return false;
1521*26a7fe9cSArmin Le Grand }
1522*26a7fe9cSArmin Le Grand
1523*26a7fe9cSArmin Le Grand const sal_uInt16 nPageCount(rDoc.GetMasterPageCount());
1524*26a7fe9cSArmin Le Grand
1525*26a7fe9cSArmin Le Grand for(sal_uInt16 a(0); a < nPageCount; a++)
1526*26a7fe9cSArmin Le Grand {
1527*26a7fe9cSArmin Le Grand const SdrPage* pCandidate = rDoc.GetMasterPage(a);
1528*26a7fe9cSArmin Le Grand String aPageLayoutName(pCandidate->GetLayoutName());
1529*26a7fe9cSArmin Le Grand aPageLayoutName.Erase(aPageLayoutName.SearchAscii(SD_LT_SEPARATOR));
1530*26a7fe9cSArmin Le Grand
1531*26a7fe9cSArmin Le Grand if(aPageLayoutName == rCandidate)
1532*26a7fe9cSArmin Le Grand {
1533*26a7fe9cSArmin Le Grand return false;
1534*26a7fe9cSArmin Le Grand }
1535*26a7fe9cSArmin Le Grand }
1536*26a7fe9cSArmin Le Grand
1537*26a7fe9cSArmin Le Grand return true;
1538*26a7fe9cSArmin Le Grand }
1539*26a7fe9cSArmin Le Grand
1540*26a7fe9cSArmin Le Grand // #121863# factored out functinality
createNewMasterPageLayoutName(const SdDrawDocument & rDoc)1541*26a7fe9cSArmin Le Grand String createNewMasterPageLayoutName(const SdDrawDocument& rDoc)
1542*26a7fe9cSArmin Le Grand {
1543*26a7fe9cSArmin Le Grand const String aBaseName(SdResId(STR_LAYOUT_DEFAULT_NAME));
1544*26a7fe9cSArmin Le Grand String aRetval;
1545*26a7fe9cSArmin Le Grand sal_uInt16 nCount(0);
1546*26a7fe9cSArmin Le Grand
1547*26a7fe9cSArmin Le Grand while(!aRetval.Len())
1548*26a7fe9cSArmin Le Grand {
1549*26a7fe9cSArmin Le Grand aRetval = aBaseName;
1550*26a7fe9cSArmin Le Grand
1551*26a7fe9cSArmin Le Grand if(nCount)
1552*26a7fe9cSArmin Le Grand {
1553*26a7fe9cSArmin Le Grand aRetval += String::CreateFromInt32(nCount);
1554*26a7fe9cSArmin Le Grand }
1555*26a7fe9cSArmin Le Grand
1556*26a7fe9cSArmin Le Grand nCount++;
1557*26a7fe9cSArmin Le Grand
1558*26a7fe9cSArmin Le Grand if(!isMasterPageLayoutNameUnique(rDoc, aRetval))
1559*26a7fe9cSArmin Le Grand {
1560*26a7fe9cSArmin Le Grand aRetval.Erase();
1561*26a7fe9cSArmin Le Grand }
1562*26a7fe9cSArmin Le Grand }
1563*26a7fe9cSArmin Le Grand
1564*26a7fe9cSArmin Le Grand return aRetval;
1565*26a7fe9cSArmin Le Grand }
1566*26a7fe9cSArmin Le Grand
SetMasterPage(sal_uInt16 nSdPageNum,const String & rLayoutName,SdDrawDocument * pSourceDoc,sal_Bool bMaster,sal_Bool bCheckMasters)1567cdf0e10cSrcweir void SdDrawDocument::SetMasterPage(sal_uInt16 nSdPageNum,
1568cdf0e10cSrcweir const String& rLayoutName,
1569cdf0e10cSrcweir SdDrawDocument* pSourceDoc,
1570cdf0e10cSrcweir sal_Bool bMaster,
1571cdf0e10cSrcweir sal_Bool bCheckMasters)
1572cdf0e10cSrcweir {
1573cdf0e10cSrcweir if( mpDocSh )
1574cdf0e10cSrcweir mpDocSh->SetWaitCursor( sal_True );
1575cdf0e10cSrcweir
1576cdf0e10cSrcweir ::svl::IUndoManager* pUndoMgr = mpDocSh->GetUndoManager();
1577cdf0e10cSrcweir
1578cdf0e10cSrcweir const bool bUndo = IsUndoEnabled();
1579cdf0e10cSrcweir
1580cdf0e10cSrcweir if( bUndo )
1581cdf0e10cSrcweir {
1582cdf0e10cSrcweir pUndoMgr->EnterListAction(String(SdResId(STR_UNDO_SET_PRESLAYOUT)), String());
1583cdf0e10cSrcweir }
1584cdf0e10cSrcweir
1585cdf0e10cSrcweir SdPage* pSelectedPage = GetSdPage(nSdPageNum, PK_STANDARD);
1586cdf0e10cSrcweir SdPage* pNotes = (SdPage*) GetPage(pSelectedPage->GetPageNum()+1);
1587cdf0e10cSrcweir SdPage& rOldMaster = (SdPage&)pSelectedPage->TRG_GetMasterPage();
1588cdf0e10cSrcweir SdPage& rOldNotesMaster = (SdPage&)pNotes->TRG_GetMasterPage();
1589cdf0e10cSrcweir SdPage* pMaster = NULL;
1590cdf0e10cSrcweir SdPage* pNotesMaster = NULL;
1591cdf0e10cSrcweir SdPage* pPage = NULL;
1592cdf0e10cSrcweir String aOldPageLayoutName(pSelectedPage->GetLayoutName());
1593cdf0e10cSrcweir String aOldLayoutName(aOldPageLayoutName);
1594cdf0e10cSrcweir aOldLayoutName.Erase(aOldLayoutName.SearchAscii( SD_LT_SEPARATOR ));
1595cdf0e10cSrcweir
1596cdf0e10cSrcweir if (pSourceDoc)
1597cdf0e10cSrcweir {
1598cdf0e10cSrcweir List* pReplList = NULL;
1599cdf0e10cSrcweir sal_Bool bLayoutReloaded = sal_False; // Wurde ex. Layout wieder geladen?
1600cdf0e10cSrcweir
1601cdf0e10cSrcweir /*********************************************************************
1602cdf0e10cSrcweir |* LayoutName, Page and Notespage
1603cdf0e10cSrcweir \*********************************************************************/
1604cdf0e10cSrcweir if (rLayoutName.Len() == 0)
1605cdf0e10cSrcweir {
1606cdf0e10cSrcweir // No LayoutName: take first MasterPage
1607cdf0e10cSrcweir pMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_STANDARD);
1608cdf0e10cSrcweir pNotesMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_NOTES);
1609cdf0e10cSrcweir }
1610cdf0e10cSrcweir else
1611cdf0e10cSrcweir {
1612cdf0e10cSrcweir String aSearchFor(rLayoutName);
1613cdf0e10cSrcweir aSearchFor.AppendAscii( RTL_CONSTASCII_STRINGPARAM( SD_LT_SEPARATOR ));
1614cdf0e10cSrcweir aSearchFor.Append( String(SdResId(STR_LAYOUT_OUTLINE))) ;
1615cdf0e10cSrcweir
1616cdf0e10cSrcweir for (sal_uInt16 nMP = 0; nMP < pSourceDoc->GetMasterPageCount(); nMP++)
1617cdf0e10cSrcweir {
1618cdf0e10cSrcweir SdPage* pMP = (SdPage*) pSourceDoc->GetMasterPage(nMP);
1619cdf0e10cSrcweir
1620cdf0e10cSrcweir if (pMP->GetLayoutName() == aSearchFor)
1621cdf0e10cSrcweir {
1622cdf0e10cSrcweir if (pMP->GetPageKind() == PK_STANDARD)
1623cdf0e10cSrcweir pMaster = pMP;
1624cdf0e10cSrcweir if (pMP->GetPageKind() == PK_NOTES)
1625cdf0e10cSrcweir pNotesMaster = pMP;
1626cdf0e10cSrcweir }
1627cdf0e10cSrcweir if (pMaster && pNotesMaster)
1628cdf0e10cSrcweir break;
1629cdf0e10cSrcweir }
1630cdf0e10cSrcweir DBG_ASSERT(pMaster, "MasterPage (Standard page) not found");
1631cdf0e10cSrcweir DBG_ASSERT(pNotesMaster, "MasterPage (Notes page) not found");
1632cdf0e10cSrcweir
1633cdf0e10cSrcweir // this should not happen, but looking at crashreports, it does
1634cdf0e10cSrcweir if( (pMaster == NULL) || (pNotesMaster == NULL) )
1635cdf0e10cSrcweir {
1636cdf0e10cSrcweir // so take the first MasterPage
1637cdf0e10cSrcweir pMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_STANDARD);
1638cdf0e10cSrcweir pNotesMaster = (SdPage*) pSourceDoc->GetMasterSdPage(0, PK_NOTES);
1639cdf0e10cSrcweir }
1640cdf0e10cSrcweir }
1641cdf0e10cSrcweir
1642cdf0e10cSrcweir // we should never reach this, but one never knows....
1643cdf0e10cSrcweir if( (pMaster == NULL) || (pNotesMaster == NULL) )
1644cdf0e10cSrcweir {
1645cdf0e10cSrcweir pUndoMgr->LeaveListAction();
1646cdf0e10cSrcweir
1647cdf0e10cSrcweir if( mpDocSh )
1648cdf0e10cSrcweir mpDocSh->SetWaitCursor( sal_False );
1649cdf0e10cSrcweir
1650cdf0e10cSrcweir DBG_ERROR( "SdDrawDocument::SetMasterPage() failed!" );
1651cdf0e10cSrcweir
1652cdf0e10cSrcweir return;
1653cdf0e10cSrcweir }
1654cdf0e10cSrcweir
1655*26a7fe9cSArmin Le Grand const String aOriginalNewLayoutName( pMaster->GetName() );
1656*26a7fe9cSArmin Le Grand String aTargetNewLayoutName(aOriginalNewLayoutName);
1657*26a7fe9cSArmin Le Grand
1658*26a7fe9cSArmin Le Grand if (pSourceDoc != this)
1659*26a7fe9cSArmin Le Grand {
1660*26a7fe9cSArmin Le Grand // #121863# clone masterpages, they are from another model (!)
1661*26a7fe9cSArmin Le Grand SdPage* pNewNotesMaster = dynamic_cast< SdPage* >(pNotesMaster->Clone(this));
1662*26a7fe9cSArmin Le Grand SdPage* pNewMaster = dynamic_cast< SdPage* >(pMaster->Clone(this));
1663*26a7fe9cSArmin Le Grand
1664*26a7fe9cSArmin Le Grand if(!pNewNotesMaster || !pNewMaster)
1665*26a7fe9cSArmin Le Grand {
1666*26a7fe9cSArmin Le Grand delete pNewNotesMaster;
1667*26a7fe9cSArmin Le Grand delete pNewMaster;
1668*26a7fe9cSArmin Le Grand OSL_ASSERT("SdDrawDocument::SetMasterPage() cloning of MasterPage/NoteAmsterPage failed!" );
1669*26a7fe9cSArmin Le Grand return;
1670*26a7fe9cSArmin Le Grand }
1671*26a7fe9cSArmin Le Grand
1672*26a7fe9cSArmin Le Grand pNotesMaster = pNewNotesMaster;
1673*26a7fe9cSArmin Le Grand pMaster = pNewMaster;
1674*26a7fe9cSArmin Le Grand
1675*26a7fe9cSArmin Le Grand // layout name needs to be unique
1676*26a7fe9cSArmin Le Grand aTargetNewLayoutName = pMaster->GetLayoutName();
1677*26a7fe9cSArmin Le Grand aTargetNewLayoutName.Erase(aTargetNewLayoutName.SearchAscii(SD_LT_SEPARATOR));
1678*26a7fe9cSArmin Le Grand
1679*26a7fe9cSArmin Le Grand if(!isMasterPageLayoutNameUnique(*this, aTargetNewLayoutName))
1680*26a7fe9cSArmin Le Grand {
1681*26a7fe9cSArmin Le Grand aTargetNewLayoutName = createNewMasterPageLayoutName(*this);
1682*26a7fe9cSArmin Le Grand
1683*26a7fe9cSArmin Le Grand String aTemp(aTargetNewLayoutName);
1684*26a7fe9cSArmin Le Grand aTemp.AppendAscii(RTL_CONSTASCII_STRINGPARAM(SD_LT_SEPARATOR));
1685*26a7fe9cSArmin Le Grand aTemp.Append(String(SdResId(STR_LAYOUT_OUTLINE)));
1686*26a7fe9cSArmin Le Grand
1687*26a7fe9cSArmin Le Grand pMaster->SetName(aTargetNewLayoutName);
1688*26a7fe9cSArmin Le Grand pMaster->SetLayoutName(aTemp);
1689*26a7fe9cSArmin Le Grand
1690*26a7fe9cSArmin Le Grand pNotesMaster->SetName(aTargetNewLayoutName);
1691*26a7fe9cSArmin Le Grand pNotesMaster->SetLayoutName(aTemp);
1692*26a7fe9cSArmin Le Grand }
1693*26a7fe9cSArmin Le Grand }
1694*26a7fe9cSArmin Le Grand
1695cdf0e10cSrcweir if (pSourceDoc != this)
1696cdf0e10cSrcweir {
1697cdf0e10cSrcweir const sal_uInt16 nMasterPageCount = GetMasterPageCount();
1698cdf0e10cSrcweir for ( sal_uInt16 nMPage = 0; nMPage < nMasterPageCount; nMPage++ )
1699cdf0e10cSrcweir {
1700cdf0e10cSrcweir SdPage* pCheckMaster = (SdPage*)GetMasterPage(nMPage);
1701*26a7fe9cSArmin Le Grand if( pCheckMaster->GetName() == aTargetNewLayoutName )
1702cdf0e10cSrcweir {
1703cdf0e10cSrcweir bLayoutReloaded = sal_True;
1704cdf0e10cSrcweir break;
1705cdf0e10cSrcweir }
1706cdf0e10cSrcweir }
1707cdf0e10cSrcweir
1708cdf0e10cSrcweir /*****************************************************************
1709cdf0e10cSrcweir |* Praesentationsvorlagen korrigieren bzw. neu anlegen
1710cdf0e10cSrcweir \****************************************************************/
1711cdf0e10cSrcweir // nur die Praesentationsvorlagen beachten
1712cdf0e10cSrcweir String aName;
1713cdf0e10cSrcweir SdStyleSheetPool* pSourceStyleSheetPool = (SdStyleSheetPool*) pSourceDoc->GetStyleSheetPool();
1714cdf0e10cSrcweir pSourceStyleSheetPool->SetSearchMask(SD_STYLE_FAMILY_MASTERPAGE);
1715cdf0e10cSrcweir static_cast<SdStyleSheetPool*>( mxStyleSheetPool.get())->SetSearchMask(SD_STYLE_FAMILY_MASTERPAGE);
1716cdf0e10cSrcweir
1717cdf0e10cSrcweir pReplList = new List; // Liste fuer ersetzte StyleSheets
1718cdf0e10cSrcweir SdStyleSheetVector aCreatedStyles; // Liste fuer erzeugte StyleSheets
1719cdf0e10cSrcweir
1720cdf0e10cSrcweir SfxStyleSheetBase* pHisSheet = pSourceStyleSheetPool->First();
1721cdf0e10cSrcweir
1722cdf0e10cSrcweir while (pHisSheet)
1723cdf0e10cSrcweir {
1724cdf0e10cSrcweir aName = pHisSheet->GetName();
1725cdf0e10cSrcweir
1726*26a7fe9cSArmin Le Grand // #121863# search in source styles with original style name from source of
1727*26a7fe9cSArmin Le Grand // evtl. cloned master (not-cloned, renamed for uniqueness)
1728*26a7fe9cSArmin Le Grand if( aName.Search( aOriginalNewLayoutName ) == 0 )
1729cdf0e10cSrcweir {
1730*26a7fe9cSArmin Le Grand // #121863# build name of evtl. cloned master style to search for
1731*26a7fe9cSArmin Le Grand if(aOriginalNewLayoutName != aTargetNewLayoutName)
1732*26a7fe9cSArmin Le Grand {
1733*26a7fe9cSArmin Le Grand const sal_uInt16 nPos(aName.SearchAscii(SD_LT_SEPARATOR));
1734*26a7fe9cSArmin Le Grand aName.Erase(0, nPos);
1735*26a7fe9cSArmin Le Grand aName.Insert(aTargetNewLayoutName, 0);
1736*26a7fe9cSArmin Le Grand }
1737*26a7fe9cSArmin Le Grand
1738cdf0e10cSrcweir SfxStyleSheet* pMySheet = static_cast<SfxStyleSheet*>( mxStyleSheetPool->Find(aName, SD_STYLE_FAMILY_MASTERPAGE) );
1739cdf0e10cSrcweir
1740cdf0e10cSrcweir if (pMySheet)
1741cdf0e10cSrcweir {
1742cdf0e10cSrcweir // Es ist eine gleichnamige Vorlage vorhanden ist: Inhalte ersetzen
1743cdf0e10cSrcweir #ifdef DBG_UTIL
1744cdf0e10cSrcweir sal_Bool bTest =
1745cdf0e10cSrcweir #endif
1746cdf0e10cSrcweir pMySheet->SetName(pHisSheet->GetName());
1747cdf0e10cSrcweir DBG_ASSERT(bTest, "StyleSheet-Umbenennung fehlgeschlagen");
1748cdf0e10cSrcweir pMySheet->GetItemSet().ClearItem(0); // alle loeschen
1749cdf0e10cSrcweir
1750cdf0e10cSrcweir StyleSheetUndoAction* pUndoChStyle = new StyleSheetUndoAction(this,
1751cdf0e10cSrcweir pMySheet, &pHisSheet->GetItemSet());
1752cdf0e10cSrcweir pUndoMgr->AddUndoAction(pUndoChStyle);
1753cdf0e10cSrcweir pMySheet->GetItemSet().Put(pHisSheet->GetItemSet());
1754cdf0e10cSrcweir pMySheet->Broadcast(SfxSimpleHint(SFX_HINT_DATACHANGED));
1755cdf0e10cSrcweir }
1756cdf0e10cSrcweir else
1757cdf0e10cSrcweir {
1758cdf0e10cSrcweir // create new style
1759cdf0e10cSrcweir String aHelpFile;
1760cdf0e10cSrcweir pMySheet = static_cast<SfxStyleSheet*>( &mxStyleSheetPool->Make(aName, SD_STYLE_FAMILY_MASTERPAGE, pHisSheet->GetMask()) );
1761cdf0e10cSrcweir pMySheet->SetHelpId( aHelpFile, pHisSheet->GetHelpId(aHelpFile) );
1762cdf0e10cSrcweir pMySheet->GetItemSet().ClearItem(0); // alle loeschen
1763cdf0e10cSrcweir pMySheet->GetItemSet().Put(pHisSheet->GetItemSet());
1764cdf0e10cSrcweir
1765cdf0e10cSrcweir aCreatedStyles.push_back( SdStyleSheetRef( static_cast< SdStyleSheet* >( pMySheet ) ) );
1766cdf0e10cSrcweir }
1767cdf0e10cSrcweir
1768cdf0e10cSrcweir StyleReplaceData* pReplData = new StyleReplaceData;
1769cdf0e10cSrcweir pReplData->nNewFamily = pMySheet->GetFamily();
1770cdf0e10cSrcweir pReplData->nFamily = pMySheet->GetFamily();
1771cdf0e10cSrcweir pReplData->aNewName = pMySheet->GetName();
1772cdf0e10cSrcweir
1773*26a7fe9cSArmin Le Grand // #121863# re-create original name of styte used at page where to replace with
1774*26a7fe9cSArmin Le Grand // this new style
1775cdf0e10cSrcweir String aTemp(pMySheet->GetName());
1776*26a7fe9cSArmin Le Grand const sal_uInt16 nPos(aTemp.SearchAscii(SD_LT_SEPARATOR));
1777cdf0e10cSrcweir aTemp.Erase(0, nPos);
1778cdf0e10cSrcweir aTemp.Insert(aOldLayoutName, 0);
1779*26a7fe9cSArmin Le Grand
1780cdf0e10cSrcweir pReplData->aName = aTemp;
1781cdf0e10cSrcweir pReplList->Insert(pReplData, LIST_APPEND);
1782cdf0e10cSrcweir }
1783cdf0e10cSrcweir
1784cdf0e10cSrcweir pHisSheet = (SfxStyleSheet*) pSourceStyleSheetPool->Next();
1785cdf0e10cSrcweir }
1786cdf0e10cSrcweir
1787cdf0e10cSrcweir // wenn neue Vorlagen erzeugt wurden:
1788cdf0e10cSrcweir // eventuell bestehende Parent-Verkettung der Itemsets in den
1789cdf0e10cSrcweir // Vorlagen wieder aufbauen
1790cdf0e10cSrcweir if(!aCreatedStyles.empty())
1791cdf0e10cSrcweir {
1792cdf0e10cSrcweir StyleReplaceData* pRData = (StyleReplaceData*)pReplList->First();
1793cdf0e10cSrcweir
1794cdf0e10cSrcweir while (pRData)
1795cdf0e10cSrcweir {
1796cdf0e10cSrcweir SfxStyleSheetBase* pSOld = mxStyleSheetPool->Find(pRData->aName);
1797cdf0e10cSrcweir SfxStyleSheetBase* pSNew = mxStyleSheetPool->Find(pRData->aNewName);
1798cdf0e10cSrcweir
1799cdf0e10cSrcweir if (pSOld && pSNew)
1800cdf0e10cSrcweir {
1801cdf0e10cSrcweir const String& rParentOfOld = pSOld->GetParent();
1802cdf0e10cSrcweir const String& rParentOfNew = pSNew->GetParent();
1803cdf0e10cSrcweir
1804cdf0e10cSrcweir if (rParentOfOld.Len() > 0 && rParentOfNew.Len() == 0)
1805cdf0e10cSrcweir {
1806cdf0e10cSrcweir
1807cdf0e10cSrcweir for (sal_uLong i = 0; i < pReplList->Count(); i++)
1808cdf0e10cSrcweir {
1809cdf0e10cSrcweir StyleReplaceData* pRD = (StyleReplaceData*)pReplList->
1810cdf0e10cSrcweir GetObject(i);
1811cdf0e10cSrcweir if ((pRD->aName == rParentOfOld) && (pRD->aName != pRD->aNewName))
1812cdf0e10cSrcweir {
1813cdf0e10cSrcweir String aParentOfNew(pRD->aNewName);
1814cdf0e10cSrcweir pSNew->SetParent(aParentOfNew);
1815cdf0e10cSrcweir break;
1816cdf0e10cSrcweir }
1817cdf0e10cSrcweir }
1818cdf0e10cSrcweir }
1819cdf0e10cSrcweir }
1820cdf0e10cSrcweir pRData = (StyleReplaceData*) pReplList->Next();
1821cdf0e10cSrcweir }
1822cdf0e10cSrcweir
1823cdf0e10cSrcweir // ab jetzt beim Suchen alle beachten
1824cdf0e10cSrcweir pSourceStyleSheetPool->SetSearchMask(SFX_STYLE_FAMILY_ALL);
1825cdf0e10cSrcweir mxStyleSheetPool->SetSearchMask(SFX_STYLE_FAMILY_ALL);
1826cdf0e10cSrcweir }
1827cdf0e10cSrcweir
1828cdf0e10cSrcweir if( !aCreatedStyles.empty() )
1829cdf0e10cSrcweir {
1830cdf0e10cSrcweir // UndoAction fuer das Erzeugen und Einfuegen vorn StyleSheets
1831cdf0e10cSrcweir // auf den UndoManager legen
1832cdf0e10cSrcweir SdMoveStyleSheetsUndoAction* pMovStyles = new SdMoveStyleSheetsUndoAction( this, aCreatedStyles, sal_True);
1833cdf0e10cSrcweir pUndoMgr->AddUndoAction(pMovStyles);
1834cdf0e10cSrcweir }
1835cdf0e10cSrcweir }
1836cdf0e10cSrcweir
1837cdf0e10cSrcweir // Layoutnamen auf Basis des Seitenlayoutnamens der Masterpage bilden
1838cdf0e10cSrcweir String aPageLayoutName(pMaster->GetLayoutName());
1839cdf0e10cSrcweir String aLayoutName = aPageLayoutName;
1840cdf0e10cSrcweir aLayoutName.Erase( aLayoutName.SearchAscii( SD_LT_SEPARATOR ));
1841cdf0e10cSrcweir
1842*26a7fe9cSArmin Le Grand // #121863# Do *not* remove from original document any longer, it is potentially used there
1843*26a7fe9cSArmin Le Grand // and would lead to crashes. Rely on the automatic process of removing unused masterpages
1844*26a7fe9cSArmin Le Grand // (see RemoveUnnecessaryMasterPages)
1845*26a7fe9cSArmin Le Grand //if (pSourceDoc != this)
1846*26a7fe9cSArmin Le Grand //{
1847*26a7fe9cSArmin Le Grand // // Aus dem Source-Dokument austragen
1848*26a7fe9cSArmin Le Grand // SdrPage* pTest = NULL;
1849*26a7fe9cSArmin Le Grand // pTest = pSourceDoc->RemoveMasterPage(pNotesMaster->GetPageNum());
1850*26a7fe9cSArmin Le Grand // pTest = pSourceDoc->RemoveMasterPage(pMaster->GetPageNum());
1851*26a7fe9cSArmin Le Grand //}
1852cdf0e10cSrcweir
1853cdf0e10cSrcweir /*********************************************************************
1854cdf0e10cSrcweir |* Neue MasterPages ins Dokument eintragen und den Standard- und
1855cdf0e10cSrcweir |* Notizseiten das Praesentationslayout ueberbraten
1856cdf0e10cSrcweir \********************************************************************/
1857cdf0e10cSrcweir if (pSourceDoc != this)
1858cdf0e10cSrcweir {
1859cdf0e10cSrcweir // Die Masterpages einfuegen:
1860cdf0e10cSrcweir // Masterpages von neuen Layouts hinten anhaengen; wird ein Layout
1861cdf0e10cSrcweir // dagegen ersetzt, so muss vor der Position der alten Masterpage
1862cdf0e10cSrcweir // eingefuegt werden, damit ab jetzt beim Suchen (z. B. SdPage::
1863cdf0e10cSrcweir // SetPresentationLayout) die neue Masterpage zuerst gefunden wird
1864cdf0e10cSrcweir sal_uInt16 nInsertPos = rOldMaster.GetPageNum();
1865cdf0e10cSrcweir BegUndo();
1866cdf0e10cSrcweir
1867cdf0e10cSrcweir if (!bLayoutReloaded)
1868cdf0e10cSrcweir nInsertPos = 0xFFFF;
1869cdf0e10cSrcweir InsertMasterPage(pMaster, nInsertPos);
1870cdf0e10cSrcweir if( bUndo )
1871cdf0e10cSrcweir AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pMaster));
1872cdf0e10cSrcweir
1873cdf0e10cSrcweir nInsertPos++;
1874cdf0e10cSrcweir if (!bLayoutReloaded)
1875cdf0e10cSrcweir nInsertPos = 0xFFFF;
1876cdf0e10cSrcweir InsertMasterPage(pNotesMaster, nInsertPos);
1877cdf0e10cSrcweir if( bUndo )
1878cdf0e10cSrcweir {
1879cdf0e10cSrcweir AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pNotesMaster));
1880cdf0e10cSrcweir
1881cdf0e10cSrcweir EndUndo(); // schon hier, damit sich Joes Actions ZWISCHEN unsere eigenen schieben
1882cdf0e10cSrcweir }
1883cdf0e10cSrcweir }
1884cdf0e10cSrcweir
1885cdf0e10cSrcweir // Liste mit Seiten fuellen
1886cdf0e10cSrcweir List* pPageList = new List;
1887cdf0e10cSrcweir
1888cdf0e10cSrcweir // #98456, this has to be removed according to CL (KA 07/08/2002)
1889cdf0e10cSrcweir // #109884# but we need them again to restore the styles of the presentation objects while undo
1890cdf0e10cSrcweir pPageList->Insert(pMaster, LIST_APPEND);
1891cdf0e10cSrcweir pPageList->Insert(pNotesMaster, LIST_APPEND);
1892cdf0e10cSrcweir
1893cdf0e10cSrcweir if (bMaster || bLayoutReloaded)
1894cdf0e10cSrcweir {
1895cdf0e10cSrcweir for (sal_uInt16 nPage = 1; nPage < GetPageCount(); nPage++)
1896cdf0e10cSrcweir {
1897cdf0e10cSrcweir pPage = (SdPage*) GetPage(nPage);
1898cdf0e10cSrcweir String aTest = pPage->GetLayoutName();
1899cdf0e10cSrcweir if (aTest == aOldPageLayoutName)
1900cdf0e10cSrcweir {
1901cdf0e10cSrcweir pPageList->Insert(pPage, LIST_APPEND);
1902cdf0e10cSrcweir }
1903cdf0e10cSrcweir }
1904cdf0e10cSrcweir
1905cdf0e10cSrcweir }
1906cdf0e10cSrcweir else
1907cdf0e10cSrcweir {
1908cdf0e10cSrcweir pPageList->Insert(pSelectedPage, LIST_APPEND);
1909cdf0e10cSrcweir pPageList->Insert(pNotes, LIST_APPEND);
1910cdf0e10cSrcweir }
1911cdf0e10cSrcweir
1912cdf0e10cSrcweir pPage = (SdPage*)pPageList->First();
1913cdf0e10cSrcweir while (pPage)
1914cdf0e10cSrcweir {
1915cdf0e10cSrcweir AutoLayout eAutoLayout = pPage->GetAutoLayout();
1916cdf0e10cSrcweir
1917cdf0e10cSrcweir if( bUndo )
1918cdf0e10cSrcweir {
1919cdf0e10cSrcweir SdPresentationLayoutUndoAction * pPLUndoAction =
1920cdf0e10cSrcweir new SdPresentationLayoutUndoAction
1921cdf0e10cSrcweir (this,
1922cdf0e10cSrcweir pPage->IsMasterPage() ? aLayoutName : aOldLayoutName,
1923cdf0e10cSrcweir aLayoutName,
1924cdf0e10cSrcweir eAutoLayout, eAutoLayout, sal_False, pPage);
1925cdf0e10cSrcweir pUndoMgr->AddUndoAction(pPLUndoAction);
1926cdf0e10cSrcweir }
1927cdf0e10cSrcweir pPage->SetPresentationLayout(aLayoutName);
1928cdf0e10cSrcweir pPage->SetAutoLayout(eAutoLayout);
1929cdf0e10cSrcweir
1930cdf0e10cSrcweir pPage = (SdPage*)pPageList->Next();
1931cdf0e10cSrcweir }
1932cdf0e10cSrcweir delete pPageList;
1933cdf0e10cSrcweir
1934cdf0e10cSrcweir /*********************************************************************
1935cdf0e10cSrcweir |* Neue Masterpages angleichen
1936cdf0e10cSrcweir \********************************************************************/
1937cdf0e10cSrcweir if (pSourceDoc != this)
1938cdf0e10cSrcweir {
1939cdf0e10cSrcweir // die Masterpages angleichen
1940cdf0e10cSrcweir Size aSize(rOldMaster.GetSize());
1941cdf0e10cSrcweir Rectangle aBorderRect(rOldMaster.GetLftBorder(),
1942cdf0e10cSrcweir rOldMaster.GetUppBorder(),
1943cdf0e10cSrcweir rOldMaster.GetRgtBorder(),
1944cdf0e10cSrcweir rOldMaster.GetLwrBorder());
1945cdf0e10cSrcweir pMaster->ScaleObjects(aSize, aBorderRect, sal_True);
1946cdf0e10cSrcweir pMaster->SetSize(aSize);
1947cdf0e10cSrcweir pMaster->SetBorder(rOldMaster.GetLftBorder(),
1948cdf0e10cSrcweir rOldMaster.GetUppBorder(),
1949cdf0e10cSrcweir rOldMaster.GetRgtBorder(),
1950cdf0e10cSrcweir rOldMaster.GetLwrBorder());
1951cdf0e10cSrcweir pMaster->SetOrientation( rOldMaster.GetOrientation() );
1952cdf0e10cSrcweir pMaster->SetAutoLayout(pMaster->GetAutoLayout());
1953cdf0e10cSrcweir
1954cdf0e10cSrcweir aSize = rOldNotesMaster.GetSize();
1955cdf0e10cSrcweir Rectangle aNotesBorderRect(rOldNotesMaster.GetLftBorder(),
1956cdf0e10cSrcweir rOldNotesMaster.GetUppBorder(),
1957cdf0e10cSrcweir rOldNotesMaster.GetRgtBorder(),
1958cdf0e10cSrcweir rOldNotesMaster.GetLwrBorder());
1959cdf0e10cSrcweir pNotesMaster->ScaleObjects(aSize, aNotesBorderRect, sal_True);
1960cdf0e10cSrcweir pNotesMaster->SetSize(aSize);
1961cdf0e10cSrcweir pNotesMaster->SetBorder(rOldNotesMaster.GetLftBorder(),
1962cdf0e10cSrcweir rOldNotesMaster.GetUppBorder(),
1963cdf0e10cSrcweir rOldNotesMaster.GetRgtBorder(),
1964cdf0e10cSrcweir rOldNotesMaster.GetLwrBorder());
1965cdf0e10cSrcweir pNotesMaster->SetOrientation( rOldNotesMaster.GetOrientation() );
1966cdf0e10cSrcweir pNotesMaster->SetAutoLayout(pNotesMaster->GetAutoLayout());
1967cdf0e10cSrcweir
1968cdf0e10cSrcweir // Liste der ersetzten Vorlagen mit Inhalt loeschen
1969cdf0e10cSrcweir StyleReplaceData* pReplData = (StyleReplaceData*)pReplList->First();
1970cdf0e10cSrcweir while (pReplData)
1971cdf0e10cSrcweir {
1972cdf0e10cSrcweir delete pReplData;
1973cdf0e10cSrcweir pReplData = (StyleReplaceData*)pReplList->Next();
1974cdf0e10cSrcweir }
1975cdf0e10cSrcweir delete pReplList;
1976cdf0e10cSrcweir
1977cdf0e10cSrcweir
1978cdf0e10cSrcweir if( (pSourceDoc->GetDocumentType() == DOCUMENT_TYPE_IMPRESS) &&
1979cdf0e10cSrcweir (GetDocumentType() == DOCUMENT_TYPE_DRAW) )
1980cdf0e10cSrcweir {
1981cdf0e10cSrcweir pMaster->RemoveEmptyPresentationObjects();
1982cdf0e10cSrcweir pNotesMaster->RemoveEmptyPresentationObjects();
1983cdf0e10cSrcweir }
1984cdf0e10cSrcweir }
1985cdf0e10cSrcweir }
1986cdf0e10cSrcweir else
1987cdf0e10cSrcweir {
1988cdf0e10cSrcweir /*********************************************************************
1989cdf0e10cSrcweir |* Einen neuen Layoutnamen ausdenken
1990cdf0e10cSrcweir \********************************************************************/
1991*26a7fe9cSArmin Le Grand String aName(createNewMasterPageLayoutName(*this));
1992cdf0e10cSrcweir String aPageLayoutName(aName);
1993cdf0e10cSrcweir aPageLayoutName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( SD_LT_SEPARATOR ));
1994cdf0e10cSrcweir aPageLayoutName += String(SdResId(STR_LAYOUT_OUTLINE));
1995cdf0e10cSrcweir
1996cdf0e10cSrcweir /*********************************************************************
1997cdf0e10cSrcweir |* Neue StyleSheets erzeugen
1998cdf0e10cSrcweir \********************************************************************/
1999cdf0e10cSrcweir static_cast<SdStyleSheetPool*>( mxStyleSheetPool.get())->CreateLayoutStyleSheets(aName);
2000cdf0e10cSrcweir SdStyleSheetVector aCreatedStyles;
2001cdf0e10cSrcweir static_cast<SdStyleSheetPool*>( mxStyleSheetPool.get())->CreateLayoutSheetList(aName, aCreatedStyles);
2002cdf0e10cSrcweir
2003cdf0e10cSrcweir if( bUndo )
2004cdf0e10cSrcweir {
2005cdf0e10cSrcweir SdMoveStyleSheetsUndoAction* pMovStyles = new SdMoveStyleSheetsUndoAction(this, aCreatedStyles, sal_True);
2006cdf0e10cSrcweir pUndoMgr->AddUndoAction(pMovStyles);
2007cdf0e10cSrcweir }
2008cdf0e10cSrcweir
2009cdf0e10cSrcweir /*********************************************************************
2010cdf0e10cSrcweir |* Neue MasterPages erzeugen und ins Dokument eintragen
2011cdf0e10cSrcweir \********************************************************************/
2012cdf0e10cSrcweir
2013cdf0e10cSrcweir if( bUndo )
2014cdf0e10cSrcweir BegUndo();
2015cdf0e10cSrcweir
2016cdf0e10cSrcweir pMaster = (SdPage*) AllocPage(sal_True);
2017cdf0e10cSrcweir pMaster->SetSize(pSelectedPage->GetSize());
2018cdf0e10cSrcweir pMaster->SetBorder(pSelectedPage->GetLftBorder(),
2019cdf0e10cSrcweir pSelectedPage->GetUppBorder(),
2020cdf0e10cSrcweir pSelectedPage->GetRgtBorder(),
2021cdf0e10cSrcweir pSelectedPage->GetLwrBorder() );
2022cdf0e10cSrcweir pMaster->SetName(aName);
2023cdf0e10cSrcweir pMaster->SetLayoutName(aPageLayoutName);
2024cdf0e10cSrcweir InsertMasterPage(pMaster);
2025cdf0e10cSrcweir
2026cdf0e10cSrcweir if( bUndo )
2027cdf0e10cSrcweir AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pMaster));
2028cdf0e10cSrcweir
2029cdf0e10cSrcweir pMaster->SetAutoLayout(AUTOLAYOUT_NONE, true, true);
2030cdf0e10cSrcweir
2031cdf0e10cSrcweir pNotesMaster = (SdPage*) AllocPage(sal_True);
2032cdf0e10cSrcweir pNotesMaster->SetPageKind(PK_NOTES);
2033cdf0e10cSrcweir pNotesMaster->SetSize(pNotes->GetSize());
2034cdf0e10cSrcweir pNotesMaster->SetBorder(pNotes->GetLftBorder(),
2035cdf0e10cSrcweir pNotes->GetUppBorder(),
2036cdf0e10cSrcweir pNotes->GetRgtBorder(),
2037cdf0e10cSrcweir pNotes->GetLwrBorder() );
2038cdf0e10cSrcweir pNotesMaster->SetName(aName);
2039cdf0e10cSrcweir pNotesMaster->SetLayoutName(aPageLayoutName);
2040cdf0e10cSrcweir InsertMasterPage(pNotesMaster);
2041cdf0e10cSrcweir
2042cdf0e10cSrcweir if( bUndo )
2043cdf0e10cSrcweir AddUndo(GetSdrUndoFactory().CreateUndoNewPage(*pNotesMaster));
2044cdf0e10cSrcweir
2045cdf0e10cSrcweir pNotesMaster->SetAutoLayout(AUTOLAYOUT_NOTES, true, true);
2046cdf0e10cSrcweir
2047cdf0e10cSrcweir if( bUndo )
2048cdf0e10cSrcweir EndUndo();
2049cdf0e10cSrcweir
2050cdf0e10cSrcweir /*********************************************************************
2051cdf0e10cSrcweir |* Liste der betroffenen Standard- und Notizseiten erstellen
2052cdf0e10cSrcweir \********************************************************************/
2053cdf0e10cSrcweir List* pPageList = new List;
2054cdf0e10cSrcweir if (bMaster)
2055cdf0e10cSrcweir {
2056cdf0e10cSrcweir for (sal_uInt16 nPage = 1; nPage < GetPageCount(); nPage++)
2057cdf0e10cSrcweir {
2058cdf0e10cSrcweir pPage = (SdPage*) GetPage(nPage);
2059cdf0e10cSrcweir const String s(pPage->GetLayoutName());
2060cdf0e10cSrcweir if(s == aOldPageLayoutName)
2061cdf0e10cSrcweir {
2062cdf0e10cSrcweir pPageList->Insert(pPage, LIST_APPEND);
2063cdf0e10cSrcweir }
2064cdf0e10cSrcweir }
2065cdf0e10cSrcweir }
2066cdf0e10cSrcweir else
2067cdf0e10cSrcweir {
2068cdf0e10cSrcweir pPageList->Insert(pSelectedPage, LIST_APPEND);
2069cdf0e10cSrcweir pPageList->Insert(pNotes, LIST_APPEND);
2070cdf0e10cSrcweir }
2071cdf0e10cSrcweir
2072cdf0e10cSrcweir /*********************************************************************
2073cdf0e10cSrcweir |* An den betroffenen Seiten Praesentations- und Autolayout setzen
2074cdf0e10cSrcweir \********************************************************************/
2075cdf0e10cSrcweir pPage = (SdPage*)pPageList->First();
2076cdf0e10cSrcweir while(pPage)
2077cdf0e10cSrcweir {
2078cdf0e10cSrcweir AutoLayout eOldAutoLayout = pPage->GetAutoLayout();
2079cdf0e10cSrcweir AutoLayout eNewAutoLayout =
2080cdf0e10cSrcweir pPage->GetPageKind() == PK_STANDARD ? AUTOLAYOUT_NONE : AUTOLAYOUT_NOTES;
2081cdf0e10cSrcweir
2082cdf0e10cSrcweir if( bUndo )
2083cdf0e10cSrcweir {
2084cdf0e10cSrcweir SdPresentationLayoutUndoAction * pPLUndoAction =
2085cdf0e10cSrcweir new SdPresentationLayoutUndoAction
2086cdf0e10cSrcweir (this, aOldLayoutName, aName,
2087cdf0e10cSrcweir eOldAutoLayout, eNewAutoLayout, sal_True,
2088cdf0e10cSrcweir pPage);
2089cdf0e10cSrcweir pUndoMgr->AddUndoAction(pPLUndoAction);
2090cdf0e10cSrcweir }
2091cdf0e10cSrcweir
2092cdf0e10cSrcweir pPage->SetPresentationLayout(aName);
2093cdf0e10cSrcweir pPage->SetAutoLayout(eNewAutoLayout);
2094cdf0e10cSrcweir
2095cdf0e10cSrcweir pPage = (SdPage*)pPageList->Next();
2096cdf0e10cSrcweir }
2097cdf0e10cSrcweir
2098cdf0e10cSrcweir // Seitenliste loeschen
2099cdf0e10cSrcweir delete pPageList;
2100cdf0e10cSrcweir }
2101cdf0e10cSrcweir
2102cdf0e10cSrcweir /*********************************************************************
2103cdf0e10cSrcweir |* falls die alten Masterpages nicht mehr benoetigt werden,
2104cdf0e10cSrcweir |* muessen sie und die entsprechenden Praesentationsvorlagen
2105cdf0e10cSrcweir |* entfernt werden
2106cdf0e10cSrcweir \********************************************************************/
2107cdf0e10cSrcweir if (bCheckMasters)
2108cdf0e10cSrcweir {
2109cdf0e10cSrcweir // Alle pruefen
2110cdf0e10cSrcweir RemoveUnnecessaryMasterPages();
2111cdf0e10cSrcweir }
2112cdf0e10cSrcweir else
2113cdf0e10cSrcweir {
2114cdf0e10cSrcweir // Nur die ausgetauschte MasterPage pruefen
2115cdf0e10cSrcweir RemoveUnnecessaryMasterPages(&rOldMaster);
2116cdf0e10cSrcweir }
2117cdf0e10cSrcweir
2118cdf0e10cSrcweir if( bUndo )
2119cdf0e10cSrcweir pUndoMgr->LeaveListAction();
2120cdf0e10cSrcweir
2121cdf0e10cSrcweir if( mpDocSh )
2122cdf0e10cSrcweir mpDocSh->SetWaitCursor( sal_False );
2123cdf0e10cSrcweir }
2124cdf0e10cSrcweir
2125cdf0e10cSrcweir
2126cdf0e10cSrcweir
Merge(SdrModel & rSourceModel,sal_uInt16 nFirstPageNum,sal_uInt16 nLastPageNum,sal_uInt16 nDestPos,FASTBOOL bMergeMasterPages,FASTBOOL bAllMasterPages,FASTBOOL bUndo,FASTBOOL bTreadSourceAsConst)2127cdf0e10cSrcweir void SdDrawDocument::Merge(SdrModel& rSourceModel,
2128cdf0e10cSrcweir sal_uInt16 nFirstPageNum, sal_uInt16 nLastPageNum,
2129cdf0e10cSrcweir sal_uInt16 nDestPos,
2130cdf0e10cSrcweir FASTBOOL bMergeMasterPages, FASTBOOL bAllMasterPages,
2131cdf0e10cSrcweir FASTBOOL bUndo, FASTBOOL bTreadSourceAsConst)
2132cdf0e10cSrcweir {
2133cdf0e10cSrcweir sal_uInt16 nMasterPageCount = GetMasterPageCount();
2134cdf0e10cSrcweir SdrModel::Merge( rSourceModel, nFirstPageNum, nLastPageNum, nDestPos, bMergeMasterPages, bAllMasterPages, bUndo, bTreadSourceAsConst );
2135cdf0e10cSrcweir
2136cdf0e10cSrcweir // add style family for each new master page
2137cdf0e10cSrcweir for( sal_uInt16 nMaster = nMasterPageCount; nMaster < GetMasterPageCount(); nMaster++ )
2138cdf0e10cSrcweir {
2139cdf0e10cSrcweir SdPage* pPage = static_cast< SdPage* >( GetMasterPage( nMaster ) );
2140cdf0e10cSrcweir if( pPage && pPage->IsMasterPage() && (pPage->GetPageKind() == PK_STANDARD) )
2141cdf0e10cSrcweir {
2142cdf0e10cSrcweir // new master page created, add its style family
2143cdf0e10cSrcweir SdStyleSheetPool* pStylePool = (SdStyleSheetPool*) GetStyleSheetPool();
2144cdf0e10cSrcweir if( pStylePool )
2145cdf0e10cSrcweir pStylePool->AddStyleFamily( pPage );
2146cdf0e10cSrcweir }
2147cdf0e10cSrcweir }
2148cdf0e10cSrcweir }
2149