xref: /aoo41x/main/sd/source/ui/view/outlnvsh.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sd.hxx"
30 
31 #include "OutlineViewShell.hxx"
32 
33 #include "ViewShellImplementation.hxx"
34 #include <memory>
35 #include "helpids.h"
36 #include "app.hrc"
37 #include <svx/hyprlink.hxx>
38 #include <svx/hyperdlg.hxx>
39 #include <svx/zoomslideritem.hxx>
40 
41 #include <sfx2/objface.hxx>
42 #include <sot/exchange.hxx>
43 #include <svx/ruler.hxx>
44 #include <svx/zoomitem.hxx>
45 #include <editeng/eeitem.hxx>
46 #include <editeng/flditem.hxx>
47 #include <sfx2/shell.hxx>
48 #include <sfx2/templdlg.hxx>
49 #include <sfx2/viewfac.hxx>
50 #include <sfx2/request.hxx>
51 #include <svx/hlnkitem.hxx>
52 #include <svx/svdotext.hxx>
53 #include <sfx2/dispatch.hxx>
54 #include <vcl/scrbar.hxx>
55 #include <svl/whiter.hxx>
56 #include <editeng/editstat.hxx>
57 #include <svl/itempool.hxx>
58 #include <sfx2/tplpitem.hxx>
59 #include <svx/svdorect.hxx>
60 #include <sot/formats.hxx>
61 #include <com/sun/star/linguistic2/XThesaurus.hpp>
62 #include <com/sun/star/i18n/TransliterationModules.hpp>
63 #include <com/sun/star/i18n/TransliterationModulesExtra.hpp>
64 #include <editeng/unolingu.hxx>
65 #include <comphelper/processfactory.hxx>
66 #include <editeng/outlobj.hxx>
67 #include <svl/cjkoptions.hxx>
68 #include <svtools/cliplistener.hxx>
69 #include <svl/srchitem.hxx>
70 #include <editeng/editobj.hxx>
71 #include "fubullet.hxx"
72 #include "optsitem.hxx"
73 
74 #include "strings.hrc"
75 #include "glob.hrc"
76 #include "res_bmp.hrc"
77 #include "Outliner.hxx"
78 #include "Window.hxx"
79 #include "TextObjectBar.hxx"
80 #include "drawdoc.hxx"
81 #include "sdresid.hxx"
82 #include "sdpage.hxx"
83 #include "fuoltext.hxx"
84 #include "FrameView.hxx"
85 #include "zoomlist.hxx"
86 #include "stlsheet.hxx"
87 #include "slideshow.hxx"
88 #include "SdUnoOutlineView.hxx"
89 #include "SpellDialogChildWindow.hxx"
90 
91 #include "AccessibleOutlineView.hxx"
92 #include "ViewShellBase.hxx"
93 #include "ViewShellManager.hxx"
94 #include "DrawController.hxx"
95 #include "framework/FrameworkHelper.hxx"
96 
97 using ::rtl::OUString;
98 using namespace ::com::sun::star;
99 using namespace ::com::sun::star::uno;
100 using namespace ::com::sun::star::lang;
101 using namespace ::com::sun::star::linguistic2;
102 
103 using namespace sd;
104 #define OutlineViewShell
105 #include "sdslots.hxx"
106 
107 namespace sd {
108 
109 #define MIN_ZOOM	       10       // Minimaler Zoomfaktor
110 #define MAX_ZOOM	     1000	    // Maximaler Zoomfaktor
111 
112 /************************************************************************/
113 
114 
115 /*************************************************************************
116 |*
117 |* SFX-Slotmap und Standardinterface deklarieren
118 |*
119 \************************************************************************/
120 
121 
122 SFX_IMPL_INTERFACE(OutlineViewShell, SfxShell, SdResId(STR_OUTLINEVIEWSHELL))
123 {
124 	SFX_POPUPMENU_REGISTRATION( SdResId(RID_OUTLINE_POPUP) );
125 	SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_TOOLS | SFX_VISIBILITY_STANDARD |
126 								SFX_VISIBILITY_FULLSCREEN | SFX_VISIBILITY_SERVER,
127 								SdResId(RID_OUTLINE_TOOLBOX) );
128     SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_APPLICATION | SFX_VISIBILITY_DESKTOP | SFX_VISIBILITY_STANDARD | SFX_VISIBILITY_CLIENT | SFX_VISIBILITY_VIEWER | SFX_VISIBILITY_READONLYDOC,
129             					SdResId(RID_DRAW_VIEWER_TOOLBOX) );
130 	SFX_CHILDWINDOW_REGISTRATION( SfxTemplateDialogWrapper::GetChildWindowId() );
131 	SFX_CHILDWINDOW_REGISTRATION( SvxHyperlinkDlgWrapper::GetChildWindowId() );
132 	SFX_CHILDWINDOW_REGISTRATION( SvxHlinkDlgWrapper::GetChildWindowId() );
133 	SFX_CHILDWINDOW_REGISTRATION( ::sd::SpellDialogChildWindow::GetChildWindowId() );
134 	SFX_CHILDWINDOW_REGISTRATION( SID_SEARCH_DLG );
135 }
136 
137 
138 TYPEINIT1( OutlineViewShell, ViewShell );
139 
140 
141 /*************************************************************************
142 |*
143 |* gemeinsamer Initialiserungsanteil der beiden Konstruktoren
144 |*
145 \************************************************************************/
146 
147 void OutlineViewShell::Construct(DrawDocShell* )
148 {
149 	sal_Bool bModified = GetDoc()->IsChanged();
150 
151     meShellType = ST_OUTLINE;
152 	Size aSize(29700, 21000);
153 	Point aWinPos (0, 0);
154 	Point aViewOrigin(0, 0);
155 	GetActiveWindow()->SetMinZoomAutoCalc(sal_False);
156 	GetActiveWindow()->SetMinZoom( MIN_ZOOM );
157 	GetActiveWindow()->SetMaxZoom( MAX_ZOOM );
158 	InitWindows(aViewOrigin, aSize, aWinPos);
159 	pOlView = new OutlineView(GetDocSh(), GetActiveWindow(), this);
160 	mpView = pOlView;			 // Pointer der Basisklasse ViewShell
161 
162 	SetPool( &GetDoc()->GetPool() );
163 
164 	SetZoom(69);
165 
166 	// Einstellungen der FrameView uebernehmen
167 	ReadFrameViewData(mpFrameView);
168 
169 	::Outliner* pOutl = pOlView->GetOutliner();
170 	pOutl->SetUpdateMode(sal_True);
171 
172 	if (!bModified)
173 	{
174 		pOutl->ClearModifyFlag();
175 	}
176 
177 	pLastPage = GetActualPage();
178 
179 	String aName( RTL_CONSTASCII_USTRINGPARAM( "OutlineViewShell" ));
180 	SetName (aName);
181 
182 	SetHelpId( SD_IF_SDOUTLINEVIEWSHELL );
183 	GetActiveWindow()->SetHelpId( HID_SDOUTLINEVIEWSHELL );
184 	GetActiveWindow()->SetUniqueId( HID_SDOUTLINEVIEWSHELL );
185 }
186 
187 
188 
189 
190 Reference<drawing::XDrawSubController> OutlineViewShell::CreateSubController (void)
191 {
192     Reference<drawing::XDrawSubController> xSubController;
193 
194     if (IsMainViewShell())
195     {
196         // Create uno sub controller for the main view shell.
197         xSubController = Reference<drawing::XDrawSubController>(
198             new SdUnoOutlineView (
199                 GetViewShellBase().GetDrawController(),
200                 *this,
201                 *GetView()));
202     }
203 
204     return xSubController;
205 }
206 
207 
208 
209 
210 /*************************************************************************
211 |*
212 |* Standard-Konstruktor, Fenster duerfen nicht automatisch zentrieren
213 |*
214 \************************************************************************/
215 
216 OutlineViewShell::OutlineViewShell (
217     SfxViewFrame* pFrame,
218     ViewShellBase& rViewShellBase,
219     ::Window* pParentWindow,
220     FrameView* pFrameViewArgument)
221     : ViewShell(pFrame, pParentWindow, rViewShellBase),
222       pOlView(NULL),
223       pLastPage( NULL ),
224       pClipEvtLstnr(NULL),
225       bPastePossible(false),
226       mbInitialized(false)
227 
228 {
229 	if (pFrameViewArgument != NULL)
230 		mpFrameView = pFrameViewArgument;
231 	else
232         mpFrameView = new FrameView(GetDoc());
233 
234 	mpFrameView->Connect();
235 
236 	Construct(GetDocSh());
237 }
238 
239 /*************************************************************************
240 |*
241 |* Destruktor
242 |*
243 \************************************************************************/
244 
245 OutlineViewShell::~OutlineViewShell()
246 {
247 	DisposeFunctions();
248 
249 	delete pOlView;
250 
251 	mpFrameView->Disconnect();
252 
253 	if ( pClipEvtLstnr )
254 	{
255 		pClipEvtLstnr->AddRemoveListener( GetActiveWindow(), sal_False );
256 		pClipEvtLstnr->ClearCallbackLink();		// #103849# prevent callback if another thread is waiting
257 		pClipEvtLstnr->release();
258 	}
259 }
260 
261 
262 
263 
264 void OutlineViewShell::Shutdown (void)
265 {
266     ViewShell::Shutdown();
267 
268     PrepareClose();
269 }
270 
271 
272 
273 
274 /*************************************************************************
275 |*
276 |* Paint-Methode: das Ereignis wird vom Fenster pWindow an
277 |* die Viewshell und die aktuelle Funktion weitergeleitet
278 |*
279 \************************************************************************/
280 
281 void OutlineViewShell::Paint(const Rectangle& rRect, ::sd::Window* pWin)
282 {
283 	if (pOlView)
284 	{
285 		pOlView->Paint(rRect, pWin);
286 	}
287 
288 	if(HasCurrentFunction())
289 	{
290 		GetCurrentFunction()->Paint(rRect, pWin);
291 	}
292 }
293 
294 void OutlineViewShell::ArrangeGUIElements ()
295 {
296     // Retrieve the current size (thickness) of the scroll bars.  That is
297     // the width of the vertical and the height of the horizontal scroll
298     // bar.
299     int nScrollBarSize =
300         GetParentWindow()->GetSettings().GetStyleSettings().GetScrollBarSize();
301 	maScrBarWH = Size (nScrollBarSize, nScrollBarSize);
302 
303 	ViewShell::ArrangeGUIElements ();
304 
305     ::sd::Window* pWindow = mpContentWindow.get();
306     if (pWindow != NULL)
307     {
308         pWindow->SetMinZoomAutoCalc(sal_False);
309 
310         // pWindow->SetPosSizePixel(rNewPos, Size(nSizeX, nSizeY));
311 
312         // OutputArea der OutlinerView aendern
313         OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWindow);
314 
315         Rectangle aWin(Point(0,0), pWindow->GetOutputSizePixel());
316 //		aWin.nLeft = pOlView->GetPageNumberWidthPixel();
317 
318         aWin = pWindow->PixelToLogic(aWin);
319         pOutlinerView->SetOutputArea(aWin);
320 
321         Rectangle aVis = pOutlinerView->GetVisArea();
322 
323         Rectangle aText = Rectangle(Point(0,0),
324             Size(pOlView->GetPaperWidth(),
325                 pOlView->GetOutliner()->GetTextHeight()));
326         aText.Bottom() += aWin.GetHeight();
327 
328         if (!aWin.IsEmpty())			// nicht beim Oeffnen
329         {
330             InitWindows(Point(0,0), aText.GetSize(), Point(aVis.TopLeft()));
331             UpdateScrollBars();
332         }
333     }
334 }
335 
336 /*************************************************************************
337 |*
338 |* SfxRequests fuer Controller bearbeiten
339 |*
340 \************************************************************************/
341 
342 void OutlineViewShell::ExecCtrl(SfxRequest &rReq)
343 {
344 	sal_uInt16 nSlot = rReq.GetSlot();
345 	switch ( nSlot )
346 	{
347 		case SID_MAIL_SCROLLBODY_PAGEDOWN:
348 		{
349             ExecReq( rReq );
350 			break;
351 		}
352 
353 		case SID_OPT_LOCALE_CHANGED:
354 		{
355 			pOlView->GetOutliner()->UpdateFields();
356 			UpdatePreview( GetActualPage() );
357 			rReq.Done();
358             break;
359 		}
360 
361 		default:
362 		break;
363 	}
364 }
365 
366 
367 
368 
369 void OutlineViewShell::AddWindow (::sd::Window* pWin)
370 {
371     pOlView->AddWindowToPaintView(pWin);
372 }
373 
374 
375 
376 
377 void OutlineViewShell::RemoveWindow (::sd::Window* pWin)
378 {
379     pOlView->DeleteWindowFromPaintView(pWin);
380 }
381 
382 
383 
384 
385 /*************************************************************************
386 |*
387 |* Activate(), beim ersten Aufruf erfolgt ein Update der Felder
388 |*
389 \************************************************************************/
390 void OutlineViewShell::Activate( sal_Bool bIsMDIActivate )
391 {
392     if ( ! mbInitialized)
393     {
394         mbInitialized = true;
395     	SfxRequest aRequest (SID_EDIT_OUTLINER, 0, GetDoc()->GetItemPool());
396         FuPermanent (aRequest);
397     }
398 
399     ViewShell::Activate( bIsMDIActivate );
400     pOlView->SetLinks();
401     pOlView->ConnectToApplication();
402 
403     if( bIsMDIActivate )
404     {
405         OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() );
406         ::Outliner* pOutl = pOutlinerView->GetOutliner();
407         pOutl->UpdateFields();
408     }
409 }
410 
411 /*************************************************************************
412 |*
413 |* Deactivate()
414 |*
415 \************************************************************************/
416 void OutlineViewShell::Deactivate( sal_Bool bIsMDIActivate )
417 {
418     pOlView->DisconnectFromApplication();
419 
420     // #96416# Links must be kept also on deactivated viewshell, to allow drag'n'drop
421     // to function properly
422     // pOlView->ResetLinks();
423 
424     ViewShell::Deactivate( bIsMDIActivate );
425 }
426 
427 /*************************************************************************
428 |*
429 |* Status von Controller-SfxSlots setzen
430 |*
431 \************************************************************************/
432 void OutlineViewShell::GetCtrlState(SfxItemSet &rSet)
433 {
434 	if (SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_HYPERLINK_GETLINK))
435 	{
436 		SvxHyperlinkItem aHLinkItem;
437 
438 		OutlinerView* pOLV = pOlView->GetViewByWindow(GetActiveWindow());
439 		if (pOLV)
440 		{
441 			const SvxFieldItem* pFieldItem = pOLV->GetFieldAtSelection();
442 			if (pFieldItem)
443 			{
444                 ESelection aSel = pOLV->GetSelection();
445                 if ( abs( aSel.nEndPos - aSel.nStartPos ) == 1 )
446                 {
447 				    const SvxFieldData* pField = pFieldItem->GetField();
448 				    if ( pField->ISA(SvxURLField) )
449 				    {
450 					    aHLinkItem.SetName(((const SvxURLField*) pField)->GetRepresentation());
451 					    aHLinkItem.SetURL(((const SvxURLField*) pField)->GetURL());
452 					    aHLinkItem.SetTargetFrame(((const SvxURLField*) pField)->GetTargetFrame());
453 				    }
454                 }
455 			}
456 		}
457 		rSet.Put(aHLinkItem);
458 	}
459     rSet.Put( SfxBoolItem( SID_READONLY_MODE, GetDocSh()->IsReadOnly() ) );
460 
461 	if ( SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_MAIL_SCROLLBODY_PAGEDOWN) )
462 		rSet.Put( SfxBoolItem( SID_MAIL_SCROLLBODY_PAGEDOWN, sal_True ) );
463 
464 	if ( SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_TRANSLITERATE_HALFWIDTH) ||
465 		 SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_TRANSLITERATE_FULLWIDTH) ||
466 		 SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_TRANSLITERATE_HIRAGANA) ||
467 		 SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_TRANSLITERATE_KATAGANA) )
468 	{
469         SvtCJKOptions aCJKOptions;
470 		if( !aCJKOptions.IsChangeCaseMapEnabled() )
471 		{
472             GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, sal_False );
473             GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, sal_False );
474             GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, sal_False );
475             GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAGANA, sal_False );
476 			rSet.DisableItem( SID_TRANSLITERATE_HALFWIDTH );
477 			rSet.DisableItem( SID_TRANSLITERATE_FULLWIDTH );
478 			rSet.DisableItem( SID_TRANSLITERATE_HIRAGANA );
479 			rSet.DisableItem( SID_TRANSLITERATE_KATAGANA );
480 		}
481         else
482         {
483             GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HALFWIDTH, sal_True );
484             GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_FULLWIDTH, sal_True );
485             GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_HIRAGANA, sal_True );
486             GetViewFrame()->GetBindings().SetVisibleState( SID_TRANSLITERATE_KATAGANA, sal_True );
487         }
488 	}
489 }
490 
491 /*************************************************************************
492 |*
493 |* SfxRequests fuer Support-Funktionen
494 |*
495 \************************************************************************/
496 
497 void OutlineViewShell::FuSupport(SfxRequest &rReq)
498 {
499 	if( rReq.GetSlot() == SID_STYLE_FAMILY && rReq.GetArgs())
500 		GetDocSh()->SetStyleFamily(((SfxUInt16Item&)rReq.GetArgs()->Get( SID_STYLE_FAMILY )).GetValue());
501 
502 	sal_Bool bPreviewState = sal_False;
503 	sal_uLong nSlot = rReq.GetSlot();
504 
505 	std::auto_ptr< OutlineViewModelChangeGuard > aGuard;
506 	if( pOlView && (
507         (nSlot == SID_TRANSLITERATE_SENTENCE_CASE) ||
508         (nSlot == SID_TRANSLITERATE_TITLE_CASE) ||
509         (nSlot == SID_TRANSLITERATE_TOGGLE_CASE) ||
510 		(nSlot == SID_TRANSLITERATE_UPPER) ||
511 		(nSlot == SID_TRANSLITERATE_LOWER) ||
512 		(nSlot == SID_TRANSLITERATE_HALFWIDTH) ||
513 		(nSlot == SID_TRANSLITERATE_FULLWIDTH) ||
514 		(nSlot == SID_TRANSLITERATE_HIRAGANA) ||
515 		(nSlot == SID_TRANSLITERATE_KATAGANA) ||
516 		(nSlot == SID_CUT) ||
517 //		(nSlot == SID_COPY) ||
518 		(nSlot == SID_PASTE) ||
519 		(nSlot == SID_DELETE)))
520 	{
521 		aGuard.reset( new OutlineViewModelChangeGuard( *pOlView ) );
522 	}
523 
524 	switch ( nSlot )
525 	{
526 		case SID_CUT:
527 		{
528 			if(HasCurrentFunction())
529 			{
530 				GetCurrentFunction()->DoCut();
531 			}
532 			else if (pOlView)
533 			{
534 				pOlView->DoCut();
535 			}
536 			rReq.Done();
537 			bPreviewState = sal_True;
538 		}
539 		break;
540 
541 		case SID_COPY:
542 		{
543 			if(HasCurrentFunction())
544 			{
545 				GetCurrentFunction()->DoCopy();
546 			}
547 			else if (pOlView)
548 			{
549 				pOlView->DoCopy();
550 			}
551 			rReq.Done();
552 			bPreviewState = sal_True;
553 		}
554 		break;
555 
556 		case SID_PASTE:
557 		{
558             OutlineViewPageChangesGuard aGuard2(pOlView);
559 
560 			if(HasCurrentFunction())
561 			{
562 				GetCurrentFunction()->DoPaste();
563 			}
564 			else if (pOlView)
565 			{
566 				pOlView->DoPaste();
567 			}
568 			rReq.Done();
569 			bPreviewState = sal_True;
570 		}
571 		break;
572 
573 		case SID_DELETE:
574 		{
575 			if( pOlView )
576 			{
577 				OutlinerView* pOutlView = pOlView->GetViewByWindow(GetActiveWindow());
578 				if (pOutlView)
579 				{
580 					OutlineViewPageChangesGuard aGuard2(pOlView);
581 
582 					KeyCode  aKCode(KEY_DELETE);
583 					KeyEvent aKEvt( 0, aKCode );
584 					pOutlView->PostKeyEvent(aKEvt);
585 
586 					FunctionReference xFunc( GetCurrentFunction() );
587 					FuOutlineText* pFuOutlineText = dynamic_cast< FuOutlineText* >( xFunc.get() );
588                     if( pFuOutlineText )
589                         pFuOutlineText->UpdateForKeyPress (aKEvt);
590 				}
591 			}
592 			rReq.Done();
593 			bPreviewState = sal_True;
594 		}
595 		break;
596 
597 		case SID_DRAWINGMODE:
598 		case SID_NOTESMODE:
599 		case SID_HANDOUTMODE:
600 		case SID_DIAMODE:
601 		case SID_OUTLINEMODE:
602             framework::FrameworkHelper::Instance(GetViewShellBase())->HandleModeChangeSlot(
603                 nSlot,
604                 rReq);
605 			rReq.Done();
606 			break;
607 
608 		case SID_RULER:
609 			SetRuler( !HasRuler() );
610 			Invalidate( SID_RULER );
611 			rReq.Done();
612 		break;
613 
614 		case SID_ZOOM_PREV:
615 		{
616 			if (mpZoomList->IsPreviousPossible())
617 			{
618 				// Vorheriges ZoomRect einstellen
619 				SetZoomRect(mpZoomList->GetPreviousZoomRect());
620 			}
621 			rReq.Done ();
622 		}
623 		break;
624 
625 		case SID_ZOOM_NEXT:
626 		{
627 			if (mpZoomList->IsNextPossible())
628 			{
629 				// Naechstes ZoomRect einstellen
630 				SetZoomRect(mpZoomList->GetNextZoomRect());
631 			}
632 			rReq.Done ();
633 		}
634 		break;
635 
636 		case SID_AUTOSPELL_CHECK:
637 		{
638 			GetDoc()->SetOnlineSpell(!GetDoc()->GetOnlineSpell());
639 			rReq.Done ();
640 		}
641 		break;
642 
643         case SID_TRANSLITERATE_SENTENCE_CASE:
644         case SID_TRANSLITERATE_TITLE_CASE:
645         case SID_TRANSLITERATE_TOGGLE_CASE:
646 		case SID_TRANSLITERATE_UPPER:
647 		case SID_TRANSLITERATE_LOWER:
648 		case SID_TRANSLITERATE_HALFWIDTH:
649 		case SID_TRANSLITERATE_FULLWIDTH:
650 		case SID_TRANSLITERATE_HIRAGANA:
651 		case SID_TRANSLITERATE_KATAGANA:
652 		{
653 			OutlinerView* pOLV = pOlView->GetViewByWindow( GetActiveWindow() );
654 			if( pOLV )
655 			{
656 				using namespace ::com::sun::star::i18n;
657 				sal_Int32 nType = 0;
658 
659 				switch( nSlot )
660 				{
661                     case SID_TRANSLITERATE_SENTENCE_CASE:
662                         nType = TransliterationModulesExtra::SENTENCE_CASE;
663                         break;
664                     case SID_TRANSLITERATE_TITLE_CASE:
665                         nType = TransliterationModulesExtra::TITLE_CASE;
666                         break;
667                     case SID_TRANSLITERATE_TOGGLE_CASE:
668                         nType = TransliterationModulesExtra::TOGGLE_CASE;
669                         break;
670                     case SID_TRANSLITERATE_UPPER:
671 						nType = TransliterationModules_LOWERCASE_UPPERCASE;
672 						break;
673 					case SID_TRANSLITERATE_LOWER:
674 						nType = TransliterationModules_UPPERCASE_LOWERCASE;
675 						break;
676 					case SID_TRANSLITERATE_HALFWIDTH:
677 						nType = TransliterationModules_FULLWIDTH_HALFWIDTH;
678 						break;
679 					case SID_TRANSLITERATE_FULLWIDTH:
680 						nType = TransliterationModules_HALFWIDTH_FULLWIDTH;
681 						break;
682 					case SID_TRANSLITERATE_HIRAGANA:
683 						nType = TransliterationModules_KATAKANA_HIRAGANA;
684 						break;
685 					case SID_TRANSLITERATE_KATAGANA:
686 						nType = TransliterationModules_HIRAGANA_KATAKANA;
687 						break;
688 				}
689 
690 				pOLV->TransliterateText( nType );
691 			}
692 
693 			rReq.Done();
694 			bPreviewState = sal_True;
695 		}
696 		break;
697 
698 		// #96090# added Undo/Redo handling
699 		case SID_UNDO :
700 		{
701 			OutlineViewPageChangesGuard aGuard2(pOlView);
702 			ImpSidUndo(sal_False, rReq);
703 		}
704 		break;
705 		case SID_REDO :
706 		{
707 			OutlineViewPageChangesGuard aGuard2(pOlView);
708 			ImpSidRedo(sal_False, rReq);
709 		}
710 		break;
711 
712 		default:
713 		break;
714 	}
715 
716 	if( bPreviewState )
717 		Invalidate( SID_PREVIEW_STATE );
718 
719 	Invalidate(SID_CUT);
720 	Invalidate(SID_COPY);
721 	Invalidate(SID_PASTE);
722 }
723 
724 /*************************************************************************
725 |*
726 |* SfxRequests fuer permanente Funktionen
727 |*
728 \************************************************************************/
729 
730 void OutlineViewShell::FuPermanent(SfxRequest &rReq)
731 {
732 	if(HasCurrentFunction())
733 	{
734 		DeactivateCurrentFunction(true);
735 	}
736 
737 	switch ( rReq.GetSlot() )
738 	{
739 		case SID_EDIT_OUTLINER:
740 		{
741 			::Outliner* pOutl = pOlView->GetOutliner();
742 			if( pOutl )
743 			{
744 				pOutl->GetUndoManager().Clear();
745 				pOutl->UpdateFields();
746 			}
747 
748 			SetCurrentFunction( FuOutlineText::Create(this,GetActiveWindow(),pOlView,GetDoc(),rReq) );
749 
750 			rReq.Done();
751 		}
752 		break;
753 
754 	  default:
755 	  break;
756 	}
757 
758 	if(HasOldFunction())
759 	{
760 		GetOldFunction()->Deactivate();
761 		SetOldFunction(0);
762 	}
763 
764 	if(HasCurrentFunction())
765 	{
766 		GetCurrentFunction()->Activate();
767 		SetOldFunction(GetCurrentFunction());
768 	}
769 }
770 
771 
772 IMPL_LINK( OutlineViewShell, ClipboardChanged, TransferableDataHelper*, pDataHelper )
773 {
774 	if ( pDataHelper )
775 	{
776 		bPastePossible = ( pDataHelper->GetFormatCount() != 0 &&
777 							( pDataHelper->HasFormat( FORMAT_STRING ) ||
778 							  pDataHelper->HasFormat( FORMAT_RTF ) ||
779 							  pDataHelper->HasFormat( SOT_FORMATSTR_ID_HTML ) ) );
780 
781 		SfxBindings& rBindings = GetViewFrame()->GetBindings();
782 		rBindings.Invalidate( SID_PASTE );
783         rBindings.Invalidate( SID_PASTE_SPECIAL );
784 		rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
785 	}
786 	return 0;
787 }
788 
789 /*************************************************************************
790 |*
791 |* Status (Enabled/Disabled) von Menue-SfxSlots setzen
792 |*
793 \************************************************************************/
794 
795 void OutlineViewShell::GetMenuState( SfxItemSet &rSet )
796 {
797 	ViewShell::GetMenuState(rSet);
798 
799 	// Vorlagenkatalog darf nicht aufgerufen werden
800 	rSet.DisableItem( SID_STYLE_CATALOG );
801 
802 	rSet.Put(SfxBoolItem(SID_DIAMODE, sal_False));
803 	rSet.Put(SfxBoolItem(SID_DRAWINGMODE, sal_False));
804 	rSet.Put(SfxBoolItem(SID_OUTLINEMODE, sal_True));
805 	rSet.Put(SfxBoolItem(SID_NOTESMODE, sal_False));
806 	rSet.Put(SfxBoolItem(SID_HANDOUTMODE, sal_False));
807 
808 	if (!mpZoomList->IsNextPossible())
809 	{
810 	   rSet.DisableItem(SID_ZOOM_NEXT);
811 	}
812 	if (!mpZoomList->IsPreviousPossible())
813 	{
814 	   rSet.DisableItem(SID_ZOOM_PREV);
815 	}
816 
817 	if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ZOOM_IN ) ||
818 		SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ZOOM_OUT ) )
819 	{
820 		if( GetActiveWindow()->GetZoom() <= GetActiveWindow()->GetMinZoom() || GetDocSh()->IsUIActive() )
821 			rSet.DisableItem( SID_ZOOM_IN );
822 		if( GetActiveWindow()->GetZoom() >= GetActiveWindow()->GetMaxZoom() || GetDocSh()->IsUIActive() )
823 			rSet.DisableItem( SID_ZOOM_OUT );
824 	}
825 
826 	::Outliner* pOutl = pOlView->GetOutliner();
827 	DBG_ASSERT(pOutl, "OutlineViewShell::GetMenuState(), no outliner? Fatality!");
828 	if( !pOutl )
829 		return;
830 
831 	// 'Alles auswaehlen' zulassen?
832 	if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_SELECTALL ) )
833 	{
834 		sal_uLong nParaCount = pOutl->GetParagraphCount();
835 		sal_Bool bDisable = nParaCount == 0;
836 		if (!bDisable && nParaCount == 1)
837 		{
838 			String aTest( pOutl->GetText( pOutl->GetParagraph( 0 ) ) );
839 			if (aTest.Len() == 0)
840 			{
841 				bDisable = sal_True;
842 			}
843 		}
844 		if (bDisable)
845 			rSet.DisableItem(SID_SELECTALL);
846 	}
847 
848 	// Status des Lineals setzen
849 	rSet.Put( SfxBoolItem( SID_RULER, HasRuler() ) );
850 
851 	// Formatierung ein oder aus?
852 	rSet.Put( SfxBoolItem( SID_OUTLINE_FORMAT, !pOutl->IsFlatMode() ) );
853 
854 	if( pOutl->IsFlatMode() )
855 		rSet.DisableItem( SID_COLORVIEW );
856 	else
857 	{
858 		// Farbansicht ein/aus
859 		sal_uLong nCntrl = pOutl->GetControlWord();
860 		sal_Bool bNoColor = sal_False;
861 		if (nCntrl & EE_CNTRL_NOCOLORS)
862 			bNoColor = sal_True;
863 
864 		rSet.Put( SfxBoolItem( SID_COLORVIEW, bNoColor ) );
865 	}
866 
867 	// Buttons der Werkzeugleiste
868 	// zunaechst selektionsabhaengige: COLLAPSE, EXPAND
869 	sal_Bool bDisableCollapse = sal_True;
870 	sal_Bool bDisableExpand   = sal_True;
871 	sal_Bool bUnique		  = sal_True;
872 	OutlinerView* pOutlinerView = pOlView->GetViewByWindow(GetActiveWindow());
873 	List* pList = pOutlinerView->CreateSelectionList();
874 	Paragraph* pPara = (Paragraph*)pList->First();
875 
876 	sal_Int16 nDepth;
877 	sal_Int16 nTmpDepth = pOutl->GetDepth( (sal_uInt16) pOutl->GetAbsPos( pPara ) );
878 	bool bPage = pOutl->HasParaFlag( pPara, PARAFLAG_ISPAGE );
879 	while (pPara)
880 	{
881 		nDepth = pOutl->GetDepth( (sal_uInt16) pOutl->GetAbsPos( pPara ) );
882 
883 		if( nDepth != nTmpDepth )
884 			bUnique = sal_False;
885 		if( bPage != pOutl->HasParaFlag( pPara, PARAFLAG_ISPAGE ) )
886 			bUnique = sal_False;
887 		if (!pOutl->IsExpanded(pPara) && pOutl->HasChilds(pPara))
888 			bDisableExpand = sal_False;
889 		if (pOutl->IsExpanded(pPara) && pOutl->HasChilds(pPara))
890 			bDisableCollapse = sal_False;
891 
892 		pPara = (Paragraph*)pList->Next();
893 	}
894 
895 	delete pList;
896 
897 	if (bDisableExpand)
898 		rSet.DisableItem(SID_OUTLINE_EXPAND);
899 	if (bDisableCollapse)
900 		rSet.DisableItem(SID_OUTLINE_COLLAPSE);
901 
902 	// ergibt die Selektion ein eindeutiges Praesentationslayout?
903 	// wenn nicht, duerfen die Vorlagen nicht bearbeitet werden
904 	SfxItemSet aSet(*rSet.GetPool(), SID_STATUS_LAYOUT, SID_STATUS_LAYOUT);
905 	GetStatusBarState(aSet);
906 	String aTest(((SfxStringItem&)aSet.Get(SID_STATUS_LAYOUT)).GetValue());
907 	if (aTest.Len() == 0)
908 	{
909 		bUnique = sal_False;
910 		rSet.DisableItem(SID_PRESENTATION_TEMPLATES);
911 	}
912 
913 	if (!bUnique)
914 		rSet.DisableItem( SID_PRESENTATIONOBJECT );
915 
916 	// jetzt die selektionsunabhaengigen: COLLAPSE_ALL, EXPAND_ALL
917 	sal_Bool bDisableCollapseAll = sal_True;
918 	sal_Bool bDisableExpandAll	 = sal_True;
919 
920 	// wenn schon die Selektion etwas kollabierbares/expandierbares enthaelt
921 	if (!bDisableCollapse)
922 		bDisableCollapseAll = sal_False;
923 	if (!bDisableExpand)
924 		bDisableExpandAll = sal_False;
925 
926 	// schade, so billig kommen wir nicht davon; alle Absaetze durchsuchen
927 	if (bDisableCollapseAll || bDisableExpandAll)
928 	{
929 		sal_uLong nParaPos = 0;
930 		pPara = pOutl->GetParagraph( nParaPos );
931 		while (pPara && (bDisableCollapseAll || bDisableExpandAll))
932 		{
933 			if (!pOutl->IsExpanded(pPara) && pOutl->HasChilds(pPara))
934 				bDisableExpandAll = sal_False;
935 
936 			if (pOutl->IsExpanded(pPara) && pOutl->HasChilds(pPara))
937 				bDisableCollapseAll = sal_False;
938 
939 			pPara = pOutl->GetParagraph( ++nParaPos );
940 		}
941 	}
942 
943 	if (bDisableExpandAll)
944 		rSet.DisableItem(SID_OUTLINE_EXPAND_ALL);
945 	if (bDisableCollapseAll)
946 		rSet.DisableItem(SID_OUTLINE_COLLAPSE_ALL);
947 
948 	if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_PASTE ) )
949 	{
950 		if ( !pClipEvtLstnr )
951 		{
952 			// create listener
953 			pClipEvtLstnr = new TransferableClipboardListener( LINK( this, OutlineViewShell, ClipboardChanged ) );
954 			pClipEvtLstnr->acquire();
955 			pClipEvtLstnr->AddRemoveListener( GetActiveWindow(), sal_True );
956 
957 			// get initial state
958 			TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( GetActiveWindow() ) );
959 			bPastePossible = ( aDataHelper.GetFormatCount() != 0 &&
960 								( aDataHelper.HasFormat( FORMAT_STRING ) ||
961 								  aDataHelper.HasFormat( FORMAT_RTF ) ||
962 								  aDataHelper.HasFormat( SOT_FORMATSTR_ID_HTML ) ) );
963 		}
964 
965 		if( !bPastePossible )
966 		{
967 			rSet.DisableItem( SID_PASTE );
968 		}
969 	}
970 
971 	if (!pOlView->GetViewByWindow(GetActiveWindow())->HasSelection())
972 	{
973 		rSet.DisableItem(SID_CUT);
974 		rSet.DisableItem(SID_COPY);
975 	}
976 
977 	if (pOlView->GetOutliner()->IsModified())
978 	{
979 		GetDoc()->SetChanged(sal_True);
980 	}
981 
982 	// Da �berladen, muss hier der Status gesetzt werden
983 	if( !GetDocSh()->IsModified() )
984 	{
985 		rSet.DisableItem( SID_SAVEDOC );
986 	}
987 
988 	if ( GetDocSh()->IsReadOnly() )
989 	{
990 		rSet.DisableItem( SID_AUTOSPELL_CHECK );
991 	}
992 	else
993 	{
994 		if (GetDoc()->GetOnlineSpell())
995 		{
996 			rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, sal_True));
997 		}
998 		else
999 		{
1000 			rSet.Put(SfxBoolItem(SID_AUTOSPELL_CHECK, sal_False));
1001 		}
1002 	}
1003 
1004 	// Feldbefehle
1005 	if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_MODIFY_FIELD ) )
1006 	{
1007 		const SvxFieldItem* pFldItem = pOutlinerView->GetFieldAtSelection();
1008 
1009 		if( !( pFldItem && (pFldItem->GetField()->ISA( SvxDateField ) ||
1010 							pFldItem->GetField()->ISA( SvxAuthorField ) ||
1011 							pFldItem->GetField()->ISA( SvxExtFileField ) ||
1012 							pFldItem->GetField()->ISA( SvxExtTimeField ) ) ) )
1013 		{
1014 			rSet.DisableItem( SID_MODIFY_FIELD );
1015 		}
1016 	}
1017 
1018 	if (SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_EXPAND_PAGE))
1019 	{
1020 		sal_Bool bDisable = sal_True;
1021 		sal_uInt16 i = 0;
1022 		sal_uInt16 nCount = GetDoc()->GetSdPageCount(PK_STANDARD);
1023 		pOlView->SetSelectedPages();
1024 
1025 		while (i < nCount && bDisable)
1026 		{
1027 			SdPage* pPage = GetDoc()->GetSdPage(i, PK_STANDARD);
1028 
1029 			if (pPage->IsSelected())
1030 			{
1031 				SdrObject* pObj = pPage->GetPresObj(PRESOBJ_OUTLINE);
1032 
1033                 if (pObj!=NULL )
1034 				{
1035 					if( !pObj->IsEmptyPresObj() )
1036 					{
1037 						bDisable = false;
1038 					}
1039 					else
1040 					{
1041 						// check if the object is in edit, than its temporarely not empty
1042 						SdrTextObj* pTextObj = dynamic_cast< SdrTextObj* >( pObj );
1043 						if( pTextObj )
1044 						{
1045 							OutlinerParaObject* pParaObj = pTextObj->GetEditOutlinerParaObject();
1046 							if( pParaObj )
1047 							{
1048 								delete pParaObj;
1049 								bDisable = false;
1050 							}
1051 						}
1052 					}
1053 				}
1054 			}
1055 
1056 			i++;
1057 		}
1058 
1059 		if (bDisable)
1060 		{
1061 			rSet.DisableItem(SID_EXPAND_PAGE);
1062 		}
1063 	}
1064 
1065 	if (SFX_ITEM_AVAILABLE == rSet.GetItemState(SID_SUMMARY_PAGE))
1066 	{
1067 		sal_Bool bDisable = sal_True;
1068 		sal_uInt16 i = 0;
1069 		sal_uInt16 nCount = GetDoc()->GetSdPageCount(PK_STANDARD);
1070 		pOlView->SetSelectedPages();
1071 
1072 		while (i < nCount && bDisable)
1073 		{
1074 			SdPage* pPage = GetDoc()->GetSdPage(i, PK_STANDARD);
1075 
1076 			if (pPage->IsSelected())
1077 			{
1078 				SdrObject* pObj = pPage->GetPresObj(PRESOBJ_TITLE);
1079 
1080 				if (pObj && !pObj->IsEmptyPresObj())
1081 				{
1082 					bDisable = sal_False;
1083 				}
1084 			}
1085 
1086 			i++;
1087 		}
1088 
1089 		if (bDisable)
1090 		{
1091 			rSet.DisableItem(SID_SUMMARY_PAGE);
1092 		}
1093 	}
1094 
1095     if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_THESAURUS ) )
1096 	{
1097 		if ( !pOlView->IsTextEdit() )
1098 		{
1099 			rSet.DisableItem( SID_THESAURUS );
1100 		}
1101 		else
1102 		{
1103 			LanguageType            eLang = GetDoc()->GetLanguage( EE_CHAR_LANGUAGE );
1104 	        Reference< XThesaurus > xThesaurus( LinguMgr::GetThesaurus() );
1105 			Locale                  aLocale;
1106 
1107 			SvxLanguageToLocale( aLocale, eLang );
1108 
1109             if (!xThesaurus.is() || eLang == LANGUAGE_NONE || !xThesaurus->hasLocale(aLocale))
1110 				rSet.DisableItem( SID_THESAURUS );
1111 		}
1112 	}
1113 
1114 	// Starten der Praesentation moeglich?
1115 	if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_PRESENTATION ) )
1116 	{
1117 		sal_Bool bDisable = sal_True;
1118 		sal_uInt16 nCount = GetDoc()->GetSdPageCount( PK_STANDARD );
1119 
1120 		for( sal_uInt16 i = 0; i < nCount && bDisable; i++ )
1121 		{
1122 			SdPage* pPage = GetDoc()->GetSdPage(i, PK_STANDARD);
1123 
1124 			if( !pPage->IsExcluded() )
1125 				bDisable = sal_False;
1126 		}
1127 		if( bDisable || GetDocSh()->IsPreview())
1128 		{
1129 			rSet.DisableItem( SID_PRESENTATION );
1130 		}
1131 	}
1132 
1133 	FuBullet::GetSlotState( rSet, this, GetViewFrame() );
1134 
1135 	//rSet.DisableItem( SID_PRINTDOC );
1136 	//rSet.DisableItem( SID_PRINTDOCDIRECT );
1137 	//rSet.DisableItem( SID_SETUPPRINTER );
1138 }
1139 
1140 /*************************************************************************
1141 |*
1142 |* wird gerufen, wenn ScrollBar benutzt wird
1143 |*
1144 \************************************************************************/
1145 
1146 long OutlineViewShell::VirtHScrollHdl(ScrollBar* pHScroll)
1147 {
1148 	long   nThumb = pHScroll->GetThumbPos();
1149 	long   nRange = pHScroll->GetRange().Len();
1150 	double fX	  = (double) nThumb / nRange;
1151 
1152     Window* 	  pWin			= mpContentWindow.get();
1153     OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWin);
1154     long		  nViewWidth	= pWin->PixelToLogic(
1155         pWin->GetSizePixel()).Width();
1156     long		  nTextWidth	= pOlView->GetPaperWidth();
1157     nViewWidth					= Max(nViewWidth, nTextWidth);
1158     long		  nCurrentPos	= pOutlinerView->GetVisArea().Left();
1159     long		  nTargetPos	= (long)(fX * nViewWidth);
1160     long		  nDelta		= nTargetPos - nCurrentPos;
1161 
1162     pOutlinerView->HideCursor();
1163     pOutlinerView->Scroll(-nDelta, 0);
1164     pOutlinerView->ShowCursor(sal_False);
1165 
1166     pOlView->InvalidateSlideNumberArea();
1167 	return 0;
1168 }
1169 
1170 /*************************************************************************
1171 |*
1172 |* wird gerufen, wenn ScrollBar benutzt wird
1173 |*
1174 \************************************************************************/
1175 
1176 long OutlineViewShell::VirtVScrollHdl(ScrollBar* pVScroll)
1177 {
1178 	long nThumb = pVScroll->GetThumbPos();
1179 	long nRange = pVScroll->GetRange().Len();
1180 	double fY = (double) nThumb / nRange;
1181 
1182     Window* 	  pWin			= mpContentWindow.get();
1183     OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWin);
1184     long		  nViewHeight	= pWin->PixelToLogic(
1185         pWin->GetSizePixel()).Height();
1186     long		  nTextHeight	= pOlView->GetOutliner()->GetTextHeight();
1187     nViewHeight 			   += nTextHeight;
1188     long		  nCurrentPos	= pOutlinerView->GetVisArea().Top();
1189     long		  nTargetPos	= (long)(fY * nViewHeight);
1190     long		  nDelta		= nTargetPos - nCurrentPos;
1191 
1192     pOutlinerView->HideCursor();
1193     pOutlinerView->Scroll(0, -nDelta);
1194     pOutlinerView->ShowCursor(sal_False);
1195 
1196     pOlView->InvalidateSlideNumberArea();
1197 
1198 	return 0;
1199 }
1200 
1201 /*************************************************************************
1202 |*
1203 |* PrepareClose, wird gerufen, wenn die Shell zestoert werden soll,
1204 |* leitet den Aufruf an die View weiter
1205 |*
1206 \************************************************************************/
1207 
1208 sal_uInt16 OutlineViewShell::PrepareClose( sal_Bool bUI, sal_Bool bForBrowsing )
1209 {
1210 	if( ViewShell::PrepareClose(bUI, bForBrowsing) != sal_True )
1211 		return sal_False;
1212 
1213 	return pOlView == NULL || pOlView->PrepareClose(bUI);
1214 }
1215 
1216 
1217 /*************************************************************************
1218 |*
1219 |* Zoomen mit Zoomfaktor, OutlinerView informieren
1220 |*
1221 \************************************************************************/
1222 
1223 void OutlineViewShell::SetZoom(long nZoom)
1224 {
1225 	ViewShell::SetZoom(nZoom);
1226 
1227     ::sd::Window* pWindow = mpContentWindow.get();
1228     if (pWindow)
1229     {
1230         // OutputArea der OutlinerView aendern
1231         OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWindow);
1232         Rectangle aWin(Point(0,0), pWindow->GetOutputSizePixel());
1233         aWin = pWindow->PixelToLogic(aWin);
1234         pOutlinerView->SetOutputArea(aWin);
1235     }
1236 
1237 	// #106268#
1238 	GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
1239 	GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
1240 }
1241 
1242 /*************************************************************************
1243 |*
1244 |* Zoomen mit Zoomrechteck, OutlinerView informieren
1245 |*
1246 \************************************************************************/
1247 
1248 void OutlineViewShell::SetZoomRect(const Rectangle& rZoomRect)
1249 {
1250 	ViewShell::SetZoomRect(rZoomRect);
1251 
1252     ::sd::Window* pWindow = mpContentWindow.get();
1253     if (pWindow)
1254     {
1255         // OutputArea der OutlinerView aendern
1256         OutlinerView* pOutlinerView = pOlView->GetViewByWindow(pWindow);
1257         Rectangle aWin(Point(0,0), pWindow->GetOutputSizePixel());
1258         aWin = pWindow->PixelToLogic(aWin);
1259         pOutlinerView->SetOutputArea(aWin);
1260     }
1261 
1262 	// #106268#
1263 	GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOM );
1264 	GetViewFrame()->GetBindings().Invalidate( SID_ATTR_ZOOMSLIDER );
1265 }
1266 
1267 /*************************************************************************
1268 |*
1269 |* Vorm Speichern das Model der Drawing Engine aktualisieren, dann den
1270 |* Call weiterleiten an die ObjectShell.
1271 |*
1272 \************************************************************************/
1273 
1274 void OutlineViewShell::Execute(SfxRequest& rReq)
1275 {
1276     bool bForwardCall = true;
1277 
1278 	switch(rReq.GetSlot())
1279 	{
1280 		case SID_SAVEDOC:
1281 		case SID_SAVEASDOC:
1282 			PrepareClose();
1283             break;
1284 
1285 		case SID_SEARCH_ITEM:
1286             // Forward this request to the the common (old) code of the
1287             // document shell.
1288             GetDocSh()->Execute (rReq);
1289             bForwardCall = false;
1290             break;
1291 
1292         case SID_SPELL_DIALOG:
1293         {
1294             SfxViewFrame* pViewFrame = GetViewFrame();
1295             if (rReq.GetArgs() != NULL)
1296                 pViewFrame->SetChildWindow (SID_SPELL_DIALOG,
1297                     ((const SfxBoolItem&) (rReq.GetArgs()->
1298                         Get(SID_SPELL_DIALOG))).GetValue());
1299             else
1300                 pViewFrame->ToggleChildWindow(SID_SPELL_DIALOG);
1301 
1302             pViewFrame->GetBindings().Invalidate(SID_SPELL_DIALOG);
1303             rReq.Done ();
1304 
1305             bForwardCall = false;
1306         }
1307         break;
1308 
1309 		default:
1310             OSL_TRACE ("OutlineViewShell::Execute(): can not handle slot %d", rReq.GetSlot());
1311             break;
1312 
1313 	}
1314 
1315     if (bForwardCall)
1316         ((DrawDocShell*)GetViewFrame()->GetObjectShell())->ExecuteSlot( rReq );
1317 }
1318 
1319 /*************************************************************************
1320 |*
1321 |* Read FrameViews data and set actual views data
1322 |*
1323 \************************************************************************/
1324 
1325 void OutlineViewShell::ReadFrameViewData(FrameView* pView)
1326 {
1327 	::Outliner* pOutl = pOlView->GetOutliner();
1328 
1329 	if ( pView->IsNoAttribs() )
1330 		pOutl->SetFlatMode( sal_True );   // Attribut-Darstellung ausschalten
1331 	else
1332 		pOutl->SetFlatMode( sal_False );  // Attribut-Darstellung einschalten
1333 
1334 	sal_uLong nCntrl = pOutl->GetControlWord();
1335 
1336 	if ( pView->IsNoColors() )
1337 		pOutl->SetControlWord(nCntrl | EE_CNTRL_NOCOLORS);   // Farbansicht ausschalten
1338 	else
1339 		pOutl->SetControlWord(nCntrl & ~EE_CNTRL_NOCOLORS);  // Farbansicht einschalten
1340 
1341 	sal_uInt16 nPage = mpFrameView->GetSelectedPage();
1342 	pLastPage = GetDoc()->GetSdPage( nPage, PK_STANDARD );
1343     pOlView->SetActualPage(pLastPage);
1344 }
1345 
1346 
1347 
1348 /*************************************************************************
1349 |*
1350 |* Write actual views data to FrameView
1351 |*
1352 \************************************************************************/
1353 
1354 void OutlineViewShell::WriteFrameViewData()
1355 {
1356 	::Outliner* pOutl = pOlView->GetOutliner();
1357 
1358 	sal_uLong nCntrl = pOutl->GetControlWord();
1359 	sal_Bool bNoColor = sal_False;
1360 	if (nCntrl & EE_CNTRL_NOCOLORS)
1361 		bNoColor = sal_True;
1362 	mpFrameView->SetNoColors(bNoColor);
1363 	mpFrameView->SetNoAttribs( pOutl->IsFlatMode() );
1364 	SdPage* pActualPage = pOlView->GetActualPage();
1365     DBG_ASSERT(pActualPage, "No current page");
1366 	if( pActualPage )
1367         mpFrameView->SetSelectedPage((pActualPage->GetPageNum() - 1) / 2);
1368 }
1369 
1370 
1371 /*************************************************************************
1372 |*
1373 |* SfxRequests fuer StatusBar bearbeiten
1374 |*
1375 \************************************************************************/
1376 
1377 void OutlineViewShell::ExecStatusBar(SfxRequest&)
1378 {
1379 }
1380 
1381 /*************************************************************************
1382 |*
1383 |* Statuswerte der Statusbar zurueckgeben
1384 |*
1385 \************************************************************************/
1386 
1387 void OutlineViewShell::GetStatusBarState(SfxItemSet& rSet)
1388 {
1389 	// Zoom-Item
1390 	if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ATTR_ZOOM ) )
1391 	{
1392 		SvxZoomItem* pZoomItem;
1393 		sal_uInt16 nZoom = (sal_uInt16) GetActiveWindow()->GetZoom();
1394 
1395 		pZoomItem = new SvxZoomItem( SVX_ZOOM_PERCENT, nZoom );
1396 
1397 		// Bereich einschraenken
1398 		sal_uInt16 nZoomValues = SVX_ZOOM_ENABLE_ALL;
1399 		nZoomValues &= ~SVX_ZOOM_ENABLE_OPTIMAL;
1400 		nZoomValues &= ~SVX_ZOOM_ENABLE_WHOLEPAGE;
1401 		nZoomValues &= ~SVX_ZOOM_ENABLE_PAGEWIDTH;
1402 
1403 		pZoomItem->SetValueSet( nZoomValues );
1404 		rSet.Put( *pZoomItem );
1405 		delete pZoomItem;
1406 	}
1407 
1408 	if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ATTR_ZOOMSLIDER ) )
1409 	{
1410 		if (GetDocSh()->IsUIActive() || !GetActiveWindow() )
1411 		{
1412 			rSet.DisableItem( SID_ATTR_ZOOMSLIDER );
1413 		}
1414 		else
1415 		{
1416 			sd::Window * pActiveWindow = GetActiveWindow();
1417 			SvxZoomSliderItem aZoomItem( (sal_uInt16) pActiveWindow->GetZoom(), (sal_uInt16)pActiveWindow->GetMinZoom(), (sal_uInt16)pActiveWindow->GetMaxZoom() ) ;
1418 			aZoomItem.AddSnappingPoint(100);
1419 			rSet.Put( aZoomItem );
1420 		}
1421 	}
1422 
1423 
1424 	// Seitenanzeige und Layout
1425 	/*
1426 	if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_STATUS_PAGE ) ||
1427 		SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_STATUS_LAYOUT ) )
1428 	*/
1429 	sal_uInt16	nPageCount = GetDoc()->GetSdPageCount( PK_STANDARD );
1430 	String	aPageStr, aLayoutStr;
1431 
1432 	::sd::Window*		pWin		= GetActiveWindow();
1433 	OutlinerView*	pActiveView = pOlView->GetViewByWindow( pWin );
1434 	::Outliner*     pOutliner   = pOlView->GetOutliner();
1435 	List*			pSelList	= (List*)pActiveView->CreateSelectionList();
1436 	Paragraph*		pFirstPara	= (Paragraph*)pSelList->First();
1437 	Paragraph*		pLastPara	= (Paragraph*)pSelList->Last();
1438 
1439 	if( !pOutliner->HasParaFlag(pFirstPara,PARAFLAG_ISPAGE) )
1440 		pFirstPara = pOlView->GetPrevTitle( pFirstPara );
1441 
1442 	if( !pOutliner->HasParaFlag(pLastPara, PARAFLAG_ISPAGE) )
1443 		pLastPara = pOlView->GetPrevTitle( pLastPara );
1444 
1445 	delete pSelList;				// die wurde extra fuer uns erzeugt
1446 
1447 	// nur eine Seite selektiert?
1448 	if( pFirstPara == pLastPara )
1449 	{
1450 		// wieviele Seiten sind vor der selektierten Seite?
1451 		sal_uLong nPos = 0L;
1452 		while( pFirstPara )
1453 		{
1454 			pFirstPara = pOlView->GetPrevTitle( pFirstPara );
1455 			if( pFirstPara )
1456 				nPos++;
1457 		}
1458 
1459 		if( nPos >= GetDoc()->GetSdPageCount( PK_STANDARD ) )
1460 			nPos = 0;
1461 
1462 		SdrPage* pPage = GetDoc()->GetSdPage( (sal_uInt16) nPos, PK_STANDARD );
1463 
1464 		aPageStr = String(SdResId( STR_SD_PAGE ));
1465 		aPageStr += sal_Unicode(' ');
1466 		aPageStr += String::CreateFromInt32( (sal_Int32)(nPos + 1) );	// sal_uLong -> sal_Int32
1467 		aPageStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " / " ));
1468 		aPageStr += String::CreateFromInt32( nPageCount );
1469 
1470 		aLayoutStr = pPage->GetLayoutName();
1471 		aLayoutStr.Erase( aLayoutStr.SearchAscii( SD_LT_SEPARATOR ) );
1472 	}
1473 	rSet.Put( SfxStringItem( SID_STATUS_PAGE, aPageStr ) );
1474 	rSet.Put( SfxStringItem( SID_STATUS_LAYOUT, aLayoutStr ) );
1475 }
1476 
1477 /*************************************************************************
1478 |*
1479 |* Command event
1480 |*
1481 \************************************************************************/
1482 
1483 void OutlineViewShell::Command( const CommandEvent& rCEvt, ::sd::Window* pWin )
1484 {
1485 	if ( rCEvt.GetCommand() == COMMAND_CONTEXTMENU )
1486 	{
1487 		GetActiveWindow()->ReleaseMouse();
1488 
1489 		OutlinerView* pOLV = pOlView->GetViewByWindow(GetActiveWindow());
1490 		Point aPos(rCEvt.GetMousePosPixel());
1491 
1492 		if (pOLV && pOLV->IsWrongSpelledWordAtPos(aPos))
1493 		{
1494 			// #91457# Popup for Online-Spelling now handled by DrawDocShell
1495 			// Link aLink = LINK(GetDoc(), SdDrawDocument, OnlineSpellCallback);
1496 			Link aLink = LINK(GetDocSh(), DrawDocShell, OnlineSpellCallback);
1497 
1498 			pOLV->ExecuteSpellPopup(aPos, &aLink);
1499 		}
1500 		else
1501 		{
1502 		   GetViewFrame()->GetDispatcher()->ExecutePopup(SdResId(RID_OUTLINE_POPUP));
1503 		}
1504 	}
1505 	else
1506 	{
1507 		ViewShell::Command( rCEvt, pWin );
1508 
1509 		// ggfs. Preview den neuen Kontext mitteilen
1510 		Invalidate( SID_PREVIEW_STATE );
1511 
1512 	}
1513 }
1514 
1515 
1516 /*************************************************************************
1517 |*
1518 |* Keyboard event
1519 |*
1520 \************************************************************************/
1521 
1522 sal_Bool OutlineViewShell::KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin)
1523 {
1524 	sal_Bool bReturn = sal_False;
1525 	OutlineViewPageChangesGuard aGuard(pOlView);
1526 
1527 	if (pWin == NULL && HasCurrentFunction())
1528 	{
1529 		bReturn = GetCurrentFunction()->KeyInput(rKEvt);
1530 	}
1531 
1532 	// nein, weiterleiten an Basisklasse
1533 	else
1534 	{
1535 		bReturn = ViewShell::KeyInput(rKEvt, pWin);
1536 	}
1537 
1538 	Invalidate(SID_STYLE_EDIT);
1539 	Invalidate(SID_STYLE_NEW);
1540 	Invalidate(SID_STYLE_DELETE);
1541 	Invalidate(SID_STYLE_UPDATE_BY_EXAMPLE);
1542 	Invalidate(SID_STYLE_NEW_BY_EXAMPLE);
1543 	Invalidate(SID_STYLE_WATERCAN);
1544 	Invalidate(SID_STYLE_FAMILY5);
1545 
1546 	// Pruefen und Unterscheiden von CursorBewegungs- oder Eingabe-Keys
1547 	KeyCode aKeyGroup( rKEvt.GetKeyCode().GetGroup() );
1548 	if( (aKeyGroup != KEYGROUP_CURSOR && aKeyGroup != KEYGROUP_FKEYS) ||
1549 		(GetActualPage() != pLastPage) )
1550 	{
1551 		Invalidate( SID_PREVIEW_STATE );
1552 	}
1553 
1554 	return(bReturn);
1555 }
1556 
1557 
1558 /*************************************************************************
1559 |*
1560 |* Optimale Groesse zurueckgeben
1561 |*
1562 \************************************************************************/
1563 
1564 Size OutlineViewShell::GetOptimalSizePixel() const
1565 {
1566 	Size aResult(200, 200);
1567 	if (pOlView)
1568 	{
1569 		::Outliner* pOutliner = pOlView->GetOutliner();
1570 		if (pOutliner)
1571 		{
1572 			Size aTemp = pOutliner->CalcTextSize();
1573 			aTemp = GetActiveWindow()->LogicToPixel(aTemp);
1574 			aResult.Width() = Max(aResult.Width(), aTemp.Width());
1575 			aResult.Height() = Max(aResult.Height(), aTemp.Height());
1576 			if (4 * aResult.Height() > 3 * aResult.Width())
1577 			{
1578 				aResult.Height() = 3 * aResult.Width() / 4;
1579 			}
1580 		}
1581 	}
1582 
1583 	// und jetzt jetzt das Standardgelumpe draufaddieren
1584 	aResult.Width()  += mpVerticalScrollBar->GetSizePixel().Width();
1585 	aResult.Height() += mpHorizontalScrollBar->GetSizePixel().Height();
1586 		//!!! +	System::GetMenuBarHeightPixel();  // statt Titlebar
1587 	return aResult;
1588 }
1589 
1590 
1591 /*************************************************************************
1592 |*
1593 |* Text der Selektion zurueckgeben
1594 |*
1595 \************************************************************************/
1596 
1597 String OutlineViewShell::GetSelectionText(sal_Bool bCompleteWords)
1598 {
1599 	String aStrSelection;
1600 	::Outliner* pOl = pOlView->GetOutliner();
1601 	OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() );
1602 
1603 	if (pOl && pOlView)
1604 	{
1605 		if (bCompleteWords)
1606 		{
1607 			ESelection aSel = pOutlinerView->GetSelection();
1608 			String aStrCurrentDelimiters = pOl->GetWordDelimiters();
1609 
1610 			pOl->SetWordDelimiters( String( RTL_CONSTASCII_USTRINGPARAM( " .,;\"'" )));
1611 			aStrSelection = pOl->GetWord( aSel.nEndPara, aSel.nEndPos );
1612 			pOl->SetWordDelimiters( aStrCurrentDelimiters );
1613 		}
1614 		else
1615 		{
1616 			aStrSelection = pOutlinerView->GetSelected();
1617 		}
1618 	}
1619 
1620 	return (aStrSelection);
1621 }
1622 
1623 
1624 /*************************************************************************
1625 |*
1626 |* Ist etwas selektiert?
1627 |*
1628 \************************************************************************/
1629 
1630 sal_Bool OutlineViewShell::HasSelection(sal_Bool bText) const
1631 {
1632 	sal_Bool bReturn = sal_False;
1633 
1634 	if (bText)
1635 	{
1636 		OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() );
1637 
1638 		if (pOutlinerView && pOutlinerView->GetSelected().Len() != 0)
1639 		{
1640 			bReturn = sal_True;
1641 		}
1642 	}
1643 
1644 	return bReturn;
1645 }
1646 
1647 
1648 /*************************************************************************
1649 |*
1650 |* Status der Attribut-Items
1651 |*
1652 \************************************************************************/
1653 
1654 void OutlineViewShell::GetAttrState( SfxItemSet& rSet )
1655 {
1656 	SfxWhichIter  aIter( rSet );
1657 	sal_uInt16        nWhich = aIter.FirstWhich();
1658 	SfxAllItemSet aAllSet( *rSet.GetPool() );
1659 
1660 	while ( nWhich )
1661 	{
1662 		sal_uInt16 nSlotId = SfxItemPool::IsWhich(nWhich)
1663 			? GetPool().GetSlotId(nWhich)
1664 			: nWhich;
1665 
1666 		switch ( nSlotId )
1667 		{
1668 			case SID_STYLE_FAMILY2:
1669 			case SID_STYLE_FAMILY3:
1670 			{
1671 				rSet.DisableItem( nWhich );
1672 			}
1673 			break;
1674 
1675 			case SID_STYLE_FAMILY5:
1676 			{
1677 				SfxStyleSheet* pStyleSheet = pOlView->GetViewByWindow(GetActiveWindow())->GetStyleSheet();
1678 
1679 				if( pStyleSheet )
1680 				{
1681 					pStyleSheet = ((SdStyleSheet*)pStyleSheet)->GetPseudoStyleSheet();
1682 
1683 					if (pStyleSheet)
1684 					{
1685 						SfxTemplateItem aItem( nWhich, pStyleSheet->GetName() );
1686 						aAllSet.Put( aItem, aItem.Which()  );
1687 					}
1688 				}
1689 
1690 				if( !pStyleSheet )
1691 				{
1692 					SfxTemplateItem aItem( nWhich, String() );
1693 					aAllSet.Put( aItem, aItem.Which() );
1694 					// rSet.DisableItem( nWhich );
1695 				}
1696 			}
1697 			break;
1698 
1699 			case SID_STYLE_EDIT:
1700 			{
1701 				ISfxTemplateCommon* pTmplCommon = SFX_APP()->GetCurrentTemplateCommon(GetViewFrame()->GetBindings());
1702 
1703 				if (pTmplCommon && pTmplCommon->GetActualFamily() == SD_STYLE_FAMILY_PSEUDO)
1704 				{
1705 					SfxItemSet aSet(*rSet.GetPool(), SID_STATUS_LAYOUT, SID_STATUS_LAYOUT);
1706 					GetStatusBarState(aSet);
1707 					String aRealStyle(((SfxStringItem&) aSet.Get(SID_STATUS_LAYOUT)).GetValue());
1708 
1709 					if (!aRealStyle.Len())
1710 					{
1711 						// Kein eindeutiger Layoutname gefunden
1712 						rSet.DisableItem(nWhich);
1713 					}
1714 				}
1715 			}
1716 			break;
1717 
1718 			case SID_STYLE_UPDATE_BY_EXAMPLE:
1719 			{
1720 				::sd::Window*     pActWin = GetActiveWindow();
1721 				OutlinerView* pOV = pOlView->GetViewByWindow(pActWin);
1722 				ESelection aESel(pOV->GetSelection());
1723 
1724 				if (aESel.nStartPara != aESel.nEndPara ||
1725 					aESel.nStartPos  != aESel.nEndPos)
1726 					// aufgespannte Selektion, also StyleSheet und/oder
1727 					// Attributierung nicht zwingend eindeutig
1728 					rSet.DisableItem(nWhich);
1729 			}
1730 			break;
1731 
1732 			case SID_STYLE_NEW:
1733 			case SID_STYLE_DELETE:
1734 			case SID_STYLE_NEW_BY_EXAMPLE:
1735 			case SID_STYLE_WATERCAN:
1736 			{
1737 				rSet.DisableItem(nWhich);
1738 			}
1739 			break;
1740 		}
1741 
1742 		nWhich = aIter.NextWhich();
1743 	}
1744 
1745 	rSet.Put( aAllSet, sal_False );
1746 }
1747 
1748 
1749 
1750 /*************************************************************************
1751 |*
1752 |* MouseButtonUp event
1753 |*
1754 \************************************************************************/
1755 
1756 void OutlineViewShell::MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin)
1757 {
1758 	// Zuerst die Basisklasse
1759 	ViewShell::MouseButtonUp(rMEvt, pWin);
1760 
1761 	Invalidate(SID_STYLE_EDIT);
1762 	Invalidate(SID_STYLE_NEW);
1763 	Invalidate(SID_STYLE_DELETE);
1764 	Invalidate(SID_STYLE_UPDATE_BY_EXAMPLE);
1765 	Invalidate(SID_STYLE_NEW_BY_EXAMPLE);
1766 	Invalidate(SID_STYLE_WATERCAN);
1767 	Invalidate(SID_STYLE_FAMILY5);
1768 
1769 	// ggfs. Preview den neuen Kontext mitteilen
1770 	if( GetActualPage() != pLastPage )
1771 		Invalidate( SID_PREVIEW_STATE );
1772 }
1773 
1774 
1775 
1776 SdPage* OutlineViewShell::getCurrentPage() const
1777 {
1778 	// since there are no master pages in outline view, we can
1779 	// for now use the GetActualPage method
1780 	return const_cast<OutlineViewShell*>(this)->GetActualPage();
1781 }
1782 
1783 /*************************************************************************
1784 |*
1785 |* Liefert die erste selektierte Seite zurueck.
1786 |* Wenn nichts selektiert ist, wird die erste Seite zurueckgeliefert.
1787 |*
1788 \************************************************************************/
1789 SdPage* OutlineViewShell::GetActualPage()
1790 {
1791 	return pOlView->GetActualPage();
1792 }
1793 
1794 
1795 void OutlineViewShell::UpdatePreview( SdPage* pPage, sal_Bool )
1796 {
1797 	const bool bNewPage = pPage != pLastPage;
1798 	pLastPage = pPage;
1799 	if (bNewPage)
1800 	{
1801 		OutlineViewPageChangesGuard aGuard(pOlView);
1802         SetCurrentPage(pPage);
1803     }
1804 }
1805 
1806 /*************************************************************************
1807 |*
1808 |* Update Title
1809 |*
1810 \************************************************************************/
1811 
1812 bool OutlineViewShell::UpdateTitleObject( SdPage* pPage, Paragraph* pPara )
1813 {
1814 	DBG_ASSERT( pPage, "sd::OutlineViewShell::UpdateTitleObject(), pPage == 0?" );
1815 	DBG_ASSERT( pPara, "sd::OutlineViewShell::UpdateTitleObject(), pPara == 0?" );
1816 
1817 	if( !pPage || !pPara )
1818 		return false;
1819 
1820 	::Outliner* 			pOutliner = pOlView->GetOutliner();
1821 	SdrTextObj* 		pTO  = pOlView->GetTitleTextObject( pPage );
1822 	OutlinerParaObject* pOPO = NULL;
1823 
1824 	String	aTest( pOutliner->GetText( pPara ) );
1825 	bool 	bText = aTest.Len() > 0;
1826 	bool 	bNewObject = false;
1827 
1828 	if( bText )
1829 	{
1830 		// create a title object if we don't have one but have text
1831 		if( !pTO )
1832 		{
1833 			DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" );
1834 			pTO = pOlView->CreateTitleTextObject(pPage);
1835 			bNewObject = sal_True;
1836 		}
1837 
1838 		// if we have a title object and a text, set the text
1839 		if( pTO )
1840 		{
1841 			pOPO = pOutliner->CreateParaObject( (sal_uInt16) pOutliner->GetAbsPos( pPara ), 1 );
1842 			pOPO->SetOutlinerMode( OUTLINERMODE_TITLEOBJECT );
1843 			pOPO->SetVertical( pTO->IsVerticalWriting() );
1844 			if( pTO->GetOutlinerParaObject() && (pOPO->GetTextObject() == pTO->GetOutlinerParaObject()->GetTextObject()) )
1845 			{
1846 				// do nothing, same text already set
1847 				delete pOPO;
1848 			}
1849 			else
1850 			{
1851 				DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" );
1852 				if( !bNewObject && pOlView->isRecordingUndo() )
1853 					pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0));
1854 
1855 				pTO->SetOutlinerParaObject( pOPO );
1856 				pTO->SetEmptyPresObj( sal_False );
1857 				pTO->ActionChanged();
1858 			}
1859 		}
1860 	}
1861 	else if( pTO )
1862 	{
1863 		// no text but object available?
1864 		// outline object available, but we have no text
1865 		if(pPage->IsPresObj(pTO))
1866 		{
1867 			// if it is not already empty
1868 			if( !pTO->IsEmptyPresObj() )
1869 			{
1870 				DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" );
1871 
1872 				// make it empty
1873 				if( pOlView->isRecordingUndo() )
1874 					pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0));
1875 				pPage->RestoreDefaultText( pTO );
1876 				pTO->SetEmptyPresObj(sal_True);
1877 				pTO->ActionChanged();
1878 			}
1879 		}
1880 		else
1881 		{
1882 			DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateTitleObject(), no undo for model change!?" );
1883 			// outline object is not part of the layout, delete it
1884 			if( pOlView->isRecordingUndo() )
1885 				pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoRemoveObject(*pTO));
1886 			pPage->RemoveObject(pTO->GetOrdNum());
1887 		}
1888 	}
1889 
1890 	return bNewObject;
1891 }
1892 
1893 /*************************************************************************
1894 |*
1895 |* Update LayoutObject
1896 |*
1897 \************************************************************************/
1898 
1899 bool OutlineViewShell::UpdateOutlineObject( SdPage* pPage, Paragraph* pPara )
1900 {
1901 	DBG_ASSERT( pPage, "sd::OutlineViewShell::UpdateOutlineObject(), pPage == 0?" );
1902 	DBG_ASSERT( pPara, "sd::OutlineViewShell::UpdateOutlineObject(), pPara == 0?" );
1903 
1904 	if( !pPage || !pPara )
1905 		return false;
1906 
1907 	::Outliner* 		pOutliner = pOlView->GetOutliner();
1908 	OutlinerParaObject* pOPO = NULL;
1909 	SdrTextObj* 		pTO  = NULL;
1910 
1911 	sal_Bool bNewObject = sal_False;
1912 
1913 	sal_uInt16 eOutlinerMode = OUTLINERMODE_TITLEOBJECT;
1914 	pTO = (SdrTextObj*)pPage->GetPresObj( PRESOBJ_TEXT );
1915 	if( !pTO )
1916 	{
1917 		eOutlinerMode = OUTLINERMODE_OUTLINEOBJECT;
1918 		pTO = pOlView->GetOutlineTextObject( pPage );
1919 	}
1920 
1921 	// wieviele Absaetze in der Gliederung?
1922 	sal_uLong nTitlePara	 = pOutliner->GetAbsPos( pPara );
1923 	sal_uLong nPara          = nTitlePara + 1;
1924 	sal_uLong nParasInLayout = 0L;
1925 	pPara = pOutliner->GetParagraph( nPara );
1926 	while( pPara && !pOutliner->HasParaFlag(pPara, PARAFLAG_ISPAGE) )
1927 	{
1928 		nParasInLayout++;
1929 		pPara = pOutliner->GetParagraph( ++nPara );
1930 	}
1931 	if( nParasInLayout )
1932 	{
1933 		// ein OutlinerParaObject erzeugen
1934 		pPara = pOutliner->GetParagraph( nTitlePara + 1 );
1935 		pOPO  = pOutliner->CreateParaObject( (sal_uInt16) nTitlePara + 1, (sal_uInt16) nParasInLayout );
1936 	}
1937 
1938 	if( pOPO )
1939 	{
1940 		DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateOutlineObject(), no undo for model change!?" );
1941 
1942 		// do we need an outline text object?
1943 		if( !pTO )
1944 		{
1945 			pTO = pOlView->CreateOutlineTextObject( pPage );
1946 			bNewObject = sal_True;
1947 		}
1948 
1949 		// Seitenobjekt, Gliederungstext im Outliner:
1950 		// Text uebernehmen
1951 		if( pTO )
1952 		{
1953 			pOPO->SetVertical( pTO->IsVerticalWriting() );
1954 			pOPO->SetOutlinerMode( eOutlinerMode );
1955 			if( pTO->GetOutlinerParaObject() && (pOPO->GetTextObject() == pTO->GetOutlinerParaObject()->GetTextObject()) )
1956 			{
1957 				// do nothing, same text already set
1958 				delete pOPO;
1959 			}
1960 			else
1961 			{
1962 				if( !bNewObject && pOlView->isRecordingUndo() )
1963 					pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0));
1964 
1965 				pTO->SetOutlinerParaObject( pOPO );
1966 				pTO->SetEmptyPresObj( sal_False );
1967 				pTO->ActionChanged();
1968 			}
1969 		}
1970 	}
1971 	else if( pTO )
1972 	{
1973 		// Seitenobjekt, aber kein Gliederungstext:
1974 		// wenn Objekt in Praesentationsliste der Seite ist -> Defaulttext,
1975 		// sonst Objekt loeschen
1976 		if( pPage->IsPresObj(pTO) )
1977 		{
1978 			if( !pTO->IsEmptyPresObj() )
1979 			{
1980 				DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateOutlineObject(), no undo for model change!?" );
1981 
1982 				// loescht auch altes OutlinerParaObject
1983 				if( pOlView->isRecordingUndo() )
1984 					pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoObjectSetText(*pTO,0));
1985 				pPage->RestoreDefaultText( pTO );
1986 				pTO->SetEmptyPresObj(sal_True);
1987 				pTO->ActionChanged();
1988 			}
1989 		}
1990 		else
1991 		{
1992 			DBG_ASSERT( pOlView->isRecordingUndo(), "sd::OutlineViewShell::UpdateOutlineObject(), no undo for model change!?" );
1993 			if( pOlView->isRecordingUndo() )
1994 				pOlView->AddUndo(GetDoc()->GetSdrUndoFactory().CreateUndoRemoveObject(*pTO));
1995 			pPage->RemoveObject(pTO->GetOrdNum());
1996 		}
1997 	}
1998 
1999 	return bNewObject;
2000 }
2001 
2002 
2003 /*************************************************************************
2004 |*
2005 |* Outliner aus Stream fuellen
2006 |*
2007 \************************************************************************/
2008 
2009 sal_uLong OutlineViewShell::Read(SvStream& rInput, const String& rBaseURL, sal_uInt16 eFormat)
2010 {
2011 	sal_uLong bRet = 0;
2012 
2013 	::Outliner* pOutl = pOlView->GetOutliner();
2014 
2015 	{
2016 	OutlineViewPageChangesGuard aGuard( pOlView );
2017 	OutlineViewModelChangeGuard aGuard2( *pOlView );
2018 
2019     bRet = pOutl->Read( rInput, rBaseURL, eFormat, GetDocSh()->GetHeaderAttributes() );
2020 
2021 	SdPage* pPage = GetDoc()->GetSdPage( GetDoc()->GetSdPageCount(PK_STANDARD) - 1, PK_STANDARD );;
2022 	SfxStyleSheet* pTitleSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_TITLE );
2023 	SfxStyleSheet* pOutlSheet = pPage->GetStyleSheetForPresObj( PRESOBJ_OUTLINE );
2024 
2025 	sal_uInt16 nParaCount = (sal_uInt16)pOutl->GetParagraphCount();
2026 	if ( nParaCount > 0 )
2027 	{
2028 		for ( sal_uInt16 nPara = 0; nPara < nParaCount; nPara++ )
2029 		{
2030 			pOlView->UpdateParagraph( nPara );
2031 
2032 			sal_Int16 nDepth = pOutl->GetDepth( nPara );
2033 
2034 			if( (nDepth == 0) || !nPara )
2035 			{
2036 				Paragraph* pPara = pOutl->GetParagraph( nPara );
2037 				pOutl->SetDepth(pPara, -1);
2038 				pOutl->SetParaFlag(pPara, PARAFLAG_ISPAGE);
2039 
2040 				pOutl->SetStyleSheet( nPara, pTitleSheet );
2041 
2042 				if( nPara ) // first slide already exists
2043 					pOlView->InsertSlideForParagraph( pPara );
2044 			}
2045 			else
2046 			{
2047 				pOutl->SetDepth( pOutl->GetParagraph( nPara ), nDepth - 1 );
2048 				String aStyleSheetName( pOutlSheet->GetName() );
2049 				aStyleSheetName.Erase( aStyleSheetName.Len() - 1, 1 );
2050 				aStyleSheetName += String::CreateFromInt32( nDepth );
2051 				SfxStyleSheetBasePool* pStylePool = GetDoc()->GetStyleSheetPool();
2052 				SfxStyleSheet* pStyle = (SfxStyleSheet*) pStylePool->Find( aStyleSheetName, pOutlSheet->GetFamily() );
2053 				DBG_ASSERT( pStyle, "AutoStyleSheetName - Style not found!" );
2054 				if ( pStyle )
2055 					pOutl->SetStyleSheet( nPara, pStyle );
2056 			}
2057 		}
2058 	}
2059 	}
2060 
2061 	pOutl->GetUndoManager().Clear();
2062 
2063 	return( bRet );
2064 }
2065 
2066 void OutlineViewShell::WriteUserDataSequence ( ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& rSequence, sal_Bool bBrowse )
2067 {
2068 	WriteFrameViewData();
2069 
2070 	ViewShell::WriteUserDataSequence( rSequence, bBrowse );
2071 }
2072 
2073 void OutlineViewShell::ReadUserDataSequence ( const ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >& rSequence, sal_Bool bBrowse )
2074 {
2075 	WriteFrameViewData();
2076 
2077 	ViewShell::ReadUserDataSequence( rSequence, bBrowse );
2078 
2079 	ReadFrameViewData( mpFrameView );
2080 }
2081 
2082 void OutlineViewShell::VisAreaChanged(const Rectangle& rRect)
2083 {
2084 	ViewShell::VisAreaChanged( rRect );
2085 
2086 	GetViewShellBase().GetDrawController().FireVisAreaChanged(rRect);
2087 }
2088 
2089 /** If there is a valid controller then create a new instance of
2090     <type>AccessibleDrawDocumentView</type>.  Otherwise delegate this call
2091     to the base class to return a default object (probably an empty
2092     reference).
2093 */
2094 ::com::sun::star::uno::Reference<
2095     ::com::sun::star::accessibility::XAccessible>
2096     OutlineViewShell::CreateAccessibleDocumentView (::sd::Window* pWindow)
2097 {
2098     OSL_ASSERT (GetViewShell()!=NULL);
2099     if (GetViewShell()->GetController() != NULL)
2100     {
2101         ::accessibility::AccessibleOutlineView* pDocumentView =
2102             new ::accessibility::AccessibleOutlineView (
2103                 pWindow,
2104                 this,
2105                 GetViewShell()->GetController(),
2106                 pWindow->GetAccessibleParentWindow()->GetAccessible());
2107         pDocumentView->Init();
2108         return ::com::sun::star::uno::Reference<
2109             ::com::sun::star::accessibility::XAccessible>
2110             (static_cast< ::com::sun::star::uno::XWeak*>(pDocumentView),
2111                 ::com::sun::star::uno::UNO_QUERY);
2112     }
2113     else
2114     {
2115         OSL_TRACE ("OutlineViewShell::CreateAccessibleDocumentView: no controller");
2116         return ViewShell::CreateAccessibleDocumentView (pWindow);
2117     }
2118 }
2119 
2120 
2121 
2122 
2123 void OutlineViewShell::GetState (SfxItemSet& rSet)
2124 {
2125     // Iterate over all requested items in the set.
2126 	SfxWhichIter aIter( rSet );
2127 	sal_uInt16 nWhich = aIter.FirstWhich();
2128 	while (nWhich)
2129 	{
2130 		switch (nWhich)
2131 		{
2132 			case SID_SEARCH_ITEM:
2133 			case SID_SEARCH_OPTIONS:
2134                 // Call common (old) implementation in the document shell.
2135                 GetDocSh()->GetState (rSet);
2136                 break;
2137 			default:
2138                 OSL_TRACE ("OutlineViewShell::GetState(): can not handle which id %d", nWhich);
2139                 break;
2140         }
2141 		nWhich = aIter.NextWhich();
2142 	}
2143 }
2144 
2145 
2146 
2147 
2148 void OutlineViewShell::SetCurrentPage (SdPage* pPage)
2149 {
2150     // Adapt the selection of the model.
2151     for (sal_uInt16 i=0; i<GetDoc()->GetSdPageCount(PK_STANDARD); i++)
2152         GetDoc()->SetSelected(
2153             GetDoc()->GetSdPage(i, PK_STANDARD),
2154             sal_False);
2155     GetDoc()->SetSelected (pPage, sal_True);
2156 
2157     DrawController& rController(GetViewShellBase().GetDrawController());
2158     rController.FireSelectionChangeListener();
2159     rController.FireSwitchCurrentPage (pPage);
2160 
2161     pOlView->SetActualPage(pPage);
2162 }
2163 
2164 
2165 } // end of namespace sd
2166