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