xref: /aoo4110/main/sd/source/ui/func/fusumry.cxx (revision b1cdbd2c)
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 "fusumry.hxx"
29 #include <editeng/eeitem.hxx>
30 #include <svx/svdotext.hxx>
31 #include <svx/svdundo.hxx>
32 #include <sfx2/printer.hxx>
33 #include <editeng/outlobj.hxx>
34 
35 #include "strings.hrc"
36 
37 #include "pres.hxx"
38 #include "View.hxx"
39 #include "sdpage.hxx"
40 #include "Outliner.hxx"
41 #include "drawview.hxx"
42 #include "drawdoc.hxx"
43 #include "ViewShell.hxx"
44 #include "DrawDocShell.hxx"
45 #include "sdresid.hxx"
46 #include "optsitem.hxx"
47 #include "DrawViewShell.hxx"
48 
49 namespace sd {
50 
51 TYPEINIT1( FuSummaryPage, FuPoor );
52 
53 /*************************************************************************
54 |*
55 |* Konstruktor
56 |*
57 \************************************************************************/
FuSummaryPage(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)58 FuSummaryPage::FuSummaryPage (
59     ViewShell* pViewSh,
60     ::sd::Window* pWin,
61     ::sd::View* pView,
62     SdDrawDocument* pDoc,
63     SfxRequest& rReq)
64     : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
65 {
66 }
67 
Create(ViewShell * pViewSh,::sd::Window * pWin,::sd::View * pView,SdDrawDocument * pDoc,SfxRequest & rReq)68 FunctionReference FuSummaryPage::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
69 {
70 	FunctionReference xFunc( new FuSummaryPage( pViewSh, pWin, pView, pDoc, rReq ) );
71 	xFunc->DoExecute(rReq);
72 	return xFunc;
73 }
74 
DoExecute(SfxRequest &)75 void FuSummaryPage::DoExecute( SfxRequest& )
76 {
77 	::sd::Outliner* pOutl = NULL;
78 	SdPage* pSummaryPage = NULL;
79 	sal_uInt16 i = 0;
80 	sal_uInt16 nFirstPage = SDRPAGE_NOTFOUND;
81 	sal_uInt16 nSelectedPages = 0;
82 	sal_uInt16 nCount = mpDoc->GetSdPageCount(PK_STANDARD);
83 
84 	while (i < nCount && nSelectedPages <= 1)
85 	{
86 		/**********************************************************************
87 		* Wieviele Seiten sind selektiert?
88 		* Genau eine Seite selektiert: Ab dieser Seite alles zusammenfassen
89 		* sonst: Nur die selektierten Seiten zusammenfassen
90 		**********************************************************************/
91 		SdPage* pActualPage = mpDoc->GetSdPage(i, PK_STANDARD);
92 
93 		if (pActualPage->IsSelected())
94 		{
95 			if (nFirstPage == SDRPAGE_NOTFOUND)
96 			{
97 				nFirstPage = i;
98 			}
99 
100 			nSelectedPages++;
101 		}
102 
103 		i++;
104 	}
105 
106 	bool bBegUndo = false;
107 
108 	SfxStyleSheet* pStyle = NULL;
109 
110 	for (i = nFirstPage; i < nCount; i++)
111 	{
112 		SdPage* pActualPage = mpDoc->GetSdPage(i, PK_STANDARD);
113 
114 		if (nSelectedPages <= 1 || pActualPage->IsSelected())
115 		{
116 			SdPage* pActualNotesPage = mpDoc->GetSdPage(i, PK_NOTES);
117 			SdrTextObj* pTextObj = (SdrTextObj*) pActualPage->GetPresObj(PRESOBJ_TITLE);
118 
119 			if (pTextObj && !pTextObj->IsEmptyPresObj())
120 			{
121 				if (!pSummaryPage)
122 				{
123 					/**********************************************************
124 					* Inhaltsverzeichnis-Seite einfuegen und Outliner anlegen
125 					**********************************************************/
126 					const bool bUndo = mpView->IsUndoEnabled();
127 
128 					if( bUndo )
129 					{
130 						mpView->BegUndo(String(SdResId(STR_UNDO_SUMMARY_PAGE)));
131 						bBegUndo = true;
132 					}
133 
134 					SetOfByte aVisibleLayers = pActualPage->TRG_GetMasterPageVisibleLayers();
135 
136 					// Seite mit Titel & Gliederung!
137 					pSummaryPage = (SdPage*) mpDoc->AllocPage(sal_False);
138 					pSummaryPage->SetSize(pActualPage->GetSize() );
139 					pSummaryPage->SetBorder(pActualPage->GetLftBorder(),
140 									 pActualPage->GetUppBorder(),
141 									 pActualPage->GetRgtBorder(),
142 									 pActualPage->GetLwrBorder() );
143 
144 					// Seite hinten einfuegen
145 					mpDoc->InsertPage(pSummaryPage, nCount * 2 + 1);
146 					if( bUndo )
147 						mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pSummaryPage));
148 
149 					// MasterPage der aktuellen Seite verwenden
150 					pSummaryPage->TRG_SetMasterPage(pActualPage->TRG_GetMasterPage());
151 					pSummaryPage->SetLayoutName(pActualPage->GetLayoutName());
152 					pSummaryPage->SetAutoLayout(AUTOLAYOUT_ENUM, sal_True);
153 					pSummaryPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
154 					pSummaryPage->setHeaderFooterSettings(pActualPage->getHeaderFooterSettings());
155 
156 					// Notiz-Seite
157 					SdPage* pNotesPage = (SdPage*) mpDoc->AllocPage(sal_False);
158 					pNotesPage->SetSize(pActualNotesPage->GetSize());
159 					pNotesPage->SetBorder(pActualNotesPage->GetLftBorder(),
160 										  pActualNotesPage->GetUppBorder(),
161 										  pActualNotesPage->GetRgtBorder(),
162 										  pActualNotesPage->GetLwrBorder() );
163 					pNotesPage->SetPageKind(PK_NOTES);
164 
165 					// Seite hinten einfuegen
166 					mpDoc->InsertPage(pNotesPage, nCount * 2 + 2);
167 
168 					if( bUndo )
169 						mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pNotesPage));
170 
171 					// MasterPage der aktuellen Seite verwenden
172 					pNotesPage->TRG_SetMasterPage(pActualNotesPage->TRG_GetMasterPage());
173 					pNotesPage->SetLayoutName(pActualNotesPage->GetLayoutName());
174 					pNotesPage->SetAutoLayout(pActualNotesPage->GetAutoLayout(), sal_True);
175 					pNotesPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
176 					pNotesPage->setHeaderFooterSettings(pActualNotesPage->getHeaderFooterSettings());
177 
178 					pOutl = new ::sd::Outliner( mpDoc, OUTLINERMODE_OUTLINEOBJECT );
179 					pOutl->SetUpdateMode(sal_False);
180 					pOutl->EnableUndo(sal_False);
181 
182 					if (mpDocSh)
183 						pOutl->SetRefDevice(SD_MOD()->GetRefDevice( *mpDocSh ));
184 
185 					pOutl->SetDefTab( mpDoc->GetDefaultTabulator() );
186 					pOutl->SetStyleSheetPool((SfxStyleSheetPool*) mpDoc->GetStyleSheetPool());
187 					pStyle = pSummaryPage->GetStyleSheetForPresObj( PRESOBJ_OUTLINE );
188 					pOutl->SetStyleSheet( 0, pStyle );
189 				}
190 
191 				/**************************************************************
192 				* Text hinzufuegen
193 				**************************************************************/
194 				OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject();
195 				// #118876#, check if the OutlinerParaObject is created successfully
196 				if( pParaObj )
197 				{
198 					pParaObj->SetOutlinerMode( OUTLINERMODE_OUTLINEOBJECT );
199 					pOutl->AddText(*pParaObj);
200 				}
201 			}
202 		}
203 	}
204 
205 	if (pSummaryPage)
206 	{
207 		SdrTextObj* pTextObj = (SdrTextObj*) pSummaryPage->GetPresObj(PRESOBJ_OUTLINE);
208 
209 		// Harte Absatz- und Zeichenattribute entfernen
210 		SfxItemSet aEmptyEEAttr(mpDoc->GetPool(), EE_ITEMS_START, EE_ITEMS_END);
211 		sal_uLong nParaCount = pOutl->GetParagraphCount();
212 
213 		for (sal_uInt16 nPara = 0; nPara < nParaCount; nPara++)
214 		{
215 			pOutl->SetStyleSheet( nPara, pStyle );
216 			pOutl->QuickRemoveCharAttribs(nPara);
217 			pOutl->SetParaAttribs(nPara, aEmptyEEAttr);
218 			pOutl->SetDepth(pOutl->GetParagraph(nPara), 0);
219 		}
220 
221 		pTextObj->SetOutlinerParaObject( pOutl->CreateParaObject() );
222 		pTextObj->SetEmptyPresObj(sal_False);
223 
224 		// Harte Attribute entfernen (Flag auf sal_True)
225 		SfxItemSet aAttr(mpDoc->GetPool());
226 		aAttr.Put(XLineStyleItem(XLINE_NONE));
227 		aAttr.Put(XFillStyleItem(XFILL_NONE));
228 		pTextObj->SetMergedItemSet(aAttr);
229 
230 		if( bBegUndo )
231 			mpView->EndUndo();
232 		delete pOutl;
233 
234 		DrawViewShell* pDrawViewShell= dynamic_cast< DrawViewShell* >( mpViewShell );
235 		if(pDrawViewShell)
236 		{
237 			pDrawViewShell->SwitchPage( (pSummaryPage->GetPageNum() - 1) / 2);
238 		}
239 	}
240 }
241 
242 
243 } // end of namespace sd
244