xref: /AOO41X/main/sd/source/ui/view/drviewsa.cxx (revision 8809db7a87f97847b57a57f4cd2b0104b2b83182)
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 "DrawViewShell.hxx"
28 #include <cppuhelper/implbase1.hxx>
29 #include <comphelper/processfactory.hxx>
30 #ifndef _SVX_SIZEITEM
31 #include <editeng/sizeitem.hxx>
32 #endif
33 #include <svx/svdlayer.hxx>
34 #ifndef _SVX_ZOOMITEM
35 #include <svx/zoomitem.hxx>
36 #endif
37 #include <svx/svdpagv.hxx>
38 #include <svl/ptitem.hxx>
39 #include <svl/stritem.hxx>
40 #include <sfx2/request.hxx>
41 #include <sfx2/dispatch.hxx>
42 #include <svx/svdopath.hxx>
43 #include <sfx2/docfile.hxx>
44 #include <svx/zoomslideritem.hxx>
45 #include <svl/eitem.hxx>
46 
47 #ifndef _SVX_DIALOGS_HRC
48 #include <svx/dialogs.hrc>
49 #endif
50 #include <svx/extrusionbar.hxx>
51 #include <svx/fontworkbar.hxx>
52 #include <svx/clipfmtitem.hxx>
53 
54 
55 #include <sfx2/viewfrm.hxx>
56 #include <svx/fmshell.hxx>
57 #include <sfx2/dispatch.hxx>
58 #include <svtools/cliplistener.hxx>
59 #include <svx/float3d.hxx>
60 #include "helpids.h"
61 
62 #include "view/viewoverlaymanager.hxx"
63 #include "app.hrc"
64 #include "helpids.h"
65 #include "strings.hrc"
66 #include "res_bmp.hrc"
67 #include "sdpage.hxx"
68 #include "FrameView.hxx"
69 #include "drawdoc.hxx"
70 #include "sdresid.hxx"
71 #include "DrawDocShell.hxx"
72 #include "Window.hxx"
73 #include "fupoor.hxx"
74 #include "fusel.hxx"
75 #include "drawview.hxx"
76 #include "SdUnoDrawView.hxx"
77 #include "ViewShellBase.hxx"
78 #include "SdUnoDrawView.hxx"
79 #include "slideshow.hxx"
80 #include "ToolBarManager.hxx"
81 #include "annotationmanager.hxx"
82 
83 using namespace ::rtl;
84 using namespace ::com::sun::star;
85 using namespace ::com::sun::star::uno;
86 
87 namespace {
88 static const ::rtl::OUString MASTER_VIEW_TOOL_BAR_NAME(
89     ::rtl::OUString::createFromAscii("masterviewtoolbar"));
90 }
91 
92 namespace sd {
93 
94 sal_Bool DrawViewShell::mbPipette = sal_False;
95 
96 // ------------------------
97 // - ScannerEventListener -
98 // ------------------------
99 
100 class ScannerEventListener : public ::cppu::WeakImplHelper1< ::com::sun::star::lang::XEventListener >
101 {
102 private:
103 
104     DrawViewShell*      mpParent;
105 
106 public:
107 
108                             ScannerEventListener( DrawViewShell* pParent ) : mpParent( pParent )  {};
109                             ~ScannerEventListener();
110 
111     // XEventListener
112     virtual void SAL_CALL   disposing( const ::com::sun::star::lang::EventObject& rEventObject ) throw (::com::sun::star::uno::RuntimeException);
113 
114     void                    ParentDestroyed() { mpParent = NULL; }
115 };
116 
117 // -----------------------------------------------------------------------------
118 
119 ScannerEventListener::~ScannerEventListener()
120 {
121 }
122 
123 // -----------------------------------------------------------------------------
124 
125 void SAL_CALL ScannerEventListener::disposing( const ::com::sun::star::lang::EventObject& rEventObject ) throw (::com::sun::star::uno::RuntimeException)
126 {
127     if( mpParent )
128         mpParent->ScannerEvent( rEventObject );
129 }
130 
131 /*************************************************************************
132 |*
133 |* Standard-Konstruktor
134 |*
135 \************************************************************************/
136 
137 DrawViewShell::DrawViewShell( SfxViewFrame* pFrame, ViewShellBase& rViewShellBase, ::Window* pParentWindow, PageKind ePageKind, FrameView* pFrameViewArgument )
138 : ViewShell (pFrame, pParentWindow, rViewShellBase)
139 , maTabControl(this, pParentWindow)
140 , mbIsInSwitchPage(false)
141 {
142     if (pFrameViewArgument != NULL)
143         mpFrameView = pFrameViewArgument;
144     else
145         mpFrameView = new FrameView(GetDoc());
146     Construct(GetDocSh(), ePageKind);
147 }
148 
149 /*************************************************************************
150 |*
151 |* Destruktor
152 |*
153 \************************************************************************/
154 
155 DrawViewShell::~DrawViewShell()
156 {
157     mpAnnotationManager.reset();
158     mpViewOverlayManager.reset();
159 
160     OSL_ASSERT (GetViewShell()!=NULL);
161 
162     if( mxScannerListener.is() )
163         static_cast< ScannerEventListener* >( mxScannerListener.get() )->ParentDestroyed();
164 
165     // #96642# Remove references to items within Svx3DWin
166     // (maybe do a listening sometime in Svx3DWin)
167     sal_uInt16 nId = Svx3DChildWindow::GetChildWindowId();
168     SfxChildWindow* pWindow = GetViewFrame() ? GetViewFrame()->GetChildWindow(nId) : NULL;
169     if(pWindow)
170     {
171         Svx3DWin* p3DWin = static_cast< Svx3DWin* > (pWindow->GetWindow());
172         if(p3DWin)
173             p3DWin->DocumentReload();
174     }
175 
176     EndListening (*GetDoc());
177     EndListening (*GetDocSh());
178 
179     if( SlideShow::IsRunning(*this) )
180         StopSlideShow(false);
181 
182     DisposeFunctions();
183 
184     SdPage* pPage;
185     sal_uInt16 aPageCnt = GetDoc()->GetSdPageCount(mePageKind);
186 
187     for (sal_uInt16 i = 0; i < aPageCnt; i++)
188     {
189         pPage = GetDoc()->GetSdPage(i, mePageKind);
190 
191         if (pPage == mpActualPage)
192         {
193             GetDoc()->SetSelected(pPage, sal_True);
194         }
195         else
196         {
197             GetDoc()->SetSelected(pPage, sal_False);
198         }
199     }
200 
201     if ( mpClipEvtLstnr )
202     {
203         mpClipEvtLstnr->AddRemoveListener( GetActiveWindow(), sal_False );
204         mpClipEvtLstnr->ClearCallbackLink();        // #103849# prevent callback if another thread is waiting
205         mpClipEvtLstnr->release();
206     }
207 
208     delete mpDrawView;
209     // Set mpView to NULL so that the destructor of the ViewShell base class
210     // does not access it.
211     mpView = mpDrawView = NULL;
212 
213     mpFrameView->Disconnect();
214     delete [] mpSlotArray;
215 }
216 
217 /*************************************************************************
218 |*
219 |* gemeinsamer Initialisierungsanteil der beiden Konstruktoren
220 |*
221 \************************************************************************/
222 
223 void DrawViewShell::Construct(DrawDocShell* pDocSh, PageKind eInitialPageKind)
224 {
225     mpActualPage = 0;
226     mbMousePosFreezed = sal_False;
227     mbReadOnly = GetDocSh()->IsReadOnly();
228     mpSlotArray = 0;
229     mpClipEvtLstnr = 0;
230     mbPastePossible = sal_False;
231     mbIsLayerModeActive = false;
232 
233     mpFrameView->Connect();
234 
235     OSL_ASSERT (GetViewShell()!=NULL);
236 
237     // Array fuer Slot-/ImageMapping:
238     // Gerader Eintrag: Haupt-/ToolboxSlot
239     // Ungerader Eintrag: gemappter Slot
240     // Achtung: Anpassen von GetIdBySubId() !!!
241     // Reihenfolge (insbesondere Zoom) darf nicht geaendert werden !!!
242     mpSlotArray = new sal_uInt16[ SLOTARRAY_COUNT ];
243     mpSlotArray[ 0 ]  = SID_OBJECT_CHOOSE_MODE;
244     mpSlotArray[ 1 ]  = SID_OBJECT_ROTATE;
245     mpSlotArray[ 2 ]  = SID_OBJECT_ALIGN;
246     mpSlotArray[ 3 ]  = SID_OBJECT_ALIGN_LEFT;
247     mpSlotArray[ 4 ]  = SID_ZOOM_TOOLBOX;
248     mpSlotArray[ 5 ]  = SID_ZOOM_TOOLBOX;
249     mpSlotArray[ 6 ]  = SID_DRAWTBX_TEXT;
250     mpSlotArray[ 7 ]  = SID_ATTR_CHAR;
251     mpSlotArray[ 8 ]  = SID_DRAWTBX_RECTANGLES;
252     mpSlotArray[ 9 ]  = SID_DRAW_RECT;
253     mpSlotArray[ 10 ] = SID_DRAWTBX_ELLIPSES;
254     mpSlotArray[ 11 ] = SID_DRAW_ELLIPSE;
255     mpSlotArray[ 12 ] = SID_DRAWTBX_LINES;
256     mpSlotArray[ 13 ] = SID_DRAW_FREELINE_NOFILL;
257     mpSlotArray[ 14 ] = SID_DRAWTBX_3D_OBJECTS;
258     mpSlotArray[ 15 ] = SID_3D_CUBE;
259     mpSlotArray[ 16 ] = SID_DRAWTBX_INSERT;
260     mpSlotArray[ 17 ] = SID_INSERT_DIAGRAM;
261     mpSlotArray[ 18 ] = SID_POSITION;
262     mpSlotArray[ 19 ] = SID_FRAME_TO_TOP;
263     mpSlotArray[ 20 ] = SID_DRAWTBX_CONNECTORS;
264     mpSlotArray[ 21 ] = SID_TOOL_CONNECTOR;
265     mpSlotArray[ 22 ] = SID_DRAWTBX_ARROWS;
266     mpSlotArray[ 23 ] = SID_LINE_ARROW_END;
267 
268     SetPool( &GetDoc()->GetPool() );
269 
270     GetDoc()->CreateFirstPages();
271 
272     mpDrawView = new DrawView(pDocSh, GetActiveWindow(), this);
273     mpView = mpDrawView;             // Pointer der Basisklasse ViewShell
274     mpDrawView->SetSwapAsynchron(sal_True); // Asynchrones Laden von Graphiken
275 
276     // We do not read the page kind from the frame view anymore so we have
277     // to set it in order to resync frame view and this view.
278     mpFrameView->SetPageKind(eInitialPageKind);
279     mePageKind = eInitialPageKind;
280     meEditMode = EM_PAGE;
281     DocumentType eDocType = GetDoc()->GetDocumentType(); // RTTI fasst hier noch nicht
282     switch (mePageKind)
283     {
284         case PK_STANDARD:
285             meShellType = ST_IMPRESS;
286             break;
287 
288         case PK_NOTES:
289             meShellType = ST_NOTES;
290             break;
291 
292         case PK_HANDOUT:
293             meShellType = ST_HANDOUT;
294             break;
295     }
296 
297     Size aPageSize( GetDoc()->GetSdPage(0, mePageKind)->GetSize() );
298     Point aPageOrg( aPageSize.Width(), aPageSize.Height() / 2);
299     Size aSize(aPageSize.Width() * 3, aPageSize.Height() * 2);
300     InitWindows(aPageOrg, aSize, Point(-1, -1));
301 
302     Point aVisAreaPos;
303 
304     if ( pDocSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
305     {
306         aVisAreaPos = pDocSh->GetVisArea(ASPECT_CONTENT).TopLeft();
307     }
308 
309     mpDrawView->SetWorkArea(Rectangle(Point() - aVisAreaPos - aPageOrg, aSize));
310 
311     // Objekte koennen max. so gross wie die ViewSize werden
312     GetDoc()->SetMaxObjSize(aSize);
313 
314     // Split-Handler fuer TabControls
315     maTabControl.SetSplitHdl( LINK( this, DrawViewShell, TabSplitHdl ) );
316 
317     // Damit der richtige EditMode von der FrameView komplett eingestellt
318     // werden kann, wird hier ein aktuell anderer gewaehlt (kleiner Trick)
319     if (mpFrameView->GetViewShEditMode(mePageKind) == EM_PAGE)
320     {
321         meEditMode = EM_MASTERPAGE;
322     }
323     else
324     {
325         meEditMode = EM_PAGE;
326     }
327 
328     // Einstellungen der FrameView uebernehmen
329     ReadFrameViewData(mpFrameView);
330 
331     if( eDocType == DOCUMENT_TYPE_DRAW )
332     {
333         SetHelpId( SD_IF_SDGRAPHICVIEWSHELL );
334         GetActiveWindow()->SetHelpId( HID_SDGRAPHICVIEWSHELL );
335         GetActiveWindow()->SetUniqueId( HID_SDGRAPHICVIEWSHELL );
336     }
337     else
338     {
339         if (mePageKind == PK_NOTES)
340         {
341             SetHelpId( SID_NOTESMODE );
342             GetActiveWindow()->SetHelpId( CMD_SID_NOTESMODE );
343             GetActiveWindow()->SetUniqueId( CMD_SID_NOTESMODE );
344 
345             // AutoLayouts muessen erzeugt sein
346             GetDoc()->StopWorkStartupDelay();
347         }
348         else if (mePageKind == PK_HANDOUT)
349         {
350             SetHelpId( SID_HANDOUTMODE );
351             GetActiveWindow()->SetHelpId( CMD_SID_HANDOUTMODE );
352             GetActiveWindow()->SetUniqueId( CMD_SID_HANDOUTMODE );
353 
354             // AutoLayouts muessen erzeugt sein
355             GetDoc()->StopWorkStartupDelay();
356         }
357         else
358         {
359             SetHelpId( SD_IF_SDDRAWVIEWSHELL );
360             GetActiveWindow()->SetHelpId( HID_SDDRAWVIEWSHELL );
361             GetActiveWindow()->SetUniqueId( HID_SDDRAWVIEWSHELL );
362         }
363     }
364 
365     // Selektionsfunktion starten
366     SfxRequest aReq(SID_OBJECT_SELECT, 0, GetDoc()->GetItemPool());
367     FuPermanent(aReq);
368     mpDrawView->SetFrameDragSingles(sal_True);
369 
370     if (pDocSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED)
371     {
372         mbZoomOnPage = sal_False;
373     }
374     else
375     {
376         mbZoomOnPage = sal_True;
377     }
378 
379     mbIsRulerDrag = sal_False;
380 
381     String aName( RTL_CONSTASCII_USTRINGPARAM("DrawViewShell"));
382     SetName (aName);
383 
384     mnLockCount = 0UL;
385 
386     ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() );
387 
388     if( xMgr.is() )
389     {
390         mxScannerManager = ::com::sun::star::uno::Reference< ::com::sun::star::scanner::XScannerManager >(
391                            xMgr->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.scanner.ScannerManager" ) ),
392                            ::com::sun::star::uno::UNO_QUERY );
393 
394         if( mxScannerManager.is() )
395         {
396             mxScannerListener = ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >(
397                                 static_cast< ::cppu::OWeakObject* >( new ScannerEventListener( this ) ),
398                                 ::com::sun::star::uno::UNO_QUERY );
399         }
400     }
401 
402     mpAnnotationManager.reset( new AnnotationManager( GetViewShellBase() ) );
403     mpViewOverlayManager.reset( new ViewOverlayManager( GetViewShellBase() ) );
404 }
405 
406 
407 
408 
409 void DrawViewShell::Init (bool bIsMainViewShell)
410 {
411     ViewShell::Init(bIsMainViewShell);
412 
413     StartListening (*GetDocSh());
414 }
415 
416 
417 
418 
419 void DrawViewShell::Shutdown (void)
420 {
421     ViewShell::Shutdown();
422 
423     if(SlideShow::IsRunning( GetViewShellBase() ) )
424     {
425         // Turn off effects.
426         GetDrawView()->SetAnimationMode(SDR_ANIMATION_DISABLE);
427     }
428 }
429 
430 
431 
432 
433 css::uno::Reference<css::drawing::XDrawSubController> DrawViewShell::CreateSubController (void)
434 {
435     css::uno::Reference<css::drawing::XDrawSubController> xSubController;
436 
437     if (IsMainViewShell())
438     {
439         // Create uno sub controller for the main view shell.
440         xSubController = css::uno::Reference<css::drawing::XDrawSubController>(
441             new SdUnoDrawView (
442                 GetViewShellBase().GetDrawController(),
443                 *this,
444                 *GetView()));
445     }
446 
447     return xSubController;
448 }
449 
450 
451 
452 
453 bool DrawViewShell::RelocateToParentWindow (::Window* pParentWindow)
454 {
455     // DrawViewShells can not be relocated to a new parent window at the
456     // moment, so return <FALSE/> except when the given parent window is the
457     // parent window that is already in use.
458     return pParentWindow==GetParentWindow();
459 }
460 
461 
462 
463 
464 /*************************************************************************
465 |*
466 |* pruefe ob linienzuege gezeichnet werden muessen
467 |*
468 \************************************************************************/
469 
470 /*
471     linienzuege werden ueber makros als folge von
472         MoveTo (x, y)
473         LineTo (x, y)   [oder BezierTo (x, y)]
474         LineTo (x, y)
475             :
476     dargestellt. einen endbefehl fuer die linienzuege
477     gibt es nicht, also muessen alle befehle in den
478     requests nach LineTo (BezierTo) abgetestet und die
479     punktparameter gesammelt werden.
480     der erste nicht-LineTo fuehrt dann dazu, dass aus
481     den gesammelten punkten der linienzug erzeugt wird
482 */
483 
484 void DrawViewShell::CheckLineTo(SfxRequest& rReq)
485 {
486     (void)rReq;
487 #ifdef DBG_UTIL
488     if(rReq.IsAPI())
489     {
490         if(SID_LINETO == rReq.GetSlot() || SID_BEZIERTO == rReq.GetSlot() || SID_MOVETO == rReq.GetSlot() )
491         {
492             DBG_ERROR("DrawViewShell::CheckLineTo: slots SID_LINETO, SID_BEZIERTO, SID_MOVETO no longer supported.");
493         }
494     }
495 #endif
496 
497     rReq.Ignore ();
498 }
499 
500 /*************************************************************************
501 |*
502 |* veraendere die seitemparameter, wenn SID_PAGESIZE oder SID_PAGEMARGIN
503 |*
504 \************************************************************************/
505 
506 void DrawViewShell::SetupPage (Size &rSize,
507                                  long nLeft,
508                                  long nRight,
509                                  long nUpper,
510                                  long nLower,
511                                  sal_Bool bSize,
512                                  sal_Bool bMargin,
513                                  sal_Bool bScaleAll)
514 {
515     sal_uInt16 nPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind);
516     sal_uInt16 i;
517 
518     for (i = 0; i < nPageCnt; i++)
519     {
520         /**********************************************************************
521         * Erst alle MasterPages bearbeiten
522         **********************************************************************/
523         SdPage *pPage = GetDoc()->GetMasterSdPage(i, mePageKind);
524 
525         if( pPage )
526         {
527             if( bSize )
528             {
529                 Rectangle aBorderRect(nLeft, nUpper, nRight, nLower);
530                 pPage->ScaleObjects(rSize, aBorderRect, bScaleAll);
531                 pPage->SetSize(rSize);
532 
533             }
534             if( bMargin )
535             {
536                 pPage->SetLftBorder(nLeft);
537                 pPage->SetRgtBorder(nRight);
538                 pPage->SetUppBorder(nUpper);
539                 pPage->SetLwrBorder(nLower);
540             }
541 
542             if ( mePageKind == PK_STANDARD )
543             {
544                 GetDoc()->GetMasterSdPage(i, PK_NOTES)->CreateTitleAndLayout();
545             }
546 
547             pPage->CreateTitleAndLayout();
548         }
549     }
550 
551     nPageCnt = GetDoc()->GetSdPageCount(mePageKind);
552 
553     for (i = 0; i < nPageCnt; i++)
554     {
555         /**********************************************************************
556         * Danach alle Pages bearbeiten
557         **********************************************************************/
558         SdPage *pPage = GetDoc()->GetSdPage(i, mePageKind);
559 
560         if( pPage )
561         {
562             if( bSize )
563             {
564                 Rectangle aBorderRect(nLeft, nUpper, nRight, nLower);
565                 pPage->ScaleObjects(rSize, aBorderRect, bScaleAll);
566                 pPage->SetSize(rSize);
567             }
568             if( bMargin )
569             {
570                 pPage->SetLftBorder(nLeft);
571                 pPage->SetRgtBorder(nRight);
572                 pPage->SetUppBorder(nUpper);
573                 pPage->SetLwrBorder(nLower);
574             }
575 
576             if ( mePageKind == PK_STANDARD )
577             {
578                 SdPage* pNotesPage = GetDoc()->GetSdPage(i, PK_NOTES);
579                 pNotesPage->SetAutoLayout( pNotesPage->GetAutoLayout() );
580             }
581 
582             pPage->SetAutoLayout( pPage->GetAutoLayout() );
583         }
584     }
585 
586     if ( mePageKind == PK_STANDARD )
587     {
588         SdPage* pHandoutPage = GetDoc()->GetSdPage(0, PK_HANDOUT);
589         pHandoutPage->CreateTitleAndLayout(sal_True);
590     }
591 
592     long nWidth = mpActualPage->GetSize().Width();
593     long nHeight = mpActualPage->GetSize().Height();
594 
595     Point aPageOrg(nWidth, nHeight / 2);
596     Size aSize( nWidth * 3, nHeight * 2);
597 
598     InitWindows(aPageOrg, aSize, Point(-1, -1), sal_True);
599 
600     Point aVisAreaPos;
601 
602     if ( GetDocSh()->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
603     {
604         aVisAreaPos = GetDocSh()->GetVisArea(ASPECT_CONTENT).TopLeft();
605     }
606 
607     GetView()->SetWorkArea(Rectangle(Point() - aVisAreaPos - aPageOrg, aSize));
608 
609     UpdateScrollBars();
610 
611     Point aNewOrigin(mpActualPage->GetLftBorder(), mpActualPage->GetUppBorder());
612     GetView()->GetSdrPageView()->SetPageOrigin(aNewOrigin);
613 
614     GetViewFrame()->GetBindings().Invalidate(SID_RULER_NULL_OFFSET);
615 
616     // auf (neue) Seitengroesse zoomen
617     GetViewFrame()->GetDispatcher()->Execute(SID_SIZE_PAGE,
618                         SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
619 }
620 
621 /*************************************************************************
622 |*
623 |* Statuswerte der Statusbar zurueckgeben
624 |*
625 \************************************************************************/
626 
627 void DrawViewShell::GetStatusBarState(SfxItemSet& rSet)
628 {
629     // Zoom-Item
630     // Hier sollte der entsprechende Wert (Optimal ?, Seitenbreite oder
631     // Seite) mit Hilfe des ZoomItems weitergegeben werden !!!
632     if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ATTR_ZOOM ) )
633     {
634         if (GetDocSh()->IsUIActive() || (SlideShow::IsRunning(GetViewShellBase())) )
635         {
636             rSet.DisableItem( SID_ATTR_ZOOM );
637         }
638         else
639         {
640             SvxZoomItem* pZoomItem;
641             sal_uInt16 nZoom = (sal_uInt16) GetActiveWindow()->GetZoom();
642 
643             if( mbZoomOnPage )
644                 pZoomItem = new SvxZoomItem( SVX_ZOOM_WHOLEPAGE, nZoom );
645             else
646                 pZoomItem = new SvxZoomItem( SVX_ZOOM_PERCENT, nZoom );
647 
648             // Bereich einschraenken
649             sal_uInt16 nZoomValues = SVX_ZOOM_ENABLE_ALL;
650             SdrPageView* pPageView = mpDrawView->GetSdrPageView();
651 
652             if( ( pPageView && pPageView->GetObjList()->GetObjCount() == 0 ) )
653                 // || ( mpDrawView->GetMarkedObjectList().GetMarkCount() == 0 ) )
654             {
655                 nZoomValues &= ~SVX_ZOOM_ENABLE_OPTIMAL;
656             }
657 
658             pZoomItem->SetValueSet( nZoomValues );
659             rSet.Put( *pZoomItem );
660             delete pZoomItem;
661         }
662     }
663     if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ATTR_ZOOMSLIDER ) )
664     {
665         rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetDoc() ) );
666         if (GetDocSh()->IsUIActive() || (xSlideshow.is() && xSlideshow->isRunning()) || !GetActiveWindow() )
667         {
668             rSet.DisableItem( SID_ATTR_ZOOMSLIDER );
669         }
670         else
671         {
672             sd::Window * pActiveWindow = GetActiveWindow();
673             SvxZoomSliderItem aZoomItem( (sal_uInt16) pActiveWindow->GetZoom(), (sal_uInt16)pActiveWindow->GetMinZoom(), (sal_uInt16)pActiveWindow->GetMaxZoom() ) ;
674 
675             SdrPageView* pPageView = mpDrawView->GetSdrPageView();
676             if( pPageView )
677             {
678                 Point aPagePos(0, 0);
679                 Size aPageSize = pPageView->GetPage()->GetSize();
680 
681                 aPagePos.X() += aPageSize.Width()  / 2;
682                 aPageSize.Width() = (long) (aPageSize.Width() * 1.03);
683 
684                 aPagePos.Y() += aPageSize.Height() / 2;
685                 aPageSize.Height() = (long) (aPageSize.Height() * 1.03);
686                 aPagePos.Y() -= aPageSize.Height() / 2;
687 
688                 aPagePos.X() -= aPageSize.Width()  / 2;
689 
690                 Rectangle aFullPageZoomRect( aPagePos, aPageSize );
691                 aZoomItem.AddSnappingPoint( pActiveWindow->GetZoomForRect( aFullPageZoomRect ) );
692             }
693             aZoomItem.AddSnappingPoint(100);
694             rSet.Put( aZoomItem );
695         }
696     }
697 
698     Point aPos = GetActiveWindow()->PixelToLogic(maMousePos);
699     mpDrawView->GetSdrPageView()->LogicToPagePos(aPos);
700     Fraction aUIScale(GetDoc()->GetUIScale());
701     aPos.X() = Fraction(aPos.X()) / aUIScale;
702     aPos.Y() = Fraction(aPos.Y()) / aUIScale;
703 
704     // Position- und Groesse-Items
705     if ( mpDrawView->IsAction() )
706     {
707         Rectangle aRect;
708         mpDrawView->TakeActionRect( aRect );
709 
710         if ( aRect.IsEmpty() )
711             rSet.Put( SfxPointItem(SID_ATTR_POSITION, aPos) );
712         else
713         {
714             mpDrawView->GetSdrPageView()->LogicToPagePos(aRect);
715             aPos = aRect.TopLeft();
716             aPos.X() = Fraction(aPos.X()) / aUIScale;
717             aPos.Y() = Fraction(aPos.Y()) / aUIScale;
718             rSet.Put( SfxPointItem( SID_ATTR_POSITION, aPos) );
719             Size aSize( aRect.Right() - aRect.Left(), aRect.Bottom() - aRect.Top() );
720             aSize.Height() = Fraction(aSize.Height()) / aUIScale;
721             aSize.Width()  = Fraction(aSize.Width())  / aUIScale;
722             rSet.Put( SvxSizeItem( SID_ATTR_SIZE, aSize) );
723         }
724     }
725     else
726     {
727         if ( mpDrawView->AreObjectsMarked() )
728         {
729             Rectangle aRect = mpDrawView->GetAllMarkedRect();
730             mpDrawView->GetSdrPageView()->LogicToPagePos(aRect);
731 
732             // Show the position of the selected shape(s)
733             Point aShapePosition (aRect.TopLeft());
734             aShapePosition.X() = Fraction(aShapePosition.X()) / aUIScale;
735             aShapePosition.Y() = Fraction(aShapePosition.Y()) / aUIScale;
736             rSet.Put (SfxPointItem(SID_ATTR_POSITION, aShapePosition));
737 
738             Size aSize( aRect.Right() - aRect.Left(), aRect.Bottom() - aRect.Top() );
739             aSize.Height() = Fraction(aSize.Height()) / aUIScale;
740             aSize.Width()  = Fraction(aSize.Width())  / aUIScale;
741             rSet.Put( SvxSizeItem( SID_ATTR_SIZE, aSize) );
742         }
743         else
744         {
745             rSet.Put( SfxPointItem(SID_ATTR_POSITION, aPos) );
746             rSet.Put( SvxSizeItem( SID_ATTR_SIZE, Size( 0, 0 ) ) );
747         }
748     }
749 
750     // Display of current page and layer.
751     if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_STATUS_PAGE ) )
752     {
753         // Allways show the slide/page number.
754         String aString (SdResId( STR_SD_PAGE ));
755         aString += sal_Unicode(' ');
756         aString += UniString::CreateFromInt32( maTabControl.GetCurPageId() );
757         aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " / " ));
758         aString += UniString::CreateFromInt32( GetDoc()->GetSdPageCount( mePageKind ) );
759 
760         // If in layer mode additionally show the layer that contains all
761         // selected shapes of the page.  If the shapes are distributed on
762         // more than one layer, no layer name is shown.
763         if (IsLayerModeActive())
764         {
765             SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin();
766             SdrLayerID nLayer = 0, nOldLayer = 0;
767             SdrLayer*  pLayer = NULL;
768             SdrObject* pObj = NULL;
769             const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
770             sal_uLong nMarkCount = rMarkList.GetMarkCount();
771             FASTBOOL bOneLayer = sal_True;
772 
773             // Use the first ten selected shapes as a (hopefully
774             // representative) sample of all shapes of the current page.
775             // Detect whether they belong to the same layer.
776             for( sal_uLong j = 0; j < nMarkCount && bOneLayer && j < 10; j++ )
777             {
778                 pObj = rMarkList.GetMark( j )->GetMarkedSdrObj();
779                 if( pObj )
780                 {
781                     nLayer = pObj->GetLayer();
782 
783                     if( j != 0 && nLayer != nOldLayer )
784                         bOneLayer = sal_False;
785 
786                     nOldLayer = nLayer;
787                 }
788             }
789 
790             // Append the layer name to the current page number.
791             if( bOneLayer && nMarkCount )
792             {
793                 pLayer = rLayerAdmin.GetLayerPerID( nLayer );
794                 if( pLayer )
795                 {
796                     aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " (" ));
797                     aString += pLayer->GetName();
798                     aString += sal_Unicode(')');
799                 }
800             }
801         }
802 
803         rSet.Put (SfxStringItem (SID_STATUS_PAGE, aString));
804     }
805     // Layout
806     if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_STATUS_LAYOUT ) )
807     {
808         String aString = mpActualPage->GetLayoutName();
809         aString.Erase( aString.SearchAscii( SD_LT_SEPARATOR ) );
810         rSet.Put( SfxStringItem( SID_STATUS_LAYOUT, aString ) );
811     }
812 }
813 
814 
815 
816 void DrawViewShell::Notify (SfxBroadcaster&, const SfxHint& rHint)
817 {
818     const SfxSimpleHint* pSimple = dynamic_cast< const SfxSimpleHint* >(&rHint);
819     if (pSimple!=NULL && pSimple->GetId()==SFX_HINT_MODECHANGED)
820     {
821         // Change to selection when turning on read-only mode.
822         if(GetDocSh()->IsReadOnly() && dynamic_cast< FuSelection* >( GetCurrentFunction().get() ) )
823         {
824             SfxRequest aReq(SID_OBJECT_SELECT, 0, GetDoc()->GetItemPool());
825             FuPermanent(aReq);
826         }
827 
828         // Turn on design mode when document is not read-only.
829         if (GetDocSh()->IsReadOnly() != mbReadOnly )
830         {
831             mbReadOnly = GetDocSh()->IsReadOnly();
832 
833             SfxBoolItem aItem( SID_FM_DESIGN_MODE, !mbReadOnly );
834             GetViewFrame()->GetDispatcher()->Execute( SID_FM_DESIGN_MODE,
835                 SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L );
836         }
837     }
838 
839 }
840 
841 void DrawViewShell::ExecuteAnnotation (SfxRequest& rRequest)
842 {
843     if( mpAnnotationManager.get() )
844         mpAnnotationManager->ExecuteAnnotation( rRequest );
845 }
846 
847 // --------------------------------------------------------------------
848 
849 void DrawViewShell::GetAnnotationState (SfxItemSet& rItemSet )
850 {
851     if( mpAnnotationManager.get() )
852         mpAnnotationManager->GetAnnotationState( rItemSet );
853 }
854 
855 
856 } // end of namespace sd
857