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 #include "OutlineView.hxx"
28cdf0e10cSrcweir #include <memory>
29cdf0e10cSrcweir #include <editeng/forbiddencharacterstable.hxx>
30cdf0e10cSrcweir #include <sfx2/progress.hxx>
31cdf0e10cSrcweir #include <vcl/wrkwin.hxx>
32cdf0e10cSrcweir #include <svx/svxids.hrc>
33cdf0e10cSrcweir #include "eetext.hxx"
34cdf0e10cSrcweir #include <editeng/eeitem.hxx>
35cdf0e10cSrcweir #include <editeng/editstat.hxx>
36cdf0e10cSrcweir #include <editeng/lrspitem.hxx>
37cdf0e10cSrcweir #include <svx/svdotext.hxx>
38cdf0e10cSrcweir #include <sfx2/printer.hxx>
39cdf0e10cSrcweir #include <sfx2/imagemgr.hxx>
40cdf0e10cSrcweir #include <sfx2/app.hxx>
41cdf0e10cSrcweir #include <sfx2/bindings.hxx>
42cdf0e10cSrcweir #include <svl/itempool.hxx>
43cdf0e10cSrcweir #include <svl/style.hxx>
44cdf0e10cSrcweir #include <svx/svdorect.hxx>
45cdf0e10cSrcweir #include <svx/svdundo.hxx>
46cdf0e10cSrcweir #include <svl/brdcst.hxx>
47cdf0e10cSrcweir #include <vcl/msgbox.hxx>
48cdf0e10cSrcweir #include <editeng/adjitem.hxx>
49cdf0e10cSrcweir #include <editeng/tstpitem.hxx>
50cdf0e10cSrcweir #include <editeng/lspcitem.hxx>
51cdf0e10cSrcweir #include <editeng/numitem.hxx>
52cdf0e10cSrcweir #include <editeng/outlobj.hxx>
53cdf0e10cSrcweir #include <editeng/numitem.hxx>
54cdf0e10cSrcweir #include <editeng/editeng.hxx>
55cdf0e10cSrcweir
56cdf0e10cSrcweir // #97766#
57cdf0e10cSrcweir #include <editeng/editobj.hxx>
58cdf0e10cSrcweir #include <editeng/editund2.hxx>
59cdf0e10cSrcweir
60cdf0e10cSrcweir #include <editeng/editview.hxx>
61cdf0e10cSrcweir #include <editeng/svxfont.hxx>
62cdf0e10cSrcweir #include <editeng/fhgtitem.hxx>
63cdf0e10cSrcweir
64cdf0e10cSrcweir #include "DrawDocShell.hxx"
65cdf0e10cSrcweir #include "drawdoc.hxx"
66cdf0e10cSrcweir #include "Window.hxx"
67cdf0e10cSrcweir #include "sdpage.hxx"
68cdf0e10cSrcweir #include "pres.hxx"
69cdf0e10cSrcweir #include "OutlineViewShell.hxx"
70cdf0e10cSrcweir #include "app.hrc"
71cdf0e10cSrcweir #include "glob.hrc"
72cdf0e10cSrcweir #include "sdresid.hxx"
73cdf0e10cSrcweir #include "Outliner.hxx"
74cdf0e10cSrcweir #include "strings.hrc"
75cdf0e10cSrcweir #include "EventMultiplexer.hxx"
76cdf0e10cSrcweir #include "ViewShellBase.hxx"
77cdf0e10cSrcweir #include "undo/undoobjects.hxx"
78cdf0e10cSrcweir #include "undo/undomanager.hxx"
79cdf0e10cSrcweir #include "stlsheet.hxx"
80cdf0e10cSrcweir
81cdf0e10cSrcweir using ::rtl::OUString;
82cdf0e10cSrcweir using namespace ::com::sun::star::uno;
83cdf0e10cSrcweir using namespace ::com::sun::star::frame;
84cdf0e10cSrcweir
85cdf0e10cSrcweir namespace sd {
86cdf0e10cSrcweir
87cdf0e10cSrcweir // Breite: DIN A 4, zwei Raender zu je 1 cm
88cdf0e10cSrcweir #define OUTLINE_PAPERWIDTH 19000
89cdf0e10cSrcweir
90cdf0e10cSrcweir // beim Seitenmanipulation Fortschrittsanzeige, wenn mehr Seiten betroffen
91cdf0e10cSrcweir // sind als:
92cdf0e10cSrcweir #define PROCESS_WITH_PROGRESS_THRESHOLD 5
93cdf0e10cSrcweir
94cdf0e10cSrcweir struct SdParaAndPos
95cdf0e10cSrcweir {
96cdf0e10cSrcweir Paragraph* pPara;
97cdf0e10cSrcweir sal_uInt16 nPos;
98cdf0e10cSrcweir };
99cdf0e10cSrcweir
100cdf0e10cSrcweir TYPEINIT1( OutlineView, ::sd::View );
101cdf0e10cSrcweir
102cdf0e10cSrcweir /*************************************************************************
103cdf0e10cSrcweir |*
104cdf0e10cSrcweir |* Konstruktor
105cdf0e10cSrcweir |*
106cdf0e10cSrcweir \************************************************************************/
107cdf0e10cSrcweir
OutlineView(DrawDocShell * pDocSh,::Window * pWindow,OutlineViewShell * pOutlineViewSh)108cdf0e10cSrcweir OutlineView::OutlineView( DrawDocShell* pDocSh, ::Window* pWindow, OutlineViewShell* pOutlineViewSh)
109cdf0e10cSrcweir : ::sd::View(pDocSh->GetDoc(), pWindow, pOutlineViewSh)
110cdf0e10cSrcweir , mpOutlineViewShell(pOutlineViewSh)
111cdf0e10cSrcweir , mpOutliner( mpDoc->GetOutliner(sal_True) )
112cdf0e10cSrcweir , mpOldParaOrder(NULL)
113cdf0e10cSrcweir , mpSelectedParas(NULL)
114cdf0e10cSrcweir , mnPagesToProcess(0)
115cdf0e10cSrcweir , mnPagesProcessed(0)
116cdf0e10cSrcweir , mbFirstPaint(sal_True)
117cdf0e10cSrcweir , mpProgress(NULL)
118cdf0e10cSrcweir , mbHighContrastMode( false )
119cdf0e10cSrcweir , maDocColor( COL_WHITE )
120cdf0e10cSrcweir , mnPageNumberWidthPixel( 0 )
121cdf0e10cSrcweir , maLRSpaceItem( 0, 0, 2000, 0, EE_PARA_OUTLLRSPACE )
122cdf0e10cSrcweir {
123cdf0e10cSrcweir sal_Bool bInitOutliner = sal_False;
124cdf0e10cSrcweir
125cdf0e10cSrcweir if (mpOutliner->GetViewCount() == 0)
126cdf0e10cSrcweir {
127cdf0e10cSrcweir // Outliner initialisieren: Referenz-Device setzen
128cdf0e10cSrcweir bInitOutliner = sal_True;
129cdf0e10cSrcweir mpOutliner->Init( OUTLINERMODE_OUTLINEVIEW );
130cdf0e10cSrcweir /*
131cdf0e10cSrcweir SfxStyleSheet* pTitleSheet = mpDoc->GetSdPage( 0, PK_STANDARD )->GetStyleSheetForPresObj( PRESOBJ_TITLE );
132cdf0e10cSrcweir
133cdf0e10cSrcweir if ( pTitleSheet )
134cdf0e10cSrcweir {
135cdf0e10cSrcweir // set title symbol (level 0)
136cdf0e10cSrcweir SvxNumBulletItem aNumBulletItem( (const SvxNumBulletItem&) pTitleSheet->GetItemSet().Get(EE_PARA_NUMBULLET) );
137cdf0e10cSrcweir SvxNumRule aNumRule(* aNumBulletItem.GetNumRule());
138cdf0e10cSrcweir SvxNumberFormat aFormat( aNumRule.GetLevel(0));
139cdf0e10cSrcweir Font aBulletFont;
140cdf0e10cSrcweir const Font* pFont = aFormat.GetBulletFont();
141cdf0e10cSrcweir if ( pFont ) // if available take font size and color from style
142cdf0e10cSrcweir aBulletFont = *pFont;
143cdf0e10cSrcweir else
144cdf0e10cSrcweir {
145cdf0e10cSrcweir aBulletFont.SetColor( COL_AUTO );
146cdf0e10cSrcweir aBulletFont.SetHeight( 1552 );
147cdf0e10cSrcweir }
148cdf0e10cSrcweir aBulletFont.SetCharSet(RTL_TEXTENCODING_MS_1252); // and replacing other values by standard
149cdf0e10cSrcweir aBulletFont.SetName( String( RTL_CONSTASCII_USTRINGPARAM( "StarSymbol" )) );
150cdf0e10cSrcweir aBulletFont.SetWeight(WEIGHT_NORMAL);
151cdf0e10cSrcweir aBulletFont.SetUnderline(UNDERLINE_NONE);
152cdf0e10cSrcweir aBulletFont.SetStrikeout(STRIKEOUT_NONE);
153cdf0e10cSrcweir aBulletFont.SetItalic(ITALIC_NONE);
154cdf0e10cSrcweir aBulletFont.SetOutline(sal_False);
155cdf0e10cSrcweir aBulletFont.SetShadow(sal_False);
156cdf0e10cSrcweir aFormat.SetBulletFont( &aBulletFont );
157cdf0e10cSrcweir aFormat.SetBulletChar( 0xE011 ); // StarBats: 0xF000 + 114
158cdf0e10cSrcweir mpOutliner->OverwriteLevel0Bullet( aFormat );
159cdf0e10cSrcweir }
160cdf0e10cSrcweir */
161cdf0e10cSrcweir mpOutliner->SetRefDevice( SD_MOD()->GetRefDevice( *pDocSh ) );
162cdf0e10cSrcweir sal_uLong nWidth = OUTLINE_PAPERWIDTH;
163cdf0e10cSrcweir mpOutliner->SetPaperSize(Size(nWidth, 400000000));
164cdf0e10cSrcweir }
165cdf0e10cSrcweir
166cdf0e10cSrcweir // View in Outliner einfuegen
167cdf0e10cSrcweir for (sal_uInt16 nView = 0; nView < MAX_OUTLINERVIEWS; nView++)
168cdf0e10cSrcweir {
169cdf0e10cSrcweir mpOutlinerView[nView] = NULL;
170cdf0e10cSrcweir }
171cdf0e10cSrcweir
172cdf0e10cSrcweir mpOutlinerView[0] = new OutlinerView(mpOutliner, pWindow);
173cdf0e10cSrcweir Rectangle aNullRect;
174cdf0e10cSrcweir mpOutlinerView[0]->SetOutputArea(aNullRect);
175cdf0e10cSrcweir mpOutliner->SetUpdateMode(sal_False);
176cdf0e10cSrcweir mpOutliner->InsertView(mpOutlinerView[0], LIST_APPEND);
177cdf0e10cSrcweir
178cdf0e10cSrcweir onUpdateStyleSettings( true );
179cdf0e10cSrcweir
180cdf0e10cSrcweir if (bInitOutliner)
181cdf0e10cSrcweir {
182cdf0e10cSrcweir // Outliner mit Inhalt fuellen
183cdf0e10cSrcweir FillOutliner();
184cdf0e10cSrcweir }
185cdf0e10cSrcweir
186cdf0e10cSrcweir Link aLink( LINK(this,OutlineView,EventMultiplexerListener) );
187cdf0e10cSrcweir mpOutlineViewShell->GetViewShellBase().GetEventMultiplexer()->AddEventListener(
188cdf0e10cSrcweir aLink,
189cdf0e10cSrcweir tools::EventMultiplexerEvent::EID_CURRENT_PAGE
190cdf0e10cSrcweir | tools::EventMultiplexerEvent::EID_PAGE_ORDER);
191cdf0e10cSrcweir
192cdf0e10cSrcweir LanguageType eLang = mpOutliner->GetDefaultLanguage();
193cdf0e10cSrcweir maPageNumberFont = OutputDevice::GetDefaultFont( DEFAULTFONT_SANS_UNICODE, eLang, 0 );
194cdf0e10cSrcweir maPageNumberFont.SetHeight( 500 );
195cdf0e10cSrcweir
196cdf0e10cSrcweir maBulletFont.SetColor( COL_AUTO );
197cdf0e10cSrcweir maBulletFont.SetHeight( 1000 );
198cdf0e10cSrcweir maBulletFont.SetCharSet(RTL_TEXTENCODING_MS_1252); // and replacing other values by standard
199cdf0e10cSrcweir maBulletFont.SetName( String( RTL_CONSTASCII_USTRINGPARAM( "StarSymbol" )) );
200cdf0e10cSrcweir maBulletFont.SetWeight(WEIGHT_NORMAL);
201cdf0e10cSrcweir maBulletFont.SetUnderline(UNDERLINE_NONE);
202cdf0e10cSrcweir maBulletFont.SetStrikeout(STRIKEOUT_NONE);
203cdf0e10cSrcweir maBulletFont.SetItalic(ITALIC_NONE);
204cdf0e10cSrcweir maBulletFont.SetOutline(sal_False);
205cdf0e10cSrcweir maBulletFont.SetShadow(sal_False);
206cdf0e10cSrcweir
207cdf0e10cSrcweir
208cdf0e10cSrcweir Reference<XFrame> xFrame (mpOutlineViewShell->GetViewShellBase().GetFrame()->GetTopFrame().GetFrameInterface(), UNO_QUERY);
209cdf0e10cSrcweir
210cdf0e10cSrcweir const OUString aSlotURL( RTL_CONSTASCII_USTRINGPARAM( ".uno:ShowSlide" ));
211cdf0e10cSrcweir maSlideImage = GetImage( xFrame, aSlotURL, true, false /* todo, hc mode */ );
212cdf0e10cSrcweir
213cdf0e10cSrcweir // Tell undo manager of the document about the undo manager of the
214cdf0e10cSrcweir // outliner, so that the former can synchronize with the later.
215cdf0e10cSrcweir sd::UndoManager* pDocUndoMgr = dynamic_cast<sd::UndoManager*>(mpDocSh->GetUndoManager());
216cdf0e10cSrcweir if (pDocUndoMgr != NULL)
217cdf0e10cSrcweir pDocUndoMgr->SetLinkedUndoManager(&mpOutliner->GetUndoManager());
218cdf0e10cSrcweir }
219cdf0e10cSrcweir
220cdf0e10cSrcweir /*************************************************************************
221cdf0e10cSrcweir |*
222cdf0e10cSrcweir |* Destruktor, Links restaurieren, Outliner leeren
223cdf0e10cSrcweir |*
224cdf0e10cSrcweir \************************************************************************/
225cdf0e10cSrcweir
~OutlineView()226cdf0e10cSrcweir OutlineView::~OutlineView()
227cdf0e10cSrcweir {
228cdf0e10cSrcweir DBG_ASSERT(maDragAndDropModelGuard.get() == 0, "sd::OutlineView::~OutlineView(), prior drag operation not finished correctly!" );
229cdf0e10cSrcweir
230cdf0e10cSrcweir Link aLink( LINK(this,OutlineView,EventMultiplexerListener) );
231cdf0e10cSrcweir mpOutlineViewShell->GetViewShellBase().GetEventMultiplexer()->RemoveEventListener( aLink );
232cdf0e10cSrcweir DisconnectFromApplication();
233cdf0e10cSrcweir
234cdf0e10cSrcweir if( mpProgress )
235cdf0e10cSrcweir delete mpProgress;
236cdf0e10cSrcweir
237cdf0e10cSrcweir // OutlinerViews abmelden und zerstoeren
238cdf0e10cSrcweir for (sal_uInt16 nView = 0; nView < MAX_OUTLINERVIEWS; nView++)
239cdf0e10cSrcweir {
240cdf0e10cSrcweir if (mpOutlinerView[nView] != NULL)
241cdf0e10cSrcweir {
242cdf0e10cSrcweir mpOutliner->RemoveView( mpOutlinerView[nView] );
243cdf0e10cSrcweir delete mpOutlinerView[nView];
244cdf0e10cSrcweir mpOutlinerView[nView] = NULL;
245cdf0e10cSrcweir }
246cdf0e10cSrcweir }
247cdf0e10cSrcweir
248cdf0e10cSrcweir if (mpOutliner->GetViewCount() == 0)
249cdf0e10cSrcweir {
250cdf0e10cSrcweir // Outliner deinitialisieren: Farbdarstellung einschalten
251cdf0e10cSrcweir ResetLinks();
252cdf0e10cSrcweir sal_uLong nCntrl = mpOutliner->GetControlWord();
253cdf0e10cSrcweir mpOutliner->SetUpdateMode(sal_False); // sonst wird bei SetControlWord gezeichnet
254cdf0e10cSrcweir mpOutliner->SetControlWord(nCntrl & ~EE_CNTRL_NOCOLORS);
255cdf0e10cSrcweir SvtAccessibilityOptions aOptions;
256cdf0e10cSrcweir mpOutliner->ForceAutoColor( aOptions.GetIsAutomaticFontColor() );
257cdf0e10cSrcweir mpOutliner->Clear();
258cdf0e10cSrcweir }
259cdf0e10cSrcweir
260cdf0e10cSrcweir DBG_ASSERT(!mpSelectedParas, "Absatzliste nicht geloescht");
261cdf0e10cSrcweir DBG_ASSERT(!mpOldParaOrder, "Absatzliste nicht geloescht");
262cdf0e10cSrcweir }
263cdf0e10cSrcweir
264cdf0e10cSrcweir
265cdf0e10cSrcweir
266cdf0e10cSrcweir
ConnectToApplication(void)267cdf0e10cSrcweir void OutlineView::ConnectToApplication (void)
268cdf0e10cSrcweir {
269cdf0e10cSrcweir mpOutlineViewShell->GetActiveWindow()->GrabFocus();
270cdf0e10cSrcweir Application::AddEventListener(LINK(this, OutlineView, AppEventListenerHdl));
271cdf0e10cSrcweir }
272cdf0e10cSrcweir
273cdf0e10cSrcweir
274cdf0e10cSrcweir
275cdf0e10cSrcweir
DisconnectFromApplication(void)276cdf0e10cSrcweir void OutlineView::DisconnectFromApplication (void)
277cdf0e10cSrcweir {
278cdf0e10cSrcweir Application::RemoveEventListener(LINK(this, OutlineView, AppEventListenerHdl));
279cdf0e10cSrcweir }
280cdf0e10cSrcweir
281cdf0e10cSrcweir
282cdf0e10cSrcweir
283cdf0e10cSrcweir
284cdf0e10cSrcweir /*************************************************************************
285cdf0e10cSrcweir |*
286cdf0e10cSrcweir |* Paint-Methode
287cdf0e10cSrcweir |*
288cdf0e10cSrcweir \************************************************************************/
289cdf0e10cSrcweir
Paint(const Rectangle & rRect,::sd::Window * pWin)290cdf0e10cSrcweir void OutlineView::Paint(const Rectangle& rRect, ::sd::Window* pWin)
291cdf0e10cSrcweir {
292cdf0e10cSrcweir OutlinerView* pOlView = GetViewByWindow(pWin);
293cdf0e10cSrcweir
294cdf0e10cSrcweir if (pOlView)
295cdf0e10cSrcweir {
296cdf0e10cSrcweir pOlView->HideCursor();
297cdf0e10cSrcweir pOlView->Paint(rRect);
298cdf0e10cSrcweir
299cdf0e10cSrcweir pOlView->ShowCursor(mbFirstPaint);
300cdf0e10cSrcweir
301cdf0e10cSrcweir /*
302cdf0e10cSrcweir if( mnPageNumberWidthPixel == 0 )
303cdf0e10cSrcweir GetPageNumberWidthPixel();
304cdf0e10cSrcweir
305cdf0e10cSrcweir const sal_uLong nParaCount = pOlView->GetOutliner()->GetParagraphCount();
306cdf0e10cSrcweir EditView& rEditView = pOlView->GetEditView();
307cdf0e10cSrcweir
308cdf0e10cSrcweir Font aOldFont( pWin->GetFont() );
309cdf0e10cSrcweir
310cdf0e10cSrcweir const String aBulletStr( sal_Unicode( 0xE011 ) );
311cdf0e10cSrcweir pWin->SetFont( maBulletFont);
312cdf0e10cSrcweir sal_Int32 nBulletWidth = pWin->GetTextWidth(aBulletStr);
313cdf0e10cSrcweir
314cdf0e10cSrcweir sal_Int32 nPage = 1;
315cdf0e10cSrcweir for( sal_uLong nPara = 0; nPara < nParaCount; nPara++ )
316cdf0e10cSrcweir {
317cdf0e10cSrcweir Paragraph* pPara = pOlView->GetOutliner()->GetParagraph( nPara );
318cdf0e10cSrcweir if( pPara->HasFlag( PARAFLAG_ISPAGE ) )
319cdf0e10cSrcweir {
320cdf0e10cSrcweir pWin->SetFont( maPageNumberFont );
321cdf0e10cSrcweir const String aStr( String::CreateFromInt32( nPage++ ) );
322cdf0e10cSrcweir Point aPos( rEditView.GetWindowPosTopLeft( (sal_uInt16)nPara ) );
323cdf0e10cSrcweir
324cdf0e10cSrcweir sal_Int32 nNumberOffset = pWin->PixelToLogic( Point(mnPageNumberWidthPixel, 0) ).X() - nBulletWidth;
325cdf0e10cSrcweir sal_Int32 nLineHeight = pOlView->GetOutliner()->GetLineHeight( nPara, 0 );
326cdf0e10cSrcweir
327cdf0e10cSrcweir aPos.X() = nNumberOffset;
328cdf0e10cSrcweir
329cdf0e10cSrcweir Point aPoint( aPos.X() - pWin->GetTextWidth( aStr ), aPos.Y() + ( nLineHeight - maPageNumberFont.GetHeight()) / 2 );
330cdf0e10cSrcweir pWin->DrawText( aPoint, aStr );
331cdf0e10cSrcweir
332cdf0e10cSrcweir aPoint.X() = aPos.X();
333cdf0e10cSrcweir aPoint.Y() = aPos.Y() +( nLineHeight - maBulletFont.GetHeight()) / 2;
334cdf0e10cSrcweir pWin->SetFont( maBulletFont );
335cdf0e10cSrcweir pWin->DrawText( aPoint, aBulletStr );
336cdf0e10cSrcweir }
337cdf0e10cSrcweir }
338cdf0e10cSrcweir
339cdf0e10cSrcweir pWin->SetFont( aOldFont );
340cdf0e10cSrcweir */
341cdf0e10cSrcweir mbFirstPaint = sal_False;
342cdf0e10cSrcweir }
343cdf0e10cSrcweir }
344cdf0e10cSrcweir
InvalidateSlideNumberArea()345cdf0e10cSrcweir void OutlineView::InvalidateSlideNumberArea()
346cdf0e10cSrcweir {
347cdf0e10cSrcweir /*
348cdf0e10cSrcweir for( sal_Int16 nView = 0; nView < MAX_OUTLINERVIEWS; ++nView )
349cdf0e10cSrcweir {
350cdf0e10cSrcweir if (mpOutlinerView[nView] != NULL)
351cdf0e10cSrcweir {
352cdf0e10cSrcweir ::Window* pWindow = mpOutlinerView[nView]->GetWindow();
353cdf0e10cSrcweir if( pWindow )
354cdf0e10cSrcweir {
355cdf0e10cSrcweir Rectangle aRect( Point(0,0), pWindow->GetOutputSize() );
356cdf0e10cSrcweir aRect.nRight = aRect.nLeft + pWindow->PixelToLogic( Point( mnPageNumberWidthPixel, 0 ) ).X() * 2;
357cdf0e10cSrcweir
358cdf0e10cSrcweir pWindow->Invalidate(aRect);
359cdf0e10cSrcweir }
360cdf0e10cSrcweir }
361cdf0e10cSrcweir }
362cdf0e10cSrcweir */
363cdf0e10cSrcweir }
364cdf0e10cSrcweir
365cdf0e10cSrcweir /*************************************************************************
366cdf0e10cSrcweir |*
367cdf0e10cSrcweir |* Fenster-Groesse hat sich geaendert
368cdf0e10cSrcweir |*
369cdf0e10cSrcweir \************************************************************************/
370cdf0e10cSrcweir
AdjustPosSizePixel(const Point &,const Size &,::sd::Window *)371cdf0e10cSrcweir void OutlineView::AdjustPosSizePixel(const Point &,const Size &,::sd::Window*)
372cdf0e10cSrcweir {
373cdf0e10cSrcweir }
374cdf0e10cSrcweir
375cdf0e10cSrcweir /*************************************************************************
376cdf0e10cSrcweir |*
377cdf0e10cSrcweir |* ein Fenster hinzufuegen
378cdf0e10cSrcweir |*
379cdf0e10cSrcweir \************************************************************************/
380cdf0e10cSrcweir
AddWindowToPaintView(OutputDevice * pWin)381cdf0e10cSrcweir void OutlineView::AddWindowToPaintView(OutputDevice* pWin)
382cdf0e10cSrcweir {
383cdf0e10cSrcweir sal_Bool bAdded = sal_False;
384cdf0e10cSrcweir sal_Bool bValidArea = sal_False;
385cdf0e10cSrcweir Rectangle aOutputArea;
386cdf0e10cSrcweir const Color aWhiteColor( COL_WHITE );
387cdf0e10cSrcweir sal_uInt16 nView = 0;
388cdf0e10cSrcweir
389cdf0e10cSrcweir while (nView < MAX_OUTLINERVIEWS && !bAdded)
390cdf0e10cSrcweir {
391cdf0e10cSrcweir if (mpOutlinerView[nView] == NULL)
392cdf0e10cSrcweir {
393cdf0e10cSrcweir mpOutlinerView[nView] = new OutlinerView(mpOutliner, dynamic_cast< ::sd::Window* >(pWin));
394cdf0e10cSrcweir mpOutlinerView[nView]->SetBackgroundColor( aWhiteColor );
395cdf0e10cSrcweir mpOutliner->InsertView(mpOutlinerView[nView], LIST_APPEND);
396cdf0e10cSrcweir bAdded = sal_True;
397cdf0e10cSrcweir
398cdf0e10cSrcweir if (bValidArea)
399cdf0e10cSrcweir {
400cdf0e10cSrcweir mpOutlinerView[nView]->SetOutputArea(aOutputArea);
401cdf0e10cSrcweir }
402cdf0e10cSrcweir }
403cdf0e10cSrcweir else if (!bValidArea)
404cdf0e10cSrcweir {
405cdf0e10cSrcweir aOutputArea = mpOutlinerView[nView]->GetOutputArea();
406cdf0e10cSrcweir bValidArea = sal_True;
407cdf0e10cSrcweir }
408cdf0e10cSrcweir
409cdf0e10cSrcweir nView++;
410cdf0e10cSrcweir }
411cdf0e10cSrcweir
412cdf0e10cSrcweir // weisser Hintergrund im Outliner
413cdf0e10cSrcweir pWin->SetBackground( Wallpaper( aWhiteColor ) );
414cdf0e10cSrcweir
415cdf0e10cSrcweir ::sd::View::AddWindowToPaintView(pWin);
416cdf0e10cSrcweir }
417cdf0e10cSrcweir
418cdf0e10cSrcweir /*************************************************************************
419cdf0e10cSrcweir |*
420cdf0e10cSrcweir |* ein Fenster entfernen
421cdf0e10cSrcweir |*
422cdf0e10cSrcweir \************************************************************************/
423cdf0e10cSrcweir
DeleteWindowFromPaintView(OutputDevice * pWin)424cdf0e10cSrcweir void OutlineView::DeleteWindowFromPaintView(OutputDevice* pWin)
425cdf0e10cSrcweir {
426cdf0e10cSrcweir sal_Bool bRemoved = sal_False;
427cdf0e10cSrcweir sal_uInt16 nView = 0;
428cdf0e10cSrcweir ::Window* pWindow;
429cdf0e10cSrcweir
430cdf0e10cSrcweir while (nView < MAX_OUTLINERVIEWS && !bRemoved)
431cdf0e10cSrcweir {
432cdf0e10cSrcweir if (mpOutlinerView[nView] != NULL)
433cdf0e10cSrcweir {
434cdf0e10cSrcweir pWindow = mpOutlinerView[nView]->GetWindow();
435cdf0e10cSrcweir
436cdf0e10cSrcweir if (pWindow == pWin)
437cdf0e10cSrcweir {
438cdf0e10cSrcweir mpOutliner->RemoveView( mpOutlinerView[nView] );
439cdf0e10cSrcweir delete mpOutlinerView[nView];
440cdf0e10cSrcweir mpOutlinerView[nView] = NULL;
441cdf0e10cSrcweir bRemoved = sal_True;
442cdf0e10cSrcweir }
443cdf0e10cSrcweir }
444cdf0e10cSrcweir
445cdf0e10cSrcweir nView++;
446cdf0e10cSrcweir }
447cdf0e10cSrcweir
448cdf0e10cSrcweir ::sd::View::DeleteWindowFromPaintView(pWin);
449cdf0e10cSrcweir }
450cdf0e10cSrcweir
451cdf0e10cSrcweir /*************************************************************************
452cdf0e10cSrcweir |*
453cdf0e10cSrcweir |* Zeiger der dem Fenster entsprechenden OutlinerView zurueckgeben.
454cdf0e10cSrcweir |*
455cdf0e10cSrcweir \************************************************************************/
456cdf0e10cSrcweir
GetViewByWindow(::Window * pWin) const457cdf0e10cSrcweir OutlinerView* OutlineView::GetViewByWindow (::Window* pWin) const
458cdf0e10cSrcweir {
459cdf0e10cSrcweir OutlinerView* pOlView = NULL;
460cdf0e10cSrcweir for (sal_uInt16 nView = 0; nView < MAX_OUTLINERVIEWS; nView++)
461cdf0e10cSrcweir {
462cdf0e10cSrcweir if (mpOutlinerView[nView] != NULL)
463cdf0e10cSrcweir {
464cdf0e10cSrcweir if ( pWin == mpOutlinerView[nView]->GetWindow() )
465cdf0e10cSrcweir {
466cdf0e10cSrcweir pOlView = mpOutlinerView[nView];
467cdf0e10cSrcweir }
468cdf0e10cSrcweir }
469cdf0e10cSrcweir }
470cdf0e10cSrcweir return (pOlView);
471cdf0e10cSrcweir }
472cdf0e10cSrcweir
473cdf0e10cSrcweir
474cdf0e10cSrcweir /*************************************************************************
475cdf0e10cSrcweir |*
476cdf0e10cSrcweir |* Ermittelt den Titel vor einem beliebigen Absatz.
477cdf0e10cSrcweir |*
478cdf0e10cSrcweir \************************************************************************/
479cdf0e10cSrcweir
GetPrevTitle(const Paragraph * pPara)480cdf0e10cSrcweir Paragraph* OutlineView::GetPrevTitle(const Paragraph* pPara)
481cdf0e10cSrcweir {
482cdf0e10cSrcweir sal_Int32 nPos = mpOutliner->GetAbsPos(const_cast<Paragraph*>(pPara));
483cdf0e10cSrcweir
484cdf0e10cSrcweir if (nPos > 0)
485cdf0e10cSrcweir {
486cdf0e10cSrcweir while(nPos)
487cdf0e10cSrcweir {
488cdf0e10cSrcweir pPara = mpOutliner->GetParagraph(--nPos);
489cdf0e10cSrcweir if( mpOutliner->HasParaFlag(pPara, PARAFLAG_ISPAGE) )
490cdf0e10cSrcweir {
491cdf0e10cSrcweir return const_cast< Paragraph* >( pPara );
492cdf0e10cSrcweir }
493cdf0e10cSrcweir }
494cdf0e10cSrcweir
495cdf0e10cSrcweir }
496cdf0e10cSrcweir return NULL;
497cdf0e10cSrcweir }
498cdf0e10cSrcweir
499cdf0e10cSrcweir /*************************************************************************
500cdf0e10cSrcweir |*
501cdf0e10cSrcweir |* Ermittelt den Titel nach einem beliebigen Absatz.
502cdf0e10cSrcweir |*
503cdf0e10cSrcweir \************************************************************************/
504cdf0e10cSrcweir
GetNextTitle(const Paragraph * pPara)505cdf0e10cSrcweir Paragraph* OutlineView::GetNextTitle(const Paragraph* pPara)
506cdf0e10cSrcweir {
507cdf0e10cSrcweir Paragraph* pResult = const_cast< Paragraph* >( pPara );
508cdf0e10cSrcweir
509cdf0e10cSrcweir sal_Int32 nPos = mpOutliner->GetAbsPos(pResult);
510cdf0e10cSrcweir
511cdf0e10cSrcweir do
512cdf0e10cSrcweir {
513cdf0e10cSrcweir pResult = mpOutliner->GetParagraph(++nPos);
514cdf0e10cSrcweir if( pResult && mpOutliner->HasParaFlag(pResult, PARAFLAG_ISPAGE) )
515cdf0e10cSrcweir return pResult;
516cdf0e10cSrcweir }
517cdf0e10cSrcweir while( pResult );
518cdf0e10cSrcweir
519cdf0e10cSrcweir return NULL;
520cdf0e10cSrcweir }
521cdf0e10cSrcweir
522cdf0e10cSrcweir /*************************************************************************
523cdf0e10cSrcweir |*
524cdf0e10cSrcweir |* Handler fuer das Einfuegen von Seiten (Absaetzen)
525cdf0e10cSrcweir |*
526cdf0e10cSrcweir \************************************************************************/
527cdf0e10cSrcweir
IMPL_LINK(OutlineView,ParagraphInsertedHdl,::Outliner *,pOutliner)528cdf0e10cSrcweir IMPL_LINK( OutlineView, ParagraphInsertedHdl, ::Outliner *, pOutliner )
529cdf0e10cSrcweir {
530cdf0e10cSrcweir // DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::ParagraphInsertedHdl(), model change without undo?!" );
531cdf0e10cSrcweir
532cdf0e10cSrcweir // we get calls to this handler during binary insert of drag and drop contents but
533cdf0e10cSrcweir // we ignore it here and handle it later in OnEndPasteOrDrop()
534cdf0e10cSrcweir if( maDragAndDropModelGuard.get() == 0 )
535cdf0e10cSrcweir {
536cdf0e10cSrcweir OutlineViewPageChangesGuard aGuard(this);
537cdf0e10cSrcweir
538cdf0e10cSrcweir Paragraph* pPara = pOutliner->GetHdlParagraph();
539cdf0e10cSrcweir
540cdf0e10cSrcweir sal_uInt16 nAbsPos = (sal_uInt16)mpOutliner->GetAbsPos( pPara );
541cdf0e10cSrcweir
542cdf0e10cSrcweir UpdateParagraph( nAbsPos );
543cdf0e10cSrcweir
544cdf0e10cSrcweir if( (nAbsPos == 0) || mpOutliner->HasParaFlag(pPara,PARAFLAG_ISPAGE) || mpOutliner->HasParaFlag(mpOutliner->GetParagraph( nAbsPos-1 ), PARAFLAG_ISPAGE) )
545cdf0e10cSrcweir {
546cdf0e10cSrcweir InsertSlideForParagraph( pPara );
547cdf0e10cSrcweir InvalidateSlideNumberArea();
548cdf0e10cSrcweir }
549cdf0e10cSrcweir }
550cdf0e10cSrcweir
551cdf0e10cSrcweir return 0;
552cdf0e10cSrcweir }
553cdf0e10cSrcweir
554cdf0e10cSrcweir /** creates and inserts an empty slide for the given paragraph */
InsertSlideForParagraph(Paragraph * pPara)555cdf0e10cSrcweir SdPage* OutlineView::InsertSlideForParagraph( Paragraph* pPara )
556cdf0e10cSrcweir {
557cdf0e10cSrcweir DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::InsertSlideForParagraph(), model change without undo?!" );
558cdf0e10cSrcweir
559cdf0e10cSrcweir OutlineViewPageChangesGuard aGuard(this);
560cdf0e10cSrcweir
561cdf0e10cSrcweir mpOutliner->SetParaFlag( pPara, PARAFLAG_ISPAGE );
562cdf0e10cSrcweir // wieviele Titel sind vor dem neuen Titelabsatz?
563cdf0e10cSrcweir sal_uLong nExample = 0L; // Position der "Vorbild"seite
564cdf0e10cSrcweir sal_uLong nTarget = 0L; // Einfuegeposition
565cdf0e10cSrcweir while(pPara)
566cdf0e10cSrcweir {
567cdf0e10cSrcweir pPara = GetPrevTitle(pPara);
568cdf0e10cSrcweir if (pPara)
569cdf0e10cSrcweir nTarget++;
570cdf0e10cSrcweir }
571cdf0e10cSrcweir
572cdf0e10cSrcweir
573cdf0e10cSrcweir // was der Outliner nicht kann, muss hier wieder wettgemacht werden:
574cdf0e10cSrcweir // wenn VOR dem ersten Absatz ein neuer Absatz mit RETURN erzeugt wird,
575cdf0e10cSrcweir // meldet der Outliner den bereits bestehenden (jetzt nach unten
576cdf0e10cSrcweir // gerutschten) Absatz als neuen Absatz; nicht darauf reinfallen!
577cdf0e10cSrcweir if (nTarget == 1)
578cdf0e10cSrcweir {
579cdf0e10cSrcweir String aTest(mpOutliner->GetText( mpOutliner->GetParagraph( 0 ) ));
580cdf0e10cSrcweir if (aTest.Len() == 0)
581cdf0e10cSrcweir {
582cdf0e10cSrcweir nTarget = 0;
583cdf0e10cSrcweir }
584cdf0e10cSrcweir }
585cdf0e10cSrcweir
586cdf0e10cSrcweir
587cdf0e10cSrcweir // "Vorbild"seite ist - wenn vorhanden - die Vorgaengerseite
588cdf0e10cSrcweir if (nTarget > 0)
589cdf0e10cSrcweir {
590cdf0e10cSrcweir nExample = nTarget - 1;
591cdf0e10cSrcweir
592cdf0e10cSrcweir sal_uInt16 nPageCount = mpDoc->GetSdPageCount( PK_STANDARD );
593cdf0e10cSrcweir if( nExample >= nPageCount )
594cdf0e10cSrcweir nExample = nPageCount - 1;
595cdf0e10cSrcweir }
596cdf0e10cSrcweir
597cdf0e10cSrcweir /**********************************************************************
598cdf0e10cSrcweir * Es wird stets zuerst eine Standardseite und dann eine
599cdf0e10cSrcweir * Notizseite erzeugt. Es ist sichergestellt, dass auf eine
600cdf0e10cSrcweir * Standardseite stets die zugehoerige Notizseite folgt.
601cdf0e10cSrcweir * Vorangestellt ist genau eine Handzettelseite
602cdf0e10cSrcweir **********************************************************************/
603cdf0e10cSrcweir
604cdf0e10cSrcweir // diese Seite hat Vorbildfunktion
605cdf0e10cSrcweir SdPage* pExample = (SdPage*)mpDoc->GetSdPage((sal_uInt16)nExample, PK_STANDARD);
606cdf0e10cSrcweir SdPage* pPage = (SdPage*)mpDoc->AllocPage(sal_False);
607cdf0e10cSrcweir
608cdf0e10cSrcweir pPage->SetLayoutName(pExample->GetLayoutName());
609cdf0e10cSrcweir
610cdf0e10cSrcweir // einfuegen (Seite)
611cdf0e10cSrcweir mpDoc->InsertPage(pPage, (sal_uInt16)(nTarget) * 2 + 1);
612cdf0e10cSrcweir if( isRecordingUndo() )
613cdf0e10cSrcweir AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pPage));
614cdf0e10cSrcweir
615cdf0e10cSrcweir // der Standardseite eine Masterpage zuweisen
616cdf0e10cSrcweir pPage->TRG_SetMasterPage(pExample->TRG_GetMasterPage());
617cdf0e10cSrcweir
618cdf0e10cSrcweir // Seitengroesse setzen
619cdf0e10cSrcweir pPage->SetSize(pExample->GetSize());
620cdf0e10cSrcweir pPage->SetBorder( pExample->GetLftBorder(),
621cdf0e10cSrcweir pExample->GetUppBorder(),
622cdf0e10cSrcweir pExample->GetRgtBorder(),
623cdf0e10cSrcweir pExample->GetLwrBorder() );
624cdf0e10cSrcweir
625cdf0e10cSrcweir // neue Praesentationsobjekte anlegen (auf <Titel> oder
626cdf0e10cSrcweir // <Titel mit Untertitel> folgt <Titel mit Gliederung>, ansonsten
627cdf0e10cSrcweir // wird das Layout von der Vorgaengerseite uebernommen)
628cdf0e10cSrcweir AutoLayout eAutoLayout = pExample->GetAutoLayout();
629cdf0e10cSrcweir if (eAutoLayout == AUTOLAYOUT_TITLE ||
630cdf0e10cSrcweir eAutoLayout == AUTOLAYOUT_ONLY_TITLE)
631cdf0e10cSrcweir {
632cdf0e10cSrcweir pPage->SetAutoLayout(AUTOLAYOUT_ENUM, sal_True);
633cdf0e10cSrcweir }
634cdf0e10cSrcweir else
635cdf0e10cSrcweir {
636cdf0e10cSrcweir pPage->SetAutoLayout(pExample->GetAutoLayout(), sal_True);
637cdf0e10cSrcweir }
638cdf0e10cSrcweir
639cdf0e10cSrcweir /**********************************************************************
640cdf0e10cSrcweir |* jetzt die Notizseite
641cdf0e10cSrcweir \*********************************************************************/
642cdf0e10cSrcweir pExample = (SdPage*)mpDoc->GetSdPage((sal_uInt16)nExample, PK_NOTES);
643cdf0e10cSrcweir SdPage* pNotesPage = (SdPage*)mpDoc->AllocPage(sal_False);
644cdf0e10cSrcweir
645cdf0e10cSrcweir pNotesPage->SetLayoutName(pExample->GetLayoutName());
646cdf0e10cSrcweir
647cdf0e10cSrcweir pNotesPage->SetPageKind(PK_NOTES);
648cdf0e10cSrcweir
649cdf0e10cSrcweir // einfuegen (Notizseite)
650cdf0e10cSrcweir mpDoc->InsertPage(pNotesPage, (sal_uInt16)(nTarget) * 2 + 2);
651cdf0e10cSrcweir if( isRecordingUndo() )
652cdf0e10cSrcweir AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewPage(*pNotesPage));
653cdf0e10cSrcweir
654cdf0e10cSrcweir // der Notizseite eine Masterpage zuweisen
655cdf0e10cSrcweir pNotesPage->TRG_SetMasterPage(pExample->TRG_GetMasterPage());
656cdf0e10cSrcweir
657cdf0e10cSrcweir // Seitengroesse setzen, es muss bereits eine Seite vorhanden sein
658cdf0e10cSrcweir pNotesPage->SetSize(pExample->GetSize());
659cdf0e10cSrcweir pNotesPage->SetBorder( pExample->GetLftBorder(),
660cdf0e10cSrcweir pExample->GetUppBorder(),
661cdf0e10cSrcweir pExample->GetRgtBorder(),
662cdf0e10cSrcweir pExample->GetLwrBorder() );
663cdf0e10cSrcweir
664cdf0e10cSrcweir // neue Praesentationsobjekte anlegen
665cdf0e10cSrcweir pNotesPage->SetAutoLayout(pExample->GetAutoLayout(), sal_True);
666cdf0e10cSrcweir
667cdf0e10cSrcweir mpOutliner->UpdateFields();
668cdf0e10cSrcweir
669cdf0e10cSrcweir return pPage;
670cdf0e10cSrcweir }
671cdf0e10cSrcweir
672cdf0e10cSrcweir /*************************************************************************
673cdf0e10cSrcweir |*
674cdf0e10cSrcweir |* Handler fuer das Loeschen von Seiten (Absaetzen)
675cdf0e10cSrcweir |*
676cdf0e10cSrcweir \************************************************************************/
677cdf0e10cSrcweir
IMPL_LINK(OutlineView,ParagraphRemovingHdl,::Outliner *,pOutliner)678cdf0e10cSrcweir IMPL_LINK( OutlineView, ParagraphRemovingHdl, ::Outliner *, pOutliner )
679cdf0e10cSrcweir {
680cdf0e10cSrcweir DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::ParagraphRemovingHdl(), model change without undo?!" );
681cdf0e10cSrcweir
682cdf0e10cSrcweir OutlineViewPageChangesGuard aGuard(this);
683cdf0e10cSrcweir
684cdf0e10cSrcweir Paragraph* pPara = pOutliner->GetHdlParagraph();
685cdf0e10cSrcweir if( pOutliner->HasParaFlag( pPara, PARAFLAG_ISPAGE ) )
686cdf0e10cSrcweir {
687cdf0e10cSrcweir // wieviele Titel sind vor dem fraglichen Titelabsatz?
688cdf0e10cSrcweir sal_uLong nPos = 0L;
689cdf0e10cSrcweir while(pPara)
690cdf0e10cSrcweir {
691cdf0e10cSrcweir pPara = GetPrevTitle(pPara);
692cdf0e10cSrcweir if (pPara) nPos++;
693cdf0e10cSrcweir }
694cdf0e10cSrcweir
695cdf0e10cSrcweir // Seite und Notizseite loeschen
696cdf0e10cSrcweir sal_uInt16 nAbsPos = (sal_uInt16)nPos * 2 + 1;
697cdf0e10cSrcweir SdrPage* pPage = mpDoc->GetPage(nAbsPos);
698cdf0e10cSrcweir if( isRecordingUndo() )
699cdf0e10cSrcweir AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoDeletePage(*pPage));
700cdf0e10cSrcweir mpDoc->RemovePage(nAbsPos);
701cdf0e10cSrcweir
702cdf0e10cSrcweir nAbsPos = (sal_uInt16)nPos * 2 + 1;
703cdf0e10cSrcweir pPage = mpDoc->GetPage(nAbsPos);
704cdf0e10cSrcweir if( isRecordingUndo() )
705cdf0e10cSrcweir AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoDeletePage(*pPage));
706cdf0e10cSrcweir mpDoc->RemovePage(nAbsPos);
707cdf0e10cSrcweir
708cdf0e10cSrcweir // ggfs. Fortschrittsanzeige
709cdf0e10cSrcweir if (mnPagesToProcess)
710cdf0e10cSrcweir {
711cdf0e10cSrcweir mnPagesProcessed++;
712cdf0e10cSrcweir
713cdf0e10cSrcweir if(mpProgress)
714cdf0e10cSrcweir mpProgress->SetState(mnPagesProcessed);
715cdf0e10cSrcweir
716cdf0e10cSrcweir if (mnPagesProcessed == mnPagesToProcess)
717cdf0e10cSrcweir {
718cdf0e10cSrcweir if(mpProgress)
719cdf0e10cSrcweir {
720cdf0e10cSrcweir delete mpProgress;
721cdf0e10cSrcweir mpProgress = NULL;
722cdf0e10cSrcweir }
723cdf0e10cSrcweir mnPagesToProcess = 0;
724cdf0e10cSrcweir mnPagesProcessed = 0;
725cdf0e10cSrcweir }
726cdf0e10cSrcweir }
727cdf0e10cSrcweir pOutliner->UpdateFields();
728cdf0e10cSrcweir }
729cdf0e10cSrcweir
730cdf0e10cSrcweir InvalidateSlideNumberArea();
731cdf0e10cSrcweir
732cdf0e10cSrcweir return 0;
733cdf0e10cSrcweir }
734cdf0e10cSrcweir
735cdf0e10cSrcweir /*************************************************************************
736cdf0e10cSrcweir |*
737cdf0e10cSrcweir |* Handler fuer das Aendern der Einruecktiefe von Absaetzen (macht ggfs.
738cdf0e10cSrcweir |* das Einfuegen oder Loeschen von Seiten notwendig)
739cdf0e10cSrcweir |*
740cdf0e10cSrcweir \************************************************************************/
741cdf0e10cSrcweir
IMPL_LINK(OutlineView,DepthChangedHdl,::Outliner *,pOutliner)742cdf0e10cSrcweir IMPL_LINK( OutlineView, DepthChangedHdl, ::Outliner *, pOutliner )
743cdf0e10cSrcweir {
744cdf0e10cSrcweir DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::DepthChangedHdl(), no undo for model change?!" );
745cdf0e10cSrcweir
746cdf0e10cSrcweir OutlineViewPageChangesGuard aGuard(this);
747cdf0e10cSrcweir
748cdf0e10cSrcweir Paragraph* pPara = pOutliner->GetHdlParagraph();
749cdf0e10cSrcweir if( pOutliner->HasParaFlag( pPara, PARAFLAG_ISPAGE ) && ((pOutliner->GetPrevFlags() & PARAFLAG_ISPAGE) == 0) )
750cdf0e10cSrcweir {
751cdf0e10cSrcweir // the current paragraph is transformed into a slide
752cdf0e10cSrcweir
753cdf0e10cSrcweir mpOutliner->SetDepth( pPara, -1 );
754cdf0e10cSrcweir
755cdf0e10cSrcweir // werden da etwa mehrere Level-1-Absaetze auf Level 0 gebracht und
756cdf0e10cSrcweir // wir sollten eine Fortschrittsanzeige oder Eieruhr aufsetzen und
757cdf0e10cSrcweir // haben es noch nicht getan?
758cdf0e10cSrcweir if (mnPagesToProcess == 0)
759cdf0e10cSrcweir {
760cdf0e10cSrcweir Window* pActWin = mpOutlineViewShell->GetActiveWindow();
761cdf0e10cSrcweir OutlinerView* pOlView = GetViewByWindow(pActWin);
762cdf0e10cSrcweir List* pList = pOlView->CreateSelectionList();
763cdf0e10cSrcweir
764cdf0e10cSrcweir Paragraph* pParagraph = (Paragraph*)pList->First();
765cdf0e10cSrcweir while (pParagraph)
766cdf0e10cSrcweir {
767cdf0e10cSrcweir if( !pOutliner->HasParaFlag( pParagraph, PARAFLAG_ISPAGE ) && (pOutliner->GetDepth( (sal_uInt16) pOutliner->GetAbsPos( pParagraph ) ) <= 0) )
768cdf0e10cSrcweir mnPagesToProcess++;
769cdf0e10cSrcweir pParagraph = (Paragraph*)pList->Next();
770cdf0e10cSrcweir }
771cdf0e10cSrcweir
772cdf0e10cSrcweir mnPagesToProcess++; // der Absatz, der jetzt schon auf Level 0
773cdf0e10cSrcweir // steht, gehoert auch dazu
774cdf0e10cSrcweir mnPagesProcessed = 0;
775cdf0e10cSrcweir
776cdf0e10cSrcweir if (mnPagesToProcess > PROCESS_WITH_PROGRESS_THRESHOLD)
777cdf0e10cSrcweir {
778cdf0e10cSrcweir if( mpProgress )
779cdf0e10cSrcweir delete mpProgress;
780cdf0e10cSrcweir
781cdf0e10cSrcweir const String aStr(SdResId(STR_CREATE_PAGES));
782cdf0e10cSrcweir mpProgress = new SfxProgress( GetDocSh(), aStr, mnPagesToProcess );
783cdf0e10cSrcweir }
784cdf0e10cSrcweir else
785cdf0e10cSrcweir {
786cdf0e10cSrcweir mpDocSh->SetWaitCursor( sal_True );
787cdf0e10cSrcweir }
788cdf0e10cSrcweir delete pList;
789cdf0e10cSrcweir }
790cdf0e10cSrcweir
791cdf0e10cSrcweir ParagraphInsertedHdl(pOutliner);
792cdf0e10cSrcweir
793cdf0e10cSrcweir mnPagesProcessed++;
794cdf0e10cSrcweir
795cdf0e10cSrcweir // muss eine Fortschrittsanzeige gepflegt werden?
796cdf0e10cSrcweir if (mnPagesToProcess > PROCESS_WITH_PROGRESS_THRESHOLD)
797cdf0e10cSrcweir {
798cdf0e10cSrcweir if (mpProgress)
799cdf0e10cSrcweir mpProgress->SetState(mnPagesProcessed);
800cdf0e10cSrcweir }
801cdf0e10cSrcweir
802cdf0e10cSrcweir // war das die letzte Seite?
803cdf0e10cSrcweir if (mnPagesProcessed == mnPagesToProcess)
804cdf0e10cSrcweir {
805cdf0e10cSrcweir if (mnPagesToProcess > PROCESS_WITH_PROGRESS_THRESHOLD && mpProgress)
806cdf0e10cSrcweir {
807cdf0e10cSrcweir delete mpProgress;
808cdf0e10cSrcweir mpProgress = NULL;
809cdf0e10cSrcweir }
810cdf0e10cSrcweir else
811cdf0e10cSrcweir mpDocSh->SetWaitCursor( sal_False );
812cdf0e10cSrcweir
813cdf0e10cSrcweir mnPagesToProcess = 0;
814cdf0e10cSrcweir mnPagesProcessed = 0;
815cdf0e10cSrcweir }
816cdf0e10cSrcweir pOutliner->UpdateFields();
817cdf0e10cSrcweir }
818cdf0e10cSrcweir else if( !pOutliner->HasParaFlag( pPara, PARAFLAG_ISPAGE ) && ((pOutliner->GetPrevFlags() & PARAFLAG_ISPAGE) != 0) )
819cdf0e10cSrcweir {
820cdf0e10cSrcweir // the paragraph was a page but now becomes a normal paragraph
821cdf0e10cSrcweir
822cdf0e10cSrcweir // how many titles are before the title paragraph in question?
823cdf0e10cSrcweir sal_uLong nPos = 0L;
824cdf0e10cSrcweir Paragraph* pParagraph = pPara;
825cdf0e10cSrcweir while(pParagraph)
826cdf0e10cSrcweir {
827cdf0e10cSrcweir pParagraph = GetPrevTitle(pParagraph);
828cdf0e10cSrcweir if (pParagraph)
829cdf0e10cSrcweir nPos++;
830cdf0e10cSrcweir }
831cdf0e10cSrcweir // Seite und Notizseite loeschen
832cdf0e10cSrcweir
833cdf0e10cSrcweir sal_uInt16 nAbsPos = (sal_uInt16)nPos * 2 + 1;
834cdf0e10cSrcweir SdrPage* pPage = mpDoc->GetPage(nAbsPos);
835cdf0e10cSrcweir if( isRecordingUndo() )
836cdf0e10cSrcweir AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoDeletePage(*pPage));
837cdf0e10cSrcweir mpDoc->RemovePage(nAbsPos);
838cdf0e10cSrcweir
839cdf0e10cSrcweir nAbsPos = (sal_uInt16)nPos * 2 + 1;
840cdf0e10cSrcweir pPage = mpDoc->GetPage(nAbsPos);
841cdf0e10cSrcweir if( isRecordingUndo() )
842cdf0e10cSrcweir AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoDeletePage(*pPage));
843cdf0e10cSrcweir mpDoc->RemovePage(nAbsPos);
844cdf0e10cSrcweir
845cdf0e10cSrcweir pPage = GetPageForParagraph( pPara );
846cdf0e10cSrcweir
847cdf0e10cSrcweir mpOutliner->SetDepth( pPara, (pPage && (static_cast<SdPage*>(pPage)->GetAutoLayout() == AUTOLAYOUT_TITLE)) ? -1 : 0 );
848cdf0e10cSrcweir
849cdf0e10cSrcweir // ggfs. Fortschrittsanzeige
850cdf0e10cSrcweir if (mnPagesToProcess)
851cdf0e10cSrcweir {
852cdf0e10cSrcweir mnPagesProcessed++;
853cdf0e10cSrcweir if (mpProgress)
854cdf0e10cSrcweir mpProgress->SetState(mnPagesProcessed);
855cdf0e10cSrcweir
856cdf0e10cSrcweir if (mnPagesProcessed == mnPagesToProcess)
857cdf0e10cSrcweir {
858cdf0e10cSrcweir if(mpProgress)
859cdf0e10cSrcweir {
860cdf0e10cSrcweir delete mpProgress;
861cdf0e10cSrcweir mpProgress = NULL;
862cdf0e10cSrcweir }
863cdf0e10cSrcweir mnPagesToProcess = 0;
864cdf0e10cSrcweir mnPagesProcessed = 0;
865cdf0e10cSrcweir }
866cdf0e10cSrcweir }
867cdf0e10cSrcweir pOutliner->UpdateFields();
868cdf0e10cSrcweir }
869cdf0e10cSrcweir else if ( (pOutliner->GetPrevDepth() == 1) && ( pOutliner->GetDepth( (sal_uInt16) pOutliner->GetAbsPos( pPara ) ) == 2 ) )
870cdf0e10cSrcweir {
871cdf0e10cSrcweir // wieviele Titel sind vor dem fraglichen Titelabsatz?
872cdf0e10cSrcweir sal_Int32 nPos = -1L;
873cdf0e10cSrcweir
874cdf0e10cSrcweir Paragraph* pParagraph = pPara;
875cdf0e10cSrcweir while(pParagraph)
876cdf0e10cSrcweir {
877cdf0e10cSrcweir pParagraph = GetPrevTitle(pParagraph);
878cdf0e10cSrcweir if (pParagraph)
879cdf0e10cSrcweir nPos++;
880cdf0e10cSrcweir }
881cdf0e10cSrcweir
882cdf0e10cSrcweir if(nPos >= 0)
883cdf0e10cSrcweir {
884cdf0e10cSrcweir SdPage*pPage = (SdPage*)mpDoc->GetSdPage( (sal_uInt16) nPos, PK_STANDARD);
885cdf0e10cSrcweir
886cdf0e10cSrcweir if(pPage && pPage->GetPresObj(PRESOBJ_TEXT))
887cdf0e10cSrcweir pOutliner->SetDepth( pPara, 0 );
888cdf0e10cSrcweir }
889cdf0e10cSrcweir
890cdf0e10cSrcweir }
891cdf0e10cSrcweir // wieviele Titel sind vor dem fraglichen Titelabsatz?
892cdf0e10cSrcweir sal_Int32 nPos = -1L;
893cdf0e10cSrcweir
894cdf0e10cSrcweir Paragraph* pTempPara = pPara;
895cdf0e10cSrcweir while(pTempPara)
896cdf0e10cSrcweir {
897cdf0e10cSrcweir pTempPara = GetPrevTitle(pTempPara);
898cdf0e10cSrcweir if (pTempPara)
899cdf0e10cSrcweir nPos++;
900cdf0e10cSrcweir }
901cdf0e10cSrcweir
902cdf0e10cSrcweir if( nPos >= 0 )
903cdf0e10cSrcweir {
904cdf0e10cSrcweir SdPage* pPage = (SdPage*) mpDoc->GetSdPage( (sal_uInt16) nPos, PK_STANDARD );
905cdf0e10cSrcweir
906cdf0e10cSrcweir if( pPage )
907cdf0e10cSrcweir {
908cdf0e10cSrcweir SfxStyleSheet* pStyleSheet = NULL;
909cdf0e10cSrcweir sal_uLong nPara = pOutliner->GetAbsPos( pPara );
910cdf0e10cSrcweir sal_Int16 nDepth = pOutliner->GetDepth( (sal_uInt16) nPara );
911cdf0e10cSrcweir bool bSubTitle = pPage->GetPresObj(PRESOBJ_TEXT) != NULL;
912cdf0e10cSrcweir
913cdf0e10cSrcweir if( pOutliner->HasParaFlag(pPara, PARAFLAG_ISPAGE) )
914cdf0e10cSrcweir {
915cdf0e10cSrcweir pStyleSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TITLE );
916cdf0e10cSrcweir }
917cdf0e10cSrcweir else if( bSubTitle )
918cdf0e10cSrcweir {
919cdf0e10cSrcweir pStyleSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TEXT );
920cdf0e10cSrcweir }
921cdf0e10cSrcweir else
922cdf0e10cSrcweir {
923cdf0e10cSrcweir pStyleSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_OUTLINE );
924cdf0e10cSrcweir
925cdf0e10cSrcweir if( nDepth > 0 )
926cdf0e10cSrcweir {
927cdf0e10cSrcweir String aNewStyleSheetName( pStyleSheet->GetName() );
928cdf0e10cSrcweir aNewStyleSheetName.Erase( aNewStyleSheetName.Len()-1, 1 );
929cdf0e10cSrcweir aNewStyleSheetName += String::CreateFromInt32( nDepth+1 );
930cdf0e10cSrcweir SfxStyleSheetBasePool* pStylePool = mpDoc->GetStyleSheetPool();
931cdf0e10cSrcweir pStyleSheet = (SfxStyleSheet*) pStylePool->Find( aNewStyleSheetName, pStyleSheet->GetFamily() );
932cdf0e10cSrcweir }
933cdf0e10cSrcweir }
934cdf0e10cSrcweir
935cdf0e10cSrcweir // before we set the style sheet we need to preserve the bullet item
936cdf0e10cSrcweir // since all items will be deleted while setting a new style sheet
937cdf0e10cSrcweir SfxItemSet aOldAttrs( pOutliner->GetParaAttribs( (sal_uInt16)nPara ) );
938cdf0e10cSrcweir
939cdf0e10cSrcweir pOutliner->SetStyleSheet( nPara, pStyleSheet );
940cdf0e10cSrcweir
941cdf0e10cSrcweir // restore the old bullet item but not if the style changed
942cdf0e10cSrcweir if ( pOutliner->GetPrevDepth() != -1 && nDepth != -1 &&
943cdf0e10cSrcweir aOldAttrs.GetItemState( EE_PARA_NUMBULLET ) == SFX_ITEM_ON )
944cdf0e10cSrcweir {
945cdf0e10cSrcweir SfxItemSet aAttrs( pOutliner->GetParaAttribs( (sal_uInt16)nPara ) );
946cdf0e10cSrcweir aAttrs.Put( *aOldAttrs.GetItem( EE_PARA_NUMBULLET ) );
947cdf0e10cSrcweir pOutliner->SetParaAttribs( (sal_uInt16)nPara, aAttrs );
948cdf0e10cSrcweir }
949cdf0e10cSrcweir }
950cdf0e10cSrcweir }
951cdf0e10cSrcweir
952cdf0e10cSrcweir InvalidateSlideNumberArea();
953cdf0e10cSrcweir
954cdf0e10cSrcweir return 0;
955cdf0e10cSrcweir }
956cdf0e10cSrcweir
957cdf0e10cSrcweir /*************************************************************************
958cdf0e10cSrcweir |*
959cdf0e10cSrcweir |* Handler fuer StatusEvents
960cdf0e10cSrcweir |*
961cdf0e10cSrcweir \************************************************************************/
962cdf0e10cSrcweir
IMPL_LINK(OutlineView,StatusEventHdl,EditStatus *,EMPTYARG)963cdf0e10cSrcweir IMPL_LINK( OutlineView, StatusEventHdl, EditStatus *, EMPTYARG )
964cdf0e10cSrcweir {
965cdf0e10cSrcweir ::sd::Window* pWin = mpOutlineViewShell->GetActiveWindow();
966cdf0e10cSrcweir OutlinerView* pOutlinerView = GetViewByWindow(pWin);
967cdf0e10cSrcweir Rectangle aVis = pOutlinerView->GetVisArea();
968cdf0e10cSrcweir
969cdf0e10cSrcweir // sal_uLong nWidth = ((SdPage*)mpDoc->GetSdPage(0, PK_STANDARD))->GetSize().Width();
970cdf0e10cSrcweir sal_uLong nWidth = OUTLINE_PAPERWIDTH;
971cdf0e10cSrcweir Rectangle aText = Rectangle(Point(0,0),
972cdf0e10cSrcweir Size(nWidth,
973cdf0e10cSrcweir mpOutliner->GetTextHeight()));
974cdf0e10cSrcweir Rectangle aWin(Point(0,0), pWin->GetOutputSizePixel());
975cdf0e10cSrcweir aWin = pWin->PixelToLogic(aWin);
976cdf0e10cSrcweir
977cdf0e10cSrcweir if (!aVis.IsEmpty()) // nicht beim Oeffnen
978cdf0e10cSrcweir {
979cdf0e10cSrcweir aText.Bottom() += aWin.GetHeight();
980cdf0e10cSrcweir
981cdf0e10cSrcweir mpOutlineViewShell->InitWindows(Point(0,0), aText.GetSize(),
982cdf0e10cSrcweir Point(aVis.TopLeft()));
983cdf0e10cSrcweir mpOutlineViewShell->UpdateScrollBars();
984cdf0e10cSrcweir }
985cdf0e10cSrcweir
986cdf0e10cSrcweir InvalidateSlideNumberArea();
987cdf0e10cSrcweir return 0;
988cdf0e10cSrcweir }
989cdf0e10cSrcweir
IMPL_LINK(OutlineView,BeginDropHdl,void *,EMPTYARG)990cdf0e10cSrcweir IMPL_LINK( OutlineView, BeginDropHdl, void *, EMPTYARG )
991cdf0e10cSrcweir {
992cdf0e10cSrcweir DBG_ASSERT(maDragAndDropModelGuard.get() == 0, "sd::OutlineView::BeginDropHdl(), prior drag operation not finished correctly!" );
993cdf0e10cSrcweir
994cdf0e10cSrcweir maDragAndDropModelGuard.reset( new OutlineViewModelChangeGuard( *this ) );
995cdf0e10cSrcweir return 0;
996cdf0e10cSrcweir }
997cdf0e10cSrcweir
IMPL_LINK(OutlineView,EndDropHdl,void *,EMPTYARG)998cdf0e10cSrcweir IMPL_LINK( OutlineView, EndDropHdl, void *, EMPTYARG )
999cdf0e10cSrcweir {
1000cdf0e10cSrcweir maDragAndDropModelGuard.reset(0);
1001cdf0e10cSrcweir InvalidateSlideNumberArea();
1002cdf0e10cSrcweir return 0;
1003cdf0e10cSrcweir }
1004cdf0e10cSrcweir
1005cdf0e10cSrcweir /*************************************************************************
1006cdf0e10cSrcweir |*
1007cdf0e10cSrcweir |* Handler fuer den Beginn einer Absatzverschiebung
1008cdf0e10cSrcweir |*
1009cdf0e10cSrcweir \************************************************************************/
1010cdf0e10cSrcweir
IMPL_LINK(OutlineView,BeginMovingHdl,::Outliner *,pOutliner)1011cdf0e10cSrcweir IMPL_LINK( OutlineView, BeginMovingHdl, ::Outliner *, pOutliner )
1012cdf0e10cSrcweir {
1013cdf0e10cSrcweir DBG_ASSERT(!mpSelectedParas, "Absatzliste nicht geloescht");
1014cdf0e10cSrcweir DBG_ASSERT(!mpOldParaOrder, "Absatzliste nicht geloescht");
1015cdf0e10cSrcweir
1016cdf0e10cSrcweir OutlineViewPageChangesGuard aGuard(this);
1017cdf0e10cSrcweir
1018cdf0e10cSrcweir mpOldParaOrder = new List;
1019cdf0e10cSrcweir
1020cdf0e10cSrcweir // Liste der selektierten Titelabsaetze
1021cdf0e10cSrcweir mpSelectedParas = mpOutlinerView[0]->CreateSelectionList();
1022cdf0e10cSrcweir Paragraph* pPara = static_cast<Paragraph*>(mpSelectedParas->First());
1023cdf0e10cSrcweir while (pPara)
1024cdf0e10cSrcweir {
1025cdf0e10cSrcweir if( !pOutliner->HasParaFlag(pPara, PARAFLAG_ISPAGE) )
1026cdf0e10cSrcweir {
1027cdf0e10cSrcweir mpSelectedParas->Remove();
1028cdf0e10cSrcweir pPara = static_cast<Paragraph*>(mpSelectedParas->GetCurObject());
1029cdf0e10cSrcweir }
1030cdf0e10cSrcweir else
1031cdf0e10cSrcweir {
1032cdf0e10cSrcweir pPara = static_cast<Paragraph*>(mpSelectedParas->Next());
1033cdf0e10cSrcweir }
1034cdf0e10cSrcweir }
1035cdf0e10cSrcweir
1036cdf0e10cSrcweir // Die zu den selektierten Absaetzen auf Ebene 0 gehoerenden Seiten
1037cdf0e10cSrcweir // selektieren
1038cdf0e10cSrcweir sal_uInt16 nPos = 0;
1039cdf0e10cSrcweir sal_uLong nParaPos = 0;
1040cdf0e10cSrcweir pPara = pOutliner->GetParagraph( 0 );
1041cdf0e10cSrcweir
1042cdf0e10cSrcweir while(pPara)
1043cdf0e10cSrcweir {
1044cdf0e10cSrcweir if( pOutliner->HasParaFlag(pPara, PARAFLAG_ISPAGE) ) // eine Seite?
1045cdf0e10cSrcweir {
1046cdf0e10cSrcweir mpOldParaOrder->Insert(pPara, LIST_APPEND);
1047cdf0e10cSrcweir SdPage* pPage = mpDoc->GetSdPage(nPos, PK_STANDARD);
1048cdf0e10cSrcweir pPage->SetSelected(sal_False);
1049cdf0e10cSrcweir if (mpSelectedParas->Seek(pPara)) // selektiert?
1050cdf0e10cSrcweir {
1051cdf0e10cSrcweir pPage->SetSelected(sal_True);
1052cdf0e10cSrcweir }
1053cdf0e10cSrcweir nPos++;
1054cdf0e10cSrcweir }
1055cdf0e10cSrcweir pPara = pOutliner->GetParagraph( ++nParaPos );
1056cdf0e10cSrcweir }
1057cdf0e10cSrcweir
1058cdf0e10cSrcweir return 0;
1059cdf0e10cSrcweir }
1060cdf0e10cSrcweir
1061cdf0e10cSrcweir /*************************************************************************
1062cdf0e10cSrcweir |*
1063cdf0e10cSrcweir |* Handler fuer das Ende einer Absatzverschiebung
1064cdf0e10cSrcweir |*
1065cdf0e10cSrcweir \************************************************************************/
1066cdf0e10cSrcweir
IMPL_LINK(OutlineView,EndMovingHdl,::Outliner *,pOutliner)1067cdf0e10cSrcweir IMPL_LINK( OutlineView, EndMovingHdl, ::Outliner *, pOutliner )
1068cdf0e10cSrcweir {
1069cdf0e10cSrcweir OutlineViewPageChangesGuard aGuard(this);
1070cdf0e10cSrcweir
1071cdf0e10cSrcweir DBG_ASSERT(mpSelectedParas, "keine Absatzliste");
1072cdf0e10cSrcweir DBG_ASSERT(mpOldParaOrder, "keine Absatzliste");
1073cdf0e10cSrcweir DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::EndMovingHdl(), model change without undo?!" );
1074cdf0e10cSrcweir
1075cdf0e10cSrcweir // Einfuegeposition anhand des ersten Absatzes suchen
1076cdf0e10cSrcweir Paragraph* pSearchIt = (Paragraph*)mpSelectedParas->First();
1077cdf0e10cSrcweir
1078cdf0e10cSrcweir // den ersten der selektierten Paragraphen in der neuen Ordnung suchen
1079cdf0e10cSrcweir sal_uInt16 nPosNewOrder = 0;
1080cdf0e10cSrcweir sal_uLong nParaPos = 0;
1081cdf0e10cSrcweir Paragraph* pPara = pOutliner->GetParagraph( 0 );
1082cdf0e10cSrcweir Paragraph* pPrev = NULL;
1083cdf0e10cSrcweir while (pPara && pPara != pSearchIt)
1084cdf0e10cSrcweir {
1085cdf0e10cSrcweir if( pOutliner->HasParaFlag(pPara, PARAFLAG_ISPAGE) )
1086cdf0e10cSrcweir {
1087cdf0e10cSrcweir nPosNewOrder++;
1088cdf0e10cSrcweir pPrev = pPara;
1089cdf0e10cSrcweir }
1090cdf0e10cSrcweir pPara = pOutliner->GetParagraph( ++nParaPos );
1091cdf0e10cSrcweir }
1092cdf0e10cSrcweir
1093cdf0e10cSrcweir sal_uInt16 nPos = nPosNewOrder; // nPosNewOrder nicht veraendern
1094cdf0e10cSrcweir if (nPos == 0)
1095cdf0e10cSrcweir {
1096cdf0e10cSrcweir nPos = (sal_uInt16)-1; // vor der ersten Seite einfuegen
1097cdf0e10cSrcweir }
1098cdf0e10cSrcweir else
1099cdf0e10cSrcweir {
1100cdf0e10cSrcweir // den Vorgaenger in der alten Ordnung suchen
1101cdf0e10cSrcweir nPos = (sal_uInt16)mpOldParaOrder->GetPos(pPrev);
1102cdf0e10cSrcweir DBG_ASSERT(nPos != 0xffff, "Absatz nicht gefunden");
1103cdf0e10cSrcweir }
1104cdf0e10cSrcweir
1105cdf0e10cSrcweir mpDoc->MovePages(nPos);
1106cdf0e10cSrcweir
1107cdf0e10cSrcweir // die Seiten wieder deselektieren
1108cdf0e10cSrcweir sal_uInt16 nPageCount = (sal_uInt16)mpSelectedParas->Count();
1109cdf0e10cSrcweir while (nPageCount)
1110cdf0e10cSrcweir {
1111cdf0e10cSrcweir SdPage* pPage = mpDoc->GetSdPage(nPosNewOrder, PK_STANDARD);
1112cdf0e10cSrcweir pPage->SetSelected(sal_False);
1113cdf0e10cSrcweir nPosNewOrder++;
1114cdf0e10cSrcweir nPageCount--;
1115cdf0e10cSrcweir }
1116cdf0e10cSrcweir
1117cdf0e10cSrcweir pOutliner->UpdateFields();
1118cdf0e10cSrcweir
1119cdf0e10cSrcweir delete mpSelectedParas;
1120cdf0e10cSrcweir mpSelectedParas = NULL;
1121cdf0e10cSrcweir delete mpOldParaOrder;
1122cdf0e10cSrcweir mpOldParaOrder = NULL;
1123cdf0e10cSrcweir
1124cdf0e10cSrcweir InvalidateSlideNumberArea();
1125cdf0e10cSrcweir
1126cdf0e10cSrcweir return 0;
1127cdf0e10cSrcweir }
1128cdf0e10cSrcweir
1129cdf0e10cSrcweir /*************************************************************************
1130cdf0e10cSrcweir |*
1131cdf0e10cSrcweir |* Eine Seite des Models nach dem Titeltextobjekt durchsuchen
1132cdf0e10cSrcweir |*
1133cdf0e10cSrcweir \************************************************************************/
1134cdf0e10cSrcweir
GetTitleTextObject(SdrPage * pPage)1135cdf0e10cSrcweir SdrTextObj* OutlineView::GetTitleTextObject(SdrPage* pPage)
1136cdf0e10cSrcweir {
1137cdf0e10cSrcweir sal_uLong nObjectCount = pPage->GetObjCount();
1138cdf0e10cSrcweir SdrObject* pObject = NULL;
1139cdf0e10cSrcweir SdrTextObj* pResult = NULL;
1140cdf0e10cSrcweir
1141cdf0e10cSrcweir for (sal_uLong nObject = 0; nObject < nObjectCount; nObject++)
1142cdf0e10cSrcweir {
1143cdf0e10cSrcweir pObject = pPage->GetObj(nObject);
1144cdf0e10cSrcweir if (pObject->GetObjInventor() == SdrInventor &&
1145cdf0e10cSrcweir pObject->GetObjIdentifier() == OBJ_TITLETEXT)
1146cdf0e10cSrcweir {
1147cdf0e10cSrcweir pResult = (SdrTextObj*)pObject;
1148cdf0e10cSrcweir break;
1149cdf0e10cSrcweir }
1150cdf0e10cSrcweir }
1151cdf0e10cSrcweir return pResult;
1152cdf0e10cSrcweir }
1153cdf0e10cSrcweir
1154cdf0e10cSrcweir
1155cdf0e10cSrcweir /*************************************************************************
1156cdf0e10cSrcweir |*
1157cdf0e10cSrcweir |* Eine Seite des Models nach dem Gliederungstextobjekt durchsuchen
1158cdf0e10cSrcweir |*
1159cdf0e10cSrcweir \************************************************************************/
1160cdf0e10cSrcweir
GetOutlineTextObject(SdrPage * pPage)1161cdf0e10cSrcweir SdrTextObj* OutlineView::GetOutlineTextObject(SdrPage* pPage)
1162cdf0e10cSrcweir {
1163cdf0e10cSrcweir sal_uLong nObjectCount = pPage->GetObjCount();
1164cdf0e10cSrcweir SdrObject* pObject = NULL;
1165cdf0e10cSrcweir SdrTextObj* pResult = NULL;
1166cdf0e10cSrcweir
1167cdf0e10cSrcweir for (sal_uLong nObject = 0; nObject < nObjectCount; nObject++)
1168cdf0e10cSrcweir {
1169cdf0e10cSrcweir pObject = pPage->GetObj(nObject);
1170cdf0e10cSrcweir if (pObject->GetObjInventor() == SdrInventor &&
1171cdf0e10cSrcweir pObject->GetObjIdentifier() == OBJ_OUTLINETEXT)
1172cdf0e10cSrcweir {
1173cdf0e10cSrcweir pResult = (SdrTextObj*)pObject;
1174cdf0e10cSrcweir break;
1175cdf0e10cSrcweir }
1176cdf0e10cSrcweir }
1177cdf0e10cSrcweir return pResult;
1178cdf0e10cSrcweir }
1179cdf0e10cSrcweir
CreateTitleTextObject(SdPage * pPage)1180cdf0e10cSrcweir SdrTextObj* OutlineView::CreateTitleTextObject(SdPage* pPage)
1181cdf0e10cSrcweir {
1182cdf0e10cSrcweir DBG_ASSERT( GetTitleTextObject(pPage) == 0, "sd::OutlineView::CreateTitleTextObject(), there is already a title text object!" );
1183cdf0e10cSrcweir
1184cdf0e10cSrcweir if( pPage->GetAutoLayout() == AUTOLAYOUT_NONE )
1185cdf0e10cSrcweir {
1186cdf0e10cSrcweir // simple case
1187cdf0e10cSrcweir pPage->SetAutoLayout( AUTOLAYOUT_ONLY_TITLE, true );
1188cdf0e10cSrcweir }
1189cdf0e10cSrcweir else
1190cdf0e10cSrcweir {
1191cdf0e10cSrcweir // we already have a layout with a title but the title
1192cdf0e10cSrcweir // object was deleted, create a new one
1193cdf0e10cSrcweir pPage->InsertAutoLayoutShape( 0, PRESOBJ_TITLE, false, pPage->GetTitleRect(), true );
1194cdf0e10cSrcweir }
1195cdf0e10cSrcweir
1196cdf0e10cSrcweir return GetTitleTextObject(pPage);
1197cdf0e10cSrcweir }
1198cdf0e10cSrcweir
CreateOutlineTextObject(SdPage * pPage)1199cdf0e10cSrcweir SdrTextObj* OutlineView::CreateOutlineTextObject(SdPage* pPage)
1200cdf0e10cSrcweir {
1201cdf0e10cSrcweir DBG_ASSERT( GetOutlineTextObject(pPage) == 0, "sd::OutlineView::CreateOutlineTextObject(), there is already a layout text object!" );
1202cdf0e10cSrcweir
1203cdf0e10cSrcweir AutoLayout eNewLayout = pPage->GetAutoLayout();
1204cdf0e10cSrcweir switch( eNewLayout )
1205cdf0e10cSrcweir {
1206cdf0e10cSrcweir case AUTOLAYOUT_NONE:
1207cdf0e10cSrcweir case AUTOLAYOUT_ONLY_TITLE:
1208cdf0e10cSrcweir case AUTOLAYOUT_TITLE: eNewLayout = AUTOLAYOUT_ENUM; break;
1209cdf0e10cSrcweir
1210cdf0e10cSrcweir case AUTOLAYOUT_CHART: eNewLayout = AUTOLAYOUT_CHARTTEXT; break;
1211cdf0e10cSrcweir
1212cdf0e10cSrcweir case AUTOLAYOUT_ORG:
1213cdf0e10cSrcweir case AUTOLAYOUT_TAB:
1214cdf0e10cSrcweir case AUTOLAYOUT_OBJ: eNewLayout = AUTOLAYOUT_OBJTEXT; break;
1215cdf0e10cSrcweir default:
1216cdf0e10cSrcweir break;
1217cdf0e10cSrcweir }
1218cdf0e10cSrcweir
1219cdf0e10cSrcweir if( eNewLayout != pPage->GetAutoLayout() )
1220cdf0e10cSrcweir {
1221cdf0e10cSrcweir pPage->SetAutoLayout( eNewLayout, true );
1222cdf0e10cSrcweir }
1223cdf0e10cSrcweir else
1224cdf0e10cSrcweir {
1225cdf0e10cSrcweir // we already have a layout with a text but the text
1226cdf0e10cSrcweir // object was deleted, create a new one
1227cdf0e10cSrcweir pPage->InsertAutoLayoutShape( 0,
1228cdf0e10cSrcweir (eNewLayout == AUTOLAYOUT_TITLE) ? PRESOBJ_TEXT : PRESOBJ_OUTLINE,
1229cdf0e10cSrcweir false, pPage->GetLayoutRect(), true );
1230cdf0e10cSrcweir }
1231cdf0e10cSrcweir
1232cdf0e10cSrcweir return GetOutlineTextObject(pPage);
1233cdf0e10cSrcweir }
1234cdf0e10cSrcweir
1235cdf0e10cSrcweir /** updates draw model with all changes from outliner model */
PrepareClose(sal_Bool)1236cdf0e10cSrcweir sal_Bool OutlineView::PrepareClose(sal_Bool)
1237cdf0e10cSrcweir {
1238cdf0e10cSrcweir ::sd::UndoManager* pDocUndoMgr = dynamic_cast<sd::UndoManager*>(mpDocSh->GetUndoManager());
1239cdf0e10cSrcweir if (pDocUndoMgr != NULL)
1240cdf0e10cSrcweir pDocUndoMgr->SetLinkedUndoManager(NULL);
1241cdf0e10cSrcweir
1242cdf0e10cSrcweir mpOutliner->GetUndoManager().Clear();
1243cdf0e10cSrcweir
1244cdf0e10cSrcweir const String aUndoStr(SdResId(STR_UNDO_CHANGE_TITLE_AND_LAYOUT));
1245cdf0e10cSrcweir BegUndo(aUndoStr);
1246cdf0e10cSrcweir UpdateDocument();
1247cdf0e10cSrcweir EndUndo();
1248cdf0e10cSrcweir mpDoc->SetSelected(GetActualPage(), sal_True);
1249cdf0e10cSrcweir return sal_True;
1250cdf0e10cSrcweir }
1251cdf0e10cSrcweir
1252cdf0e10cSrcweir
1253cdf0e10cSrcweir /*************************************************************************
1254cdf0e10cSrcweir |*
1255cdf0e10cSrcweir |* Attribute des selektierten Textes setzen
1256cdf0e10cSrcweir |*
1257cdf0e10cSrcweir \************************************************************************/
1258cdf0e10cSrcweir
SetAttributes(const SfxItemSet & rSet,sal_Bool)1259cdf0e10cSrcweir sal_Bool OutlineView::SetAttributes(const SfxItemSet& rSet, sal_Bool )
1260cdf0e10cSrcweir {
1261cdf0e10cSrcweir sal_Bool bOk = sal_False;
1262cdf0e10cSrcweir
1263cdf0e10cSrcweir OutlinerView* pOlView = GetViewByWindow(mpOutlineViewShell->GetActiveWindow());
1264cdf0e10cSrcweir
1265cdf0e10cSrcweir if (pOlView)
1266cdf0e10cSrcweir {
1267cdf0e10cSrcweir pOlView->SetAttribs(rSet);
1268cdf0e10cSrcweir bOk = sal_True;
1269cdf0e10cSrcweir }
1270cdf0e10cSrcweir
1271cdf0e10cSrcweir mpOutlineViewShell->Invalidate (SID_PREVIEW_STATE);
1272cdf0e10cSrcweir
1273cdf0e10cSrcweir return (bOk);
1274cdf0e10cSrcweir }
1275cdf0e10cSrcweir
1276cdf0e10cSrcweir /*************************************************************************
1277cdf0e10cSrcweir |*
1278cdf0e10cSrcweir |* Attribute des selektierten Textes erfragen
1279cdf0e10cSrcweir |*
1280cdf0e10cSrcweir \************************************************************************/
1281cdf0e10cSrcweir
GetAttributes(SfxItemSet & rTargetSet,sal_Bool) const1282cdf0e10cSrcweir sal_Bool OutlineView::GetAttributes( SfxItemSet& rTargetSet, sal_Bool ) const
1283cdf0e10cSrcweir {
1284cdf0e10cSrcweir OutlinerView* pOlView = GetViewByWindow(
1285cdf0e10cSrcweir mpOutlineViewShell->GetActiveWindow());
1286cdf0e10cSrcweir DBG_ASSERT(pOlView, "keine OutlinerView gefunden");
1287cdf0e10cSrcweir
1288cdf0e10cSrcweir rTargetSet.Put( pOlView->GetAttribs(), sal_False );
1289cdf0e10cSrcweir return sal_True;
1290cdf0e10cSrcweir }
1291cdf0e10cSrcweir
1292cdf0e10cSrcweir /** creates outliner model from draw model */
FillOutliner()1293cdf0e10cSrcweir void OutlineView::FillOutliner()
1294cdf0e10cSrcweir {
1295cdf0e10cSrcweir mpOutliner->GetUndoManager().Clear();
1296cdf0e10cSrcweir mpOutliner->EnableUndo(sal_False);
1297cdf0e10cSrcweir ResetLinks();
1298cdf0e10cSrcweir mpOutliner->SetUpdateMode(false);
1299cdf0e10cSrcweir
1300cdf0e10cSrcweir Paragraph* pTitleToSelect = NULL;
1301cdf0e10cSrcweir sal_uLong nPageCount = mpDoc->GetSdPageCount(PK_STANDARD);
1302cdf0e10cSrcweir
1303cdf0e10cSrcweir // fill outliner with paragraphs from slides title & (outlines|subtitles)
1304cdf0e10cSrcweir for (sal_uInt16 nPage = 0; nPage < nPageCount; nPage++)
1305cdf0e10cSrcweir {
1306cdf0e10cSrcweir SdPage* pPage = (SdPage*)mpDoc->GetSdPage(nPage, PK_STANDARD);
1307cdf0e10cSrcweir Paragraph * pPara = NULL;
1308cdf0e10cSrcweir
1309cdf0e10cSrcweir // take text from title shape
1310cdf0e10cSrcweir SdrTextObj* pTO = GetTitleTextObject(pPage);
1311cdf0e10cSrcweir if(pTO && !(pTO->IsEmptyPresObj()))
1312cdf0e10cSrcweir {
1313cdf0e10cSrcweir OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
1314cdf0e10cSrcweir if (pOPO)
1315cdf0e10cSrcweir {
1316cdf0e10cSrcweir sal_Bool bVertical = pOPO->IsVertical();
1317cdf0e10cSrcweir pOPO->SetVertical( sal_False );
1318cdf0e10cSrcweir mpOutliner->AddText(*pOPO);
1319cdf0e10cSrcweir pOPO->SetVertical( bVertical );
1320cdf0e10cSrcweir pPara = mpOutliner->GetParagraph( mpOutliner->GetParagraphCount()-1 );
1321cdf0e10cSrcweir }
1322cdf0e10cSrcweir }
1323cdf0e10cSrcweir
1324cdf0e10cSrcweir if( pPara == 0 ) // no title, insert an empty paragraph
1325cdf0e10cSrcweir {
1326cdf0e10cSrcweir pPara = mpOutliner->Insert(String());
1327cdf0e10cSrcweir mpOutliner->SetDepth(pPara, -1);
1328cdf0e10cSrcweir
1329cdf0e10cSrcweir // Keine harten Attribute vom vorherigen Absatz uebernehmen
1330cdf0e10cSrcweir mpOutliner->SetParaAttribs( (sal_uInt16)mpOutliner->GetAbsPos(pPara),
1331cdf0e10cSrcweir mpOutliner->GetEmptyItemSet() );
1332cdf0e10cSrcweir
1333cdf0e10cSrcweir mpOutliner->SetStyleSheet( mpOutliner->GetAbsPos( pPara ), pPage->GetStyleSheetForPresObj( PRESOBJ_TITLE ) );
1334cdf0e10cSrcweir }
1335cdf0e10cSrcweir
1336cdf0e10cSrcweir mpOutliner->SetParaFlag( pPara, PARAFLAG_ISPAGE );
1337cdf0e10cSrcweir
1338cdf0e10cSrcweir sal_uLong nPara = mpOutliner->GetAbsPos( pPara );
1339cdf0e10cSrcweir
1340cdf0e10cSrcweir UpdateParagraph( (sal_uInt16)nPara );
1341cdf0e10cSrcweir
1342cdf0e10cSrcweir // remember paragraph of currently selected page
1343cdf0e10cSrcweir if (pPage->IsSelected())
1344cdf0e10cSrcweir pTitleToSelect = pPara;
1345cdf0e10cSrcweir
1346cdf0e10cSrcweir // take text from subtitle or outline
1347cdf0e10cSrcweir pTO = static_cast<SdrTextObj*>(pPage->GetPresObj(PRESOBJ_TEXT));
1348cdf0e10cSrcweir const bool bSubTitle = pTO != 0;
1349cdf0e10cSrcweir
1350cdf0e10cSrcweir if (!pTO) // if no subtile found, try outline
1351cdf0e10cSrcweir pTO = GetOutlineTextObject(pPage);
1352cdf0e10cSrcweir
1353cdf0e10cSrcweir if(pTO && !(pTO->IsEmptyPresObj())) // found some text
1354cdf0e10cSrcweir {
1355cdf0e10cSrcweir OutlinerParaObject* pOPO = pTO->GetOutlinerParaObject();
1356cdf0e10cSrcweir if (pOPO)
1357cdf0e10cSrcweir {
1358cdf0e10cSrcweir sal_uInt16 nParaCount1 = (sal_uInt16)mpOutliner->GetParagraphCount();
1359cdf0e10cSrcweir sal_Bool bVertical = pOPO->IsVertical();
1360cdf0e10cSrcweir pOPO->SetVertical( sal_False );
1361cdf0e10cSrcweir mpOutliner->AddText(*pOPO);
1362cdf0e10cSrcweir pOPO->SetVertical( bVertical );
1363cdf0e10cSrcweir
1364cdf0e10cSrcweir sal_uInt16 nParaCount2 = (sal_uInt16)mpOutliner->GetParagraphCount();
1365cdf0e10cSrcweir for (sal_uInt16 n = nParaCount1; n < nParaCount2; n++)
1366cdf0e10cSrcweir {
1367cdf0e10cSrcweir if( bSubTitle )
1368cdf0e10cSrcweir {
1369cdf0e10cSrcweir Paragraph* p = mpOutliner->GetParagraph(n);
1370cdf0e10cSrcweir if(p && mpOutliner->GetDepth( n ) > 0 )
1371cdf0e10cSrcweir mpOutliner->SetDepth(p, 0);
1372cdf0e10cSrcweir }
1373cdf0e10cSrcweir
1374cdf0e10cSrcweir UpdateParagraph( n );
1375cdf0e10cSrcweir }
1376cdf0e10cSrcweir }
1377cdf0e10cSrcweir }
1378cdf0e10cSrcweir }
1379cdf0e10cSrcweir
1380cdf0e10cSrcweir // place cursor at the start
1381cdf0e10cSrcweir Paragraph* pFirstPara = mpOutliner->GetParagraph( 0 );
1382cdf0e10cSrcweir mpOutlinerView[0]->Select( pFirstPara, sal_True, sal_False );
1383cdf0e10cSrcweir mpOutlinerView[0]->Select( pFirstPara, sal_False, sal_False );
1384cdf0e10cSrcweir
1385cdf0e10cSrcweir // select title of slide that was selected
1386cdf0e10cSrcweir if (pTitleToSelect)
1387cdf0e10cSrcweir mpOutlinerView[0]->Select(pTitleToSelect, sal_True, sal_False);
1388cdf0e10cSrcweir
1389cdf0e10cSrcweir SetLinks();
1390cdf0e10cSrcweir
1391cdf0e10cSrcweir mpOutliner->EnableUndo(sal_True);
1392cdf0e10cSrcweir
1393cdf0e10cSrcweir mpOutliner->SetUpdateMode(true);
1394cdf0e10cSrcweir }
1395cdf0e10cSrcweir
1396cdf0e10cSrcweir /*************************************************************************
1397cdf0e10cSrcweir |*
1398cdf0e10cSrcweir |* Handler fuer das Loeschen von Level-0-Absaetzen (Seiten): Warnung
1399cdf0e10cSrcweir |*
1400cdf0e10cSrcweir \************************************************************************/
1401cdf0e10cSrcweir
IMPL_LINK(OutlineView,RemovingPagesHdl,OutlinerView *,EMPTYARG)1402cdf0e10cSrcweir IMPL_LINK( OutlineView, RemovingPagesHdl, OutlinerView *, EMPTYARG )
1403cdf0e10cSrcweir {
1404cdf0e10cSrcweir sal_uInt16 nNumOfPages = mpOutliner->GetSelPageCount();
1405cdf0e10cSrcweir
1406cdf0e10cSrcweir if (nNumOfPages > PROCESS_WITH_PROGRESS_THRESHOLD)
1407cdf0e10cSrcweir {
1408cdf0e10cSrcweir mnPagesToProcess = nNumOfPages;
1409cdf0e10cSrcweir mnPagesProcessed = 0;
1410cdf0e10cSrcweir }
1411cdf0e10cSrcweir
1412cdf0e10cSrcweir if (mnPagesToProcess)
1413cdf0e10cSrcweir {
1414cdf0e10cSrcweir if( mpProgress )
1415cdf0e10cSrcweir delete mpProgress;
1416cdf0e10cSrcweir
1417cdf0e10cSrcweir String aStr(SdResId(STR_DELETE_PAGES));
1418cdf0e10cSrcweir mpProgress = new SfxProgress( GetDocSh(), aStr, mnPagesToProcess );
1419cdf0e10cSrcweir }
1420cdf0e10cSrcweir mpOutliner->UpdateFields();
1421cdf0e10cSrcweir
1422cdf0e10cSrcweir InvalidateSlideNumberArea();
1423cdf0e10cSrcweir
1424cdf0e10cSrcweir return 1;
1425cdf0e10cSrcweir }
1426cdf0e10cSrcweir
1427cdf0e10cSrcweir /*************************************************************************
1428cdf0e10cSrcweir |*
1429cdf0e10cSrcweir |* Handler fuer das Einruecken von Level-0-Absaetzen (Seiten): Warnung
1430cdf0e10cSrcweir |*
1431cdf0e10cSrcweir \************************************************************************/
1432cdf0e10cSrcweir
IMPL_LINK_INLINE_START(OutlineView,IndentingPagesHdl,OutlinerView *,pOutlinerView)1433cdf0e10cSrcweir IMPL_LINK_INLINE_START( OutlineView, IndentingPagesHdl, OutlinerView *, pOutlinerView )
1434cdf0e10cSrcweir {
1435cdf0e10cSrcweir return RemovingPagesHdl(pOutlinerView);
1436cdf0e10cSrcweir }
IMPL_LINK_INLINE_END(OutlineView,IndentingPagesHdl,OutlinerView *,pOutlinerView)1437cdf0e10cSrcweir IMPL_LINK_INLINE_END( OutlineView, IndentingPagesHdl, OutlinerView *, pOutlinerView )
1438cdf0e10cSrcweir
1439cdf0e10cSrcweir
1440cdf0e10cSrcweir /** returns the first slide that is selected in the outliner or where
1441cdf0e10cSrcweir the cursor is located */
1442cdf0e10cSrcweir SdPage* OutlineView::GetActualPage()
1443cdf0e10cSrcweir {
1444cdf0e10cSrcweir ::sd::Window* pWin = mpOutlineViewShell->GetActiveWindow();
1445cdf0e10cSrcweir OutlinerView* pActiveView = GetViewByWindow(pWin);
1446cdf0e10cSrcweir std::auto_ptr<List> pSelList( static_cast< List* >(pActiveView->CreateSelectionList()) );
1447cdf0e10cSrcweir
1448cdf0e10cSrcweir SdPage* pCurrent = GetPageForParagraph(static_cast<Paragraph*>(pSelList->First()) );
1449cdf0e10cSrcweir DBG_ASSERT( pCurrent ||
1450cdf0e10cSrcweir (mpDocSh->GetUndoManager() && static_cast< sd::UndoManager *>(mpDocSh->GetUndoManager())->IsDoing()) ||
1451cdf0e10cSrcweir maDragAndDropModelGuard.get(),
1452cdf0e10cSrcweir "sd::OutlineView::GetActualPage(), no current page?" );
1453cdf0e10cSrcweir if( pCurrent )
1454cdf0e10cSrcweir return pCurrent;
1455cdf0e10cSrcweir else
1456cdf0e10cSrcweir return mpDoc->GetSdPage( 0, PK_STANDARD );
1457cdf0e10cSrcweir }
1458cdf0e10cSrcweir
GetPageForParagraph(Paragraph * pPara)1459cdf0e10cSrcweir SdPage* OutlineView::GetPageForParagraph( Paragraph* pPara )
1460cdf0e10cSrcweir {
1461cdf0e10cSrcweir if( !mpOutliner->HasParaFlag(pPara,PARAFLAG_ISPAGE) )
1462cdf0e10cSrcweir pPara = GetPrevTitle(pPara);
1463cdf0e10cSrcweir
1464cdf0e10cSrcweir sal_uInt32 nPageToSelect = 0;
1465cdf0e10cSrcweir while(pPara)
1466cdf0e10cSrcweir {
1467cdf0e10cSrcweir pPara = GetPrevTitle(pPara);
1468cdf0e10cSrcweir if(pPara)
1469cdf0e10cSrcweir nPageToSelect++;
1470cdf0e10cSrcweir }
1471cdf0e10cSrcweir
1472cdf0e10cSrcweir if( nPageToSelect < (sal_uInt32)mpDoc->GetSdPageCount( PK_STANDARD ) )
1473cdf0e10cSrcweir return static_cast< SdPage* >( mpDoc->GetSdPage( (sal_uInt16)nPageToSelect, PK_STANDARD) );
1474cdf0e10cSrcweir else
1475cdf0e10cSrcweir return 0;
1476cdf0e10cSrcweir }
1477cdf0e10cSrcweir
GetParagraphForPage(::Outliner * pOutl,SdPage * pPage)1478cdf0e10cSrcweir Paragraph* OutlineView::GetParagraphForPage( ::Outliner* pOutl, SdPage* pPage )
1479cdf0e10cSrcweir {
1480cdf0e10cSrcweir // get the number of paragraphs with ident 0 we need to skip before
1481cdf0e10cSrcweir // we finde the actual page
1482cdf0e10cSrcweir sal_uInt32 nPagesToSkip = (pPage->GetPageNum() - 1) >> 1;
1483cdf0e10cSrcweir
1484cdf0e10cSrcweir sal_uInt32 nParaPos = 0;
1485cdf0e10cSrcweir Paragraph* pPara = pOutl->GetParagraph( 0 );
1486cdf0e10cSrcweir while( pPara )
1487cdf0e10cSrcweir {
1488cdf0e10cSrcweir // if this paragraph is a page ...
1489cdf0e10cSrcweir if( mpOutliner->HasParaFlag(pPara,PARAFLAG_ISPAGE) )
1490cdf0e10cSrcweir {
1491cdf0e10cSrcweir // see if we already skiped enough pages
1492cdf0e10cSrcweir if( 0 == nPagesToSkip )
1493cdf0e10cSrcweir break; // and if so, end the loop
1494cdf0e10cSrcweir
1495cdf0e10cSrcweir // we skiped another page
1496cdf0e10cSrcweir nPagesToSkip--;
1497cdf0e10cSrcweir }
1498cdf0e10cSrcweir
1499cdf0e10cSrcweir // get next paragraph
1500cdf0e10cSrcweir pPara = mpOutliner->GetParagraph( ++nParaPos );
1501cdf0e10cSrcweir }
1502cdf0e10cSrcweir
1503cdf0e10cSrcweir return pPara;
1504cdf0e10cSrcweir }
1505cdf0e10cSrcweir
1506cdf0e10cSrcweir /** selects the paragraph for the given page at the outliner view*/
SetActualPage(SdPage * pActual)1507cdf0e10cSrcweir void OutlineView::SetActualPage( SdPage* pActual )
1508cdf0e10cSrcweir {
1509cdf0e10cSrcweir if( pActual && mpOutliner && dynamic_cast<Outliner*> ( mpOutliner )->GetIgnoreCurrentPageChangesLevel()==0 && !mbFirstPaint)
1510cdf0e10cSrcweir {
1511cdf0e10cSrcweir // if we found a paragraph, select its text at the outliner view
1512cdf0e10cSrcweir Paragraph* pPara = GetParagraphForPage( mpOutliner, pActual );
1513cdf0e10cSrcweir if( pPara )
1514cdf0e10cSrcweir mpOutlinerView[0]->Select( pPara, sal_True, sal_False );
1515cdf0e10cSrcweir }
1516cdf0e10cSrcweir }
1517cdf0e10cSrcweir
1518cdf0e10cSrcweir /*************************************************************************
1519cdf0e10cSrcweir |*
1520cdf0e10cSrcweir |* StyleSheet aus der Selektion besorgen
1521cdf0e10cSrcweir |*
1522cdf0e10cSrcweir \************************************************************************/
1523cdf0e10cSrcweir
GetStyleSheet() const1524cdf0e10cSrcweir SfxStyleSheet* OutlineView::GetStyleSheet() const
1525cdf0e10cSrcweir {
1526cdf0e10cSrcweir ::sd::Window* pActWin = mpOutlineViewShell->GetActiveWindow();
1527cdf0e10cSrcweir OutlinerView* pOlView = GetViewByWindow(pActWin);
1528cdf0e10cSrcweir SfxStyleSheet* pResult = pOlView->GetStyleSheet();
1529cdf0e10cSrcweir return pResult;
1530cdf0e10cSrcweir }
1531cdf0e10cSrcweir
1532cdf0e10cSrcweir
1533cdf0e10cSrcweir
1534cdf0e10cSrcweir /*************************************************************************
1535cdf0e10cSrcweir |*
1536cdf0e10cSrcweir |* Seiten als selektiert / nicht selektiert setzen
1537cdf0e10cSrcweir |*
1538cdf0e10cSrcweir \************************************************************************/
1539cdf0e10cSrcweir
SetSelectedPages()1540cdf0e10cSrcweir void OutlineView::SetSelectedPages()
1541cdf0e10cSrcweir {
1542cdf0e10cSrcweir // Liste der selektierten Titelabsaetze
1543cdf0e10cSrcweir List* pSelParas = mpOutlinerView[0]->CreateSelectionList();
1544cdf0e10cSrcweir Paragraph* pPara = (Paragraph*) pSelParas->First();
1545cdf0e10cSrcweir
1546cdf0e10cSrcweir while(pPara)
1547cdf0e10cSrcweir {
1548cdf0e10cSrcweir if( !mpOutliner->HasParaFlag(pPara, PARAFLAG_ISPAGE) )
1549cdf0e10cSrcweir {
1550cdf0e10cSrcweir pSelParas->Remove();
1551cdf0e10cSrcweir pPara = (Paragraph*) pSelParas->GetCurObject();
1552cdf0e10cSrcweir }
1553cdf0e10cSrcweir else
1554cdf0e10cSrcweir {
1555cdf0e10cSrcweir pPara = (Paragraph*) pSelParas->Next();
1556cdf0e10cSrcweir }
1557cdf0e10cSrcweir }
1558cdf0e10cSrcweir
1559cdf0e10cSrcweir // Die zu den selektierten Absaetzen auf Ebene 0 gehoerenden Seiten
1560cdf0e10cSrcweir // selektieren
1561cdf0e10cSrcweir sal_uInt16 nPos = 0;
1562cdf0e10cSrcweir sal_uLong nParaPos = 0;
1563cdf0e10cSrcweir pPara = mpOutliner->GetParagraph( 0 );
1564cdf0e10cSrcweir
1565cdf0e10cSrcweir while(pPara)
1566cdf0e10cSrcweir {
1567cdf0e10cSrcweir if( mpOutliner->HasParaFlag(pPara, PARAFLAG_ISPAGE) ) // eine Seite?
1568cdf0e10cSrcweir {
1569cdf0e10cSrcweir SdPage* pPage = mpDoc->GetSdPage(nPos, PK_STANDARD);
1570cdf0e10cSrcweir DBG_ASSERT(pPage!=NULL,
1571cdf0e10cSrcweir "Trying to select non-existing page OutlineView::SetSelectedPages()");
1572cdf0e10cSrcweir if (pPage != NULL)
1573cdf0e10cSrcweir {
1574cdf0e10cSrcweir pPage->SetSelected(sal_False);
1575cdf0e10cSrcweir
1576cdf0e10cSrcweir if (pSelParas->Seek(pPara)) // selektiert?
1577cdf0e10cSrcweir pPage->SetSelected(sal_True);
1578cdf0e10cSrcweir }
1579cdf0e10cSrcweir
1580cdf0e10cSrcweir nPos++;
1581cdf0e10cSrcweir }
1582cdf0e10cSrcweir
1583cdf0e10cSrcweir pPara = mpOutliner->GetParagraph( ++nParaPos );
1584cdf0e10cSrcweir }
1585cdf0e10cSrcweir }
1586cdf0e10cSrcweir
1587cdf0e10cSrcweir
1588cdf0e10cSrcweir /*************************************************************************
1589cdf0e10cSrcweir |*
1590cdf0e10cSrcweir |* Neue Links setzen
1591cdf0e10cSrcweir |*
1592cdf0e10cSrcweir \************************************************************************/
1593cdf0e10cSrcweir
SetLinks()1594cdf0e10cSrcweir void OutlineView::SetLinks()
1595cdf0e10cSrcweir {
1596cdf0e10cSrcweir // Benachrichtigungs-Links setzen
1597cdf0e10cSrcweir mpOutliner->SetParaInsertedHdl(LINK(this, OutlineView, ParagraphInsertedHdl));
1598cdf0e10cSrcweir mpOutliner->SetParaRemovingHdl(LINK(this, OutlineView, ParagraphRemovingHdl));
1599cdf0e10cSrcweir mpOutliner->SetDepthChangedHdl(LINK(this, OutlineView, DepthChangedHdl));
1600cdf0e10cSrcweir mpOutliner->SetBeginMovingHdl(LINK(this, OutlineView, BeginMovingHdl));
1601cdf0e10cSrcweir mpOutliner->SetEndMovingHdl(LINK(this, OutlineView, EndMovingHdl));
1602cdf0e10cSrcweir mpOutliner->SetRemovingPagesHdl(LINK(this, OutlineView, RemovingPagesHdl));
1603cdf0e10cSrcweir mpOutliner->SetIndentingPagesHdl(LINK(this, OutlineView, IndentingPagesHdl));
1604cdf0e10cSrcweir mpOutliner->SetStatusEventHdl(LINK(this, OutlineView, StatusEventHdl));
1605cdf0e10cSrcweir mpOutliner->SetBeginDropHdl(LINK(this,OutlineView, BeginDropHdl));
1606cdf0e10cSrcweir mpOutliner->SetEndDropHdl(LINK(this,OutlineView, EndDropHdl));
1607cdf0e10cSrcweir mpOutliner->SetPaintFirstLineHdl(LINK(this,OutlineView,PaintingFirstLineHdl));
1608cdf0e10cSrcweir mpOutliner->SetBeginPasteOrDropHdl(LINK(this,OutlineView, BeginPasteOrDropHdl));
1609cdf0e10cSrcweir mpOutliner->SetEndPasteOrDropHdl(LINK(this,OutlineView, EndPasteOrDropHdl));
1610cdf0e10cSrcweir }
1611cdf0e10cSrcweir
1612cdf0e10cSrcweir
1613cdf0e10cSrcweir
1614cdf0e10cSrcweir /*************************************************************************
1615cdf0e10cSrcweir |*
1616cdf0e10cSrcweir |* Alte Links restaurieren
1617cdf0e10cSrcweir |*
1618cdf0e10cSrcweir \************************************************************************/
1619cdf0e10cSrcweir
ResetLinks() const1620cdf0e10cSrcweir void OutlineView::ResetLinks() const
1621cdf0e10cSrcweir {
1622cdf0e10cSrcweir // alte Links restaurieren
1623cdf0e10cSrcweir Link aEmptyLink;
1624cdf0e10cSrcweir mpOutliner->SetParaInsertedHdl(aEmptyLink);
1625cdf0e10cSrcweir mpOutliner->SetParaRemovingHdl(aEmptyLink);
1626cdf0e10cSrcweir mpOutliner->SetDepthChangedHdl(aEmptyLink);
1627cdf0e10cSrcweir mpOutliner->SetBeginMovingHdl(aEmptyLink);
1628cdf0e10cSrcweir mpOutliner->SetEndMovingHdl(aEmptyLink);
1629cdf0e10cSrcweir mpOutliner->SetStatusEventHdl(aEmptyLink);
1630cdf0e10cSrcweir mpOutliner->SetRemovingPagesHdl(aEmptyLink);
1631cdf0e10cSrcweir mpOutliner->SetIndentingPagesHdl(aEmptyLink);
1632cdf0e10cSrcweir mpOutliner->SetDrawPortionHdl(aEmptyLink);
1633cdf0e10cSrcweir mpOutliner->SetBeginPasteOrDropHdl(aEmptyLink);
1634cdf0e10cSrcweir mpOutliner->SetEndPasteOrDropHdl(aEmptyLink);
1635cdf0e10cSrcweir }
1636cdf0e10cSrcweir
1637cdf0e10cSrcweir /*************************************************************************
1638cdf0e10cSrcweir |*
1639cdf0e10cSrcweir |* AcceptDrop
1640cdf0e10cSrcweir |*
1641cdf0e10cSrcweir \************************************************************************/
1642cdf0e10cSrcweir
AcceptDrop(const AcceptDropEvent &,DropTargetHelper &,::sd::Window *,sal_uInt16,sal_uInt16)1643cdf0e10cSrcweir sal_Int8 OutlineView::AcceptDrop( const AcceptDropEvent&, DropTargetHelper&, ::sd::Window*, sal_uInt16, sal_uInt16)
1644cdf0e10cSrcweir {
1645cdf0e10cSrcweir return DND_ACTION_NONE;
1646cdf0e10cSrcweir }
1647cdf0e10cSrcweir
1648cdf0e10cSrcweir /*************************************************************************
1649cdf0e10cSrcweir |*
1650cdf0e10cSrcweir |* ExecuteDrop
1651cdf0e10cSrcweir |*
1652cdf0e10cSrcweir \************************************************************************/
1653cdf0e10cSrcweir
ExecuteDrop(const ExecuteDropEvent &,DropTargetHelper &,::sd::Window *,sal_uInt16,sal_uInt16)1654cdf0e10cSrcweir sal_Int8 OutlineView::ExecuteDrop( const ExecuteDropEvent&, DropTargetHelper&, ::sd::Window*, sal_uInt16, sal_uInt16)
1655cdf0e10cSrcweir {
1656cdf0e10cSrcweir return DND_ACTION_NONE;
1657cdf0e10cSrcweir }
1658cdf0e10cSrcweir
1659cdf0e10cSrcweir // #97766# Re-implement GetScriptType for this view to get correct results
GetScriptType() const1660cdf0e10cSrcweir sal_uInt16 OutlineView::GetScriptType() const
1661cdf0e10cSrcweir {
1662cdf0e10cSrcweir sal_uInt16 nScriptType = ::sd::View::GetScriptType();
1663cdf0e10cSrcweir
1664cdf0e10cSrcweir if(mpOutliner)
1665cdf0e10cSrcweir {
1666cdf0e10cSrcweir OutlinerParaObject* pTempOPObj = mpOutliner->CreateParaObject();
1667cdf0e10cSrcweir
1668cdf0e10cSrcweir if(pTempOPObj)
1669cdf0e10cSrcweir {
1670cdf0e10cSrcweir nScriptType = pTempOPObj->GetTextObject().GetScriptType();
1671cdf0e10cSrcweir delete pTempOPObj;
1672cdf0e10cSrcweir }
1673cdf0e10cSrcweir }
1674cdf0e10cSrcweir
1675cdf0e10cSrcweir return nScriptType;
1676cdf0e10cSrcweir }
1677cdf0e10cSrcweir
onUpdateStyleSettings(bool bForceUpdate)1678cdf0e10cSrcweir void OutlineView::onUpdateStyleSettings( bool bForceUpdate /* = false */ )
1679cdf0e10cSrcweir {
1680cdf0e10cSrcweir const bool bHighContrastMode = Application::GetSettings().GetStyleSettings().GetHighContrastMode() != 0;
1681cdf0e10cSrcweir if( bForceUpdate || (mbHighContrastMode != bHighContrastMode) )
1682cdf0e10cSrcweir {
1683cdf0e10cSrcweir if( mpOutliner )
1684cdf0e10cSrcweir {
1685cdf0e10cSrcweir mpOutliner->ForceAutoColor( bHighContrastMode );
1686cdf0e10cSrcweir }
1687cdf0e10cSrcweir mbHighContrastMode = bHighContrastMode;
1688cdf0e10cSrcweir
1689cdf0e10cSrcweir }
1690cdf0e10cSrcweir
1691cdf0e10cSrcweir svtools::ColorConfig aColorConfig;
1692cdf0e10cSrcweir const Color aDocColor( aColorConfig.GetColorValue( svtools::DOCCOLOR ).nColor );
1693cdf0e10cSrcweir if( bForceUpdate || (maDocColor != aDocColor) )
1694cdf0e10cSrcweir {
1695cdf0e10cSrcweir sal_uInt16 nView;
1696cdf0e10cSrcweir for( nView = 0; nView < MAX_OUTLINERVIEWS; nView++ )
1697cdf0e10cSrcweir {
1698cdf0e10cSrcweir if (mpOutlinerView[nView] != NULL)
1699cdf0e10cSrcweir {
1700cdf0e10cSrcweir mpOutlinerView[nView]->SetBackgroundColor( aDocColor );
1701cdf0e10cSrcweir
1702cdf0e10cSrcweir ::Window* pWindow = mpOutlinerView[nView]->GetWindow();
1703cdf0e10cSrcweir
1704cdf0e10cSrcweir if( pWindow )
1705cdf0e10cSrcweir pWindow->SetBackground( Wallpaper( aDocColor ) );
1706cdf0e10cSrcweir
1707cdf0e10cSrcweir }
1708cdf0e10cSrcweir }
1709cdf0e10cSrcweir
1710cdf0e10cSrcweir if( mpOutliner )
1711cdf0e10cSrcweir mpOutliner->SetBackgroundColor( aDocColor );
1712cdf0e10cSrcweir
1713cdf0e10cSrcweir maDocColor = aDocColor;
1714cdf0e10cSrcweir }
1715cdf0e10cSrcweir }
1716cdf0e10cSrcweir
IMPL_LINK(OutlineView,AppEventListenerHdl,void *,EMPTYARG)1717cdf0e10cSrcweir IMPL_LINK( OutlineView, AppEventListenerHdl, void *, EMPTYARG )
1718cdf0e10cSrcweir {
1719cdf0e10cSrcweir onUpdateStyleSettings();
1720cdf0e10cSrcweir return 0;
1721cdf0e10cSrcweir }
1722cdf0e10cSrcweir
1723cdf0e10cSrcweir
1724cdf0e10cSrcweir
1725cdf0e10cSrcweir
IMPL_LINK(OutlineView,EventMultiplexerListener,::sd::tools::EventMultiplexerEvent *,pEvent)1726cdf0e10cSrcweir IMPL_LINK(OutlineView, EventMultiplexerListener, ::sd::tools::EventMultiplexerEvent*, pEvent)
1727cdf0e10cSrcweir {
1728cdf0e10cSrcweir if (pEvent != NULL)
1729cdf0e10cSrcweir {
1730cdf0e10cSrcweir switch (pEvent->meEventId)
1731cdf0e10cSrcweir {
1732cdf0e10cSrcweir case tools::EventMultiplexerEvent::EID_CURRENT_PAGE:
1733cdf0e10cSrcweir SetActualPage(mpOutlineViewShell->GetActualPage());
1734cdf0e10cSrcweir InvalidateSlideNumberArea();
1735cdf0e10cSrcweir break;
1736cdf0e10cSrcweir
1737cdf0e10cSrcweir case tools::EventMultiplexerEvent::EID_PAGE_ORDER:
1738cdf0e10cSrcweir if (mpOutliner != NULL && mpDoc!=NULL && mpOutliner != NULL && dynamic_cast<Outliner*> ( mpOutliner )->GetIgnoreCurrentPageChangesLevel()==0)
1739cdf0e10cSrcweir {
1740cdf0e10cSrcweir if (((mpDoc->GetPageCount()-1)%2) == 0)
1741cdf0e10cSrcweir {
1742cdf0e10cSrcweir mpOutliner->Clear();
1743cdf0e10cSrcweir FillOutliner();
1744cdf0e10cSrcweir ::sd::Window* pWindow = mpOutlineViewShell->GetActiveWindow();
1745cdf0e10cSrcweir if (pWindow != NULL)
1746cdf0e10cSrcweir pWindow->Invalidate();
1747cdf0e10cSrcweir }
1748cdf0e10cSrcweir }
1749cdf0e10cSrcweir break;
1750cdf0e10cSrcweir }
1751cdf0e10cSrcweir }
1752cdf0e10cSrcweir return 0;
1753cdf0e10cSrcweir }
1754cdf0e10cSrcweir
IgnoreCurrentPageChanges(bool bIgnoreChanges)1755cdf0e10cSrcweir void OutlineView::IgnoreCurrentPageChanges (bool bIgnoreChanges)
1756cdf0e10cSrcweir {
1757cdf0e10cSrcweir if ( mpOutliner )
1758cdf0e10cSrcweir {
1759cdf0e10cSrcweir if (bIgnoreChanges)
1760cdf0e10cSrcweir dynamic_cast<Outliner*> ( mpOutliner )->IncreIgnoreCurrentPageChangesLevel();
1761cdf0e10cSrcweir else
1762cdf0e10cSrcweir dynamic_cast<Outliner*> ( mpOutliner )->DecreIgnoreCurrentPageChangesLevel();
1763cdf0e10cSrcweir }
1764cdf0e10cSrcweir }
1765cdf0e10cSrcweir
1766cdf0e10cSrcweir /** call this method before you do anything that can modify the outliner
1767cdf0e10cSrcweir and or the drawing document model. It will create needed undo actions */
BeginModelChange()1768cdf0e10cSrcweir void OutlineView::BeginModelChange()
1769cdf0e10cSrcweir {
1770cdf0e10cSrcweir const String aEmpty;
1771cdf0e10cSrcweir mpOutliner->GetUndoManager().EnterListAction(aEmpty,aEmpty);
1772cdf0e10cSrcweir const String aUndoStr(SdResId(STR_UNDO_CHANGE_TITLE_AND_LAYOUT));
1773cdf0e10cSrcweir BegUndo(aUndoStr);
1774cdf0e10cSrcweir }
1775cdf0e10cSrcweir
1776cdf0e10cSrcweir /** call this method after BeginModelChange(), when all possible model
1777cdf0e10cSrcweir changes are done. */
EndModelChange()1778cdf0e10cSrcweir void OutlineView::EndModelChange()
1779cdf0e10cSrcweir {
1780cdf0e10cSrcweir UpdateDocument();
1781cdf0e10cSrcweir
1782cdf0e10cSrcweir ::svl::IUndoManager* pDocUndoMgr = mpDocSh->GetUndoManager();
1783cdf0e10cSrcweir
1784cdf0e10cSrcweir bool bHasUndoActions = pDocUndoMgr->GetUndoActionCount() != 0;
1785cdf0e10cSrcweir
1786cdf0e10cSrcweir EndUndo();
1787cdf0e10cSrcweir
1788cdf0e10cSrcweir DBG_ASSERT( bHasUndoActions == (mpOutliner->GetUndoManager().GetUndoActionCount() != 0), "sd::OutlineView::EndModelChange(), undo actions not in sync!" );
1789cdf0e10cSrcweir
1790cdf0e10cSrcweir if( bHasUndoActions )
1791cdf0e10cSrcweir {
1792cdf0e10cSrcweir SfxLinkUndoAction* pLink = new SfxLinkUndoAction(pDocUndoMgr);
1793cdf0e10cSrcweir mpOutliner->GetUndoManager().AddUndoAction(pLink);
1794cdf0e10cSrcweir }
1795cdf0e10cSrcweir
1796cdf0e10cSrcweir mpOutliner->GetUndoManager().LeaveListAction();
1797cdf0e10cSrcweir
1798cdf0e10cSrcweir if( bHasUndoActions && mpOutliner->GetEditEngine().HasTriedMergeOnLastAddUndo() )
1799cdf0e10cSrcweir TryToMergeUndoActions();
1800cdf0e10cSrcweir
1801cdf0e10cSrcweir mpOutlineViewShell->Invalidate( SID_UNDO );
1802cdf0e10cSrcweir mpOutlineViewShell->Invalidate( SID_REDO );
1803cdf0e10cSrcweir }
1804cdf0e10cSrcweir
1805cdf0e10cSrcweir /** updates all changes in the outliner model to the draw model */
UpdateDocument()1806cdf0e10cSrcweir void OutlineView::UpdateDocument()
1807cdf0e10cSrcweir {
1808cdf0e10cSrcweir const sal_uInt32 nPageCount = mpDoc->GetSdPageCount(PK_STANDARD);
1809cdf0e10cSrcweir Paragraph* pPara = mpOutliner->GetParagraph( 0 );
1810cdf0e10cSrcweir sal_uInt32 nPage;
1811cdf0e10cSrcweir for (nPage = 0; nPage < nPageCount; nPage++)
1812cdf0e10cSrcweir {
1813cdf0e10cSrcweir SdPage* pPage = mpDoc->GetSdPage( (sal_uInt16)nPage, PK_STANDARD);
1814cdf0e10cSrcweir mpDoc->SetSelected(pPage, sal_False);
1815cdf0e10cSrcweir
1816cdf0e10cSrcweir mpOutlineViewShell->UpdateTitleObject( pPage, pPara );
1817cdf0e10cSrcweir mpOutlineViewShell->UpdateOutlineObject( pPage, pPara );
1818cdf0e10cSrcweir
1819cdf0e10cSrcweir if( pPara )
1820cdf0e10cSrcweir pPara = GetNextTitle(pPara);
1821cdf0e10cSrcweir }
1822cdf0e10cSrcweir
1823cdf0e10cSrcweir DBG_ASSERT( pPara == 0, "sd::OutlineView::UpdateDocument(), slides are out of sync, creating missing ones" );
1824cdf0e10cSrcweir while( pPara )
1825cdf0e10cSrcweir {
1826cdf0e10cSrcweir SdPage* pPage = InsertSlideForParagraph( pPara );
1827cdf0e10cSrcweir mpDoc->SetSelected(pPage, sal_False);
1828cdf0e10cSrcweir
1829cdf0e10cSrcweir mpOutlineViewShell->UpdateTitleObject( pPage, pPara );
1830cdf0e10cSrcweir mpOutlineViewShell->UpdateOutlineObject( pPage, pPara );
1831cdf0e10cSrcweir
1832cdf0e10cSrcweir if( pPara )
1833cdf0e10cSrcweir pPara = GetNextTitle(pPara);
1834cdf0e10cSrcweir }
1835cdf0e10cSrcweir }
1836cdf0e10cSrcweir
1837cdf0e10cSrcweir /** merge edit engine undo actions if possible */
TryToMergeUndoActions()1838cdf0e10cSrcweir void OutlineView::TryToMergeUndoActions()
1839cdf0e10cSrcweir {
1840cdf0e10cSrcweir ::svl::IUndoManager& rOutlineUndo = mpOutliner->GetUndoManager();
1841cdf0e10cSrcweir if( rOutlineUndo.GetUndoActionCount() > 1 )
1842cdf0e10cSrcweir {
1843cdf0e10cSrcweir SfxListUndoAction* pListAction = dynamic_cast< SfxListUndoAction* >( rOutlineUndo.GetUndoAction(0) );
1844cdf0e10cSrcweir SfxListUndoAction* pPrevListAction = dynamic_cast< SfxListUndoAction* >( rOutlineUndo.GetUndoAction(1) );
1845cdf0e10cSrcweir if( pListAction && pPrevListAction )
1846cdf0e10cSrcweir {
1847cdf0e10cSrcweir // find the top EditUndo action in the top undo action list
1848cdf0e10cSrcweir size_t nAction = pListAction->aUndoActions.size();
1849cdf0e10cSrcweir EditUndo* pEditUndo = 0;
1850cdf0e10cSrcweir while( !pEditUndo && nAction )
1851cdf0e10cSrcweir {
1852cdf0e10cSrcweir pEditUndo = dynamic_cast< EditUndo* >(pListAction->aUndoActions[--nAction].pAction);
1853cdf0e10cSrcweir }
1854cdf0e10cSrcweir
1855cdf0e10cSrcweir sal_uInt16 nEditPos = nAction; // we need this later to remove the merged undo actions
1856cdf0e10cSrcweir
1857cdf0e10cSrcweir // make sure it is the only EditUndo action in the top undo list
1858cdf0e10cSrcweir while( pEditUndo && nAction )
1859cdf0e10cSrcweir {
1860cdf0e10cSrcweir if( dynamic_cast< EditUndo* >(pListAction->aUndoActions[--nAction].pAction) )
1861cdf0e10cSrcweir pEditUndo = 0;
1862cdf0e10cSrcweir }
1863cdf0e10cSrcweir
1864cdf0e10cSrcweir // do we have one and only one EditUndo action in the top undo list?
1865cdf0e10cSrcweir if( pEditUndo )
1866cdf0e10cSrcweir {
1867cdf0e10cSrcweir // yes, see if we can merge it with the prev undo list
1868cdf0e10cSrcweir
1869cdf0e10cSrcweir nAction = pPrevListAction->aUndoActions.size();
1870cdf0e10cSrcweir EditUndo* pPrevEditUndo = 0;
1871cdf0e10cSrcweir while( !pPrevEditUndo && nAction )
1872cdf0e10cSrcweir pPrevEditUndo = dynamic_cast< EditUndo* >(pPrevListAction->aUndoActions[--nAction].pAction);
1873cdf0e10cSrcweir
1874cdf0e10cSrcweir if( pPrevEditUndo && pPrevEditUndo->Merge( pEditUndo ) )
1875cdf0e10cSrcweir {
1876cdf0e10cSrcweir // ok we merged the only EditUndo of the top undo list with
1877cdf0e10cSrcweir // the top EditUndo of the previous undo list
1878cdf0e10cSrcweir
1879cdf0e10cSrcweir // first remove the merged undo action
1880cdf0e10cSrcweir DBG_ASSERT( pListAction->aUndoActions[nEditPos].pAction == pEditUndo,
1881cdf0e10cSrcweir "sd::OutlineView::TryToMergeUndoActions(), wrong edit pos!" );
1882cdf0e10cSrcweir pListAction->aUndoActions.Remove(nEditPos);
1883cdf0e10cSrcweir delete pEditUndo;
1884cdf0e10cSrcweir
1885cdf0e10cSrcweir // now check if we also can merge the draw undo actions
1886cdf0e10cSrcweir ::svl::IUndoManager* pDocUndoManager = mpDocSh->GetUndoManager();
1887cdf0e10cSrcweir if( pDocUndoManager && ( pListAction->aUndoActions.size() == 1 ))
1888cdf0e10cSrcweir {
1889cdf0e10cSrcweir SfxLinkUndoAction* pLinkAction = dynamic_cast< SfxLinkUndoAction* >( pListAction->aUndoActions[0].pAction );
1890cdf0e10cSrcweir SfxLinkUndoAction* pPrevLinkAction = 0;
1891cdf0e10cSrcweir
1892cdf0e10cSrcweir if( pLinkAction )
1893cdf0e10cSrcweir {
1894cdf0e10cSrcweir nAction = pPrevListAction->aUndoActions.size();
1895cdf0e10cSrcweir while( !pPrevLinkAction && nAction )
1896cdf0e10cSrcweir pPrevLinkAction = dynamic_cast< SfxLinkUndoAction* >(pPrevListAction->aUndoActions[--nAction].pAction);
1897cdf0e10cSrcweir }
1898cdf0e10cSrcweir
1899cdf0e10cSrcweir if( pLinkAction && pPrevLinkAction &&
1900cdf0e10cSrcweir ( pLinkAction->GetAction() == pDocUndoManager->GetUndoAction(0) ) &&
1901cdf0e10cSrcweir ( pPrevLinkAction->GetAction() == pDocUndoManager->GetUndoAction(1) ) )
1902cdf0e10cSrcweir {
1903cdf0e10cSrcweir SfxListUndoAction* pSourceList = dynamic_cast< SfxListUndoAction* >(pLinkAction->GetAction());
1904cdf0e10cSrcweir SfxListUndoAction* pDestinationList = dynamic_cast< SfxListUndoAction* >(pPrevLinkAction->GetAction());
1905cdf0e10cSrcweir
1906cdf0e10cSrcweir if( pSourceList && pDestinationList )
1907cdf0e10cSrcweir {
1908cdf0e10cSrcweir sal_uInt16 nCount = pSourceList->aUndoActions.size();
1909cdf0e10cSrcweir sal_uInt16 nDestAction = pDestinationList->aUndoActions.size();
1910cdf0e10cSrcweir while( nCount-- )
1911cdf0e10cSrcweir {
1912cdf0e10cSrcweir SfxUndoAction* pTemp = pSourceList->aUndoActions[0].pAction;
1913cdf0e10cSrcweir pSourceList->aUndoActions.Remove(0);
1914cdf0e10cSrcweir pDestinationList->aUndoActions.Insert( pTemp, nDestAction++ );
1915cdf0e10cSrcweir }
1916cdf0e10cSrcweir pDestinationList->nCurUndoAction = pDestinationList->aUndoActions.size();
1917cdf0e10cSrcweir
1918cdf0e10cSrcweir pListAction->aUndoActions.Remove(0);
1919cdf0e10cSrcweir delete pLinkAction;
1920cdf0e10cSrcweir
1921cdf0e10cSrcweir pDocUndoManager->RemoveLastUndoAction();
1922cdf0e10cSrcweir }
1923cdf0e10cSrcweir }
1924cdf0e10cSrcweir }
1925cdf0e10cSrcweir
1926cdf0e10cSrcweir if ( !pListAction->aUndoActions.empty() )
1927cdf0e10cSrcweir {
1928cdf0e10cSrcweir // now we have to move all remaining doc undo actions from the top undo
1929cdf0e10cSrcweir // list to the previous undo list and remove the top undo list
1930cdf0e10cSrcweir
1931cdf0e10cSrcweir size_t nCount = pListAction->aUndoActions.size();
1932cdf0e10cSrcweir size_t nDestAction = pPrevListAction->aUndoActions.size();
1933cdf0e10cSrcweir while( nCount-- )
1934cdf0e10cSrcweir {
1935cdf0e10cSrcweir SfxUndoAction* pTemp = pListAction->aUndoActions[0].pAction;
1936cdf0e10cSrcweir pListAction->aUndoActions.Remove(0);
1937cdf0e10cSrcweir if( pTemp )
1938cdf0e10cSrcweir pPrevListAction->aUndoActions.Insert( pTemp, nDestAction++ );
1939cdf0e10cSrcweir }
1940cdf0e10cSrcweir pPrevListAction->nCurUndoAction = pPrevListAction->aUndoActions.size();
1941cdf0e10cSrcweir }
1942cdf0e10cSrcweir
1943cdf0e10cSrcweir rOutlineUndo.RemoveLastUndoAction();
1944cdf0e10cSrcweir }
1945cdf0e10cSrcweir }
1946cdf0e10cSrcweir }
1947cdf0e10cSrcweir }
1948cdf0e10cSrcweir }
1949cdf0e10cSrcweir
IMPL_LINK(OutlineView,PaintingFirstLineHdl,PaintFirstLineInfo *,pInfo)1950cdf0e10cSrcweir IMPL_LINK(OutlineView, PaintingFirstLineHdl, PaintFirstLineInfo*, pInfo)
1951cdf0e10cSrcweir {
1952cdf0e10cSrcweir if( pInfo && mpOutliner )
1953cdf0e10cSrcweir {
1954cdf0e10cSrcweir Paragraph* pPara = mpOutliner->GetParagraph( pInfo->mnPara );
1955cdf0e10cSrcweir EditEngine& rEditEngine = const_cast< EditEngine& >( mpOutliner->GetEditEngine() );
1956cdf0e10cSrcweir
1957cdf0e10cSrcweir Size aImageSize( pInfo->mpOutDev->PixelToLogic( maSlideImage.GetSizePixel() ) );
1958cdf0e10cSrcweir Size aOffset( 100, 100 );
1959cdf0e10cSrcweir
1960cdf0e10cSrcweir // paint slide number
1961cdf0e10cSrcweir if( pPara && mpOutliner->HasParaFlag(pPara,PARAFLAG_ISPAGE) )
1962cdf0e10cSrcweir {
1963cdf0e10cSrcweir long nPage = 0; // todo, printing??
1964cdf0e10cSrcweir for ( sal_uInt16 n = 0; n <= pInfo->mnPara; n++ )
1965cdf0e10cSrcweir {
1966cdf0e10cSrcweir Paragraph* p = mpOutliner->GetParagraph( n );
1967cdf0e10cSrcweir if ( mpOutliner->HasParaFlag(p,PARAFLAG_ISPAGE) )
1968cdf0e10cSrcweir nPage++;
1969cdf0e10cSrcweir }
1970cdf0e10cSrcweir
1971cdf0e10cSrcweir long nBulletHeight = (long)mpOutliner->GetLineHeight( pInfo->mnPara );
1972cdf0e10cSrcweir long nFontHeight = 0;
1973cdf0e10cSrcweir if ( !rEditEngine.IsFlatMode() )
1974cdf0e10cSrcweir {
1975cdf0e10cSrcweir // const SvxFontHeightItem& rFH = (const SvxFontHeightItem&)rEditEngine.GetParaAttrib( pInfo->mnPara, EE_CHAR_FONTHEIGHT );
1976cdf0e10cSrcweir // nBulletHeight = rFH.GetHeight();
1977cdf0e10cSrcweir nFontHeight = nBulletHeight / 5;
1978cdf0e10cSrcweir }
1979cdf0e10cSrcweir else
1980cdf0e10cSrcweir {
1981cdf0e10cSrcweir // const SvxFontHeightItem& rFH = (const SvxFontHeightItem&)rEditEngine.GetEmptyItemSet().Get( EE_CHAR_FONTHEIGHT );
1982cdf0e10cSrcweir // nBulletHeight = rFH.GetHeight();
1983cdf0e10cSrcweir nFontHeight = (nBulletHeight * 10) / 25;
1984cdf0e10cSrcweir }
1985cdf0e10cSrcweir
1986cdf0e10cSrcweir Size aFontSz( 0, nFontHeight );
1987cdf0e10cSrcweir
1988cdf0e10cSrcweir Size aOutSize( 2000, nBulletHeight );
1989cdf0e10cSrcweir
1990cdf0e10cSrcweir const float fImageHeight = ((float)aOutSize.Height() * (float)4) / (float)7;
1991cdf0e10cSrcweir const float fImageRatio = (float)aImageSize.Height() / (float)aImageSize.Width();
1992cdf0e10cSrcweir aImageSize.Width() = (long)( fImageRatio * fImageHeight );
1993cdf0e10cSrcweir aImageSize.Height() = (long)( fImageHeight );
1994cdf0e10cSrcweir
1995cdf0e10cSrcweir Point aImagePos( pInfo->mrStartPos );
1996cdf0e10cSrcweir aImagePos.X() += aOutSize.Width() - aImageSize.Width() - aOffset.Width() ;
1997cdf0e10cSrcweir aImagePos.Y() += (aOutSize.Height() - aImageSize.Height()) / 2;
1998cdf0e10cSrcweir
1999cdf0e10cSrcweir pInfo->mpOutDev->DrawImage( aImagePos, aImageSize, maSlideImage );
2000cdf0e10cSrcweir
2001cdf0e10cSrcweir const bool bVertical = mpOutliner->IsVertical();
2002cdf0e10cSrcweir const bool bRightToLeftPara = rEditEngine.IsRightToLeft( pInfo->mnPara );
2003cdf0e10cSrcweir
2004cdf0e10cSrcweir LanguageType eLang = rEditEngine.GetDefaultLanguage();
2005cdf0e10cSrcweir
2006cdf0e10cSrcweir Point aTextPos( aImagePos.X() - aOffset.Width(), pInfo->mrStartPos.Y() );
2007cdf0e10cSrcweir Font aNewFont( OutputDevice::GetDefaultFont( DEFAULTFONT_SANS_UNICODE, eLang, 0 ) );
2008cdf0e10cSrcweir aNewFont.SetSize( aFontSz );
2009cdf0e10cSrcweir // aNewFont.SetAlign( aBulletFont.GetAlign() );
2010cdf0e10cSrcweir aNewFont.SetVertical( bVertical );
2011cdf0e10cSrcweir aNewFont.SetOrientation( bVertical ? 2700 : 0 );
2012cdf0e10cSrcweir aNewFont.SetColor( COL_AUTO );
2013cdf0e10cSrcweir pInfo->mpOutDev->SetFont( aNewFont );
2014cdf0e10cSrcweir String aPageText = String::CreateFromInt32( nPage );
2015cdf0e10cSrcweir Size aTextSz;
2016cdf0e10cSrcweir aTextSz.Width() = pInfo->mpOutDev->GetTextWidth( aPageText );
2017cdf0e10cSrcweir aTextSz.Height() = pInfo->mpOutDev->GetTextHeight();
2018cdf0e10cSrcweir // long nBulletHeight = !bVertical ? aBulletArea.GetHeight() : aBulletArea.GetWidth();
2019cdf0e10cSrcweir if ( !bVertical )
2020cdf0e10cSrcweir {
2021cdf0e10cSrcweir aTextPos.Y() += (aOutSize.Height() - aTextSz.Height()) / 2;
2022cdf0e10cSrcweir if ( !bRightToLeftPara )
2023cdf0e10cSrcweir {
2024cdf0e10cSrcweir aTextPos.X() -= aTextSz.Width();
2025cdf0e10cSrcweir }
2026cdf0e10cSrcweir else
2027cdf0e10cSrcweir {
2028cdf0e10cSrcweir aTextPos.X() += aTextSz.Width();
2029cdf0e10cSrcweir }
2030cdf0e10cSrcweir }
2031cdf0e10cSrcweir else
2032cdf0e10cSrcweir {
2033cdf0e10cSrcweir aTextPos.Y() -= aTextSz.Width();
2034cdf0e10cSrcweir aTextPos.X() += nBulletHeight / 2;
2035cdf0e10cSrcweir }
2036cdf0e10cSrcweir pInfo->mpOutDev->DrawText( aTextPos, aPageText );
2037cdf0e10cSrcweir }
2038cdf0e10cSrcweir }
2039cdf0e10cSrcweir
2040cdf0e10cSrcweir return 0;
2041cdf0e10cSrcweir }
2042cdf0e10cSrcweir
2043cdf0e10cSrcweir #if 0
2044cdf0e10cSrcweir sal_Int32 OutlineView::GetPageNumberWidthPixel()
2045cdf0e10cSrcweir {
2046cdf0e10cSrcweir Window* pActWin = mpOutlineViewShell->GetActiveWindow();
2047cdf0e10cSrcweir if( pActWin )
2048cdf0e10cSrcweir {
2049cdf0e10cSrcweir Font aOldFont( pActWin->GetFont() );
2050cdf0e10cSrcweir pActWin->SetFont( maPageNumberFont );
2051cdf0e10cSrcweir Size aSize( pActWin->GetTextWidth( String( RTL_CONSTASCII_USTRINGPARAM("X" ) ) ), 0 );
2052cdf0e10cSrcweir sal_Int32 nWidth = pActWin->LogicToPixel( aSize ).Width() * 5;
2053cdf0e10cSrcweir
2054cdf0e10cSrcweir const String aBulletStr( sal_Unicode( 0xE011 ) );
2055cdf0e10cSrcweir pActWin->SetFont( maBulletFont);
2056cdf0e10cSrcweir
2057cdf0e10cSrcweir aSize.Width() = pActWin->GetTextWidth(aBulletStr);
2058cdf0e10cSrcweir nWidth += pActWin->LogicToPixel( aSize ).Width();
2059cdf0e10cSrcweir
2060cdf0e10cSrcweir pActWin->SetFont( aOldFont );
2061cdf0e10cSrcweir
2062cdf0e10cSrcweir mnPageNumberWidthPixel = nWidth;
2063cdf0e10cSrcweir }
2064cdf0e10cSrcweir return mnPageNumberWidthPixel;
2065cdf0e10cSrcweir }
2066cdf0e10cSrcweir #endif
2067cdf0e10cSrcweir
2068cdf0e10cSrcweir // --------------------------------------------------------------------
2069cdf0e10cSrcweir
UpdateParagraph(sal_uInt16 nPara)2070cdf0e10cSrcweir void OutlineView::UpdateParagraph( sal_uInt16 nPara )
2071cdf0e10cSrcweir {
2072cdf0e10cSrcweir if( mpOutliner )
2073cdf0e10cSrcweir {
2074cdf0e10cSrcweir SfxItemSet aNewAttrs2( mpOutliner->GetParaAttribs( nPara ) );
2075cdf0e10cSrcweir aNewAttrs2.Put( maLRSpaceItem );
2076cdf0e10cSrcweir mpOutliner->SetParaAttribs( nPara, aNewAttrs2 );
2077cdf0e10cSrcweir }
2078cdf0e10cSrcweir }
2079cdf0e10cSrcweir
2080cdf0e10cSrcweir // --------------------------------------------------------------------
2081cdf0e10cSrcweir
OnBeginPasteOrDrop(PasteOrDropInfos *)2082cdf0e10cSrcweir void OutlineView::OnBeginPasteOrDrop( PasteOrDropInfos* /*pInfos*/ )
2083cdf0e10cSrcweir {
2084cdf0e10cSrcweir }
2085cdf0e10cSrcweir
2086cdf0e10cSrcweir /** this is called after a paste or drop operation, make sure that the newly inserted paragraphs
2087cdf0e10cSrcweir get the correct style sheet and new slides are inserted. */
OnEndPasteOrDrop(PasteOrDropInfos * pInfos)2088cdf0e10cSrcweir void OutlineView::OnEndPasteOrDrop( PasteOrDropInfos* pInfos )
2089cdf0e10cSrcweir {
2090cdf0e10cSrcweir SdPage* pPage = 0;
2091cdf0e10cSrcweir SfxStyleSheetBasePool* pStylePool = GetDoc()->GetStyleSheetPool();
2092cdf0e10cSrcweir
2093cdf0e10cSrcweir for( sal_uInt16 nPara = pInfos->nStartPara; nPara <= pInfos->nEndPara; nPara++ )
2094cdf0e10cSrcweir {
2095cdf0e10cSrcweir Paragraph* pPara = mpOutliner->GetParagraph( nPara );
2096cdf0e10cSrcweir
2097cdf0e10cSrcweir bool bPage = mpOutliner->HasParaFlag( pPara, PARAFLAG_ISPAGE );
2098cdf0e10cSrcweir
2099cdf0e10cSrcweir if( !bPage )
2100cdf0e10cSrcweir {
2101cdf0e10cSrcweir SdStyleSheet* pStyleSheet = dynamic_cast< SdStyleSheet* >( mpOutliner->GetStyleSheet( nPara ) );
2102cdf0e10cSrcweir if( pStyleSheet )
2103cdf0e10cSrcweir {
2104cdf0e10cSrcweir const OUString aName( pStyleSheet->GetApiName() );
2105cdf0e10cSrcweir if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("title" ) ) )
2106cdf0e10cSrcweir bPage = true;
2107cdf0e10cSrcweir }
2108cdf0e10cSrcweir }
2109cdf0e10cSrcweir
2110cdf0e10cSrcweir if( !pPara )
2111cdf0e10cSrcweir continue; // fatality!?
2112cdf0e10cSrcweir
2113cdf0e10cSrcweir if( bPage && (nPara != pInfos->nStartPara) )
2114cdf0e10cSrcweir {
2115cdf0e10cSrcweir // insert new slide for this paragraph
2116cdf0e10cSrcweir pPage = InsertSlideForParagraph( pPara );
2117cdf0e10cSrcweir }
2118cdf0e10cSrcweir else
2119cdf0e10cSrcweir {
2120cdf0e10cSrcweir // newly inserted non page paragraphs get the outline style
2121cdf0e10cSrcweir if( !pPage )
2122cdf0e10cSrcweir pPage = GetPageForParagraph( pPara );
2123cdf0e10cSrcweir
2124cdf0e10cSrcweir if( pPage )
2125cdf0e10cSrcweir {
2126cdf0e10cSrcweir SfxStyleSheet* pStyle = pPage->GetStyleSheetForPresObj( bPage ? PRESOBJ_TITLE : PRESOBJ_OUTLINE );
2127cdf0e10cSrcweir
2128cdf0e10cSrcweir if( !bPage )
2129cdf0e10cSrcweir {
2130cdf0e10cSrcweir const sal_Int16 nDepth = mpOutliner->GetDepth( nPara );
2131cdf0e10cSrcweir if( nDepth > 0 )
2132cdf0e10cSrcweir {
2133cdf0e10cSrcweir String aStyleSheetName( pStyle->GetName() );
2134cdf0e10cSrcweir aStyleSheetName.Erase( aStyleSheetName.Len() - 1, 1 );
2135cdf0e10cSrcweir aStyleSheetName += String::CreateFromInt32( nDepth );
2136cdf0e10cSrcweir pStyle = static_cast<SfxStyleSheet*>( pStylePool->Find( aStyleSheetName, pStyle->GetFamily() ) );
2137cdf0e10cSrcweir DBG_ASSERT( pStyle, "sd::OutlineView::OnEndPasteOrDrop(), Style not found!" );
2138cdf0e10cSrcweir }
2139cdf0e10cSrcweir }
2140cdf0e10cSrcweir
2141cdf0e10cSrcweir mpOutliner->SetStyleSheet( nPara, pStyle );
2142cdf0e10cSrcweir }
2143cdf0e10cSrcweir
2144cdf0e10cSrcweir UpdateParagraph( nPara );
2145cdf0e10cSrcweir }
2146cdf0e10cSrcweir }
2147cdf0e10cSrcweir }
2148cdf0e10cSrcweir
2149cdf0e10cSrcweir // ====================================================================
2150cdf0e10cSrcweir
2151cdf0e10cSrcweir
OutlineViewModelChangeGuard(OutlineView & rView)2152cdf0e10cSrcweir OutlineViewModelChangeGuard::OutlineViewModelChangeGuard( OutlineView& rView )
2153cdf0e10cSrcweir : mrView( rView )
2154cdf0e10cSrcweir {
2155cdf0e10cSrcweir mrView.BeginModelChange();
2156cdf0e10cSrcweir }
2157cdf0e10cSrcweir
~OutlineViewModelChangeGuard()2158cdf0e10cSrcweir OutlineViewModelChangeGuard::~OutlineViewModelChangeGuard()
2159cdf0e10cSrcweir {
2160cdf0e10cSrcweir mrView.EndModelChange();
2161cdf0e10cSrcweir }
2162cdf0e10cSrcweir
OutlineViewPageChangesGuard(OutlineView * pView)2163cdf0e10cSrcweir OutlineViewPageChangesGuard::OutlineViewPageChangesGuard( OutlineView* pView )
2164cdf0e10cSrcweir : mpView( pView )
2165cdf0e10cSrcweir {
2166cdf0e10cSrcweir if( mpView )
2167cdf0e10cSrcweir mpView->IgnoreCurrentPageChanges( true );
2168cdf0e10cSrcweir }
2169cdf0e10cSrcweir
~OutlineViewPageChangesGuard()2170cdf0e10cSrcweir OutlineViewPageChangesGuard::~OutlineViewPageChangesGuard()
2171cdf0e10cSrcweir {
2172cdf0e10cSrcweir if( mpView )
2173cdf0e10cSrcweir mpView->IgnoreCurrentPageChanges( false );
2174cdf0e10cSrcweir }
2175cdf0e10cSrcweir
2176cdf0e10cSrcweir
2177cdf0e10cSrcweir } // end of namespace sd
2178