summaryrefslogtreecommitdiff
path: root/sd/source/ui/view/drviewsa.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/view/drviewsa.cxx')
-rwxr-xr-xsd/source/ui/view/drviewsa.cxx859
1 files changed, 859 insertions, 0 deletions
diff --git a/sd/source/ui/view/drviewsa.cxx b/sd/source/ui/view/drviewsa.cxx
new file mode 100755
index 000000000000..3628a11ac5a1
--- /dev/null
+++ b/sd/source/ui/view/drviewsa.cxx
@@ -0,0 +1,859 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sd.hxx"
+
+#include "DrawViewShell.hxx"
+#include <cppuhelper/implbase1.hxx>
+#include <comphelper/processfactory.hxx>
+#ifndef _SVX_SIZEITEM
+#include <editeng/sizeitem.hxx>
+#endif
+#include <svx/svdlayer.hxx>
+#ifndef _SVX_ZOOMITEM
+#include <svx/zoomitem.hxx>
+#endif
+#include <svx/svdpagv.hxx>
+#include <svl/ptitem.hxx>
+#include <svl/stritem.hxx>
+#include <sfx2/request.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svx/svdopath.hxx>
+#include <sfx2/docfile.hxx>
+#include <svx/zoomslideritem.hxx>
+#include <svl/eitem.hxx>
+
+#ifndef _SVX_DIALOGS_HRC
+#include <svx/dialogs.hrc>
+#endif
+#include <svx/extrusionbar.hxx>
+#include <svx/fontworkbar.hxx>
+#include <svx/clipfmtitem.hxx>
+
+
+#include <sfx2/viewfrm.hxx>
+#include <svx/fmshell.hxx>
+#include <sfx2/dispatch.hxx>
+#include <svtools/cliplistener.hxx>
+#include <svx/float3d.hxx>
+
+#include "view/viewoverlaymanager.hxx"
+#include "app.hrc"
+#include "helpids.h"
+#include "strings.hrc"
+#include "res_bmp.hrc"
+#include "sdpage.hxx"
+#include "FrameView.hxx"
+#include "drawdoc.hxx"
+#include "sdresid.hxx"
+#include "DrawDocShell.hxx"
+#include "Window.hxx"
+#include "fupoor.hxx"
+#include "fusel.hxx"
+#include "drawview.hxx"
+#include "SdUnoDrawView.hxx"
+#include "ViewShellBase.hxx"
+#include "SdUnoDrawView.hxx"
+#include "slideshow.hxx"
+#include "ToolBarManager.hxx"
+#include "annotationmanager.hxx"
+
+using namespace ::rtl;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::uno;
+
+namespace {
+static const ::rtl::OUString MASTER_VIEW_TOOL_BAR_NAME(
+ ::rtl::OUString::createFromAscii("masterviewtoolbar"));
+}
+
+namespace sd {
+
+BOOL DrawViewShell::mbPipette = FALSE;
+
+// ------------------------
+// - ScannerEventListener -
+// ------------------------
+
+class ScannerEventListener : public ::cppu::WeakImplHelper1< ::com::sun::star::lang::XEventListener >
+{
+private:
+
+ DrawViewShell* mpParent;
+
+public:
+
+ ScannerEventListener( DrawViewShell* pParent ) : mpParent( pParent ) {};
+ ~ScannerEventListener();
+
+ // XEventListener
+ virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& rEventObject ) throw (::com::sun::star::uno::RuntimeException);
+
+ void ParentDestroyed() { mpParent = NULL; }
+};
+
+// -----------------------------------------------------------------------------
+
+ScannerEventListener::~ScannerEventListener()
+{
+}
+
+// -----------------------------------------------------------------------------
+
+void SAL_CALL ScannerEventListener::disposing( const ::com::sun::star::lang::EventObject& rEventObject ) throw (::com::sun::star::uno::RuntimeException)
+{
+ if( mpParent )
+ mpParent->ScannerEvent( rEventObject );
+}
+
+/*************************************************************************
+|*
+|* Standard-Konstruktor
+|*
+\************************************************************************/
+
+DrawViewShell::DrawViewShell( SfxViewFrame* pFrame, ViewShellBase& rViewShellBase, ::Window* pParentWindow, PageKind ePageKind, FrameView* pFrameViewArgument )
+: ViewShell (pFrame, pParentWindow, rViewShellBase)
+, maTabControl(this, pParentWindow)
+, mbIsInSwitchPage(false)
+{
+ if (pFrameViewArgument != NULL)
+ mpFrameView = pFrameViewArgument;
+ else
+ mpFrameView = new FrameView(GetDoc());
+ Construct(GetDocSh(), ePageKind);
+}
+
+/*************************************************************************
+|*
+|* Destruktor
+|*
+\************************************************************************/
+
+DrawViewShell::~DrawViewShell()
+{
+ mpAnnotationManager.reset();
+ mpViewOverlayManager.reset();
+
+ OSL_ASSERT (GetViewShell()!=NULL);
+
+ if( mxScannerListener.is() )
+ static_cast< ScannerEventListener* >( mxScannerListener.get() )->ParentDestroyed();
+
+ // #96642# Remove references to items within Svx3DWin
+ // (maybe do a listening sometime in Svx3DWin)
+ USHORT nId = Svx3DChildWindow::GetChildWindowId();
+ SfxChildWindow* pWindow = GetViewFrame() ? GetViewFrame()->GetChildWindow(nId) : NULL;
+ if(pWindow)
+ {
+ Svx3DWin* p3DWin = static_cast< Svx3DWin* > (pWindow->GetWindow());
+ if(p3DWin)
+ p3DWin->DocumentReload();
+ }
+
+ EndListening (*GetDoc());
+ EndListening (*GetDocSh());
+
+ if( SlideShow::IsRunning(*this) )
+ StopSlideShow(false);
+
+ DisposeFunctions();
+
+ SdPage* pPage;
+ USHORT aPageCnt = GetDoc()->GetSdPageCount(mePageKind);
+
+ for (USHORT i = 0; i < aPageCnt; i++)
+ {
+ pPage = GetDoc()->GetSdPage(i, mePageKind);
+
+ if (pPage == mpActualPage)
+ {
+ GetDoc()->SetSelected(pPage, TRUE);
+ }
+ else
+ {
+ GetDoc()->SetSelected(pPage, FALSE);
+ }
+ }
+
+ if ( mpClipEvtLstnr )
+ {
+ mpClipEvtLstnr->AddRemoveListener( GetActiveWindow(), FALSE );
+ mpClipEvtLstnr->ClearCallbackLink(); // #103849# prevent callback if another thread is waiting
+ mpClipEvtLstnr->release();
+ }
+
+ delete mpDrawView;
+ // Set mpView to NULL so that the destructor of the ViewShell base class
+ // does not access it.
+ mpView = mpDrawView = NULL;
+
+ mpFrameView->Disconnect();
+ delete [] mpSlotArray;
+}
+
+/*************************************************************************
+|*
+|* gemeinsamer Initialisierungsanteil der beiden Konstruktoren
+|*
+\************************************************************************/
+
+void DrawViewShell::Construct(DrawDocShell* pDocSh, PageKind eInitialPageKind)
+{
+ mpActualPage = 0;
+ mbMousePosFreezed = FALSE;
+ mbReadOnly = GetDocSh()->IsReadOnly();
+ mpSlotArray = 0;
+ mpClipEvtLstnr = 0;
+ mbPastePossible = FALSE;
+ mbIsLayerModeActive = false;
+
+ mpFrameView->Connect();
+
+ OSL_ASSERT (GetViewShell()!=NULL);
+
+ // Array fuer Slot-/ImageMapping:
+ // Gerader Eintrag: Haupt-/ToolboxSlot
+ // Ungerader Eintrag: gemappter Slot
+ // Achtung: Anpassen von GetIdBySubId() !!!
+ // Reihenfolge (insbesondere Zoom) darf nicht geaendert werden !!!
+ mpSlotArray = new USHORT[ SLOTARRAY_COUNT ];
+ mpSlotArray[ 0 ] = SID_OBJECT_CHOOSE_MODE;
+ mpSlotArray[ 1 ] = SID_OBJECT_ROTATE;
+ mpSlotArray[ 2 ] = SID_OBJECT_ALIGN;
+ mpSlotArray[ 3 ] = SID_OBJECT_ALIGN_LEFT;
+ mpSlotArray[ 4 ] = SID_ZOOM_TOOLBOX;
+ mpSlotArray[ 5 ] = SID_ZOOM_TOOLBOX;
+ mpSlotArray[ 6 ] = SID_DRAWTBX_TEXT;
+ mpSlotArray[ 7 ] = SID_ATTR_CHAR;
+ mpSlotArray[ 8 ] = SID_DRAWTBX_RECTANGLES;
+ mpSlotArray[ 9 ] = SID_DRAW_RECT;
+ mpSlotArray[ 10 ] = SID_DRAWTBX_ELLIPSES;
+ mpSlotArray[ 11 ] = SID_DRAW_ELLIPSE;
+ mpSlotArray[ 12 ] = SID_DRAWTBX_LINES;
+ mpSlotArray[ 13 ] = SID_DRAW_FREELINE_NOFILL;
+ mpSlotArray[ 14 ] = SID_DRAWTBX_3D_OBJECTS;
+ mpSlotArray[ 15 ] = SID_3D_CUBE;
+ mpSlotArray[ 16 ] = SID_DRAWTBX_INSERT;
+ mpSlotArray[ 17 ] = SID_INSERT_DIAGRAM;
+ mpSlotArray[ 18 ] = SID_POSITION;
+ mpSlotArray[ 19 ] = SID_FRAME_TO_TOP;
+ mpSlotArray[ 20 ] = SID_DRAWTBX_CONNECTORS;
+ mpSlotArray[ 21 ] = SID_TOOL_CONNECTOR;
+ mpSlotArray[ 22 ] = SID_DRAWTBX_ARROWS;
+ mpSlotArray[ 23 ] = SID_LINE_ARROW_END;
+
+ SetPool( &GetDoc()->GetPool() );
+
+ GetDoc()->CreateFirstPages();
+
+ mpDrawView = new DrawView(pDocSh, GetActiveWindow(), this);
+ mpView = mpDrawView; // Pointer der Basisklasse ViewShell
+ mpDrawView->SetSwapAsynchron(TRUE); // Asynchrones Laden von Graphiken
+
+ // We do not read the page kind from the frame view anymore so we have
+ // to set it in order to resync frame view and this view.
+ mpFrameView->SetPageKind(eInitialPageKind);
+ mePageKind = eInitialPageKind;
+ meEditMode = EM_PAGE;
+ DocumentType eDocType = GetDoc()->GetDocumentType(); // RTTI fasst hier noch nicht
+ switch (mePageKind)
+ {
+ case PK_STANDARD:
+ meShellType = ST_IMPRESS;
+ break;
+
+ case PK_NOTES:
+ meShellType = ST_NOTES;
+ break;
+
+ case PK_HANDOUT:
+ meShellType = ST_HANDOUT;
+ break;
+ }
+
+ Size aPageSize( GetDoc()->GetSdPage(0, mePageKind)->GetSize() );
+ Point aPageOrg( aPageSize.Width(), aPageSize.Height() / 2);
+ Size aSize(aPageSize.Width() * 3, aPageSize.Height() * 2);
+ InitWindows(aPageOrg, aSize, Point(-1, -1));
+
+ Point aVisAreaPos;
+
+ if ( pDocSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
+ {
+ aVisAreaPos = pDocSh->GetVisArea(ASPECT_CONTENT).TopLeft();
+ }
+
+ mpDrawView->SetWorkArea(Rectangle(Point() - aVisAreaPos - aPageOrg, aSize));
+
+ // Objekte koennen max. so gross wie die ViewSize werden
+ GetDoc()->SetMaxObjSize(aSize);
+
+ // Split-Handler fuer TabControls
+ maTabControl.SetSplitHdl( LINK( this, DrawViewShell, TabSplitHdl ) );
+
+ // Damit der richtige EditMode von der FrameView komplett eingestellt
+ // werden kann, wird hier ein aktuell anderer gewaehlt (kleiner Trick)
+ if (mpFrameView->GetViewShEditMode(mePageKind) == EM_PAGE)
+ {
+ meEditMode = EM_MASTERPAGE;
+ }
+ else
+ {
+ meEditMode = EM_PAGE;
+ }
+
+ // Einstellungen der FrameView uebernehmen
+ ReadFrameViewData(mpFrameView);
+
+ if( eDocType == DOCUMENT_TYPE_DRAW )
+ {
+ SetHelpId( SD_IF_SDGRAPHICVIEWSHELL );
+ GetActiveWindow()->SetHelpId( SD_IF_SDGRAPHICVIEWSHELL );
+ GetActiveWindow()->SetUniqueId( SD_IF_SDGRAPHICVIEWSHELL );
+ }
+ else
+ {
+ if (mePageKind == PK_NOTES)
+ {
+ SetHelpId( SID_NOTESMODE );
+ GetActiveWindow()->SetHelpId( SID_NOTESMODE );
+ GetActiveWindow()->SetUniqueId( SID_NOTESMODE );
+
+ // AutoLayouts muessen erzeugt sein
+ GetDoc()->StopWorkStartupDelay();
+ }
+ else if (mePageKind == PK_HANDOUT)
+ {
+ SetHelpId( SID_HANDOUTMODE );
+ GetActiveWindow()->SetHelpId( SID_HANDOUTMODE );
+ GetActiveWindow()->SetUniqueId( SID_HANDOUTMODE );
+
+ // AutoLayouts muessen erzeugt sein
+ GetDoc()->StopWorkStartupDelay();
+ }
+ else
+ {
+ SetHelpId( SD_IF_SDDRAWVIEWSHELL );
+ GetActiveWindow()->SetHelpId( SD_IF_SDDRAWVIEWSHELL );
+ GetActiveWindow()->SetUniqueId( SD_IF_SDDRAWVIEWSHELL );
+ }
+ }
+
+ // Selektionsfunktion starten
+ SfxRequest aReq(SID_OBJECT_SELECT, 0, GetDoc()->GetItemPool());
+ FuPermanent(aReq);
+ mpDrawView->SetFrameDragSingles(TRUE);
+
+ if (pDocSh->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED)
+ {
+ mbZoomOnPage = FALSE;
+ }
+ else
+ {
+ mbZoomOnPage = TRUE;
+ }
+
+ mbIsRulerDrag = FALSE;
+
+ String aName( RTL_CONSTASCII_USTRINGPARAM("DrawViewShell"));
+ SetName (aName);
+
+ mnLockCount = 0UL;
+
+ ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() );
+
+ if( xMgr.is() )
+ {
+ mxScannerManager = ::com::sun::star::uno::Reference< ::com::sun::star::scanner::XScannerManager >(
+ xMgr->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.scanner.ScannerManager" ) ),
+ ::com::sun::star::uno::UNO_QUERY );
+
+ if( mxScannerManager.is() )
+ {
+ mxScannerListener = ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >(
+ static_cast< ::cppu::OWeakObject* >( new ScannerEventListener( this ) ),
+ ::com::sun::star::uno::UNO_QUERY );
+ }
+ }
+
+ mpAnnotationManager.reset( new AnnotationManager( GetViewShellBase() ) );
+ mpViewOverlayManager.reset( new ViewOverlayManager( GetViewShellBase() ) );
+}
+
+
+
+
+void DrawViewShell::Init (bool bIsMainViewShell)
+{
+ ViewShell::Init(bIsMainViewShell);
+
+ StartListening (*GetDocSh());
+}
+
+
+
+
+void DrawViewShell::Shutdown (void)
+{
+ ViewShell::Shutdown();
+
+ if(SlideShow::IsRunning( GetViewShellBase() ) )
+ {
+ // Turn off effects.
+ GetDrawView()->SetAnimationMode(SDR_ANIMATION_DISABLE);
+ }
+}
+
+
+
+
+css::uno::Reference<css::drawing::XDrawSubController> DrawViewShell::CreateSubController (void)
+{
+ css::uno::Reference<css::drawing::XDrawSubController> xSubController;
+
+ if (IsMainViewShell())
+ {
+ // Create uno sub controller for the main view shell.
+ xSubController = css::uno::Reference<css::drawing::XDrawSubController>(
+ new SdUnoDrawView (
+ GetViewShellBase().GetDrawController(),
+ *this,
+ *GetView()));
+ }
+
+ return xSubController;
+}
+
+
+
+
+bool DrawViewShell::RelocateToParentWindow (::Window* pParentWindow)
+{
+ // DrawViewShells can not be relocated to a new parent window at the
+ // moment, so return <FALSE/> except when the given parent window is the
+ // parent window that is already in use.
+ return pParentWindow==GetParentWindow();
+}
+
+
+
+
+/*************************************************************************
+|*
+|* pruefe ob linienzuege gezeichnet werden muessen
+|*
+\************************************************************************/
+
+/*
+ linienzuege werden ueber makros als folge von
+ MoveTo (x, y)
+ LineTo (x, y) [oder BezierTo (x, y)]
+ LineTo (x, y)
+ :
+ dargestellt. einen endbefehl fuer die linienzuege
+ gibt es nicht, also muessen alle befehle in den
+ requests nach LineTo (BezierTo) abgetestet und die
+ punktparameter gesammelt werden.
+ der erste nicht-LineTo fuehrt dann dazu, dass aus
+ den gesammelten punkten der linienzug erzeugt wird
+*/
+
+void DrawViewShell::CheckLineTo(SfxRequest& rReq)
+{
+ (void)rReq;
+#ifdef DBG_UTIL
+ if(rReq.IsAPI())
+ {
+ if(SID_LINETO == rReq.GetSlot() || SID_BEZIERTO == rReq.GetSlot() || SID_MOVETO == rReq.GetSlot() )
+ {
+ DBG_ERROR("DrawViewShell::CheckLineTo: slots SID_LINETO, SID_BEZIERTO, SID_MOVETO no longer supported.");
+ }
+ }
+#endif
+
+ rReq.Ignore ();
+}
+
+/*************************************************************************
+|*
+|* veraendere die seitemparameter, wenn SID_PAGESIZE oder SID_PAGEMARGIN
+|*
+\************************************************************************/
+
+void DrawViewShell::SetupPage (Size &rSize,
+ long nLeft,
+ long nRight,
+ long nUpper,
+ long nLower,
+ BOOL bSize,
+ BOOL bMargin,
+ BOOL bScaleAll)
+{
+ USHORT nPageCnt = GetDoc()->GetMasterSdPageCount(mePageKind);
+ USHORT i;
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ /**********************************************************************
+ * Erst alle MasterPages bearbeiten
+ **********************************************************************/
+ SdPage *pPage = GetDoc()->GetMasterSdPage(i, mePageKind);
+
+ if( pPage )
+ {
+ if( bSize )
+ {
+ Rectangle aBorderRect(nLeft, nUpper, nRight, nLower);
+ pPage->ScaleObjects(rSize, aBorderRect, bScaleAll);
+ pPage->SetSize(rSize);
+
+ }
+ if( bMargin )
+ {
+ pPage->SetLftBorder(nLeft);
+ pPage->SetRgtBorder(nRight);
+ pPage->SetUppBorder(nUpper);
+ pPage->SetLwrBorder(nLower);
+ }
+
+ if ( mePageKind == PK_STANDARD )
+ {
+ GetDoc()->GetMasterSdPage(i, PK_NOTES)->CreateTitleAndLayout();
+ }
+
+ pPage->CreateTitleAndLayout();
+ }
+ }
+
+ nPageCnt = GetDoc()->GetSdPageCount(mePageKind);
+
+ for (i = 0; i < nPageCnt; i++)
+ {
+ /**********************************************************************
+ * Danach alle Pages bearbeiten
+ **********************************************************************/
+ SdPage *pPage = GetDoc()->GetSdPage(i, mePageKind);
+
+ if( pPage )
+ {
+ if( bSize )
+ {
+ Rectangle aBorderRect(nLeft, nUpper, nRight, nLower);
+ pPage->ScaleObjects(rSize, aBorderRect, bScaleAll);
+ pPage->SetSize(rSize);
+ }
+ if( bMargin )
+ {
+ pPage->SetLftBorder(nLeft);
+ pPage->SetRgtBorder(nRight);
+ pPage->SetUppBorder(nUpper);
+ pPage->SetLwrBorder(nLower);
+ }
+
+ if ( mePageKind == PK_STANDARD )
+ {
+ SdPage* pNotesPage = GetDoc()->GetSdPage(i, PK_NOTES);
+ pNotesPage->SetAutoLayout( pNotesPage->GetAutoLayout() );
+ }
+
+ pPage->SetAutoLayout( pPage->GetAutoLayout() );
+ }
+ }
+
+ if ( mePageKind == PK_STANDARD )
+ {
+ SdPage* pHandoutPage = GetDoc()->GetSdPage(0, PK_HANDOUT);
+ pHandoutPage->CreateTitleAndLayout(TRUE);
+ }
+
+ long nWidth = mpActualPage->GetSize().Width();
+ long nHeight = mpActualPage->GetSize().Height();
+
+ Point aPageOrg(nWidth, nHeight / 2);
+ Size aSize( nWidth * 3, nHeight * 2);
+
+ InitWindows(aPageOrg, aSize, Point(-1, -1), TRUE);
+
+ Point aVisAreaPos;
+
+ if ( GetDocSh()->GetCreateMode() == SFX_CREATE_MODE_EMBEDDED )
+ {
+ aVisAreaPos = GetDocSh()->GetVisArea(ASPECT_CONTENT).TopLeft();
+ }
+
+ GetView()->SetWorkArea(Rectangle(Point() - aVisAreaPos - aPageOrg, aSize));
+
+ UpdateScrollBars();
+
+ Point aNewOrigin(mpActualPage->GetLftBorder(), mpActualPage->GetUppBorder());
+ GetView()->GetSdrPageView()->SetPageOrigin(aNewOrigin);
+
+ GetViewFrame()->GetBindings().Invalidate(SID_RULER_NULL_OFFSET);
+
+ // auf (neue) Seitengroesse zoomen
+ GetViewFrame()->GetDispatcher()->Execute(SID_SIZE_PAGE,
+ SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
+}
+
+/*************************************************************************
+|*
+|* Statuswerte der Statusbar zurueckgeben
+|*
+\************************************************************************/
+
+void DrawViewShell::GetStatusBarState(SfxItemSet& rSet)
+{
+ // Zoom-Item
+ // Hier sollte der entsprechende Wert (Optimal ?, Seitenbreite oder
+ // Seite) mit Hilfe des ZoomItems weitergegeben werden !!!
+ if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ATTR_ZOOM ) )
+ {
+ if (GetDocSh()->IsUIActive() || (SlideShow::IsRunning(GetViewShellBase())) )
+ {
+ rSet.DisableItem( SID_ATTR_ZOOM );
+ }
+ else
+ {
+ SvxZoomItem* pZoomItem;
+ UINT16 nZoom = (UINT16) GetActiveWindow()->GetZoom();
+
+ if( mbZoomOnPage )
+ pZoomItem = new SvxZoomItem( SVX_ZOOM_WHOLEPAGE, nZoom );
+ else
+ pZoomItem = new SvxZoomItem( SVX_ZOOM_PERCENT, nZoom );
+
+ // Bereich einschraenken
+ USHORT nZoomValues = SVX_ZOOM_ENABLE_ALL;
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+
+ if( ( pPageView && pPageView->GetObjList()->GetObjCount() == 0 ) )
+ // || ( mpDrawView->GetMarkedObjectList().GetMarkCount() == 0 ) )
+ {
+ nZoomValues &= ~SVX_ZOOM_ENABLE_OPTIMAL;
+ }
+
+ pZoomItem->SetValueSet( nZoomValues );
+ rSet.Put( *pZoomItem );
+ delete pZoomItem;
+ }
+ }
+ if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_ATTR_ZOOMSLIDER ) )
+ {
+ rtl::Reference< sd::SlideShow > xSlideshow( SlideShow::GetSlideShow( GetDoc() ) );
+ if (GetDocSh()->IsUIActive() || (xSlideshow.is() && xSlideshow->isRunning()) || !GetActiveWindow() )
+ {
+ rSet.DisableItem( SID_ATTR_ZOOMSLIDER );
+ }
+ else
+ {
+ sd::Window * pActiveWindow = GetActiveWindow();
+ SvxZoomSliderItem aZoomItem( (UINT16) pActiveWindow->GetZoom(), (USHORT)pActiveWindow->GetMinZoom(), (USHORT)pActiveWindow->GetMaxZoom() ) ;
+
+ SdrPageView* pPageView = mpDrawView->GetSdrPageView();
+ if( pPageView )
+ {
+ Point aPagePos(0, 0);
+ Size aPageSize = pPageView->GetPage()->GetSize();
+
+ aPagePos.X() += aPageSize.Width() / 2;
+ aPageSize.Width() = (long) (aPageSize.Width() * 1.03);
+
+ aPagePos.Y() += aPageSize.Height() / 2;
+ aPageSize.Height() = (long) (aPageSize.Height() * 1.03);
+ aPagePos.Y() -= aPageSize.Height() / 2;
+
+ aPagePos.X() -= aPageSize.Width() / 2;
+
+ Rectangle aFullPageZoomRect( aPagePos, aPageSize );
+ aZoomItem.AddSnappingPoint( pActiveWindow->GetZoomForRect( aFullPageZoomRect ) );
+ }
+ aZoomItem.AddSnappingPoint(100);
+ rSet.Put( aZoomItem );
+ }
+ }
+
+ Point aPos = GetActiveWindow()->PixelToLogic(maMousePos);
+ mpDrawView->GetSdrPageView()->LogicToPagePos(aPos);
+ Fraction aUIScale(GetDoc()->GetUIScale());
+ aPos.X() = Fraction(aPos.X()) / aUIScale;
+ aPos.Y() = Fraction(aPos.Y()) / aUIScale;
+
+ // Position- und Groesse-Items
+ if ( mpDrawView->IsAction() )
+ {
+ Rectangle aRect;
+ mpDrawView->TakeActionRect( aRect );
+
+ if ( aRect.IsEmpty() )
+ rSet.Put( SfxPointItem(SID_ATTR_POSITION, aPos) );
+ else
+ {
+ mpDrawView->GetSdrPageView()->LogicToPagePos(aRect);
+ aPos = aRect.TopLeft();
+ aPos.X() = Fraction(aPos.X()) / aUIScale;
+ aPos.Y() = Fraction(aPos.Y()) / aUIScale;
+ rSet.Put( SfxPointItem( SID_ATTR_POSITION, aPos) );
+ Size aSize( aRect.Right() - aRect.Left(), aRect.Bottom() - aRect.Top() );
+ aSize.Height() = Fraction(aSize.Height()) / aUIScale;
+ aSize.Width() = Fraction(aSize.Width()) / aUIScale;
+ rSet.Put( SvxSizeItem( SID_ATTR_SIZE, aSize) );
+ }
+ }
+ else
+ {
+ if ( mpDrawView->AreObjectsMarked() )
+ {
+ Rectangle aRect = mpDrawView->GetAllMarkedRect();
+ mpDrawView->GetSdrPageView()->LogicToPagePos(aRect);
+
+ // Show the position of the selected shape(s)
+ Point aShapePosition (aRect.TopLeft());
+ aShapePosition.X() = Fraction(aShapePosition.X()) / aUIScale;
+ aShapePosition.Y() = Fraction(aShapePosition.Y()) / aUIScale;
+ rSet.Put (SfxPointItem(SID_ATTR_POSITION, aShapePosition));
+
+ Size aSize( aRect.Right() - aRect.Left(), aRect.Bottom() - aRect.Top() );
+ aSize.Height() = Fraction(aSize.Height()) / aUIScale;
+ aSize.Width() = Fraction(aSize.Width()) / aUIScale;
+ rSet.Put( SvxSizeItem( SID_ATTR_SIZE, aSize) );
+ }
+ else
+ {
+ rSet.Put( SfxPointItem(SID_ATTR_POSITION, aPos) );
+ rSet.Put( SvxSizeItem( SID_ATTR_SIZE, Size( 0, 0 ) ) );
+ }
+ }
+
+ // Display of current page and layer.
+ if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_STATUS_PAGE ) )
+ {
+ // Allways show the slide/page number.
+ String aString (SdResId( STR_SD_PAGE ));
+ aString += sal_Unicode(' ');
+ aString += UniString::CreateFromInt32( maTabControl.GetCurPageId() );
+ aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " / " ));
+ aString += UniString::CreateFromInt32( GetDoc()->GetSdPageCount( mePageKind ) );
+
+ // If in layer mode additionally show the layer that contains all
+ // selected shapes of the page. If the shapes are distributed on
+ // more than one layer, no layer name is shown.
+ if (IsLayerModeActive())
+ {
+ SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin();
+ SdrLayerID nLayer = 0, nOldLayer = 0;
+ SdrLayer* pLayer = NULL;
+ SdrObject* pObj = NULL;
+ const SdrMarkList& rMarkList = mpDrawView->GetMarkedObjectList();
+ ULONG nMarkCount = rMarkList.GetMarkCount();
+ FASTBOOL bOneLayer = TRUE;
+
+ // Use the first ten selected shapes as a (hopefully
+ // representative) sample of all shapes of the current page.
+ // Detect whether they belong to the same layer.
+ for( ULONG j = 0; j < nMarkCount && bOneLayer && j < 10; j++ )
+ {
+ pObj = rMarkList.GetMark( j )->GetMarkedSdrObj();
+ if( pObj )
+ {
+ nLayer = pObj->GetLayer();
+
+ if( j != 0 && nLayer != nOldLayer )
+ bOneLayer = FALSE;
+
+ nOldLayer = nLayer;
+ }
+ }
+
+ // Append the layer name to the current page number.
+ if( bOneLayer && nMarkCount )
+ {
+ pLayer = rLayerAdmin.GetLayerPerID( nLayer );
+ if( pLayer )
+ {
+ aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " (" ));
+ aString += pLayer->GetName();
+ aString += sal_Unicode(')');
+ }
+ }
+ }
+
+ rSet.Put (SfxStringItem (SID_STATUS_PAGE, aString));
+ }
+ // Layout
+ if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_STATUS_LAYOUT ) )
+ {
+ String aString = mpActualPage->GetLayoutName();
+ aString.Erase( aString.SearchAscii( SD_LT_SEPARATOR ) );
+ rSet.Put( SfxStringItem( SID_STATUS_LAYOUT, aString ) );
+ }
+}
+
+
+
+void DrawViewShell::Notify (SfxBroadcaster&, const SfxHint& rHint)
+{
+ const SfxSimpleHint* pSimple = dynamic_cast< const SfxSimpleHint* >(&rHint);
+ if (pSimple!=NULL && pSimple->GetId()==SFX_HINT_MODECHANGED)
+ {
+ // Change to selection when turning on read-only mode.
+ if(GetDocSh()->IsReadOnly() && dynamic_cast< FuSelection* >( GetCurrentFunction().get() ) )
+ {
+ SfxRequest aReq(SID_OBJECT_SELECT, 0, GetDoc()->GetItemPool());
+ FuPermanent(aReq);
+ }
+
+ // Turn on design mode when document is not read-only.
+ if (GetDocSh()->IsReadOnly() != mbReadOnly )
+ {
+ mbReadOnly = GetDocSh()->IsReadOnly();
+
+ SfxBoolItem aItem( SID_FM_DESIGN_MODE, !mbReadOnly );
+ GetViewFrame()->GetDispatcher()->Execute( SID_FM_DESIGN_MODE,
+ SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L );
+ }
+ }
+
+}
+
+void DrawViewShell::ExecuteAnnotation (SfxRequest& rRequest)
+{
+ if( mpAnnotationManager.get() )
+ mpAnnotationManager->ExecuteAnnotation( rRequest );
+}
+
+// --------------------------------------------------------------------
+
+void DrawViewShell::GetAnnotationState (SfxItemSet& rItemSet )
+{
+ if( mpAnnotationManager.get() )
+ mpAnnotationManager->GetAnnotationState( rItemSet );
+}
+
+
+} // end of namespace sd