xref: /aoo41x/main/sd/source/ui/func/fuexpand.cxx (revision 79aad27f)
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