summaryrefslogtreecommitdiff
path: root/sd/source/ui/toolpanel/controls/DocumentHelper.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/toolpanel/controls/DocumentHelper.cxx')
-rw-r--r--sd/source/ui/toolpanel/controls/DocumentHelper.cxx584
1 files changed, 0 insertions, 584 deletions
diff --git a/sd/source/ui/toolpanel/controls/DocumentHelper.cxx b/sd/source/ui/toolpanel/controls/DocumentHelper.cxx
deleted file mode 100644
index ff42e8264..000000000
--- a/sd/source/ui/toolpanel/controls/DocumentHelper.cxx
+++ /dev/null
@@ -1,584 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_sd.hxx"
-
-#include "DocumentHelper.hxx"
-
-#include "drawdoc.hxx"
-#include "DrawDocShell.hxx"
-#include "sdpage.hxx"
-#include "glob.hxx"
-#include "unmovss.hxx"
-#include "strings.hrc"
-#include "sdresid.hxx"
-#include "undoback.hxx"
-#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
-#include <com/sun/star/drawing/XDrawPages.hpp>
-#include <com/sun/star/frame/XComponentLoader.hpp>
-#include <com/sun/star/container/XIndexAccess.hpp>
-#include "stlpool.hxx"
-#include <svx/xfillit0.hxx>
-#include <tools/diagnose_ex.h>
-
-using namespace ::com::sun::star;
-
-namespace sd { namespace toolpanel { namespace controls {
-
-SdPage* DocumentHelper::CopyMasterPageToLocalDocument (
- SdDrawDocument& rTargetDocument,
- SdPage* pMasterPage)
-{
- SdPage* pNewMasterPage = NULL;
-
- do
- {
- if (pMasterPage == NULL)
- break;
-
- // Check the presence of the source document.
- SdDrawDocument* pSourceDocument = static_cast<SdDrawDocument*>(
- pMasterPage->GetModel());
- if (pSourceDocument == NULL)
- break;
-
- // When the given master page already belongs to the target document
- // then there is nothing more to do.
- if (pSourceDocument == &rTargetDocument)
- {
- pNewMasterPage = pMasterPage;
- break;
- }
-
- // Test if the master pages of both the slide and its notes page are
- // present. This is not the case when we are called during the
- // creation of the slide master page because then the notes master
- // page is not there.
- sal_uInt16 nSourceMasterPageCount = pSourceDocument->GetMasterPageCount();
- if (nSourceMasterPageCount%2 == 0)
- // There should be 1 handout page + n slide masters + n notes
- // masters = 2*n+1. An even value indicates that a new slide
- // master but not yet the notes master has been inserted.
- break;
- sal_uInt16 nIndex = pMasterPage->GetPageNum();
- if (nSourceMasterPageCount <= nIndex+1)
- break;
- // Get the slide master page.
- if (pMasterPage != static_cast<SdPage*>(
- pSourceDocument->GetMasterPage(nIndex)))
- break;
- // Get the notes master page.
- SdPage* pNotesMasterPage = static_cast<SdPage*>(
- pSourceDocument->GetMasterPage(nIndex+1));
- if (pNotesMasterPage == NULL)
- break;
-
-
- // Check if a master page with the same name as that of the given
- // master page already exists.
- bool bPageExists (false);
- sal_uInt16 nMasterPageCount(rTargetDocument.GetMasterSdPageCount(PK_STANDARD));
- for (sal_uInt16 nMaster=0; nMaster<nMasterPageCount; nMaster++)
- {
- SdPage* pCandidate = static_cast<SdPage*>(
- rTargetDocument.GetMasterSdPage (nMaster, PK_STANDARD));
- if (pMasterPage!=NULL
- && pCandidate->GetName().CompareTo(pMasterPage->GetName())==0)
- {
- bPageExists = true;
- pNewMasterPage = pCandidate;
- break;
- }
- }
- if (bPageExists)
- break;
-
- // Create a new slide (and its notes page.)
- uno::Reference<drawing::XDrawPagesSupplier> xSlideSupplier (
- rTargetDocument.getUnoModel(), uno::UNO_QUERY);
- if ( ! xSlideSupplier.is())
- break;
- uno::Reference<drawing::XDrawPages> xSlides (
- xSlideSupplier->getDrawPages(), uno::UNO_QUERY);
- if ( ! xSlides.is())
- break;
- xSlides->insertNewByIndex (xSlides->getCount());
-
- // Set a layout.
- SdPage* pSlide = rTargetDocument.GetSdPage(
- rTargetDocument.GetSdPageCount(PK_STANDARD)-1,
- PK_STANDARD);
- if (pSlide == NULL)
- break;
- pSlide->SetAutoLayout(AUTOLAYOUT_TITLE, sal_True);
-
- // Create a copy of the master page and the associated notes
- // master page and insert them into our document.
- pNewMasterPage = AddMasterPage(rTargetDocument, pMasterPage);
- if (pNewMasterPage==NULL)
- break;
- SdPage* pNewNotesMasterPage
- = AddMasterPage(rTargetDocument, pNotesMasterPage);
- if (pNewNotesMasterPage==NULL)
- break;
-
- // Make the connection from the new slide to the master page
- // (and do the same for the notes page.)
- rTargetDocument.SetMasterPage (
- rTargetDocument.GetSdPageCount(PK_STANDARD)-1,
- pNewMasterPage->GetName(),
- &rTargetDocument,
- sal_False, // Connect the new master page with the new slide but
- // do not modify other (master) pages.
- sal_True);
- }
- while (false);
-
- // We are not interested in any automatisms for our modified internal
- // document.
- rTargetDocument.SetChanged (sal_False);
-
- return pNewMasterPage;
-}
-
-
-
-
-SdPage* DocumentHelper::GetSlideForMasterPage (SdPage* pMasterPage)
-{
- SdPage* pCandidate = NULL;
-
- SdDrawDocument* pDocument = NULL;
- if (pMasterPage != NULL)
- pDocument = dynamic_cast<SdDrawDocument*>(pMasterPage->GetModel());
-
- // Iterate over all pages and check if it references the given master
- // page.
- if (pDocument!=NULL && pDocument->GetSdPageCount(PK_STANDARD) > 0)
- {
- // In most cases a new slide has just been inserted so start with
- // the last page.
- sal_uInt16 nPageIndex (pDocument->GetSdPageCount(PK_STANDARD)-1);
- bool bFound (false);
- while ( ! bFound)
- {
- pCandidate = pDocument->GetSdPage(
- nPageIndex,
- PK_STANDARD);
- if (pCandidate != NULL)
- {
- if (static_cast<SdPage*>(&pCandidate->TRG_GetMasterPage())
- == pMasterPage)
- {
- bFound = true;
- break;
- }
- }
-
- if (nPageIndex == 0)
- break;
- else
- nPageIndex --;
- }
-
- // If no page was found that refernced the given master page reset
- // the pointer that is returned.
- if ( ! bFound)
- pCandidate = NULL;
- }
-
- return pCandidate;
-}
-
-
-
-
-SdPage* DocumentHelper::AddMasterPage (
- SdDrawDocument& rTargetDocument,
- SdPage* pMasterPage)
-{
- SdPage* pClonedMasterPage = NULL;
-
- if (pMasterPage!=NULL)
- {
- try
- {
- // Duplicate the master page.
- pClonedMasterPage = static_cast<SdPage*>(pMasterPage->Clone());
-
- // Copy the necessary styles.
- SdDrawDocument* pSourceDocument
- = static_cast<SdDrawDocument*>(pMasterPage->GetModel());
- if (pSourceDocument != NULL)
- ProvideStyles (*pSourceDocument, rTargetDocument, pClonedMasterPage);
-
- // Copy the precious flag.
- pClonedMasterPage->SetPrecious(pMasterPage->IsPrecious());
-
- // Now that the styles are available we can insert the cloned
- // master page.
- rTargetDocument.InsertMasterPage (pClonedMasterPage);
- }
- catch(const uno::Exception&)
- {
- pClonedMasterPage = NULL;
- DBG_UNHANDLED_EXCEPTION();
- }
- catch(const ::std::exception&)
- {
- pClonedMasterPage = NULL;
- OSL_TRACE ("caught general exception");
- }
- catch(...)
- {
- pClonedMasterPage = NULL;
- OSL_TRACE ("caught general exception");
- }
- }
-
- return pClonedMasterPage;
-}
-
-
-
-
-void DocumentHelper::ProvideStyles (
- SdDrawDocument& rSourceDocument,
- SdDrawDocument& rTargetDocument,
- SdPage* pPage)
-{
- // Get the layout name of the given page.
- String sLayoutName (pPage->GetLayoutName());
- sLayoutName.Erase (sLayoutName.SearchAscii (SD_LT_SEPARATOR));
-
- // Copy the style sheet from source to target document.
- SdStyleSheetPool* pSourceStyleSheetPool =
- static_cast<SdStyleSheetPool*>(rSourceDocument.GetStyleSheetPool());
- SdStyleSheetPool* pTargetStyleSheetPool =
- static_cast<SdStyleSheetPool*>(rTargetDocument.GetStyleSheetPool());
- SdStyleSheetVector aCreatedStyles;
- pTargetStyleSheetPool->CopyLayoutSheets (
- sLayoutName,
- *pSourceStyleSheetPool,
- aCreatedStyles);
-
- // Add an undo action for the copied style sheets.
- if( !aCreatedStyles.empty() )
- {
- ::svl::IUndoManager* pUndoManager = rTargetDocument.GetDocSh()->GetUndoManager();
- if (pUndoManager != NULL)
- {
- SdMoveStyleSheetsUndoAction* pMovStyles =
- new SdMoveStyleSheetsUndoAction (
- &rTargetDocument,
- aCreatedStyles,
- sal_True);
- pUndoManager->AddUndoAction (pMovStyles);
- }
- }
-}
-
-
-
-
-void DocumentHelper::AssignMasterPageToPageList (
- SdDrawDocument& rTargetDocument,
- SdPage* pMasterPage,
- const ::boost::shared_ptr<std::vector<SdPage*> >& rpPageList)
-{
- if (pMasterPage == NULL || !pMasterPage->IsMasterPage())
- return;
-
- // Make the layout name by stripping ouf the layout postfix from the
- // layout name of the given master page.
- String sFullLayoutName (pMasterPage->GetLayoutName());
- String sBaseLayoutName (sFullLayoutName);
- sBaseLayoutName.Erase (sBaseLayoutName.SearchAscii (SD_LT_SEPARATOR));
-
- if (rpPageList->empty())
- return;
-
- // Create a second list that contains only the valid pointers to
- // pages for which an assignment is necessary.
- ::std::vector<SdPage*>::const_iterator iPage;
- ::std::vector<SdPage*> aCleanedList;
- for (iPage=rpPageList->begin(); iPage!=rpPageList->end(); ++iPage)
- {
- OSL_ASSERT(*iPage!=NULL && (*iPage)->GetModel() == &rTargetDocument);
- if (*iPage != NULL
- && (*iPage)->GetLayoutName().CompareTo(sFullLayoutName)!=0)
- {
- aCleanedList.push_back(*iPage);
- }
- }
- if (aCleanedList.size() == 0)
- return;
-
- ::svl::IUndoManager* pUndoMgr = rTargetDocument.GetDocSh()->GetUndoManager();
- if( pUndoMgr )
- pUndoMgr->EnterListAction(String(SdResId(STR_UNDO_SET_PRESLAYOUT)), String());
-
- SdPage* pMasterPageInDocument = ProvideMasterPage(rTargetDocument,pMasterPage,rpPageList);
- if (pMasterPageInDocument == NULL)
- return;
-
- // Assign the master pages to the given list of pages.
- for (iPage=aCleanedList.begin();
- iPage!=aCleanedList.end();
- ++iPage)
- {
- AssignMasterPageToPage (
- pMasterPageInDocument,
- sBaseLayoutName,
- *iPage);
- }
-
- if( pUndoMgr )
- pUndoMgr->LeaveListAction();
-}
-
-
-
-
-SdPage* DocumentHelper::AddMasterPage (
- SdDrawDocument& rTargetDocument,
- SdPage* pMasterPage,
- sal_uInt16 nInsertionIndex)
-{
- SdPage* pClonedMasterPage = NULL;
-
- if (pMasterPage!=NULL)
- {
- // Duplicate the master page.
- pClonedMasterPage = static_cast<SdPage*>(pMasterPage->Clone());
-
- // Copy the precious flag.
- pClonedMasterPage->SetPrecious(pMasterPage->IsPrecious());
-
- // Copy the necessary styles.
- SdDrawDocument* pSourceDocument
- = static_cast<SdDrawDocument*>(pMasterPage->GetModel());
- if (pSourceDocument != NULL)
- {
- ProvideStyles (*pSourceDocument, rTargetDocument, pClonedMasterPage);
-
- // Now that the styles are available we can insert the cloned
- // master page.
- rTargetDocument.InsertMasterPage (pClonedMasterPage, nInsertionIndex);
-
- // Adapt the size of the new master page to that of the pages in
- // the document.
- Size aNewSize (rTargetDocument.GetSdPage(0, pMasterPage->GetPageKind())->GetSize());
- Rectangle aBorders (
- pClonedMasterPage->GetLftBorder(),
- pClonedMasterPage->GetUppBorder(),
- pClonedMasterPage->GetRgtBorder(),
- pClonedMasterPage->GetLwrBorder());
- pClonedMasterPage->ScaleObjects(aNewSize, aBorders, sal_True);
- pClonedMasterPage->SetSize(aNewSize);
- pClonedMasterPage->CreateTitleAndLayout(sal_True);
- }
- }
-
- return pClonedMasterPage;
-}
-
-
-
-
-/** In here we have to handle three cases:
- 1. pPage is a normal slide. We can use SetMasterPage to assign the
- master pages to it.
- 2. pPage is a master page that is used by at least one slide. We can
- assign the master page to these slides.
- 3. pPage is a master page that is currently not used by any slide.
- We can delete that page and add copies of the given master pages
- instead.
-
- For points 2 and 3 where one master page A is assigned to another B we have
- to keep in mind that the master page that page A has already been
- inserted into the target document.
-*/
-void DocumentHelper::AssignMasterPageToPage (
- SdPage* pMasterPage,
- const String& rsBaseLayoutName,
- SdPage* pPage)
-{
- // Leave early when the parameters are invalid.
- if (pPage == NULL || pMasterPage == NULL)
- return;
- SdDrawDocument* pDocument = dynamic_cast<SdDrawDocument*>(pPage->GetModel());
- if (pDocument == NULL)
- return;
-
- if ( ! pPage->IsMasterPage())
- {
- // 1. Remove the background object (so that that, if it exists, does
- // not override the new master page) and assign the master page to
- // the regular slide.
- pDocument->GetDocSh()->GetUndoManager()->AddUndoAction(
- new SdBackgroundObjUndoAction(
- *pDocument, *pPage, pPage->getSdrPageProperties().GetItemSet()),
- sal_True);
- pPage->getSdrPageProperties().PutItem(XFillStyleItem(XFILL_NONE));
-
- pDocument->SetMasterPage (
- (pPage->GetPageNum()-1)/2,
- rsBaseLayoutName,
- pDocument,
- sal_False,
- sal_False);
- }
- else
- {
- // Find first slide that uses the master page.
- SdPage* pSlide = NULL;
- sal_uInt16 nPageCount = pDocument->GetSdPageCount(PK_STANDARD);
- for (sal_uInt16 nPage=0; nPage<nPageCount&&pSlide==NULL; nPage++)
- {
- SdrPage* pCandidate = pDocument->GetSdPage(nPage,PK_STANDARD);
- if (pCandidate != NULL
- && pCandidate->TRG_HasMasterPage()
- && &(pCandidate->TRG_GetMasterPage()) == pPage)
- {
- pSlide = static_cast<SdPage*>(pCandidate);
- }
- }
-
- if (pSlide != NULL)
- {
- // 2. Assign the given master pages to the first slide that was
- // found above that uses the master page.
- pDocument->SetMasterPage (
- (pSlide->GetPageNum()-1)/2,
- rsBaseLayoutName,
- pDocument,
- sal_False,
- sal_False);
- }
- else
- {
- // 3. Replace the master page A by a copy of the given master
- // page B.
- pDocument->RemoveUnnecessaryMasterPages (
- pPage, sal_False);
- }
- }
-}
-
-
-
-
-SdPage* DocumentHelper::ProvideMasterPage (
- SdDrawDocument& rTargetDocument,
- SdPage* pMasterPage,
- const ::boost::shared_ptr<std::vector<SdPage*> >& rpPageList)
-{
- // Make sure that both the master page and its notes master exist
- // in the source document. If one is missing then return without
- // making any changes.
- if (pMasterPage == NULL)
- {
- // The caller should make sure that the master page is valid.
- OSL_ASSERT(pMasterPage != NULL);
- return NULL;
- }
- SdDrawDocument* pSourceDocument = static_cast<SdDrawDocument*>(pMasterPage->GetModel());
- if (pSourceDocument == NULL)
- return NULL;
- SdPage* pNotesMasterPage = static_cast<SdPage*>(
- pSourceDocument->GetMasterPage(pMasterPage->GetPageNum()+1));
- if (pNotesMasterPage == NULL)
- {
- // The model is not in a valid state. Maybe a new master page
- // is being (not finished yet) created? Return without making
- // any changes.
- return NULL;
- }
-
- SdPage* pMasterPageInDocument = NULL;
- // Search for a master page with the same name as the given one in
- // the target document.
- const XubString sMasterPageLayoutName (pMasterPage->GetLayoutName());
- for (sal_uInt16 nIndex=0,nCount=rTargetDocument.GetMasterPageCount(); nIndex<nCount; ++nIndex)
- {
- SdPage* pCandidate = static_cast<SdPage*>(rTargetDocument.GetMasterPage(nIndex));
- if (pCandidate!=NULL
- && sMasterPageLayoutName==pCandidate->GetLayoutName())
- {
- // The requested master page does already exist in the
- // target document, return it.
- return pCandidate;
- }
- }
-
- // The given master page does not already belong to the target
- // document so we have to create copies and insert them into the
- // targer document.
-
- // Determine the position where the new master pages are inserted.
- // By default they are inserted at the end. When we assign to a
- // master page then insert after the last of the (selected) pages.
- sal_uInt16 nInsertionIndex = rTargetDocument.GetMasterPageCount();
- if (rpPageList->front()->IsMasterPage())
- {
- nInsertionIndex = rpPageList->back()->GetPageNum();
- }
-
- // Clone the master page.
- if (pMasterPage->GetModel() != &rTargetDocument)
- {
- pMasterPageInDocument = AddMasterPage (rTargetDocument, pMasterPage, nInsertionIndex);
- if( rTargetDocument.IsUndoEnabled() )
- rTargetDocument.AddUndo(
- rTargetDocument.GetSdrUndoFactory().CreateUndoNewPage(*pMasterPageInDocument));
- }
- else
- pMasterPageInDocument = pMasterPage;
-
- // Clone the notes master.
- if (pNotesMasterPage->GetModel() != &rTargetDocument)
- {
- SdPage* pClonedNotesMasterPage
- = AddMasterPage (rTargetDocument, pNotesMasterPage, nInsertionIndex+1);
- if( rTargetDocument.IsUndoEnabled() )
- rTargetDocument.AddUndo(
- rTargetDocument.GetSdrUndoFactory().CreateUndoNewPage(*pClonedNotesMasterPage));
- }
-
- return pMasterPageInDocument;
-}
-
-
-
-
-
-} } } // end of namespace ::sd::toolpanel::controls
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */