1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: outlview.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sd.hxx"
34 #include "OutlineView.hxx"
36 #include <svx/forbiddencharacterstable.hxx>
37 #include <sfx2/progress.hxx>
38 #include <vcl/wrkwin.hxx>
39 #include <svx/svxids.hrc>
41 #include <svx/eeitem.hxx>
42 #include <svx/editstat.hxx>
43 #include <svx/lrspitem.hxx>
44 #include <svx/svdotext.hxx>
45 #include <sfx2/printer.hxx>
46 #include <sfx2/imagemgr.hxx>
47 #include <sfx2/app.hxx>
48 #include <sfx2/bindings.hxx>
49 #include <svtools/itempool.hxx>
50 #include <svtools/style.hxx>
51 #include <svx/svdorect.hxx>
52 #include <svx/svdundo.hxx>
53 #include <svtools/brdcst.hxx>
54 #include <vcl/msgbox.hxx>
55 #include <svx/adjitem.hxx>
56 #include <svx/tstpitem.hxx>
57 #include <svx/lspcitem.hxx>
58 #include <svx/numitem.hxx>
59 #include <svx/outlobj.hxx>
60 #include <svx/numitem.hxx>
61 #include <svx/editeng.hxx>
64 #include <svx/editobj.hxx>
65 #include <svx/editund2.hxx>
67 #include <svx/editview.hxx>
68 #include <svx/svxfont.hxx>
69 #include <svx/fhgtitem.hxx>
71 #include "DrawDocShell.hxx"
72 #include "drawdoc.hxx"
76 #include "OutlineViewShell.hxx"
79 #include "sdresid.hxx"
80 #include "Outliner.hxx"
81 #include "strings.hrc"
82 #include "EventMultiplexer.hxx"
83 #include "ViewShellBase.hxx"
84 #include "undo/undoobjects.hxx"
85 #include "undo/undomanager.hxx"
86 #include "stlsheet.hxx"
88 using ::rtl::OUString
;
89 using namespace ::com::sun::star::uno
;
90 using namespace ::com::sun::star::frame
;
94 // Breite: DIN A 4, zwei Raender zu je 1 cm
95 #define OUTLINE_PAPERWIDTH 19000
97 // beim Seitenmanipulation Fortschrittsanzeige, wenn mehr Seiten betroffen
99 #define PROCESS_WITH_PROGRESS_THRESHOLD 5
107 TYPEINIT1( OutlineView
, ::sd::View
);
109 /*************************************************************************
113 \************************************************************************/
115 OutlineView::OutlineView( DrawDocShell
* pDocSh
, ::Window
* pWindow
, OutlineViewShell
* pOutlineViewSh
)
116 : ::sd::View(pDocSh
->GetDoc(), pWindow
, pOutlineViewSh
)
117 , mpOutlineViewShell(pOutlineViewSh
)
118 , mpOutliner( mpDoc
->GetOutliner(TRUE
) )
119 , mpOldParaOrder(NULL
)
120 , mpSelectedParas(NULL
)
121 , mnPagesToProcess(0)
122 , mnPagesProcessed(0)
125 , mbHighContrastMode( false )
126 , maDocColor( COL_WHITE
)
127 , mnPageNumberWidthPixel( 0 )
128 , maLRSpaceItem( 0, 0, 2000, 0, EE_PARA_OUTLLRSPACE
)
130 BOOL bInitOutliner
= FALSE
;
132 if (mpOutliner
->GetViewCount() == 0)
134 // Outliner initialisieren: Referenz-Device setzen
135 bInitOutliner
= TRUE
;
136 mpOutliner
->Init( OUTLINERMODE_OUTLINEVIEW
);
138 SfxStyleSheet* pTitleSheet = mpDoc->GetSdPage( 0, PK_STANDARD )->GetStyleSheetForPresObj( PRESOBJ_TITLE );
142 // set title symbol (level 0)
143 SvxNumBulletItem aNumBulletItem( (const SvxNumBulletItem&) pTitleSheet->GetItemSet().Get(EE_PARA_NUMBULLET) );
144 SvxNumRule aNumRule(* aNumBulletItem.GetNumRule());
145 SvxNumberFormat aFormat( aNumRule.GetLevel(0));
147 const Font* pFont = aFormat.GetBulletFont();
148 if ( pFont ) // if available take font size and color from style
149 aBulletFont = *pFont;
152 aBulletFont.SetColor( COL_AUTO );
153 aBulletFont.SetHeight( 1552 );
155 aBulletFont.SetCharSet(RTL_TEXTENCODING_MS_1252); // and replacing other values by standard
156 aBulletFont.SetName( String( RTL_CONSTASCII_USTRINGPARAM( "StarSymbol" )) );
157 aBulletFont.SetWeight(WEIGHT_NORMAL);
158 aBulletFont.SetUnderline(UNDERLINE_NONE);
159 aBulletFont.SetStrikeout(STRIKEOUT_NONE);
160 aBulletFont.SetItalic(ITALIC_NONE);
161 aBulletFont.SetOutline(FALSE);
162 aBulletFont.SetShadow(FALSE);
163 aFormat.SetBulletFont( &aBulletFont );
164 aFormat.SetBulletChar( 0xE011 ); // StarBats: 0xF000 + 114
165 mpOutliner->OverwriteLevel0Bullet( aFormat );
168 mpOutliner
->SetRefDevice( SD_MOD()->GetRefDevice( *pDocSh
) );
169 ULONG nWidth
= OUTLINE_PAPERWIDTH
;
170 mpOutliner
->SetPaperSize(Size(nWidth
, 400000000));
173 // View in Outliner einfuegen
174 for (USHORT nView
= 0; nView
< MAX_OUTLINERVIEWS
; nView
++)
176 mpOutlinerView
[nView
] = NULL
;
179 mpOutlinerView
[0] = new OutlinerView(mpOutliner
, pWindow
);
181 mpOutlinerView
[0]->SetOutputArea(aNullRect
);
182 mpOutliner
->SetUpdateMode(FALSE
);
183 mpOutliner
->InsertView(mpOutlinerView
[0], LIST_APPEND
);
185 onUpdateStyleSettings( true );
189 // Outliner mit Inhalt fuellen
193 Link
aLink( LINK(this,OutlineView
,EventMultiplexerListener
) );
194 mpOutlineViewShell
->GetViewShellBase().GetEventMultiplexer()->AddEventListener(
196 tools::EventMultiplexerEvent::EID_CURRENT_PAGE
197 | tools::EventMultiplexerEvent::EID_PAGE_ORDER
);
199 LanguageType eLang
= mpOutliner
->GetDefaultLanguage();
200 maPageNumberFont
= OutputDevice::GetDefaultFont( DEFAULTFONT_SANS_UNICODE
, eLang
, 0 );
201 maPageNumberFont
.SetHeight( 500 );
203 maBulletFont
.SetColor( COL_AUTO
);
204 maBulletFont
.SetHeight( 1000 );
205 maBulletFont
.SetCharSet(RTL_TEXTENCODING_MS_1252
); // and replacing other values by standard
206 maBulletFont
.SetName( String( RTL_CONSTASCII_USTRINGPARAM( "StarSymbol" )) );
207 maBulletFont
.SetWeight(WEIGHT_NORMAL
);
208 maBulletFont
.SetUnderline(UNDERLINE_NONE
);
209 maBulletFont
.SetStrikeout(STRIKEOUT_NONE
);
210 maBulletFont
.SetItalic(ITALIC_NONE
);
211 maBulletFont
.SetOutline(FALSE
);
212 maBulletFont
.SetShadow(FALSE
);
215 Reference
<XFrame
> xFrame (mpOutlineViewShell
->GetViewShellBase().GetFrame()->GetTopFrame()->GetFrameInterface(), UNO_QUERY
);
217 const OUString
aSlotURL( RTL_CONSTASCII_USTRINGPARAM( ".uno:ShowSlide" ));
218 maSlideImage
= GetImage( xFrame
, aSlotURL
, true, false /* todo, hc mode */ );
220 // Tell undo manager of the document about the undo manager of the
221 // outliner, so that the former can synchronize with the later.
222 sd::UndoManager
* pDocUndoMgr
= dynamic_cast<sd::UndoManager
*>(mpDocSh
->GetUndoManager());
223 if (pDocUndoMgr
!= NULL
)
224 pDocUndoMgr
->SetLinkedUndoManager(&mpOutliner
->GetUndoManager());
227 /*************************************************************************
229 |* Destruktor, Links restaurieren, Outliner leeren
231 \************************************************************************/
233 OutlineView::~OutlineView()
235 DBG_ASSERT(maDragAndDropModelGuard
.get() == 0, "sd::OutlineView::~OutlineView(), prior drag operation not finished correctly!" );
237 Link
aLink( LINK(this,OutlineView
,EventMultiplexerListener
) );
238 mpOutlineViewShell
->GetViewShellBase().GetEventMultiplexer()->RemoveEventListener( aLink
);
239 DisconnectFromApplication();
244 // OutlinerViews abmelden und zerstoeren
245 for (USHORT nView
= 0; nView
< MAX_OUTLINERVIEWS
; nView
++)
247 if (mpOutlinerView
[nView
] != NULL
)
249 mpOutliner
->RemoveView( mpOutlinerView
[nView
] );
250 delete mpOutlinerView
[nView
];
251 mpOutlinerView
[nView
] = NULL
;
255 if (mpOutliner
->GetViewCount() == 0)
257 // Outliner deinitialisieren: Farbdarstellung einschalten
259 ULONG nCntrl
= mpOutliner
->GetControlWord();
260 mpOutliner
->SetUpdateMode(FALSE
); // sonst wird bei SetControlWord gezeichnet
261 mpOutliner
->SetControlWord(nCntrl
& ~EE_CNTRL_NOCOLORS
);
262 SvtAccessibilityOptions aOptions
;
263 mpOutliner
->ForceAutoColor( aOptions
.GetIsAutomaticFontColor() );
267 DBG_ASSERT(!mpSelectedParas
, "Absatzliste nicht geloescht");
268 DBG_ASSERT(!mpOldParaOrder
, "Absatzliste nicht geloescht");
274 void OutlineView::ConnectToApplication (void)
276 mpOutlineViewShell
->GetActiveWindow()->GrabFocus();
277 Application::AddEventListener(LINK(this, OutlineView
, AppEventListenerHdl
));
283 void OutlineView::DisconnectFromApplication (void)
285 Application::RemoveEventListener(LINK(this, OutlineView
, AppEventListenerHdl
));
291 /*************************************************************************
295 \************************************************************************/
297 void OutlineView::Paint(const Rectangle
& rRect
, ::sd::Window
* pWin
)
299 OutlinerView
* pOlView
= GetViewByWindow(pWin
);
303 pOlView
->HideCursor();
304 pOlView
->Paint(rRect
);
306 pOlView
->ShowCursor(mbFirstPaint
);
309 if( mnPageNumberWidthPixel == 0 )
310 GetPageNumberWidthPixel();
312 const ULONG nParaCount = pOlView->GetOutliner()->GetParagraphCount();
313 EditView& rEditView = pOlView->GetEditView();
315 Font aOldFont( pWin->GetFont() );
317 const String aBulletStr( sal_Unicode( 0xE011 ) );
318 pWin->SetFont( maBulletFont);
319 sal_Int32 nBulletWidth = pWin->GetTextWidth(aBulletStr);
322 for( ULONG nPara = 0; nPara < nParaCount; nPara++ )
324 Paragraph* pPara = pOlView->GetOutliner()->GetParagraph( nPara );
325 if( pPara->HasFlag( PARAFLAG_ISPAGE ) )
327 pWin->SetFont( maPageNumberFont );
328 const String aStr( String::CreateFromInt32( nPage++ ) );
329 Point aPos( rEditView.GetWindowPosTopLeft( (USHORT)nPara ) );
331 sal_Int32 nNumberOffset = pWin->PixelToLogic( Point(mnPageNumberWidthPixel, 0) ).X() - nBulletWidth;
332 sal_Int32 nLineHeight = pOlView->GetOutliner()->GetLineHeight( nPara, 0 );
334 aPos.X() = nNumberOffset;
336 Point aPoint( aPos.X() - pWin->GetTextWidth( aStr ), aPos.Y() + ( nLineHeight - maPageNumberFont.GetHeight()) / 2 );
337 pWin->DrawText( aPoint, aStr );
339 aPoint.X() = aPos.X();
340 aPoint.Y() = aPos.Y() +( nLineHeight - maBulletFont.GetHeight()) / 2;
341 pWin->SetFont( maBulletFont );
342 pWin->DrawText( aPoint, aBulletStr );
346 pWin->SetFont( aOldFont );
348 mbFirstPaint
= FALSE
;
352 void OutlineView::InvalidateSlideNumberArea()
355 for( sal_Int16 nView = 0; nView < MAX_OUTLINERVIEWS; ++nView )
357 if (mpOutlinerView[nView] != NULL)
359 ::Window* pWindow = mpOutlinerView[nView]->GetWindow();
362 Rectangle aRect( Point(0,0), pWindow->GetOutputSize() );
363 aRect.nRight = aRect.nLeft + pWindow->PixelToLogic( Point( mnPageNumberWidthPixel, 0 ) ).X() * 2;
365 pWindow->Invalidate(aRect);
372 /*************************************************************************
374 |* Fenster-Groesse hat sich geaendert
376 \************************************************************************/
378 void OutlineView::AdjustPosSizePixel(const Point
&,const Size
&,::sd::Window
*)
382 /*************************************************************************
384 |* ein Fenster hinzufuegen
386 \************************************************************************/
388 void OutlineView::AddWindowToPaintView(OutputDevice
* pWin
)
391 BOOL bValidArea
= FALSE
;
392 Rectangle aOutputArea
;
393 const Color
aWhiteColor( COL_WHITE
);
396 while (nView
< MAX_OUTLINERVIEWS
&& !bAdded
)
398 if (mpOutlinerView
[nView
] == NULL
)
400 mpOutlinerView
[nView
] = new OutlinerView(mpOutliner
, dynamic_cast< ::sd::Window
* >(pWin
));
401 mpOutlinerView
[nView
]->SetBackgroundColor( aWhiteColor
);
402 mpOutliner
->InsertView(mpOutlinerView
[nView
], LIST_APPEND
);
407 mpOutlinerView
[nView
]->SetOutputArea(aOutputArea
);
410 else if (!bValidArea
)
412 aOutputArea
= mpOutlinerView
[nView
]->GetOutputArea();
419 // weisser Hintergrund im Outliner
420 pWin
->SetBackground( Wallpaper( aWhiteColor
) );
422 ::sd::View::AddWindowToPaintView(pWin
);
425 /*************************************************************************
427 |* ein Fenster entfernen
429 \************************************************************************/
431 void OutlineView::DeleteWindowFromPaintView(OutputDevice
* pWin
)
433 BOOL bRemoved
= FALSE
;
437 while (nView
< MAX_OUTLINERVIEWS
&& !bRemoved
)
439 if (mpOutlinerView
[nView
] != NULL
)
441 pWindow
= mpOutlinerView
[nView
]->GetWindow();
445 mpOutliner
->RemoveView( mpOutlinerView
[nView
] );
446 delete mpOutlinerView
[nView
];
447 mpOutlinerView
[nView
] = NULL
;
455 ::sd::View::DeleteWindowFromPaintView(pWin
);
458 /*************************************************************************
460 |* Zeiger der dem Fenster entsprechenden OutlinerView zurueckgeben.
462 \************************************************************************/
464 OutlinerView
* OutlineView::GetViewByWindow (::Window
* pWin
) const
466 OutlinerView
* pOlView
= NULL
;
467 for (USHORT nView
= 0; nView
< MAX_OUTLINERVIEWS
; nView
++)
469 if (mpOutlinerView
[nView
] != NULL
)
471 if ( pWin
== mpOutlinerView
[nView
]->GetWindow() )
473 pOlView
= mpOutlinerView
[nView
];
481 /*************************************************************************
483 |* Ermittelt den Titel vor einem beliebigen Absatz.
485 \************************************************************************/
487 Paragraph
* OutlineView::GetPrevTitle(const Paragraph
* pPara
)
489 sal_Int32 nPos
= mpOutliner
->GetAbsPos(const_cast<Paragraph
*>(pPara
));
495 pPara
= mpOutliner
->GetParagraph(--nPos
);
496 if( mpOutliner
->HasParaFlag(pPara
, PARAFLAG_ISPAGE
) )
498 return const_cast< Paragraph
* >( pPara
);
506 /*************************************************************************
508 |* Ermittelt den Titel nach einem beliebigen Absatz.
510 \************************************************************************/
512 Paragraph
* OutlineView::GetNextTitle(const Paragraph
* pPara
)
514 Paragraph
* pResult
= const_cast< Paragraph
* >( pPara
);
516 sal_Int32 nPos
= mpOutliner
->GetAbsPos(pResult
);
520 pResult
= mpOutliner
->GetParagraph(++nPos
);
521 if( pResult
&& mpOutliner
->HasParaFlag(pResult
, PARAFLAG_ISPAGE
) )
529 /*************************************************************************
531 |* Handler fuer das Einfuegen von Seiten (Absaetzen)
533 \************************************************************************/
535 IMPL_LINK( OutlineView
, ParagraphInsertedHdl
, ::Outliner
*, pOutliner
)
537 // DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::ParagraphInsertedHdl(), model change without undo?!" );
539 // we get calls to this handler during binary insert of drag and drop contents but
540 // we ignore it here and handle it later in OnEndPasteOrDrop()
541 if( maDragAndDropModelGuard
.get() == 0 )
543 OutlineViewPageChangesGuard
aGuard(this);
545 Paragraph
* pPara
= pOutliner
->GetHdlParagraph();
547 USHORT nAbsPos
= (USHORT
)mpOutliner
->GetAbsPos( pPara
);
549 UpdateParagraph( nAbsPos
);
551 if( (nAbsPos
== 0) || mpOutliner
->HasParaFlag(pPara
,PARAFLAG_ISPAGE
) || mpOutliner
->HasParaFlag(mpOutliner
->GetParagraph( nAbsPos
-1 ), PARAFLAG_ISPAGE
) )
553 InsertSlideForParagraph( pPara
);
554 InvalidateSlideNumberArea();
561 /** creates and inserts an empty slide for the given paragraph */
562 SdPage
* OutlineView::InsertSlideForParagraph( Paragraph
* pPara
)
564 DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::InsertSlideForParagraph(), model change without undo?!" );
566 OutlineViewPageChangesGuard
aGuard(this);
568 mpOutliner
->SetParaFlag( pPara
, PARAFLAG_ISPAGE
);
569 // wieviele Titel sind vor dem neuen Titelabsatz?
570 ULONG nExample
= 0L; // Position der "Vorbild"seite
571 ULONG nTarget
= 0L; // Einfuegeposition
574 pPara
= GetPrevTitle(pPara
);
580 // was der Outliner nicht kann, muss hier wieder wettgemacht werden:
581 // wenn VOR dem ersten Absatz ein neuer Absatz mit RETURN erzeugt wird,
582 // meldet der Outliner den bereits bestehenden (jetzt nach unten
583 // gerutschten) Absatz als neuen Absatz; nicht darauf reinfallen!
586 String
aTest(mpOutliner
->GetText( mpOutliner
->GetParagraph( 0 ) ));
587 if (aTest
.Len() == 0)
594 // "Vorbild"seite ist - wenn vorhanden - die Vorgaengerseite
597 nExample
= nTarget
- 1;
599 USHORT nPageCount
= mpDoc
->GetSdPageCount( PK_STANDARD
);
600 if( nExample
>= nPageCount
)
601 nExample
= nPageCount
- 1;
604 /**********************************************************************
605 * Es wird stets zuerst eine Standardseite und dann eine
606 * Notizseite erzeugt. Es ist sichergestellt, dass auf eine
607 * Standardseite stets die zugehoerige Notizseite folgt.
608 * Vorangestellt ist genau eine Handzettelseite
609 **********************************************************************/
611 // diese Seite hat Vorbildfunktion
612 SdPage
* pExample
= (SdPage
*)mpDoc
->GetSdPage((USHORT
)nExample
, PK_STANDARD
);
613 SdPage
* pPage
= (SdPage
*)mpDoc
->AllocPage(FALSE
);
615 pPage
->SetLayoutName(pExample
->GetLayoutName());
618 mpDoc
->InsertPage(pPage
, (USHORT
)(nTarget
) * 2 + 1);
619 if( isRecordingUndo() )
620 AddUndo(mpDoc
->GetSdrUndoFactory().CreateUndoNewPage(*pPage
));
622 // der Standardseite eine Masterpage zuweisen
623 pPage
->TRG_SetMasterPage(pExample
->TRG_GetMasterPage());
625 // Seitengroesse setzen
626 pPage
->SetSize(pExample
->GetSize());
627 pPage
->SetBorder( pExample
->GetLftBorder(),
628 pExample
->GetUppBorder(),
629 pExample
->GetRgtBorder(),
630 pExample
->GetLwrBorder() );
632 // neue Praesentationsobjekte anlegen (auf <Titel> oder
633 // <Titel mit Untertitel> folgt <Titel mit Gliederung>, ansonsten
634 // wird das Layout von der Vorgaengerseite uebernommen)
635 AutoLayout eAutoLayout
= pExample
->GetAutoLayout();
636 if (eAutoLayout
== AUTOLAYOUT_TITLE
||
637 eAutoLayout
== AUTOLAYOUT_ONLY_TITLE
)
639 pPage
->SetAutoLayout(AUTOLAYOUT_ENUM
, TRUE
);
643 pPage
->SetAutoLayout(pExample
->GetAutoLayout(), TRUE
);
646 /**********************************************************************
647 |* jetzt die Notizseite
648 \*********************************************************************/
649 pExample
= (SdPage
*)mpDoc
->GetSdPage((USHORT
)nExample
, PK_NOTES
);
650 SdPage
* pNotesPage
= (SdPage
*)mpDoc
->AllocPage(FALSE
);
652 pNotesPage
->SetLayoutName(pExample
->GetLayoutName());
654 pNotesPage
->SetPageKind(PK_NOTES
);
656 // einfuegen (Notizseite)
657 mpDoc
->InsertPage(pNotesPage
, (USHORT
)(nTarget
) * 2 + 2);
658 if( isRecordingUndo() )
659 AddUndo(mpDoc
->GetSdrUndoFactory().CreateUndoNewPage(*pNotesPage
));
661 // der Notizseite eine Masterpage zuweisen
662 pNotesPage
->TRG_SetMasterPage(pExample
->TRG_GetMasterPage());
664 // Seitengroesse setzen, es muss bereits eine Seite vorhanden sein
665 pNotesPage
->SetSize(pExample
->GetSize());
666 pNotesPage
->SetBorder( pExample
->GetLftBorder(),
667 pExample
->GetUppBorder(),
668 pExample
->GetRgtBorder(),
669 pExample
->GetLwrBorder() );
671 // neue Praesentationsobjekte anlegen
672 pNotesPage
->SetAutoLayout(pExample
->GetAutoLayout(), TRUE
);
674 mpOutliner
->UpdateFields();
679 /*************************************************************************
681 |* Handler fuer das Loeschen von Seiten (Absaetzen)
683 \************************************************************************/
685 IMPL_LINK( OutlineView
, ParagraphRemovingHdl
, ::Outliner
*, pOutliner
)
687 DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::ParagraphRemovingHdl(), model change without undo?!" );
689 OutlineViewPageChangesGuard
aGuard(this);
691 Paragraph
* pPara
= pOutliner
->GetHdlParagraph();
692 if( pOutliner
->HasParaFlag( pPara
, PARAFLAG_ISPAGE
) )
694 // wieviele Titel sind vor dem fraglichen Titelabsatz?
698 pPara
= GetPrevTitle(pPara
);
702 // Seite und Notizseite loeschen
703 USHORT nAbsPos
= (USHORT
)nPos
* 2 + 1;
704 SdrPage
* pPage
= mpDoc
->GetPage(nAbsPos
);
705 if( isRecordingUndo() )
706 AddUndo(mpDoc
->GetSdrUndoFactory().CreateUndoDeletePage(*pPage
));
707 mpDoc
->RemovePage(nAbsPos
);
709 nAbsPos
= (USHORT
)nPos
* 2 + 1;
710 pPage
= mpDoc
->GetPage(nAbsPos
);
711 if( isRecordingUndo() )
712 AddUndo(mpDoc
->GetSdrUndoFactory().CreateUndoDeletePage(*pPage
));
713 mpDoc
->RemovePage(nAbsPos
);
715 // ggfs. Fortschrittsanzeige
716 if (mnPagesToProcess
)
721 mpProgress
->SetState(mnPagesProcessed
);
723 if (mnPagesProcessed
== mnPagesToProcess
)
730 mnPagesToProcess
= 0;
731 mnPagesProcessed
= 0;
734 pOutliner
->UpdateFields();
737 InvalidateSlideNumberArea();
742 /*************************************************************************
744 |* Handler fuer das Aendern der Einruecktiefe von Absaetzen (macht ggfs.
745 |* das Einfuegen oder Loeschen von Seiten notwendig)
747 \************************************************************************/
749 IMPL_LINK( OutlineView
, DepthChangedHdl
, ::Outliner
*, pOutliner
)
751 DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::DepthChangedHdl(), no undo for model change?!" );
753 OutlineViewPageChangesGuard
aGuard(this);
755 Paragraph
* pPara
= pOutliner
->GetHdlParagraph();
756 if( pOutliner
->HasParaFlag( pPara
, PARAFLAG_ISPAGE
) && ((pOutliner
->GetPrevFlags() & PARAFLAG_ISPAGE
) == 0) )
758 // the current paragraph is transformed into a slide
760 mpOutliner
->SetDepth( pPara
, -1 );
762 // werden da etwa mehrere Level-1-Absaetze auf Level 0 gebracht und
763 // wir sollten eine Fortschrittsanzeige oder Eieruhr aufsetzen und
764 // haben es noch nicht getan?
765 if (mnPagesToProcess
== 0)
767 Window
* pActWin
= mpOutlineViewShell
->GetActiveWindow();
768 OutlinerView
* pOlView
= GetViewByWindow(pActWin
);
769 List
* pList
= pOlView
->CreateSelectionList();
771 Paragraph
* pParagraph
= (Paragraph
*)pList
->First();
774 if( !pOutliner
->HasParaFlag( pParagraph
, PARAFLAG_ISPAGE
) && (pOutliner
->GetDepth( (USHORT
) pOutliner
->GetAbsPos( pParagraph
) ) <= 0) )
776 pParagraph
= (Paragraph
*)pList
->Next();
779 mnPagesToProcess
++; // der Absatz, der jetzt schon auf Level 0
780 // steht, gehoert auch dazu
781 mnPagesProcessed
= 0;
783 if (mnPagesToProcess
> PROCESS_WITH_PROGRESS_THRESHOLD
)
788 const String
aStr(SdResId(STR_CREATE_PAGES
));
789 mpProgress
= new SfxProgress( GetDocSh(), aStr
, mnPagesToProcess
);
793 mpDocSh
->SetWaitCursor( TRUE
);
798 ParagraphInsertedHdl(pOutliner
);
802 // muss eine Fortschrittsanzeige gepflegt werden?
803 if (mnPagesToProcess
> PROCESS_WITH_PROGRESS_THRESHOLD
)
806 mpProgress
->SetState(mnPagesProcessed
);
809 // war das die letzte Seite?
810 if (mnPagesProcessed
== mnPagesToProcess
)
812 if (mnPagesToProcess
> PROCESS_WITH_PROGRESS_THRESHOLD
&& mpProgress
)
818 mpDocSh
->SetWaitCursor( FALSE
);
820 mnPagesToProcess
= 0;
821 mnPagesProcessed
= 0;
823 pOutliner
->UpdateFields();
825 else if( !pOutliner
->HasParaFlag( pPara
, PARAFLAG_ISPAGE
) && ((pOutliner
->GetPrevFlags() & PARAFLAG_ISPAGE
) != 0) )
827 // the paragraph was a page but now becomes a normal paragraph
829 // how many titles are before the title paragraph in question?
831 Paragraph
* pParagraph
= pPara
;
834 pParagraph
= GetPrevTitle(pParagraph
);
838 // Seite und Notizseite loeschen
840 USHORT nAbsPos
= (USHORT
)nPos
* 2 + 1;
841 SdrPage
* pPage
= mpDoc
->GetPage(nAbsPos
);
842 if( isRecordingUndo() )
843 AddUndo(mpDoc
->GetSdrUndoFactory().CreateUndoDeletePage(*pPage
));
844 mpDoc
->RemovePage(nAbsPos
);
846 nAbsPos
= (USHORT
)nPos
* 2 + 1;
847 pPage
= mpDoc
->GetPage(nAbsPos
);
848 if( isRecordingUndo() )
849 AddUndo(mpDoc
->GetSdrUndoFactory().CreateUndoDeletePage(*pPage
));
850 mpDoc
->RemovePage(nAbsPos
);
852 pPage
= GetPageForParagraph( pPara
);
854 mpOutliner
->SetDepth( pPara
, (pPage
&& (static_cast<SdPage
*>(pPage
)->GetAutoLayout() == AUTOLAYOUT_TITLE
)) ? -1 : 0 );
856 // ggfs. Fortschrittsanzeige
857 if (mnPagesToProcess
)
861 mpProgress
->SetState(mnPagesProcessed
);
863 if (mnPagesProcessed
== mnPagesToProcess
)
870 mnPagesToProcess
= 0;
871 mnPagesProcessed
= 0;
874 pOutliner
->UpdateFields();
876 else if ( (pOutliner
->GetPrevDepth() == 1) && ( pOutliner
->GetDepth( (USHORT
) pOutliner
->GetAbsPos( pPara
) ) == 2 ) )
878 // wieviele Titel sind vor dem fraglichen Titelabsatz?
879 sal_Int32 nPos
= -1L;
881 Paragraph
* pParagraph
= pPara
;
884 pParagraph
= GetPrevTitle(pParagraph
);
891 SdPage
*pPage
= (SdPage
*)mpDoc
->GetSdPage( (USHORT
) nPos
, PK_STANDARD
);
893 if(pPage
&& pPage
->GetPresObj(PRESOBJ_TEXT
))
894 pOutliner
->SetDepth( pPara
, 0 );
898 // wieviele Titel sind vor dem fraglichen Titelabsatz?
899 sal_Int32 nPos
= -1L;
901 Paragraph
* pTempPara
= pPara
;
904 pTempPara
= GetPrevTitle(pTempPara
);
911 SdPage
* pPage
= (SdPage
*) mpDoc
->GetSdPage( (USHORT
) nPos
, PK_STANDARD
);
915 SfxStyleSheet
* pStyleSheet
= NULL
;
916 ULONG nPara
= pOutliner
->GetAbsPos( pPara
);
917 sal_Int16 nDepth
= pOutliner
->GetDepth( (USHORT
) nPara
);
918 bool bSubTitle
= pPage
->GetPresObj(PRESOBJ_TEXT
) != NULL
;
920 if( pOutliner
->HasParaFlag(pPara
, PARAFLAG_ISPAGE
) )
922 pStyleSheet
= pPage
->GetStyleSheetForPresObj( PRESOBJ_TITLE
);
926 pStyleSheet
= pPage
->GetStyleSheetForPresObj( PRESOBJ_TEXT
);
930 pStyleSheet
= pPage
->GetStyleSheetForPresObj( PRESOBJ_OUTLINE
);
934 String
aNewStyleSheetName( pStyleSheet
->GetName() );
935 aNewStyleSheetName
.Erase( aNewStyleSheetName
.Len()-1, 1 );
936 aNewStyleSheetName
+= String::CreateFromInt32( nDepth
+1 );
937 SfxStyleSheetBasePool
* pStylePool
= mpDoc
->GetStyleSheetPool();
938 pStyleSheet
= (SfxStyleSheet
*) pStylePool
->Find( aNewStyleSheetName
, pStyleSheet
->GetFamily() );
942 // before we set the style sheet we need to preserve the bullet item
943 // since all items will be deleted while setting a new style sheet
944 SfxItemSet
aOldAttrs( pOutliner
->GetParaAttribs( (USHORT
)nPara
) );
946 pOutliner
->SetStyleSheet( nPara
, pStyleSheet
);
948 // restore the old bullet item but not if the style changed
949 if ( pOutliner
->GetPrevDepth() != -1 && nDepth
!= -1 &&
950 aOldAttrs
.GetItemState( EE_PARA_NUMBULLET
) == SFX_ITEM_ON
)
952 SfxItemSet
aAttrs( pOutliner
->GetParaAttribs( (USHORT
)nPara
) );
953 aAttrs
.Put( *aOldAttrs
.GetItem( EE_PARA_NUMBULLET
) );
954 pOutliner
->SetParaAttribs( (USHORT
)nPara
, aAttrs
);
959 InvalidateSlideNumberArea();
964 /*************************************************************************
966 |* Handler fuer StatusEvents
968 \************************************************************************/
970 IMPL_LINK( OutlineView
, StatusEventHdl
, EditStatus
*, EMPTYARG
)
972 ::sd::Window
* pWin
= mpOutlineViewShell
->GetActiveWindow();
973 OutlinerView
* pOutlinerView
= GetViewByWindow(pWin
);
974 Rectangle aVis
= pOutlinerView
->GetVisArea();
976 // ULONG nWidth = ((SdPage*)mpDoc->GetSdPage(0, PK_STANDARD))->GetSize().Width();
977 ULONG nWidth
= OUTLINE_PAPERWIDTH
;
978 Rectangle aText
= Rectangle(Point(0,0),
980 mpOutliner
->GetTextHeight()));
981 Rectangle
aWin(Point(0,0), pWin
->GetOutputSizePixel());
982 aWin
= pWin
->PixelToLogic(aWin
);
984 if (!aVis
.IsEmpty()) // nicht beim Oeffnen
986 aText
.Bottom() += aWin
.GetHeight();
988 mpOutlineViewShell
->InitWindows(Point(0,0), aText
.GetSize(),
989 Point(aVis
.TopLeft()));
990 mpOutlineViewShell
->UpdateScrollBars();
993 InvalidateSlideNumberArea();
997 IMPL_LINK( OutlineView
, BeginDropHdl
, void *, EMPTYARG
)
999 DBG_ASSERT(maDragAndDropModelGuard
.get() == 0, "sd::OutlineView::BeginDropHdl(), prior drag operation not finished correctly!" );
1001 maDragAndDropModelGuard
.reset( new OutlineViewModelChangeGuard( *this ) );
1005 IMPL_LINK( OutlineView
, EndDropHdl
, void *, EMPTYARG
)
1007 maDragAndDropModelGuard
.reset(0);
1008 InvalidateSlideNumberArea();
1012 /*************************************************************************
1014 |* Handler fuer den Beginn einer Absatzverschiebung
1016 \************************************************************************/
1018 IMPL_LINK( OutlineView
, BeginMovingHdl
, ::Outliner
*, pOutliner
)
1020 DBG_ASSERT(!mpSelectedParas
, "Absatzliste nicht geloescht");
1021 DBG_ASSERT(!mpOldParaOrder
, "Absatzliste nicht geloescht");
1023 OutlineViewPageChangesGuard
aGuard(this);
1025 mpOldParaOrder
= new List
;
1027 // Liste der selektierten Titelabsaetze
1028 mpSelectedParas
= mpOutlinerView
[0]->CreateSelectionList();
1029 Paragraph
* pPara
= static_cast<Paragraph
*>(mpSelectedParas
->First());
1032 if( !pOutliner
->HasParaFlag(pPara
, PARAFLAG_ISPAGE
) )
1034 mpSelectedParas
->Remove();
1035 pPara
= static_cast<Paragraph
*>(mpSelectedParas
->GetCurObject());
1039 pPara
= static_cast<Paragraph
*>(mpSelectedParas
->Next());
1043 // Die zu den selektierten Absaetzen auf Ebene 0 gehoerenden Seiten
1047 pPara
= pOutliner
->GetParagraph( 0 );
1051 if( pOutliner
->HasParaFlag(pPara
, PARAFLAG_ISPAGE
) ) // eine Seite?
1053 mpOldParaOrder
->Insert(pPara
, LIST_APPEND
);
1054 SdPage
* pPage
= mpDoc
->GetSdPage(nPos
, PK_STANDARD
);
1055 pPage
->SetSelected(FALSE
);
1056 if (mpSelectedParas
->Seek(pPara
)) // selektiert?
1058 pPage
->SetSelected(TRUE
);
1062 pPara
= pOutliner
->GetParagraph( ++nParaPos
);
1068 /*************************************************************************
1070 |* Handler fuer das Ende einer Absatzverschiebung
1072 \************************************************************************/
1074 IMPL_LINK( OutlineView
, EndMovingHdl
, ::Outliner
*, pOutliner
)
1076 OutlineViewPageChangesGuard
aGuard(this);
1078 DBG_ASSERT(mpSelectedParas
, "keine Absatzliste");
1079 DBG_ASSERT(mpOldParaOrder
, "keine Absatzliste");
1080 DBG_ASSERT( isRecordingUndo(), "sd::OutlineView::EndMovingHdl(), model change without undo?!" );
1082 // Einfuegeposition anhand des ersten Absatzes suchen
1083 Paragraph
* pSearchIt
= (Paragraph
*)mpSelectedParas
->First();
1085 // den ersten der selektierten Paragraphen in der neuen Ordnung suchen
1086 USHORT nPosNewOrder
= 0;
1088 Paragraph
* pPara
= pOutliner
->GetParagraph( 0 );
1089 Paragraph
* pPrev
= NULL
;
1090 while (pPara
&& pPara
!= pSearchIt
)
1092 if( pOutliner
->HasParaFlag(pPara
, PARAFLAG_ISPAGE
) )
1097 pPara
= pOutliner
->GetParagraph( ++nParaPos
);
1100 USHORT nPos
= nPosNewOrder
; // nPosNewOrder nicht veraendern
1103 nPos
= (USHORT
)-1; // vor der ersten Seite einfuegen
1107 // den Vorgaenger in der alten Ordnung suchen
1108 nPos
= (USHORT
)mpOldParaOrder
->GetPos(pPrev
);
1109 DBG_ASSERT(nPos
!= 0xffff, "Absatz nicht gefunden");
1112 mpDoc
->MovePages(nPos
);
1114 // die Seiten wieder deselektieren
1115 USHORT nPageCount
= (USHORT
)mpSelectedParas
->Count();
1118 SdPage
* pPage
= mpDoc
->GetSdPage(nPosNewOrder
, PK_STANDARD
);
1119 pPage
->SetSelected(FALSE
);
1124 pOutliner
->UpdateFields();
1126 delete mpSelectedParas
;
1127 mpSelectedParas
= NULL
;
1128 delete mpOldParaOrder
;
1129 mpOldParaOrder
= NULL
;
1131 InvalidateSlideNumberArea();
1136 /*************************************************************************
1138 |* Eine Seite des Models nach dem Titeltextobjekt durchsuchen
1140 \************************************************************************/
1142 SdrTextObj
* OutlineView::GetTitleTextObject(SdrPage
* pPage
)
1144 ULONG nObjectCount
= pPage
->GetObjCount();
1145 SdrObject
* pObject
= NULL
;
1146 SdrTextObj
* pResult
= NULL
;
1148 for (ULONG nObject
= 0; nObject
< nObjectCount
; nObject
++)
1150 pObject
= pPage
->GetObj(nObject
);
1151 if (pObject
->GetObjInventor() == SdrInventor
&&
1152 pObject
->GetObjIdentifier() == OBJ_TITLETEXT
)
1154 pResult
= (SdrTextObj
*)pObject
;
1162 /*************************************************************************
1164 |* Eine Seite des Models nach dem Gliederungstextobjekt durchsuchen
1166 \************************************************************************/
1168 SdrTextObj
* OutlineView::GetOutlineTextObject(SdrPage
* pPage
)
1170 ULONG nObjectCount
= pPage
->GetObjCount();
1171 SdrObject
* pObject
= NULL
;
1172 SdrTextObj
* pResult
= NULL
;
1174 for (ULONG nObject
= 0; nObject
< nObjectCount
; nObject
++)
1176 pObject
= pPage
->GetObj(nObject
);
1177 if (pObject
->GetObjInventor() == SdrInventor
&&
1178 pObject
->GetObjIdentifier() == OBJ_OUTLINETEXT
)
1180 pResult
= (SdrTextObj
*)pObject
;
1187 SdrTextObj
* OutlineView::CreateTitleTextObject(SdPage
* pPage
)
1189 DBG_ASSERT( GetTitleTextObject(pPage
) == 0, "sd::OutlineView::CreateTitleTextObject(), there is already a title text object!" );
1191 if( pPage
->GetAutoLayout() == AUTOLAYOUT_NONE
)
1194 pPage
->SetAutoLayout( AUTOLAYOUT_ONLY_TITLE
, true );
1198 // we already have a layout with a title but the title
1199 // object was deleted, create a new one
1200 pPage
->InsertAutoLayoutShape( 0, PRESOBJ_TITLE
, false, pPage
->GetTitleRect(), true );
1203 return GetTitleTextObject(pPage
);
1206 SdrTextObj
* OutlineView::CreateOutlineTextObject(SdPage
* pPage
)
1208 DBG_ASSERT( GetOutlineTextObject(pPage
) == 0, "sd::OutlineView::CreateOutlineTextObject(), there is already a layout text object!" );
1210 AutoLayout eNewLayout
= pPage
->GetAutoLayout();
1211 switch( eNewLayout
)
1213 case AUTOLAYOUT_NONE
:
1214 case AUTOLAYOUT_ONLY_TITLE
:
1215 case AUTOLAYOUT_TITLE
: eNewLayout
= AUTOLAYOUT_ENUM
; break;
1217 case AUTOLAYOUT_CHART
: eNewLayout
= AUTOLAYOUT_CHARTTEXT
; break;
1219 case AUTOLAYOUT_ORG
:
1220 case AUTOLAYOUT_TAB
:
1221 case AUTOLAYOUT_OBJ
: eNewLayout
= AUTOLAYOUT_OBJTEXT
; break;
1226 if( eNewLayout
!= pPage
->GetAutoLayout() )
1228 pPage
->SetAutoLayout( eNewLayout
, true );
1232 // we already have a layout with a text but the text
1233 // object was deleted, create a new one
1234 pPage
->InsertAutoLayoutShape( 0,
1235 (eNewLayout
== AUTOLAYOUT_TITLE
) ? PRESOBJ_TEXT
: PRESOBJ_OUTLINE
,
1236 false, pPage
->GetLayoutRect(), true );
1239 return GetOutlineTextObject(pPage
);
1242 /** updates draw model with all changes from outliner model */
1243 BOOL
OutlineView::PrepareClose(BOOL
)
1245 ::sd::UndoManager
* pDocUndoMgr
= dynamic_cast<sd::UndoManager
*>(mpDocSh
->GetUndoManager());
1246 if (pDocUndoMgr
!= NULL
)
1247 pDocUndoMgr
->SetLinkedUndoManager(NULL
);
1249 mpOutliner
->GetUndoManager().Clear();
1251 const String
aUndoStr(SdResId(STR_UNDO_CHANGE_TITLE_AND_LAYOUT
));
1255 mpDoc
->SetSelected(GetActualPage(), TRUE
);
1260 /*************************************************************************
1262 |* Attribute des selektierten Textes setzen
1264 \************************************************************************/
1266 BOOL
OutlineView::SetAttributes(const SfxItemSet
& rSet
, BOOL
)
1270 OutlinerView
* pOlView
= GetViewByWindow(mpOutlineViewShell
->GetActiveWindow());
1274 pOlView
->SetAttribs(rSet
);
1278 mpOutlineViewShell
->Invalidate (SID_PREVIEW_STATE
);
1283 /*************************************************************************
1285 |* Attribute des selektierten Textes erfragen
1287 \************************************************************************/
1289 BOOL
OutlineView::GetAttributes( SfxItemSet
& rTargetSet
, BOOL
) const
1291 OutlinerView
* pOlView
= GetViewByWindow(
1292 mpOutlineViewShell
->GetActiveWindow());
1293 DBG_ASSERT(pOlView
, "keine OutlinerView gefunden");
1295 rTargetSet
.Put( pOlView
->GetAttribs(), FALSE
);
1299 /** creates outliner model from draw model */
1300 void OutlineView::FillOutliner()
1302 mpOutliner
->GetUndoManager().Clear();
1303 mpOutliner
->EnableUndo(FALSE
);
1305 mpOutliner
->SetUpdateMode(false);
1307 Paragraph
* pTitleToSelect
= NULL
;
1308 ULONG nPageCount
= mpDoc
->GetSdPageCount(PK_STANDARD
);
1310 // fill outliner with paragraphs from slides title & (outlines|subtitles)
1311 for (USHORT nPage
= 0; nPage
< nPageCount
; nPage
++)
1313 SdPage
* pPage
= (SdPage
*)mpDoc
->GetSdPage(nPage
, PK_STANDARD
);
1314 Paragraph
* pPara
= NULL
;
1316 // take text from title shape
1317 SdrTextObj
* pTO
= GetTitleTextObject(pPage
);
1318 if(pTO
&& !(pTO
->IsEmptyPresObj()))
1320 OutlinerParaObject
* pOPO
= pTO
->GetOutlinerParaObject();
1323 BOOL bVertical
= pOPO
->IsVertical();
1324 pOPO
->SetVertical( FALSE
);
1325 mpOutliner
->AddText(*pOPO
);
1326 pOPO
->SetVertical( bVertical
);
1327 pPara
= mpOutliner
->GetParagraph( mpOutliner
->GetParagraphCount()-1 );
1331 if( pPara
== 0 ) // no title, insert an empty paragraph
1333 pPara
= mpOutliner
->Insert(String());
1334 mpOutliner
->SetDepth(pPara
, -1);
1336 // Keine harten Attribute vom vorherigen Absatz uebernehmen
1337 mpOutliner
->SetParaAttribs( (USHORT
)mpOutliner
->GetAbsPos(pPara
),
1338 mpOutliner
->GetEmptyItemSet() );
1340 mpOutliner
->SetStyleSheet( mpOutliner
->GetAbsPos( pPara
), pPage
->GetStyleSheetForPresObj( PRESOBJ_TITLE
) );
1343 mpOutliner
->SetParaFlag( pPara
, PARAFLAG_ISPAGE
);
1345 ULONG nPara
= mpOutliner
->GetAbsPos( pPara
);
1347 UpdateParagraph( (USHORT
)nPara
);
1349 // remember paragraph of currently selected page
1350 if (pPage
->IsSelected())
1351 pTitleToSelect
= pPara
;
1353 // take text from subtitle or outline
1354 pTO
= static_cast<SdrTextObj
*>(pPage
->GetPresObj(PRESOBJ_TEXT
));
1355 const bool bSubTitle
= pTO
!= 0;
1357 if (!pTO
) // if no subtile found, try outline
1358 pTO
= GetOutlineTextObject(pPage
);
1360 if(pTO
&& !(pTO
->IsEmptyPresObj())) // found some text
1362 OutlinerParaObject
* pOPO
= pTO
->GetOutlinerParaObject();
1365 USHORT nParaCount1
= (USHORT
)mpOutliner
->GetParagraphCount();
1366 BOOL bVertical
= pOPO
->IsVertical();
1367 pOPO
->SetVertical( FALSE
);
1368 mpOutliner
->AddText(*pOPO
);
1369 pOPO
->SetVertical( bVertical
);
1371 USHORT nParaCount2
= (USHORT
)mpOutliner
->GetParagraphCount();
1372 for (USHORT n
= nParaCount1
; n
< nParaCount2
; n
++)
1376 Paragraph
* p
= mpOutliner
->GetParagraph(n
);
1377 if(p
&& mpOutliner
->GetDepth( n
) > 0 )
1378 mpOutliner
->SetDepth(p
, 0);
1381 UpdateParagraph( n
);
1387 // place cursor at the start
1388 Paragraph
* pFirstPara
= mpOutliner
->GetParagraph( 0 );
1389 mpOutlinerView
[0]->Select( pFirstPara
, TRUE
, FALSE
);
1390 mpOutlinerView
[0]->Select( pFirstPara
, FALSE
, FALSE
);
1392 // select title of slide that was selected
1394 mpOutlinerView
[0]->Select(pTitleToSelect
, TRUE
, FALSE
);
1398 mpOutliner
->EnableUndo(TRUE
);
1400 mpOutliner
->SetUpdateMode(true);
1403 /*************************************************************************
1405 |* Handler fuer das Loeschen von Level-0-Absaetzen (Seiten): Warnung
1407 \************************************************************************/
1409 IMPL_LINK( OutlineView
, RemovingPagesHdl
, OutlinerView
*, EMPTYARG
)
1411 USHORT nNumOfPages
= mpOutliner
->GetSelPageCount();
1413 if (nNumOfPages
> PROCESS_WITH_PROGRESS_THRESHOLD
)
1415 mnPagesToProcess
= nNumOfPages
;
1416 mnPagesProcessed
= 0;
1419 if (mnPagesToProcess
)
1424 String
aStr(SdResId(STR_DELETE_PAGES
));
1425 mpProgress
= new SfxProgress( GetDocSh(), aStr
, mnPagesToProcess
);
1427 mpOutliner
->UpdateFields();
1429 InvalidateSlideNumberArea();
1434 /*************************************************************************
1436 |* Handler fuer das Einruecken von Level-0-Absaetzen (Seiten): Warnung
1438 \************************************************************************/
1440 IMPL_LINK_INLINE_START( OutlineView
, IndentingPagesHdl
, OutlinerView
*, pOutlinerView
)
1442 return RemovingPagesHdl(pOutlinerView
);
1444 IMPL_LINK_INLINE_END( OutlineView
, IndentingPagesHdl
, OutlinerView
*, pOutlinerView
)
1447 /** returns the first slide that is selected in the outliner or where
1448 the cursor is located */
1449 SdPage
* OutlineView::GetActualPage()
1451 ::sd::Window
* pWin
= mpOutlineViewShell
->GetActiveWindow();
1452 OutlinerView
* pActiveView
= GetViewByWindow(pWin
);
1453 std::auto_ptr
<List
> pSelList( static_cast< List
* >(pActiveView
->CreateSelectionList()) );
1455 SdPage
* pCurrent
= GetPageForParagraph(static_cast<Paragraph
*>(pSelList
->First()) );
1456 DBG_ASSERT( pCurrent
||
1457 (mpDocSh
->GetUndoManager() && static_cast< sd::UndoManager
*>(mpDocSh
->GetUndoManager())->isInUndo()) ||
1458 maDragAndDropModelGuard
.get(),
1459 "sd::OutlineView::GetActualPage(), no current page?" );
1463 return mpDoc
->GetSdPage( 0, PK_STANDARD
);
1466 SdPage
* OutlineView::GetPageForParagraph( Paragraph
* pPara
)
1468 if( !mpOutliner
->HasParaFlag(pPara
,PARAFLAG_ISPAGE
) )
1469 pPara
= GetPrevTitle(pPara
);
1471 sal_uInt32 nPageToSelect
= 0;
1474 pPara
= GetPrevTitle(pPara
);
1479 if( nPageToSelect
< (sal_uInt32
)mpDoc
->GetSdPageCount( PK_STANDARD
) )
1480 return static_cast< SdPage
* >( mpDoc
->GetSdPage( (USHORT
)nPageToSelect
, PK_STANDARD
) );
1485 Paragraph
* OutlineView::GetParagraphForPage( ::Outliner
* pOutl
, SdPage
* pPage
)
1487 // get the number of paragraphs with ident 0 we need to skip before
1488 // we finde the actual page
1489 sal_uInt32 nPagesToSkip
= (pPage
->GetPageNum() - 1) >> 1;
1491 sal_uInt32 nParaPos
= 0;
1492 Paragraph
* pPara
= pOutl
->GetParagraph( 0 );
1495 // if this paragraph is a page ...
1496 if( mpOutliner
->HasParaFlag(pPara
,PARAFLAG_ISPAGE
) )
1498 // see if we already skiped enough pages
1499 if( 0 == nPagesToSkip
)
1500 break; // and if so, end the loop
1502 // we skiped another page
1506 // get next paragraph
1507 pPara
= mpOutliner
->GetParagraph( ++nParaPos
);
1513 /** selects the paragraph for the given page at the outliner view*/
1514 void OutlineView::SetActualPage( SdPage
* pActual
)
1516 if( pActual
&& mpOutliner
&& dynamic_cast<Outliner
*> ( mpOutliner
)->GetIgnoreCurrentPageChangesLevel()==0 && !mbFirstPaint
)
1518 // if we found a paragraph, select its text at the outliner view
1519 Paragraph
* pPara
= GetParagraphForPage( mpOutliner
, pActual
);
1521 mpOutlinerView
[0]->Select( pPara
, TRUE
, FALSE
);
1525 /*************************************************************************
1527 |* StyleSheet aus der Selektion besorgen
1529 \************************************************************************/
1531 SfxStyleSheet
* OutlineView::GetStyleSheet() const
1533 ::sd::Window
* pActWin
= mpOutlineViewShell
->GetActiveWindow();
1534 OutlinerView
* pOlView
= GetViewByWindow(pActWin
);
1535 SfxStyleSheet
* pResult
= pOlView
->GetStyleSheet();
1541 /*************************************************************************
1543 |* Seiten als selektiert / nicht selektiert setzen
1545 \************************************************************************/
1547 void OutlineView::SetSelectedPages()
1549 // Liste der selektierten Titelabsaetze
1550 List
* pSelParas
= mpOutlinerView
[0]->CreateSelectionList();
1551 Paragraph
* pPara
= (Paragraph
*) pSelParas
->First();
1555 if( !mpOutliner
->HasParaFlag(pPara
, PARAFLAG_ISPAGE
) )
1557 pSelParas
->Remove();
1558 pPara
= (Paragraph
*) pSelParas
->GetCurObject();
1562 pPara
= (Paragraph
*) pSelParas
->Next();
1566 // Die zu den selektierten Absaetzen auf Ebene 0 gehoerenden Seiten
1570 pPara
= mpOutliner
->GetParagraph( 0 );
1574 if( mpOutliner
->HasParaFlag(pPara
, PARAFLAG_ISPAGE
) ) // eine Seite?
1576 SdPage
* pPage
= mpDoc
->GetSdPage(nPos
, PK_STANDARD
);
1577 DBG_ASSERT(pPage
!=NULL
,
1578 "Trying to select non-existing page OutlineView::SetSelectedPages()");
1581 pPage
->SetSelected(FALSE
);
1583 if (pSelParas
->Seek(pPara
)) // selektiert?
1584 pPage
->SetSelected(TRUE
);
1590 pPara
= mpOutliner
->GetParagraph( ++nParaPos
);
1595 /*************************************************************************
1597 |* Neue Links setzen
1599 \************************************************************************/
1601 void OutlineView::SetLinks()
1603 // Benachrichtigungs-Links setzen
1604 mpOutliner
->SetParaInsertedHdl(LINK(this, OutlineView
, ParagraphInsertedHdl
));
1605 mpOutliner
->SetParaRemovingHdl(LINK(this, OutlineView
, ParagraphRemovingHdl
));
1606 mpOutliner
->SetDepthChangedHdl(LINK(this, OutlineView
, DepthChangedHdl
));
1607 mpOutliner
->SetBeginMovingHdl(LINK(this, OutlineView
, BeginMovingHdl
));
1608 mpOutliner
->SetEndMovingHdl(LINK(this, OutlineView
, EndMovingHdl
));
1609 mpOutliner
->SetRemovingPagesHdl(LINK(this, OutlineView
, RemovingPagesHdl
));
1610 mpOutliner
->SetIndentingPagesHdl(LINK(this, OutlineView
, IndentingPagesHdl
));
1611 mpOutliner
->SetStatusEventHdl(LINK(this, OutlineView
, StatusEventHdl
));
1612 mpOutliner
->SetBeginDropHdl(LINK(this,OutlineView
, BeginDropHdl
));
1613 mpOutliner
->SetEndDropHdl(LINK(this,OutlineView
, EndDropHdl
));
1614 mpOutliner
->SetPaintFirstLineHdl(LINK(this,OutlineView
,PaintingFirstLineHdl
));
1615 mpOutliner
->SetBeginPasteOrDropHdl(LINK(this,OutlineView
, BeginPasteOrDropHdl
));
1616 mpOutliner
->SetEndPasteOrDropHdl(LINK(this,OutlineView
, EndPasteOrDropHdl
));
1621 /*************************************************************************
1623 |* Alte Links restaurieren
1625 \************************************************************************/
1627 void OutlineView::ResetLinks() const
1629 // alte Links restaurieren
1631 mpOutliner
->SetParaInsertedHdl(aEmptyLink
);
1632 mpOutliner
->SetParaRemovingHdl(aEmptyLink
);
1633 mpOutliner
->SetDepthChangedHdl(aEmptyLink
);
1634 mpOutliner
->SetBeginMovingHdl(aEmptyLink
);
1635 mpOutliner
->SetEndMovingHdl(aEmptyLink
);
1636 mpOutliner
->SetStatusEventHdl(aEmptyLink
);
1637 mpOutliner
->SetRemovingPagesHdl(aEmptyLink
);
1638 mpOutliner
->SetIndentingPagesHdl(aEmptyLink
);
1639 mpOutliner
->SetDrawPortionHdl(aEmptyLink
);
1640 mpOutliner
->SetBeginPasteOrDropHdl(aEmptyLink
);
1641 mpOutliner
->SetEndPasteOrDropHdl(aEmptyLink
);
1644 /*************************************************************************
1648 \************************************************************************/
1650 sal_Int8
OutlineView::AcceptDrop( const AcceptDropEvent
&, DropTargetHelper
&, ::sd::Window
*, USHORT
, USHORT
)
1652 return DND_ACTION_NONE
;
1655 /*************************************************************************
1659 \************************************************************************/
1661 sal_Int8
OutlineView::ExecuteDrop( const ExecuteDropEvent
&, DropTargetHelper
&, ::sd::Window
*, USHORT
, USHORT
)
1663 return DND_ACTION_NONE
;
1666 // #97766# Re-implement GetScriptType for this view to get correct results
1667 sal_uInt16
OutlineView::GetScriptType() const
1669 sal_uInt16 nScriptType
= ::sd::View::GetScriptType();
1673 OutlinerParaObject
* pTempOPObj
= mpOutliner
->CreateParaObject();
1677 nScriptType
= pTempOPObj
->GetTextObject().GetScriptType();
1685 void OutlineView::onUpdateStyleSettings( bool bForceUpdate
/* = false */ )
1687 const bool bHighContrastMode
= Application::GetSettings().GetStyleSettings().GetHighContrastMode() != 0;
1688 if( bForceUpdate
|| (mbHighContrastMode
!= bHighContrastMode
) )
1692 mpOutliner
->ForceAutoColor( bHighContrastMode
);
1694 mbHighContrastMode
= bHighContrastMode
;
1698 svtools::ColorConfig aColorConfig
;
1699 const Color
aDocColor( aColorConfig
.GetColorValue( svtools::DOCCOLOR
).nColor
);
1700 if( bForceUpdate
|| (maDocColor
!= aDocColor
) )
1703 for( nView
= 0; nView
< MAX_OUTLINERVIEWS
; nView
++ )
1705 if (mpOutlinerView
[nView
] != NULL
)
1707 mpOutlinerView
[nView
]->SetBackgroundColor( aDocColor
);
1709 ::Window
* pWindow
= mpOutlinerView
[nView
]->GetWindow();
1712 pWindow
->SetBackground( Wallpaper( aDocColor
) );
1718 mpOutliner
->SetBackgroundColor( aDocColor
);
1720 maDocColor
= aDocColor
;
1724 IMPL_LINK( OutlineView
, AppEventListenerHdl
, void *, EMPTYARG
)
1726 onUpdateStyleSettings();
1733 IMPL_LINK(OutlineView
, EventMultiplexerListener
, ::sd::tools::EventMultiplexerEvent
*, pEvent
)
1737 switch (pEvent
->meEventId
)
1739 case tools::EventMultiplexerEvent::EID_CURRENT_PAGE
:
1740 SetActualPage(mpOutlineViewShell
->GetActualPage());
1741 InvalidateSlideNumberArea();
1744 case tools::EventMultiplexerEvent::EID_PAGE_ORDER
:
1745 if (mpOutliner
!= NULL
&& mpDoc
!=NULL
&& mpOutliner
!= NULL
&& dynamic_cast<Outliner
*> ( mpOutliner
)->GetIgnoreCurrentPageChangesLevel()==0)
1747 if (((mpDoc
->GetPageCount()-1)%2) == 0)
1749 mpOutliner
->Clear();
1751 ::sd::Window
* pWindow
= mpOutlineViewShell
->GetActiveWindow();
1752 if (pWindow
!= NULL
)
1753 pWindow
->Invalidate();
1762 void OutlineView::IgnoreCurrentPageChanges (bool bIgnoreChanges
)
1767 dynamic_cast<Outliner
*> ( mpOutliner
)->IncreIgnoreCurrentPageChangesLevel();
1769 dynamic_cast<Outliner
*> ( mpOutliner
)->DecreIgnoreCurrentPageChangesLevel();
1773 /** call this method before you do anything that can modify the outliner
1774 and or the drawing document model. It will create needed undo actions */
1775 void OutlineView::BeginModelChange()
1777 const String aEmpty
;
1778 mpOutliner
->GetUndoManager().EnterListAction(aEmpty
,aEmpty
);
1779 const String
aUndoStr(SdResId(STR_UNDO_CHANGE_TITLE_AND_LAYOUT
));
1783 /** call this method after BeginModelChange(), when all possible model
1784 changes are done. */
1785 void OutlineView::EndModelChange()
1789 SfxUndoManager
* pDocUndoMgr
= mpDocSh
->GetUndoManager();
1791 bool bHasUndoActions
= pDocUndoMgr
->GetUndoActionCount() != 0;
1795 DBG_ASSERT( bHasUndoActions
== (mpOutliner
->GetUndoManager().GetUndoActionCount() != 0), "sd::OutlineView::EndModelChange(), undo actions not in sync!" );
1797 if( bHasUndoActions
)
1799 SfxLinkUndoAction
* pLink
= new SfxLinkUndoAction(pDocUndoMgr
);
1800 mpOutliner
->GetUndoManager().AddUndoAction(pLink
);
1803 mpOutliner
->GetUndoManager().LeaveListAction();
1805 if( bHasUndoActions
&& mpOutliner
->GetEditEngine().HasTriedMergeOnLastAddUndo() )
1806 TryToMergeUndoActions();
1809 /** updates all changes in the outliner model to the draw model */
1810 void OutlineView::UpdateDocument()
1812 const sal_uInt32 nPageCount
= mpDoc
->GetSdPageCount(PK_STANDARD
);
1813 Paragraph
* pPara
= mpOutliner
->GetParagraph( 0 );
1815 for (nPage
= 0; nPage
< nPageCount
; nPage
++)
1817 SdPage
* pPage
= mpDoc
->GetSdPage( (USHORT
)nPage
, PK_STANDARD
);
1818 mpDoc
->SetSelected(pPage
, FALSE
);
1820 mpOutlineViewShell
->UpdateTitleObject( pPage
, pPara
);
1821 mpOutlineViewShell
->UpdateOutlineObject( pPage
, pPara
);
1824 pPara
= GetNextTitle(pPara
);
1827 DBG_ASSERT( pPara
== 0, "sd::OutlineView::UpdateDocument(), slides are out of sync, creating missing ones" );
1830 SdPage
* pPage
= InsertSlideForParagraph( pPara
);
1831 mpDoc
->SetSelected(pPage
, FALSE
);
1833 mpOutlineViewShell
->UpdateTitleObject( pPage
, pPara
);
1834 mpOutlineViewShell
->UpdateOutlineObject( pPage
, pPara
);
1837 pPara
= GetNextTitle(pPara
);
1841 /** merge edit engine undo actions if possible */
1842 void OutlineView::TryToMergeUndoActions()
1844 SfxUndoManager
& rOutlineUndo
= mpOutliner
->GetUndoManager();
1845 if( rOutlineUndo
.GetUndoActionCount() > 1 )
1847 SfxListUndoAction
* pListAction
= dynamic_cast< SfxListUndoAction
* >( rOutlineUndo
.GetUndoAction(0) );
1848 SfxListUndoAction
* pPrevListAction
= dynamic_cast< SfxListUndoAction
* >( rOutlineUndo
.GetUndoAction(1) );
1849 if( pListAction
&& pPrevListAction
)
1851 // find the top EditUndo action in the top undo action list
1852 USHORT nAction
= pListAction
->aUndoActions
.Count();
1853 EditUndo
* pEditUndo
= 0;
1854 while( !pEditUndo
&& nAction
)
1856 pEditUndo
= dynamic_cast< EditUndo
* >(pListAction
->aUndoActions
[--nAction
]);
1859 USHORT nEditPos
= nAction
; // we need this later to remove the merged undo actions
1861 // make sure it is the only EditUndo action in the top undo list
1862 while( pEditUndo
&& nAction
)
1864 if( dynamic_cast< EditUndo
* >(pListAction
->aUndoActions
[--nAction
]) )
1868 // do we have one and only one EditUndo action in the top undo list?
1871 // yes, see if we can merge it with the prev undo list
1873 nAction
= pPrevListAction
->aUndoActions
.Count();
1874 EditUndo
* pPrevEditUndo
= 0;
1875 while( !pPrevEditUndo
&& nAction
)
1876 pPrevEditUndo
= dynamic_cast< EditUndo
* >(pPrevListAction
->aUndoActions
[--nAction
]);
1878 if( pPrevEditUndo
&& pPrevEditUndo
->Merge( pEditUndo
) )
1880 // ok we merged the only EditUndo of the top undo list with
1881 // the top EditUndo of the previous undo list
1883 // first remove the merged undo action
1884 DBG_ASSERT( pListAction
->aUndoActions
[nEditPos
] == pEditUndo
, "sd::OutlineView::TryToMergeUndoActions(), wrong edit pos!" );
1885 pListAction
->aUndoActions
.Remove(nEditPos
);
1888 // now check if we also can merge the draw undo actions
1889 SfxUndoManager
* pDocUndoManager
= mpDocSh
->GetUndoManager();
1890 if( pDocUndoManager
&& ( pListAction
->aUndoActions
.Count() == 1 ))
1892 SfxLinkUndoAction
* pLinkAction
= dynamic_cast< SfxLinkUndoAction
* >( pListAction
->aUndoActions
[0] );
1893 SfxLinkUndoAction
* pPrevLinkAction
= 0;
1897 nAction
= pPrevListAction
->aUndoActions
.Count();
1898 while( !pPrevLinkAction
&& nAction
)
1899 pPrevLinkAction
= dynamic_cast< SfxLinkUndoAction
* >(pPrevListAction
->aUndoActions
[--nAction
]);
1902 if( pLinkAction
&& pPrevLinkAction
&&
1903 ( pLinkAction
->GetAction() == pDocUndoManager
->GetUndoAction(0) ) &&
1904 ( pPrevLinkAction
->GetAction() == pDocUndoManager
->GetUndoAction(1) ) )
1906 SfxListUndoAction
* pSourceList
= dynamic_cast< SfxListUndoAction
* >(pLinkAction
->GetAction());
1907 SfxListUndoAction
* pDestinationList
= dynamic_cast< SfxListUndoAction
* >(pPrevLinkAction
->GetAction());
1909 if( pSourceList
&& pDestinationList
)
1911 USHORT nCount
= pSourceList
->aUndoActions
.Count();
1912 USHORT nDestAction
= pDestinationList
->aUndoActions
.Count();
1915 const SfxUndoAction
* pTemp
= pSourceList
->aUndoActions
.GetObject(0);
1916 pSourceList
->aUndoActions
.Remove(0);
1917 pDestinationList
->aUndoActions
.Insert( pTemp
, nDestAction
++ );
1919 pDestinationList
->nCurUndoAction
= pDestinationList
->aUndoActions
.Count();
1921 pListAction
->aUndoActions
.Remove(0);
1924 pDocUndoManager
->RemoveLastUndoAction();
1929 if( pListAction
->aUndoActions
.Count() )
1931 // now we have to move all remaining doc undo actions from the top undo
1932 // list to the previous undo list and remove the top undo list
1934 USHORT nCount
= pListAction
->aUndoActions
.Count();
1935 USHORT nDestAction
= pPrevListAction
->aUndoActions
.Count();
1938 const SfxUndoAction
* pTemp
= pListAction
->aUndoActions
.GetObject(0);
1939 pListAction
->aUndoActions
.Remove(0);
1941 pPrevListAction
->aUndoActions
.Insert( pTemp
, nDestAction
++ );
1943 pPrevListAction
->nCurUndoAction
= pPrevListAction
->aUndoActions
.Count();
1946 rOutlineUndo
.RemoveLastUndoAction();
1953 IMPL_LINK(OutlineView
, PaintingFirstLineHdl
, PaintFirstLineInfo
*, pInfo
)
1955 if( pInfo
&& mpOutliner
)
1957 Paragraph
* pPara
= mpOutliner
->GetParagraph( pInfo
->mnPara
);
1958 EditEngine
& rEditEngine
= const_cast< EditEngine
& >( mpOutliner
->GetEditEngine() );
1960 Size
aImageSize( pInfo
->mpOutDev
->PixelToLogic( maSlideImage
.GetSizePixel() ) );
1961 Size
aOffset( 100, 100 );
1963 // paint slide number
1964 if( pPara
&& mpOutliner
->HasParaFlag(pPara
,PARAFLAG_ISPAGE
) )
1966 long nPage
= 0; // todo, printing??
1967 for ( USHORT n
= 0; n
<= pInfo
->mnPara
; n
++ )
1969 Paragraph
* p
= mpOutliner
->GetParagraph( n
);
1970 if ( mpOutliner
->HasParaFlag(p
,PARAFLAG_ISPAGE
) )
1974 long nBulletHeight
= (long)mpOutliner
->GetLineHeight( pInfo
->mnPara
);
1975 long nFontHeight
= 0;
1976 if ( !rEditEngine
.IsFlatMode() )
1978 // const SvxFontHeightItem& rFH = (const SvxFontHeightItem&)rEditEngine.GetParaAttrib( pInfo->mnPara, EE_CHAR_FONTHEIGHT );
1979 // nBulletHeight = rFH.GetHeight();
1980 nFontHeight
= nBulletHeight
/ 5;
1984 // const SvxFontHeightItem& rFH = (const SvxFontHeightItem&)rEditEngine.GetEmptyItemSet().Get( EE_CHAR_FONTHEIGHT );
1985 // nBulletHeight = rFH.GetHeight();
1986 nFontHeight
= (nBulletHeight
* 10) / 25;
1989 Size
aFontSz( 0, nFontHeight
);
1991 Size
aOutSize( 2000, nBulletHeight
);
1993 const float fImageHeight
= ((float)aOutSize
.Height() * (float)4) / (float)7;
1994 const float fImageRatio
= (float)aImageSize
.Height() / (float)aImageSize
.Width();
1995 aImageSize
.Width() = (long)( fImageRatio
* fImageHeight
);
1996 aImageSize
.Height() = (long)( fImageHeight
);
1998 Point
aImagePos( pInfo
->mrStartPos
);
1999 aImagePos
.X() += aOutSize
.Width() - aImageSize
.Width() - aOffset
.Width() ;
2000 aImagePos
.Y() += (aOutSize
.Height() - aImageSize
.Height()) / 2;
2002 pInfo
->mpOutDev
->DrawImage( aImagePos
, aImageSize
, maSlideImage
);
2004 const bool bVertical
= mpOutliner
->IsVertical();
2005 const bool bRightToLeftPara
= rEditEngine
.IsRightToLeft( pInfo
->mnPara
);
2007 LanguageType eLang
= rEditEngine
.GetDefaultLanguage();
2009 Point
aTextPos( aImagePos
.X() - aOffset
.Width(), pInfo
->mrStartPos
.Y() );
2010 Font
aNewFont( OutputDevice::GetDefaultFont( DEFAULTFONT_SANS_UNICODE
, eLang
, 0 ) );
2011 aNewFont
.SetSize( aFontSz
);
2012 // aNewFont.SetAlign( aBulletFont.GetAlign() );
2013 aNewFont
.SetVertical( bVertical
);
2014 aNewFont
.SetOrientation( bVertical
? 2700 : 0 );
2015 aNewFont
.SetColor( COL_AUTO
);
2016 pInfo
->mpOutDev
->SetFont( aNewFont
);
2017 String aPageText
= String::CreateFromInt32( nPage
);
2019 aTextSz
.Width() = pInfo
->mpOutDev
->GetTextWidth( aPageText
);
2020 aTextSz
.Height() = pInfo
->mpOutDev
->GetTextHeight();
2021 // long nBulletHeight = !bVertical ? aBulletArea.GetHeight() : aBulletArea.GetWidth();
2024 aTextPos
.Y() += (aOutSize
.Height() - aTextSz
.Height()) / 2;
2025 if ( !bRightToLeftPara
)
2027 aTextPos
.X() -= aTextSz
.Width();
2031 aTextPos
.X() += aTextSz
.Width();
2036 aTextPos
.Y() -= aTextSz
.Width();
2037 aTextPos
.X() += nBulletHeight
/ 2;
2039 pInfo
->mpOutDev
->DrawText( aTextPos
, aPageText
);
2046 sal_Int32
OutlineView::GetPageNumberWidthPixel()
2048 Window
* pActWin
= mpOutlineViewShell
->GetActiveWindow();
2051 Font
aOldFont( pActWin
->GetFont() );
2052 pActWin
->SetFont( maPageNumberFont
);
2053 Size
aSize( pActWin
->GetTextWidth( String( RTL_CONSTASCII_USTRINGPARAM("X" ) ) ), 0 );
2054 sal_Int32 nWidth
= pActWin
->LogicToPixel( aSize
).Width() * 5;
2056 const String
aBulletStr( sal_Unicode( 0xE011 ) );
2057 pActWin
->SetFont( maBulletFont
);
2059 aSize
.Width() = pActWin
->GetTextWidth(aBulletStr
);
2060 nWidth
+= pActWin
->LogicToPixel( aSize
).Width();
2062 pActWin
->SetFont( aOldFont
);
2064 mnPageNumberWidthPixel
= nWidth
;
2066 return mnPageNumberWidthPixel
;
2069 // --------------------------------------------------------------------
2071 void OutlineView::UpdateParagraph( USHORT nPara
)
2075 SfxItemSet
aNewAttrs2( mpOutliner
->GetParaAttribs( nPara
) );
2076 aNewAttrs2
.Put( maLRSpaceItem
);
2077 mpOutliner
->SetParaAttribs( nPara
, aNewAttrs2
);
2081 // --------------------------------------------------------------------
2083 void OutlineView::OnBeginPasteOrDrop( PasteOrDropInfos
* /*pInfos*/ )
2087 /** this is called after a paste or drop operation, make sure that the newly inserted paragraphs
2088 get the correct style sheet and new slides are inserted. */
2089 void OutlineView::OnEndPasteOrDrop( PasteOrDropInfos
* pInfos
)
2092 SfxStyleSheetBasePool
* pStylePool
= GetDoc()->GetStyleSheetPool();
2094 for( sal_uInt16 nPara
= pInfos
->nStartPara
; nPara
<= pInfos
->nEndPara
; nPara
++ )
2096 Paragraph
* pPara
= mpOutliner
->GetParagraph( nPara
);
2098 bool bPage
= mpOutliner
->HasParaFlag( pPara
, PARAFLAG_ISPAGE
);
2102 SdStyleSheet
* pStyleSheet
= dynamic_cast< SdStyleSheet
* >( mpOutliner
->GetStyleSheet( nPara
) );
2105 const OUString
aName( pStyleSheet
->GetApiName() );
2106 if( aName
.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("title" ) ) )
2112 continue; // fatality!?
2114 if( bPage
&& (nPara
!= pInfos
->nStartPara
) )
2116 // insert new slide for this paragraph
2117 pPage
= InsertSlideForParagraph( pPara
);
2121 // newly inserted non page paragraphs get the outline style
2123 pPage
= GetPageForParagraph( pPara
);
2127 SfxStyleSheet
* pStyle
= pPage
->GetStyleSheetForPresObj( bPage
? PRESOBJ_TITLE
: PRESOBJ_OUTLINE
);
2131 const sal_Int16 nDepth
= mpOutliner
->GetDepth( nPara
);
2134 String
aStyleSheetName( pStyle
->GetName() );
2135 aStyleSheetName
.Erase( aStyleSheetName
.Len() - 1, 1 );
2136 aStyleSheetName
+= String::CreateFromInt32( nDepth
);
2137 pStyle
= static_cast<SfxStyleSheet
*>( pStylePool
->Find( aStyleSheetName
, pStyle
->GetFamily() ) );
2138 DBG_ASSERT( pStyle
, "sd::OutlineView::OnEndPasteOrDrop(), Style not found!" );
2142 mpOutliner
->SetStyleSheet( nPara
, pStyle
);
2145 UpdateParagraph( nPara
);
2150 // ====================================================================
2153 OutlineViewModelChangeGuard::OutlineViewModelChangeGuard( OutlineView
& rView
)
2156 mrView
.BeginModelChange();
2159 OutlineViewModelChangeGuard::~OutlineViewModelChangeGuard()
2161 mrView
.EndModelChange();
2164 OutlineViewPageChangesGuard::OutlineViewPageChangesGuard( OutlineView
* pView
)
2168 mpView
->IgnoreCurrentPageChanges( true );
2171 OutlineViewPageChangesGuard::~OutlineViewPageChangesGuard()
2174 mpView
->IgnoreCurrentPageChanges( false );
2178 } // end of namespace sd