summaryrefslogtreecommitdiff
path: root/sd/source/ui/func/fuprlout.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/func/fuprlout.cxx')
-rw-r--r--sd/source/ui/func/fuprlout.cxx287
1 files changed, 287 insertions, 0 deletions
diff --git a/sd/source/ui/func/fuprlout.cxx b/sd/source/ui/func/fuprlout.cxx
new file mode 100644
index 000000000000..0d6f0b5aa565
--- /dev/null
+++ b/sd/source/ui/func/fuprlout.cxx
@@ -0,0 +1,287 @@
+/*************************************************************************
+ *
+ * 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 "fuprlout.hxx"
+#include <vcl/wrkwin.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svl/smplhint.hxx>
+#include <svl/itempool.hxx>
+#include <sot/storage.hxx>
+#include <vcl/msgbox.hxx>
+#include <svx/svdundo.hxx>
+
+#include <sfx2/viewfrm.hxx>
+#include <sfx2/request.hxx>
+
+#include "drawdoc.hxx"
+#include "sdpage.hxx"
+#include "pres.hxx"
+#include "DrawViewShell.hxx"
+#ifndef SD_FRAMW_VIEW_HXX
+#include "FrameView.hxx"
+#endif
+#include "stlpool.hxx"
+#include "View.hxx"
+#include "glob.hrc"
+#include "glob.hxx"
+#include "strings.hrc"
+#include "strmname.h"
+#include "app.hrc"
+#include "DrawDocShell.hxx"
+#include "unprlout.hxx"
+#include "unchss.hxx"
+#include "unmovss.hxx"
+#include "sdattr.hxx"
+#include "sdresid.hxx"
+#include "drawview.hxx"
+#include "eetext.hxx"
+#include <editeng/editdata.hxx>
+#include "sdabstdlg.hxx"
+
+namespace sd
+{
+
+#ifndef SO2_DECL_SVSTORAGE_DEFINED
+#define SO2_DECL_SVSTORAGE_DEFINED
+SO2_DECL_REF(SvStorage)
+#endif
+
+TYPEINIT1( FuPresentationLayout, FuPoor );
+
+#define POOL_BUFFER_SIZE (USHORT)32768
+#define DOCUMENT_BUFFER_SIZE (USHORT)32768
+#define DOCUMENT_TOKEN (sal_Unicode('#'))
+
+/*************************************************************************
+|*
+|* Konstruktor
+|*
+\************************************************************************/
+
+FuPresentationLayout::FuPresentationLayout (
+ ViewShell* pViewSh,
+ ::sd::Window* pWin,
+ ::sd::View* pView,
+ SdDrawDocument* pDoc,
+ SfxRequest& rReq)
+ : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
+{
+}
+
+FunctionReference FuPresentationLayout::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
+{
+ FunctionReference xFunc( new FuPresentationLayout( pViewSh, pWin, pView, pDoc, rReq ) );
+ xFunc->DoExecute(rReq);
+ return xFunc;
+}
+
+void FuPresentationLayout::DoExecute( SfxRequest& rReq )
+{
+ // damit nicht Objekte, die gerade editiert werden oder selektiert
+ // sind , verschwinden
+ mpView->SdrEndTextEdit();
+
+ if(mpView->GetSdrPageView())
+ {
+ mpView->UnmarkAll();
+ }
+
+ BOOL bError = FALSE;
+
+ // die aktive Seite ermitteln
+ USHORT nSelectedPage = SDRPAGE_NOTFOUND;
+ for (USHORT nPage = 0; nPage < mpDoc->GetSdPageCount(PK_STANDARD); nPage++)
+ {
+ if (mpDoc->GetSdPage(nPage, PK_STANDARD)->IsSelected())
+ {
+ nSelectedPage = nPage;
+ break;
+ }
+ }
+
+ DBG_ASSERT(nSelectedPage != SDRPAGE_NOTFOUND, "keine selektierte Seite");
+ SdPage* pSelectedPage = mpDoc->GetSdPage(nSelectedPage, PK_STANDARD);
+ String aOldPageLayoutName(pSelectedPage->GetLayoutName());
+ String aOldLayoutName(aOldPageLayoutName);
+ aOldLayoutName.Erase(aOldLayoutName.SearchAscii(SD_LT_SEPARATOR));
+
+ // wenn wir auf einer Masterpage sind, gelten die Aenderungen fuer alle
+ // Seiten und Notizseiten, die das betreffende Layout benutzen
+ BOOL bOnMaster = FALSE;
+ if( mpViewShell && mpViewShell->ISA(DrawViewShell))
+ {
+ EditMode eEditMode =
+ static_cast<DrawViewShell*>(mpViewShell)->GetEditMode();
+ if (eEditMode == EM_MASTERPAGE)
+ bOnMaster = TRUE;
+ }
+ BOOL bMasterPage = bOnMaster;
+ BOOL bCheckMasters = FALSE;
+
+ // Dialog aufrufen
+ BOOL bLoad = FALSE; // tauchen neue Masterpages auf?
+ String aFile;
+
+ SfxItemSet aSet(mpDoc->GetPool(), ATTR_PRESLAYOUT_START, ATTR_PRESLAYOUT_END);
+
+ aSet.Put( SfxBoolItem( ATTR_PRESLAYOUT_LOAD, bLoad));
+ aSet.Put( SfxBoolItem( ATTR_PRESLAYOUT_MASTER_PAGE, bMasterPage ) );
+ aSet.Put( SfxBoolItem( ATTR_PRESLAYOUT_CHECK_MASTERS, bCheckMasters ) );
+ aSet.Put( SfxStringItem( ATTR_PRESLAYOUT_NAME, aOldLayoutName));
+
+
+
+ const SfxItemSet *pArgs = rReq.GetArgs ();
+
+ if (pArgs)
+ {
+ if (pArgs->GetItemState(ATTR_PRESLAYOUT_LOAD) == SFX_ITEM_SET)
+ bLoad = ((SfxBoolItem&)pArgs->Get(ATTR_PRESLAYOUT_LOAD)).GetValue();
+ if( pArgs->GetItemState( ATTR_PRESLAYOUT_MASTER_PAGE ) == SFX_ITEM_SET )
+ bMasterPage = ( (SfxBoolItem&) pArgs->Get( ATTR_PRESLAYOUT_MASTER_PAGE ) ).GetValue();
+ if( pArgs->GetItemState( ATTR_PRESLAYOUT_CHECK_MASTERS ) == SFX_ITEM_SET )
+ bCheckMasters = ( (SfxBoolItem&) pArgs->Get( ATTR_PRESLAYOUT_CHECK_MASTERS ) ).GetValue();
+ if (pArgs->GetItemState(ATTR_PRESLAYOUT_NAME) == SFX_ITEM_SET)
+ aFile = ((SfxStringItem&)pArgs->Get(ATTR_PRESLAYOUT_NAME)).GetValue();
+ }
+ else
+ {
+ SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
+ AbstractSdPresLayoutDlg* pDlg = pFact ? pFact->CreateSdPresLayoutDlg(mpDocSh, mpViewShell, NULL, aSet ) : 0;
+
+ USHORT nResult = pDlg ? pDlg->Execute() : RET_CANCEL;
+
+ switch (nResult)
+ {
+ case RET_OK:
+ {
+ pDlg->GetAttr(aSet);
+ if (aSet.GetItemState(ATTR_PRESLAYOUT_LOAD) == SFX_ITEM_SET)
+ bLoad = ((SfxBoolItem&)aSet.Get(ATTR_PRESLAYOUT_LOAD)).GetValue();
+ if( aSet.GetItemState( ATTR_PRESLAYOUT_MASTER_PAGE ) == SFX_ITEM_SET )
+ bMasterPage = ( (SfxBoolItem&) aSet.Get( ATTR_PRESLAYOUT_MASTER_PAGE ) ).GetValue();
+ if( aSet.GetItemState( ATTR_PRESLAYOUT_CHECK_MASTERS ) == SFX_ITEM_SET )
+ bCheckMasters = ( (SfxBoolItem&) aSet.Get( ATTR_PRESLAYOUT_CHECK_MASTERS ) ).GetValue();
+ if (aSet.GetItemState(ATTR_PRESLAYOUT_NAME) == SFX_ITEM_SET)
+ aFile = ((SfxStringItem&)aSet.Get(ATTR_PRESLAYOUT_NAME)).GetValue();
+ }
+ break;
+
+ default:
+ bError = TRUE;
+ }
+ delete pDlg;
+ }
+
+ if (!bError)
+ {
+ mpDocSh->SetWaitCursor( TRUE );
+
+ // Hier werden nur Masterpages ausgewechselt, d.h. die aktuelle Seite
+ // bleibt aktuell. Damit beim Ein- und Ausfuegen der Masterpages nicht
+ // dauernd via PageOrderChangedHint die Methode ResetActualPage gerufen
+ // wird, wird jetzt blockiert.
+ // That isn't quitely right. If the masterpageview is active and you are
+ // removing a masterpage, it's possible that you are removing the
+ // current masterpage. So you have to call ResetActualPage !
+ if( mpViewShell->ISA(DrawViewShell) && !bCheckMasters )
+ static_cast<DrawView*>(mpView)->BlockPageOrderChangedHint(TRUE);
+
+ if (bLoad)
+ {
+ String aFileName = aFile.GetToken( 0, DOCUMENT_TOKEN );
+ SdDrawDocument* pTempDoc = mpDoc->OpenBookmarkDoc( aFileName );
+
+ // #69581: If I chosed the standard-template I got no filename and so I get no
+ // SdDrawDocument-Pointer. But the method SetMasterPage is able to handle
+ // a NULL-pointer as a Standard-template ( look at SdDrawDocument::SetMasterPage )
+ String aLayoutName;
+ if( pTempDoc )
+ aLayoutName = aFile.GetToken( 1, DOCUMENT_TOKEN );
+
+ mpDoc->SetMasterPage(nSelectedPage, aLayoutName, pTempDoc, bMasterPage, bCheckMasters);
+ mpDoc->CloseBookmarkDoc();
+ }
+ else
+ {
+ // MasterPage mit dem LayoutNamen aFile aus aktuellem Doc verwenden
+ mpDoc->SetMasterPage(nSelectedPage, aFile, mpDoc, bMasterPage, bCheckMasters);
+ }
+
+ // Blockade wieder aufheben
+ if (mpViewShell->ISA(DrawViewShell) && !bCheckMasters )
+ static_cast<DrawView*>(mpView)->BlockPageOrderChangedHint(FALSE);
+
+ /*************************************************************************
+ |* Falls dargestellte Masterpage sichtbar war, neu darstellen
+ \************************************************************************/
+ if (!bError && nSelectedPage != SDRPAGE_NOTFOUND)
+ {
+ if (bOnMaster)
+ {
+ if (mpViewShell->ISA(DrawViewShell))
+ {
+ ::sd::View* pView =
+ static_cast<DrawViewShell*>(mpViewShell)->GetView();
+ USHORT nPgNum = pSelectedPage->TRG_GetMasterPage().GetPageNum();
+
+ if (static_cast<DrawViewShell*>(mpViewShell)->GetPageKind() == PK_NOTES)
+ nPgNum++;
+
+ pView->HideSdrPage();
+ pView->ShowSdrPage(pView->GetModel()->GetMasterPage(nPgNum));
+ }
+
+ // damit TabBar aktualisiert wird
+ mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_MASTERPAGE, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
+ }
+ else
+ {
+ pSelectedPage->SetAutoLayout(pSelectedPage->GetAutoLayout());
+ }
+ }
+
+ // fake a mode change to repaint the page tab bar
+ if( mpViewShell && mpViewShell->ISA( DrawViewShell ) )
+ {
+ DrawViewShell* pDrawViewSh =
+ static_cast<DrawViewShell*>(mpViewShell);
+ EditMode eMode = pDrawViewSh->GetEditMode();
+ BOOL bLayer = pDrawViewSh->IsLayerModeActive();
+ pDrawViewSh->ChangeEditMode( eMode, !bLayer );
+ pDrawViewSh->ChangeEditMode( eMode, bLayer );
+ }
+
+ mpDocSh->SetWaitCursor( FALSE );
+ }
+}
+
+} // end of namespace sd