bump product version to 5.0.4.1
[LibreOffice.git] / sd / source / ui / func / fusumry.cxx
blobf81950cc2bab2a77dc0d708995f7eb3b700f6edd
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "fusumry.hxx"
21 #include <editeng/eeitem.hxx>
22 #include <svx/svdotext.hxx>
23 #include <svx/svdundo.hxx>
24 #include <sfx2/printer.hxx>
25 #include <editeng/outlobj.hxx>
27 #include "strings.hrc"
29 #include "pres.hxx"
30 #include "View.hxx"
31 #include "sdpage.hxx"
32 #include "Outliner.hxx"
33 #include "drawview.hxx"
34 #include "drawdoc.hxx"
35 #include "ViewShell.hxx"
36 #include "DrawDocShell.hxx"
37 #include "sdresid.hxx"
38 #include "optsitem.hxx"
39 #include "DrawViewShell.hxx"
41 using namespace com::sun::star;
43 namespace sd {
45 TYPEINIT1( FuSummaryPage, FuPoor );
47 FuSummaryPage::FuSummaryPage (
48 ViewShell* pViewSh,
49 ::sd::Window* pWin,
50 ::sd::View* pView,
51 SdDrawDocument* pDoc,
52 SfxRequest& rReq)
53 : FuPoor(pViewSh, pWin, pView, pDoc, rReq)
57 rtl::Reference<FuPoor> FuSummaryPage::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
59 rtl::Reference<FuPoor> xFunc( new FuSummaryPage( pViewSh, pWin, pView, pDoc, rReq ) );
60 xFunc->DoExecute(rReq);
61 return xFunc;
64 void FuSummaryPage::DoExecute( SfxRequest& )
66 ::sd::Outliner* pOutl = NULL;
67 SdPage* pSummaryPage = NULL;
68 sal_uInt16 i = 0;
69 sal_uInt16 nFirstPage = SDRPAGE_NOTFOUND;
70 sal_uInt16 nSelectedPages = 0;
71 sal_uInt16 nCount = mpDoc->GetSdPageCount(PK_STANDARD);
73 while (i < nCount && nSelectedPages <= 1)
75 /* How many pages are selected?
76 exactly one: pool everything from this page
77 otherwise: only pool the selected pages */
78 SdPage* pActualPage = mpDoc->GetSdPage(i, PK_STANDARD);
80 if (pActualPage->IsSelected())
82 if (nFirstPage == SDRPAGE_NOTFOUND)
84 nFirstPage = i;
87 nSelectedPages++;
90 i++;
93 bool bBegUndo = false;
95 SfxStyleSheet* pStyle = NULL;
97 for (i = nFirstPage; i < nCount; i++)
99 SdPage* pActualPage = mpDoc->GetSdPage(i, PK_STANDARD);
101 if (nSelectedPages <= 1 || pActualPage->IsSelected())
103 SdPage* pActualNotesPage = mpDoc->GetSdPage(i, PK_NOTES);
104 SdrTextObj* pTextObj = static_cast<SdrTextObj*>( pActualPage->GetPresObj(PRESOBJ_TITLE) );
106 if (pTextObj && !pTextObj->IsEmptyPresObj())
108 if (!pSummaryPage)
110 // insert "table of content"-page and create outliner
111 const bool bUndo = mpView->IsUndoEnabled();
113 if( bUndo )
115 mpView->BegUndo(SD_RESSTR(STR_UNDO_SUMMARY_PAGE));
116 bBegUndo = true;
119 SetOfByte aVisibleLayers = pActualPage->TRG_GetMasterPageVisibleLayers();
121 // page with title & structuring!
122 pSummaryPage = mpDoc->AllocSdPage(false);
123 pSummaryPage->SetSize(pActualPage->GetSize() );
124 pSummaryPage->SetBorder(pActualPage->GetLftBorder(),
125 pActualPage->GetUppBorder(),
126 pActualPage->GetRgtBorder(),
127 pActualPage->GetLwrBorder() );
129 // insert page at the back
130 mpDoc->InsertPage(pSummaryPage, nCount * 2 + 1);
131 if( bUndo )
132 mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pSummaryPage));
134 // use MasterPage of the current page
135 pSummaryPage->TRG_SetMasterPage(pActualPage->TRG_GetMasterPage());
136 pSummaryPage->SetLayoutName(pActualPage->GetLayoutName());
137 pSummaryPage->SetAutoLayout(AUTOLAYOUT_ENUM, true);
138 pSummaryPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
139 pSummaryPage->setHeaderFooterSettings(pActualPage->getHeaderFooterSettings());
141 // notes-page
142 SdPage* pNotesPage = mpDoc->AllocSdPage(false);
143 pNotesPage->SetSize(pActualNotesPage->GetSize());
144 pNotesPage->SetBorder(pActualNotesPage->GetLftBorder(),
145 pActualNotesPage->GetUppBorder(),
146 pActualNotesPage->GetRgtBorder(),
147 pActualNotesPage->GetLwrBorder() );
148 pNotesPage->SetPageKind(PK_NOTES);
150 // insert page at the back
151 mpDoc->InsertPage(pNotesPage, nCount * 2 + 2);
153 if( bUndo )
154 mpView->AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pNotesPage));
156 // use MasterPage of the current page
157 pNotesPage->TRG_SetMasterPage(pActualNotesPage->TRG_GetMasterPage());
158 pNotesPage->SetLayoutName(pActualNotesPage->GetLayoutName());
159 pNotesPage->SetAutoLayout(pActualNotesPage->GetAutoLayout(), true);
160 pNotesPage->TRG_SetMasterPageVisibleLayers(aVisibleLayers);
161 pNotesPage->setHeaderFooterSettings(pActualNotesPage->getHeaderFooterSettings());
163 pOutl = new ::sd::Outliner( mpDoc, OUTLINERMODE_OUTLINEOBJECT );
164 pOutl->SetUpdateMode(false);
165 pOutl->EnableUndo(false);
167 if (mpDocSh)
168 pOutl->SetRefDevice(SD_MOD()->GetRefDevice( *mpDocSh ));
170 pOutl->SetDefTab( mpDoc->GetDefaultTabulator() );
171 pOutl->SetStyleSheetPool(static_cast<SfxStyleSheetPool*>(mpDoc->GetStyleSheetPool()));
172 pStyle = pSummaryPage->GetStyleSheetForPresObj( PRESOBJ_OUTLINE );
173 pOutl->SetStyleSheet( 0, pStyle );
176 // add text
177 OutlinerParaObject* pParaObj = pTextObj->GetOutlinerParaObject();
178 // #118876#, check if the OutlinerParaObject is created successfully
179 if( pParaObj )
181 pParaObj->SetOutlinerMode( OUTLINERMODE_OUTLINEOBJECT );
182 pOutl->AddText(*pParaObj);
188 if (!pSummaryPage)
189 return;
191 SdrTextObj* pTextObj = static_cast<SdrTextObj*>( pSummaryPage->GetPresObj(PRESOBJ_OUTLINE) );
193 if (!pTextObj)
194 return;
196 // remove hard break- and character attributes
197 SfxItemSet aEmptyEEAttr(mpDoc->GetPool(), EE_ITEMS_START, EE_ITEMS_END);
198 sal_Int32 nParaCount = pOutl->GetParagraphCount();
200 for (sal_Int32 nPara = 0; nPara < nParaCount; nPara++)
202 pOutl->SetStyleSheet( nPara, pStyle );
203 pOutl->RemoveCharAttribs(nPara);
204 pOutl->SetParaAttribs(nPara, aEmptyEEAttr);
205 pOutl->SetDepth(pOutl->GetParagraph(nPara), 0);
208 pTextObj->SetOutlinerParaObject( pOutl->CreateParaObject() );
209 pTextObj->SetEmptyPresObj(false);
211 // remove hard attributes (Flag to sal_True)
212 SfxItemSet aAttr(mpDoc->GetPool());
213 aAttr.Put(XLineStyleItem(drawing::LineStyle_NONE));
214 aAttr.Put(XFillStyleItem(drawing::FillStyle_NONE));
215 pTextObj->SetMergedItemSet(aAttr);
217 if( bBegUndo )
218 mpView->EndUndo();
219 delete pOutl;
221 DrawViewShell* pDrawViewShell= dynamic_cast< DrawViewShell* >( mpViewShell );
222 if(pDrawViewShell)
224 pDrawViewShell->SwitchPage( (pSummaryPage->GetPageNum() - 1) / 2);
228 } // end of namespace sd
230 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */