1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_sd.hxx" 26 27 28 #include "fuprlout.hxx" 29 #include <vcl/wrkwin.hxx> 30 #include <sfx2/dispatch.hxx> 31 #include <svl/smplhint.hxx> 32 #include <svl/itempool.hxx> 33 #include <sot/storage.hxx> 34 #include <vcl/msgbox.hxx> 35 #include <svx/svdundo.hxx> 36 37 #include <sfx2/viewfrm.hxx> 38 #include <sfx2/request.hxx> 39 40 #include "drawdoc.hxx" 41 #include "sdpage.hxx" 42 #include "pres.hxx" 43 #include "DrawViewShell.hxx" 44 #ifndef SD_FRAMW_VIEW_HXX 45 #include "FrameView.hxx" 46 #endif 47 #include "stlpool.hxx" 48 #include "View.hxx" 49 #include "glob.hrc" 50 #include "glob.hxx" 51 #include "strings.hrc" 52 #include "strmname.h" 53 #include "app.hrc" 54 #include "DrawDocShell.hxx" 55 #include "unprlout.hxx" 56 #include "unchss.hxx" 57 #include "unmovss.hxx" 58 #include "sdattr.hxx" 59 #include "sdresid.hxx" 60 #include "drawview.hxx" 61 #include "eetext.hxx" 62 #include <editeng/editdata.hxx> 63 #include "sdabstdlg.hxx" 64 65 namespace sd 66 { 67 68 #ifndef SO2_DECL_SVSTORAGE_DEFINED 69 #define SO2_DECL_SVSTORAGE_DEFINED 70 SO2_DECL_REF(SvStorage) 71 #endif 72 73 TYPEINIT1( FuPresentationLayout, FuPoor ); 74 75 #define POOL_BUFFER_SIZE (sal_uInt16)32768 76 #define DOCUMENT_BUFFER_SIZE (sal_uInt16)32768 77 #define DOCUMENT_TOKEN (sal_Unicode('#')) 78 79 /************************************************************************* 80 |* 81 |* Konstruktor 82 |* 83 \************************************************************************/ 84 85 FuPresentationLayout::FuPresentationLayout ( 86 ViewShell* pViewSh, 87 ::sd::Window* pWin, 88 ::sd::View* pView, 89 SdDrawDocument* pDoc, 90 SfxRequest& rReq) 91 : FuPoor(pViewSh, pWin, pView, pDoc, rReq) 92 { 93 } 94 95 FunctionReference FuPresentationLayout::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) 96 { 97 FunctionReference xFunc( new FuPresentationLayout( pViewSh, pWin, pView, pDoc, rReq ) ); 98 xFunc->DoExecute(rReq); 99 return xFunc; 100 } 101 102 void FuPresentationLayout::DoExecute( SfxRequest& rReq ) 103 { 104 // damit nicht Objekte, die gerade editiert werden oder selektiert 105 // sind , verschwinden 106 mpView->SdrEndTextEdit(); 107 108 if(mpView->GetSdrPageView()) 109 { 110 mpView->UnmarkAll(); 111 } 112 113 sal_Bool bError = sal_False; 114 115 // die aktive Seite ermitteln 116 sal_uInt16 nSelectedPage = SDRPAGE_NOTFOUND; 117 for (sal_uInt16 nPage = 0; nPage < mpDoc->GetSdPageCount(PK_STANDARD); nPage++) 118 { 119 if (mpDoc->GetSdPage(nPage, PK_STANDARD)->IsSelected()) 120 { 121 nSelectedPage = nPage; 122 break; 123 } 124 } 125 126 DBG_ASSERT(nSelectedPage != SDRPAGE_NOTFOUND, "keine selektierte Seite"); 127 SdPage* pSelectedPage = mpDoc->GetSdPage(nSelectedPage, PK_STANDARD); 128 String aOldPageLayoutName(pSelectedPage->GetLayoutName()); 129 String aOldLayoutName(aOldPageLayoutName); 130 aOldLayoutName.Erase(aOldLayoutName.SearchAscii(SD_LT_SEPARATOR)); 131 132 // wenn wir auf einer Masterpage sind, gelten die Aenderungen fuer alle 133 // Seiten und Notizseiten, die das betreffende Layout benutzen 134 sal_Bool bOnMaster = sal_False; 135 if( mpViewShell && mpViewShell->ISA(DrawViewShell)) 136 { 137 EditMode eEditMode = 138 static_cast<DrawViewShell*>(mpViewShell)->GetEditMode(); 139 if (eEditMode == EM_MASTERPAGE) 140 bOnMaster = sal_True; 141 } 142 sal_Bool bMasterPage = bOnMaster; 143 sal_Bool bCheckMasters = sal_False; 144 145 // Dialog aufrufen 146 sal_Bool bLoad = sal_False; // tauchen neue Masterpages auf? 147 String aFile; 148 149 SfxItemSet aSet(mpDoc->GetPool(), ATTR_PRESLAYOUT_START, ATTR_PRESLAYOUT_END); 150 151 aSet.Put( SfxBoolItem( ATTR_PRESLAYOUT_LOAD, bLoad)); 152 aSet.Put( SfxBoolItem( ATTR_PRESLAYOUT_MASTER_PAGE, bMasterPage ) ); 153 aSet.Put( SfxBoolItem( ATTR_PRESLAYOUT_CHECK_MASTERS, bCheckMasters ) ); 154 aSet.Put( SfxStringItem( ATTR_PRESLAYOUT_NAME, aOldLayoutName)); 155 156 157 158 const SfxItemSet *pArgs = rReq.GetArgs (); 159 160 if (pArgs) 161 { 162 if (pArgs->GetItemState(ATTR_PRESLAYOUT_LOAD) == SFX_ITEM_SET) 163 bLoad = ((SfxBoolItem&)pArgs->Get(ATTR_PRESLAYOUT_LOAD)).GetValue(); 164 if( pArgs->GetItemState( ATTR_PRESLAYOUT_MASTER_PAGE ) == SFX_ITEM_SET ) 165 bMasterPage = ( (SfxBoolItem&) pArgs->Get( ATTR_PRESLAYOUT_MASTER_PAGE ) ).GetValue(); 166 if( pArgs->GetItemState( ATTR_PRESLAYOUT_CHECK_MASTERS ) == SFX_ITEM_SET ) 167 bCheckMasters = ( (SfxBoolItem&) pArgs->Get( ATTR_PRESLAYOUT_CHECK_MASTERS ) ).GetValue(); 168 if (pArgs->GetItemState(ATTR_PRESLAYOUT_NAME) == SFX_ITEM_SET) 169 aFile = ((SfxStringItem&)pArgs->Get(ATTR_PRESLAYOUT_NAME)).GetValue(); 170 } 171 else 172 { 173 SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); 174 AbstractSdPresLayoutDlg* pDlg = pFact ? pFact->CreateSdPresLayoutDlg(mpDocSh, mpViewShell, NULL, aSet ) : 0; 175 176 sal_uInt16 nResult = pDlg ? pDlg->Execute() : RET_CANCEL; 177 178 switch (nResult) 179 { 180 case RET_OK: 181 { 182 pDlg->GetAttr(aSet); 183 if (aSet.GetItemState(ATTR_PRESLAYOUT_LOAD) == SFX_ITEM_SET) 184 bLoad = ((SfxBoolItem&)aSet.Get(ATTR_PRESLAYOUT_LOAD)).GetValue(); 185 if( aSet.GetItemState( ATTR_PRESLAYOUT_MASTER_PAGE ) == SFX_ITEM_SET ) 186 bMasterPage = ( (SfxBoolItem&) aSet.Get( ATTR_PRESLAYOUT_MASTER_PAGE ) ).GetValue(); 187 if( aSet.GetItemState( ATTR_PRESLAYOUT_CHECK_MASTERS ) == SFX_ITEM_SET ) 188 bCheckMasters = ( (SfxBoolItem&) aSet.Get( ATTR_PRESLAYOUT_CHECK_MASTERS ) ).GetValue(); 189 if (aSet.GetItemState(ATTR_PRESLAYOUT_NAME) == SFX_ITEM_SET) 190 aFile = ((SfxStringItem&)aSet.Get(ATTR_PRESLAYOUT_NAME)).GetValue(); 191 } 192 break; 193 194 default: 195 bError = sal_True; 196 } 197 delete pDlg; 198 } 199 200 if (!bError) 201 { 202 mpDocSh->SetWaitCursor( sal_True ); 203 204 // Hier werden nur Masterpages ausgewechselt, d.h. die aktuelle Seite 205 // bleibt aktuell. Damit beim Ein- und Ausfuegen der Masterpages nicht 206 // dauernd via PageOrderChangedHint die Methode ResetActualPage gerufen 207 // wird, wird jetzt blockiert. 208 // That isn't quitely right. If the masterpageview is active and you are 209 // removing a masterpage, it's possible that you are removing the 210 // current masterpage. So you have to call ResetActualPage ! 211 if( mpViewShell->ISA(DrawViewShell) && !bCheckMasters ) 212 static_cast<DrawView*>(mpView)->BlockPageOrderChangedHint(sal_True); 213 214 if (bLoad) 215 { 216 String aFileName = aFile.GetToken( 0, DOCUMENT_TOKEN ); 217 SdDrawDocument* pTempDoc = mpDoc->OpenBookmarkDoc( aFileName ); 218 219 // #69581: If I chosed the standard-template I got no filename and so I get no 220 // SdDrawDocument-Pointer. But the method SetMasterPage is able to handle 221 // a NULL-pointer as a Standard-template ( look at SdDrawDocument::SetMasterPage ) 222 String aLayoutName; 223 if( pTempDoc ) 224 aLayoutName = aFile.GetToken( 1, DOCUMENT_TOKEN ); 225 226 mpDoc->SetMasterPage(nSelectedPage, aLayoutName, pTempDoc, bMasterPage, bCheckMasters); 227 mpDoc->CloseBookmarkDoc(); 228 } 229 else 230 { 231 // MasterPage mit dem LayoutNamen aFile aus aktuellem Doc verwenden 232 mpDoc->SetMasterPage(nSelectedPage, aFile, mpDoc, bMasterPage, bCheckMasters); 233 } 234 235 // Blockade wieder aufheben 236 if (mpViewShell->ISA(DrawViewShell) && !bCheckMasters ) 237 static_cast<DrawView*>(mpView)->BlockPageOrderChangedHint(sal_False); 238 239 /************************************************************************* 240 |* Falls dargestellte Masterpage sichtbar war, neu darstellen 241 \************************************************************************/ 242 if (!bError && nSelectedPage != SDRPAGE_NOTFOUND) 243 { 244 if (bOnMaster) 245 { 246 if (mpViewShell->ISA(DrawViewShell)) 247 { 248 ::sd::View* pView = 249 static_cast<DrawViewShell*>(mpViewShell)->GetView(); 250 sal_uInt16 nPgNum = pSelectedPage->TRG_GetMasterPage().GetPageNum(); 251 252 if (static_cast<DrawViewShell*>(mpViewShell)->GetPageKind() == PK_NOTES) 253 nPgNum++; 254 255 pView->HideSdrPage(); 256 pView->ShowSdrPage(pView->GetModel()->GetMasterPage(nPgNum)); 257 } 258 259 // damit TabBar aktualisiert wird 260 mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_MASTERPAGE, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD); 261 } 262 else 263 { 264 pSelectedPage->SetAutoLayout(pSelectedPage->GetAutoLayout()); 265 } 266 } 267 268 // fake a mode change to repaint the page tab bar 269 if( mpViewShell && mpViewShell->ISA( DrawViewShell ) ) 270 { 271 DrawViewShell* pDrawViewSh = 272 static_cast<DrawViewShell*>(mpViewShell); 273 EditMode eMode = pDrawViewSh->GetEditMode(); 274 sal_Bool bLayer = pDrawViewSh->IsLayerModeActive(); 275 pDrawViewSh->ChangeEditMode( eMode, !bLayer ); 276 pDrawViewSh->ChangeEditMode( eMode, bLayer ); 277 } 278 279 mpDocSh->SetWaitCursor( sal_False ); 280 } 281 } 282 283 } // end of namespace sd 284