xref: /trunk/main/sd/source/ui/func/fuexpand.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
15b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
35b190011SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
45b190011SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
55b190011SAndrew Rist  * distributed with this work for additional information
65b190011SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
75b190011SAndrew Rist  * to you under the Apache License, Version 2.0 (the
85b190011SAndrew Rist  * "License"); you may not use this file except in compliance
95b190011SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
115b190011SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
135b190011SAndrew Rist  * Unless required by applicable law or agreed to in writing,
145b190011SAndrew Rist  * software distributed under the License is distributed on an
155b190011SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
165b190011SAndrew Rist  * KIND, either express or implied.  See the License for the
175b190011SAndrew Rist  * specific language governing permissions and limitations
185b190011SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
205b190011SAndrew Rist  *************************************************************/
215b190011SAndrew Rist 
225b190011SAndrew 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 
13436a46462SDamjan Jovanovic             for (sal_uInt32 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 );
146*cd9c0841SDamjan Jovanovic                 sal_Int16 nDepth = pOutl->GetDepth( 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 ),
242*cd9c0841SDamjan Jovanovic                                 pTempOutl->GetDepth( 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