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 #include "fuprobjs.hxx" 28 29 #ifndef _MSGBOX_HXX //autogen 30 #include <vcl/msgbox.hxx> 31 #endif 32 #include <svl/style.hxx> 33 #include <editeng/outliner.hxx> 34 #include <svl/smplhint.hxx> 35 36 37 #include "app.hrc" 38 #include "res_bmp.hrc" 39 #include "strings.hrc" 40 #include "glob.hrc" 41 #include "prltempl.hrc" 42 43 #include "sdresid.hxx" 44 #include "drawdoc.hxx" 45 #ifndef SD_OUTLINE_VIEW_SHELL_HX 46 #include "OutlineViewShell.hxx" 47 #endif 48 #include "ViewShell.hxx" 49 #include "Window.hxx" 50 #include "glob.hxx" 51 #include "prlayout.hxx" 52 #include "unchss.hxx" 53 #include "sdabstdlg.hxx" 54 namespace sd { 55 56 TYPEINIT1( FuPresentationObjects, FuPoor ); 57 58 59 /************************************************************************* 60 |* 61 |* Konstruktor 62 |* 63 \************************************************************************/ 64 65 FuPresentationObjects::FuPresentationObjects ( 66 ViewShell* pViewSh, 67 ::sd::Window* pWin, 68 ::sd::View* pView, 69 SdDrawDocument* pDoc, 70 SfxRequest& rReq) 71 : FuPoor(pViewSh, pWin, pView, pDoc, rReq) 72 { 73 } 74 75 FunctionReference FuPresentationObjects::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq ) 76 { 77 FunctionReference xFunc( new FuPresentationObjects( pViewSh, pWin, pView, pDoc, rReq ) ); 78 xFunc->DoExecute(rReq); 79 return xFunc; 80 } 81 82 void FuPresentationObjects::DoExecute( SfxRequest& ) 83 { 84 OutlineViewShell* pOutlineViewShell = dynamic_cast< OutlineViewShell* >( mpViewShell ); 85 DBG_ASSERT( pOutlineViewShell, "sd::FuPresentationObjects::DoExecute(), does not work without an OutlineViewShell!"); 86 if( !pOutlineViewShell ) 87 return; 88 89 // ergibt die Selektion ein eindeutiges Praesentationslayout? 90 // wenn nicht, duerfen die Vorlagen nicht bearbeitet werden 91 SfxItemSet aSet(mpDoc->GetItemPool(), SID_STATUS_LAYOUT, SID_STATUS_LAYOUT); 92 pOutlineViewShell->GetStatusBarState( aSet ); 93 String aLayoutName = (((SfxStringItem&)aSet.Get(SID_STATUS_LAYOUT)).GetValue()); 94 DBG_ASSERT(aLayoutName.Len(), "Layout unbestimmt"); 95 96 sal_Bool bUnique = sal_False; 97 sal_Int16 nDepth, nTmp; 98 OutlineView* pOlView = static_cast<OutlineView*>(pOutlineViewShell->GetView()); 99 OutlinerView* pOutlinerView = pOlView->GetViewByWindow( (Window*) mpWindow ); 100 ::Outliner* pOutl = pOutlinerView->GetOutliner(); 101 List* pList = pOutlinerView->CreateSelectionList(); 102 Paragraph* pPara = (Paragraph*)pList->First(); 103 nDepth = pOutl->GetDepth((sal_uInt16)pOutl->GetAbsPos( pPara ) ); 104 bool bPage = pOutl->HasParaFlag( pPara, PARAFLAG_ISPAGE ); 105 106 while( pPara ) 107 { 108 nTmp = pOutl->GetDepth((sal_uInt16) pOutl->GetAbsPos( pPara ) ); 109 110 if( nDepth != nTmp ) 111 { 112 bUnique = sal_False; 113 break; 114 } 115 116 if( pOutl->HasParaFlag( pPara, PARAFLAG_ISPAGE ) != bPage ) 117 { 118 bUnique = sal_False; 119 break; 120 } 121 bUnique = sal_True; 122 123 pPara = (Paragraph*) pList->Next(); 124 } 125 126 if( bUnique ) 127 { 128 String aStyleName = aLayoutName; 129 aStyleName.AppendAscii( RTL_CONSTASCII_STRINGPARAM( SD_LT_SEPARATOR ) ); 130 sal_uInt16 nDlgId = TAB_PRES_LAYOUT_TEMPLATE; 131 PresentationObjects ePO; 132 133 if( bPage ) 134 { 135 ePO = PO_TITLE; 136 String aStr(SdResId( STR_LAYOUT_TITLE )); 137 aStyleName.Append( aStr ); 138 } 139 else 140 { 141 ePO = (PresentationObjects) ( PO_OUTLINE_1 + nDepth - 1 ); 142 String aStr(SdResId( STR_LAYOUT_OUTLINE )); 143 aStyleName.Append( aStr ); 144 aStyleName.Append( sal_Unicode(' ') ); 145 aStyleName.Append( UniString::CreateFromInt32( nDepth ) ); 146 } 147 148 SfxStyleSheetBasePool* pStyleSheetPool = mpDocSh->GetStyleSheetPool(); 149 SfxStyleSheetBase* pStyleSheet = pStyleSheetPool->Find( aStyleName, SD_STYLE_FAMILY_MASTERPAGE ); 150 DBG_ASSERT(pStyleSheet, "StyleSheet nicht gefunden"); 151 152 if( pStyleSheet ) 153 { 154 SfxStyleSheetBase& rStyleSheet = *pStyleSheet; 155 156 SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create(); 157 SfxAbstractTabDialog* pDlg = pFact ? pFact->CreateSdPresLayoutTemplateDlg( mpDocSh, NULL, SdResId( nDlgId ), rStyleSheet, ePO, pStyleSheetPool ) : 0; 158 if( pDlg && (pDlg->Execute() == RET_OK) ) 159 { 160 const SfxItemSet* pOutSet = pDlg->GetOutputItemSet(); 161 // Undo-Action 162 StyleSheetUndoAction* pAction = new StyleSheetUndoAction 163 (mpDoc, (SfxStyleSheet*)pStyleSheet, 164 pOutSet); 165 mpDocSh->GetUndoManager()->AddUndoAction(pAction); 166 167 pStyleSheet->GetItemSet().Put( *pOutSet ); 168 ( (SfxStyleSheet*) pStyleSheet )->Broadcast( SfxSimpleHint( SFX_HINT_DATACHANGED ) ); 169 } 170 delete( pDlg ); 171 } 172 } 173 } 174 175 } // end of namespace sd 176