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