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 "fuexpand.hxx"
29
30 #include <sfx2/viewfrm.hxx>
31 #include <svx/svdotext.hxx>
32 #include <svx/xlineit0.hxx>
33 #include <svx/svdundo.hxx>
34 #include <sfx2/printer.hxx>
35 #include <editeng/outlobj.hxx>
36 #include <svx/svdetc.hxx>
37
38 #include "app.hrc"
39 #include "strings.hrc"
40 #include "pres.hxx"
41 #include "View.hxx"
42 #include "sdpage.hxx"
43 #include "Outliner.hxx"
44 #include "drawview.hxx"
45 #include "drawdoc.hxx"
46 #include "ViewShell.hxx"
47 #include "DrawDocShell.hxx"
48 #include "sdresid.hxx"
49 #include "optsitem.hxx"
50 #include "sdmod.hxx"
51 #include <sfx2/dispatch.hxx>
52 #include <editeng/eeitem.hxx>
53
54 namespace sd {
55
56 TYPEINIT1( FuExpandPage, FuPoor );
57
58 /*************************************************************************
59 |*
60 |* Konstruktor
61 |*
62 \************************************************************************/
63
FuExpandPage(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)64 FuExpandPage::FuExpandPage (
65 ViewShell* pViewSh,
66 ::sd::Window* pWin,
67 ::sd::View* pView,
68 SdDrawDocument* pDoc,
69 SfxRequest& rReq)
70 : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
71 {
72 }
73
Create(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)74 FunctionReference FuExpandPage::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
75 {
76 FunctionReference xFunc( new FuExpandPage( pViewSh, pWin, pView, pDoc, rReq ) );
77 xFunc->DoExecute(rReq);
78 return xFunc;
79 }
80
DoExecute(SfxRequest &)81 void FuExpandPage::DoExecute( SfxRequest& )
82 {
83 if ( mpView && mpView->IsTextEdit() )
84 mpView->SdrEndTextEdit();
85
86 // Selektierte Seite finden (nur Standard-Seiten)
87 SdPage* pActualPage = NULL;
88 sal_uInt16 i = 0;
89 sal_uInt16 nCount = mpDoc->GetSdPageCount(PK_STANDARD);
90
91 while (!pActualPage && i < nCount)
92 {
93 if (mpDoc->GetSdPage(i, PK_STANDARD)->IsSelected())
94 {
95 pActualPage = mpDoc->GetSdPage(i, PK_STANDARD);
96 }
97
98 i++;
99 }
100
101 if (pActualPage)
102 {
103 ::sd::Outliner* pOutl =
104 new ::sd::Outliner( mpDoc, OUTLINERMODE_OUTLINEOBJECT );
105 pOutl->SetUpdateMode(sal_False);
106 pOutl->EnableUndo(sal_False);
107
108 if (mpDocSh)
109 pOutl->SetRefDevice( SD_MOD()->GetRefDevice( *mpDocSh ) );
110
111 pOutl->SetDefTab( mpDoc->GetDefaultTabulator() );
112 pOutl->SetStyleSheetPool((SfxStyleSheetPool*) mpDoc->GetStyleSheetPool());
113
114 SetOfByte aVisibleLayers = pActualPage->TRG_GetMasterPageVisibleLayers();
115 sal_uInt16 nActualPageNum = pActualPage->GetPageNum();
116 SdPage* pActualNotesPage = (SdPage*) mpDoc->GetPage(nActualPageNum + 1);
117 SdrTextObj* pActualOutline = (SdrTextObj*) pActualPage->GetPresObj(PRESOBJ_OUTLINE);
118
119 if (pActualOutline)
120 {
121 const bool bUndo = mpView->IsUndoEnabled();
122
123 if( bUndo )
124 mpView->BegUndo(String(SdResId(STR_UNDO_EXPAND_PAGE)));
125
126 // Aktuelles Gliederungsobjekt in Outliner setzen
127 OutlinerParaObject* pParaObj = pActualOutline->GetOutlinerParaObject();
128 pOutl->SetText(*pParaObj);
129
130 // Harte Absatz- und Zeichenattribute entfernen
131 SfxItemSet aEmptyEEAttr(mpDoc->GetPool(), EE_ITEMS_START, EE_ITEMS_END);
132 sal_uLong nParaCount1 = pOutl->GetParagraphCount();
133
134 for (sal_uInt32 nPara = 0; nPara < nParaCount1; nPara++)
135 {
136 pOutl->QuickRemoveCharAttribs(nPara);
137 pOutl->SetParaAttribs(nPara, aEmptyEEAttr);
138 }
139
140 sal_uInt16 nPos = 2;
141 Paragraph* pPara = pOutl->GetParagraph( 0 );
142
143 while (pPara)
144 {
145 sal_uLong nParaPos = pOutl->GetAbsPos( pPara );
146 sal_Int16 nDepth = pOutl->GetDepth( nParaPos );
147 if ( nDepth == 0 )
148 {
149 // Seite mit Titel & Gliederung!
150 SdPage* pPage = (SdPage*) mpDoc->AllocPage(sal_False);
151 pPage->SetSize(pActualPage->GetSize() );
152 pPage->SetBorder(pActualPage->GetLftBorder(),
153 pActualPage->GetUppBorder(),
154 pActualPage->GetRgtBorder(),
155 pActualPage->GetLwrBorder() );
156 pPage->SetName(String());
157
158 // Seite hinter aktueller Seite einfuegen
159 mpDoc->InsertPage(pPage, nActualPageNum + nPos);
160 nPos++;
161
162 if( bUndo )
163 mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pPage));
164
165 // MasterPage der aktuellen Seite verwenden
166 pPage->TRG_SetMasterPage(pActualPage->TRG_GetMasterPage());
167 pPage->SetLayoutName(pActualPage->GetLayoutName());
168 pPage->SetAutoLayout(AUTOLAYOUT_ENUM, sal_True);
169 pPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
170
171 // Notiz-Seite
172 SdPage* pNotesPage = (SdPage*) mpDoc->AllocPage(sal_False);
173 pNotesPage->SetSize(pActualNotesPage->GetSize());
174 pNotesPage->SetBorder(pActualNotesPage->GetLftBorder(),
175 pActualNotesPage->GetUppBorder(),
176 pActualNotesPage->GetRgtBorder(),
177 pActualNotesPage->GetLwrBorder() );
178 pNotesPage->SetPageKind(PK_NOTES);
179 pNotesPage->SetName(String());
180
181 // Seite hinter aktueller Seite einfuegen
182 mpDoc->InsertPage(pNotesPage, nActualPageNum + nPos);
183 nPos++;
184
185 if( bUndo )
186 mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pNotesPage));
187
188 // MasterPage der aktuellen Seite verwenden
189 pNotesPage->TRG_SetMasterPage(pActualNotesPage->TRG_GetMasterPage());
190 pNotesPage->SetLayoutName(pActualNotesPage->GetLayoutName());
191 pNotesPage->SetAutoLayout(pActualNotesPage->GetAutoLayout(), sal_True);
192 pNotesPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
193
194 // Title-Textobjekt erstellen
195 SdrTextObj* pTextObj = (SdrTextObj*) pPage->GetPresObj(PRESOBJ_TITLE);
196
197 //
198 OutlinerParaObject* pOutlinerParaObject = pOutl->CreateParaObject( (sal_uInt16) nParaPos, 1);
199 pOutlinerParaObject->SetOutlinerMode(OUTLINERMODE_TITLEOBJECT);
200
201 if( pOutlinerParaObject->GetDepth(0) != -1 )
202 {
203 SdrOutliner* pTempOutl = SdrMakeOutliner( OUTLINERMODE_TITLEOBJECT, mpDoc );
204
205 pTempOutl->SetText( *pOutlinerParaObject );
206
207 delete pOutlinerParaObject;
208
209 pTempOutl->SetDepth( pTempOutl->GetParagraph( 0 ), -1 );
210
211 pOutlinerParaObject = pTempOutl->CreateParaObject();
212 delete pTempOutl;
213 }
214
215 pTextObj->SetOutlinerParaObject(pOutlinerParaObject);
216
217 pTextObj->SetEmptyPresObj(sal_False);
218
219 SfxStyleSheet* pSheet = pPage->GetStyleSheetForPresObj(PRESOBJ_TITLE);
220 pTextObj->NbcSetStyleSheet(pSheet, sal_False);
221
222 sal_uLong nChildCount = pOutl->GetChildCount(pPara);
223
224 if (nChildCount > 0)
225 {
226 // Gliederungs-Textobjekt erstellen
227 SdrTextObj* pOutlineObj = (SdrTextObj*) pPage->GetPresObj(PRESOBJ_OUTLINE);
228 pPara = pOutl->GetParagraph( ++nParaPos );
229
230 OutlinerParaObject* pOPO = pOutl->CreateParaObject( (sal_uInt16) nParaPos, (sal_uInt16) nChildCount);
231
232 // --
233 SdrOutliner* pTempOutl = SdrMakeOutliner( OUTLINERMODE_OUTLINEOBJECT, mpDoc );
234 pTempOutl->SetText( *pOPO );
235
236 sal_uLong nParaCount2 = pTempOutl->GetParagraphCount();
237 sal_uLong nPara;
238 for( nPara = 0; nPara < nParaCount2; nPara++ )
239 {
240 pTempOutl->SetDepth (
241 pTempOutl->GetParagraph( nPara ),
242 pTempOutl->GetDepth( nPara ) - 1);
243 }
244
245 delete pOPO;
246 pOPO = pTempOutl->CreateParaObject();
247 delete pTempOutl;
248
249 // --
250 pOutlineObj->SetOutlinerParaObject( pOPO );
251 pOutlineObj->SetEmptyPresObj(sal_False);
252
253 // Harte Attribute entfernen (Flag auf sal_True)
254 SfxItemSet aAttr(mpDoc->GetPool());
255 aAttr.Put(XLineStyleItem(XLINE_NONE));
256 aAttr.Put(XFillStyleItem(XFILL_NONE));
257 pOutlineObj->SetMergedItemSet(aAttr);
258 }
259 }
260
261 pPara = pOutl->GetParagraph( ++nParaPos );
262 }
263
264 if( bUndo )
265 mpView->EndUndo();
266 }
267
268 delete pOutl;
269
270 mpViewShell->GetViewFrame()->GetDispatcher()->Execute(SID_DELETE_PAGE, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD);
271 }
272 }
273
274 } // end of namespace sd
275