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