xref: /aoo41x/main/sd/source/ui/view/outlview.cxx (revision 79aad27f)
1*5b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*5b190011SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*5b190011SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*5b190011SAndrew Rist  * distributed with this work for additional information
6*5b190011SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*5b190011SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*5b190011SAndrew Rist  * "License"); you may not use this file except in compliance
9*5b190011SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*5b190011SAndrew Rist  *
11*5b190011SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*5b190011SAndrew Rist  *
13*5b190011SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*5b190011SAndrew Rist  * software distributed under the License is distributed on an
15*5b190011SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*5b190011SAndrew Rist  * KIND, either express or implied.  See the License for the
17*5b190011SAndrew Rist  * specific language governing permissions and limitations
18*5b190011SAndrew Rist  * under the License.
19*5b190011SAndrew Rist  *
20*5b190011SAndrew Rist  *************************************************************/
21*5b190011SAndrew Rist 
22*5b190011SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sd.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #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