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