diff options
Diffstat (limited to 'sd/source/ui/inc/DrawViewShell.hxx')
-rwxr-xr-x | sd/source/ui/inc/DrawViewShell.hxx | 498 |
1 files changed, 498 insertions, 0 deletions
diff --git a/sd/source/ui/inc/DrawViewShell.hxx b/sd/source/ui/inc/DrawViewShell.hxx new file mode 100755 index 000000000000..4abb1a22946d --- /dev/null +++ b/sd/source/ui/inc/DrawViewShell.hxx @@ -0,0 +1,498 @@ +/************************************************************************* + * + * 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. + * + ************************************************************************/ + +#ifndef SD_DRAW_VIEW_SHELL_HXX +#define SD_DRAW_VIEW_SHELL_HXX + +#include "ViewShell.hxx" +#include "tools/AsynchronousCall.hxx" +#include <sfx2/viewfac.hxx> +#include <sfx2/viewsh.hxx> +#include "TabControl.hxx" +#include "pres.hxx" +#include <com/sun/star/lang/XEventListener.hpp> +#include <com/sun/star/scanner/XScannerManager.hpp> + +class SdPage; +class DrawDocShell; +class SdAnimationWin; +class SdRuler; +class TabBar; +class SdrObject; +class SdrPageView; +class TransferableDataHelper; +class TransferableClipboardListener; +class AbstractSvxNameDialog; +class SdrLayer; +class SvxClipboardFmtItem; + +namespace sd { + +class DrawView; +class LayerTabBar; +class Ruler; +class SdUnoDrawView; +class AnnotationManager; +class ViewOverlayManager; + +#define CHECK_RANGE(nMin, nValue, nMax) ((nValue >= nMin) && (nValue <= nMax)) + +/** Base class of the stacked shells that provide graphical views to + Draw and Impress documents and editing functionality. In contrast + to this other stacked shells are responsible for showing an + overview over several slides (SlideViewShell) or a textual + overview over the text in an Impress document (OutlineViewShell). +*/ +class DrawViewShell + : public ViewShell, + public SfxListener +{ +public: + static const int SLOTARRAY_COUNT = 24; + + TYPEINFO(); + + SFX_DECL_INTERFACE(SD_IF_SDDRAWVIEWSHELL) + + /** Create a new stackable shell that may take some information + (e.g. the frame view) from the given previous shell. + @param ePageKind + This parameter gives the initial page kind that the new shell + will show. + @param pFrameView + The frame view that makes it possible to pass information from + one view shell to the next. + */ + DrawViewShell ( + SfxViewFrame* pFrame, + ViewShellBase& rViewShellBase, + ::Window* pParentWindow, + PageKind ePageKind = PK_STANDARD, + FrameView* pFrameView = NULL); + + virtual ~DrawViewShell (void); + + virtual void Init (bool bIsMainViewShell); + + virtual void Shutdown (void); + + void PrePaint(); + virtual void Paint(const Rectangle& rRect, ::sd::Window* pWin); + + /** Set the position and size of the area which contains the GUI + elements like rulers, sliders, and buttons as well as the document + view. Both size and position are expected to be in pixel + coordinates. The positions and sizes of the mentioned GUI elements + are updated as well. + + <p> This method is implemented by first setting copying the given + values to internal variables and then calling the + <type>ArrangeGUIElements</type> method which performs the actual + work of sizeing and arranging the UI elements accordingly.</p> + @param rPos + The position of the enclosing window relative to the document + window. This is only interesting if a Draw/Impress document + view is embedded as OLE object into another document view. For + normal documents this position is (0,0). + @param rSize + The new size in pixel. + */ + // virtual void AdjustPosSizePixel(const Point &rPos, const Size &rSize); + + /** Arrange and resize the GUI elements like rulers, sliders, and + buttons as well as the actual document view according to the size of + the enclosing window and current sizes of buttons, rulers, and + sliders. + */ + virtual void ArrangeGUIElements (void); + + void HidePage(); + + virtual BOOL KeyInput(const KeyEvent& rKEvt, ::sd::Window* pWin); + virtual void MouseMove(const MouseEvent& rMEvt, ::sd::Window* pWin); + virtual void MouseButtonUp(const MouseEvent& rMEvt, ::sd::Window* pWin); + virtual void MouseButtonDown(const MouseEvent& rMEvt, ::sd::Window* pWin); + virtual void Command(const CommandEvent& rCEvt, ::sd::Window* pWin); + + virtual void Resize (void); + + void ShowMousePosInfo(const Rectangle& rRect, ::sd::Window* pWin); + + virtual void AddWindow(::sd::Window* pWin); + virtual void RemoveWindow(::sd::Window* pWin); + + virtual void ChangeEditMode (EditMode eMode, bool bIsLayerModeActive); + + virtual void SetZoom( long nZoom ); + virtual void SetZoomRect( const Rectangle& rZoomRect ); + + void InsertURLField(const String& rURL, const String& rText, const String& rTarget, + const Point* pPos); + void InsertURLButton(const String& rURL, const String& rText, const String& rTarget, + const Point* pPos); + + virtual void SetUIUnit(FieldUnit eUnit); + + void SelectionHasChanged(); + void ModelHasChanged(); + virtual void Activate(BOOL bIsMDIActivate); + virtual void Deactivate(BOOL IsMDIActivate); + virtual void UIActivating( SfxInPlaceClient* ); + virtual void UIDeactivated( SfxInPlaceClient* ); + virtual String GetSelectionText( BOOL bCompleteWords = FALSE ); + virtual BOOL HasSelection( BOOL bText = TRUE ) const; + + void ExecCtrl(SfxRequest& rReq); + void GetCtrlState(SfxItemSet& rSet); + void GetMenuState(SfxItemSet& rSet); + void GetTableMenuState(SfxItemSet& rSet); + /** Set the items of the given item set that are related to + switching the editing mode to the correct values. + <p>This function also sets the states of the mode buttons + (those at the upper right corner) accordingly.</p> + */ + void GetModeSwitchingMenuState (SfxItemSet &rSet); + void GetAttrState(SfxItemSet& rSet); + void GetSnapItemState(SfxItemSet& rSet); + + void GetState (SfxItemSet& rSet); + void Execute (SfxRequest& rReq); + + void ExecStatusBar(SfxRequest& rReq); + void GetStatusBarState(SfxItemSet& rSet); + + void ExecOptionsBar(SfxRequest& rReq); + void GetOptionsBarState(SfxItemSet& rSet); + + void ExecRuler(SfxRequest& rReq); + void GetRulerState(SfxItemSet& rSet); + + void ExecFormText(SfxRequest& rReq); + void GetFormTextState(SfxItemSet& rSet); + + void ExecAnimationWin(SfxRequest& rReq); + void GetAnimationWinState(SfxItemSet& rSet); + + void ExecNavigatorWin(SfxRequest& rReq); + void GetNavigatorWinState(SfxItemSet& rSet); + + void ExecEffectWin(SfxRequest& rReq); + + void Update3DWindow(); + void AssignFrom3DWindow(); + + void ExecGallery(SfxRequest& rReq); + void GetGalleryState(SfxItemSet& rSet); + + void ExecBmpMask( SfxRequest& rReq ); + void GetBmpMaskState( SfxItemSet& rSet ); + + void ExecIMap( SfxRequest& rReq ); + void GetIMapState( SfxItemSet& rSet ); + + void FuTemporary(SfxRequest& rReq); + void FuPermanent(SfxRequest& rReq); + void FuSupport(SfxRequest& rReq); + void FuTable(SfxRequest& rReq); + + void AttrExec (SfxRequest& rReq); + void AttrState (SfxItemSet& rSet); + + void ExecuteAnnotation (SfxRequest& rRequest); + void GetAnnotationState (SfxItemSet& rItemSet); + + void StartRulerDrag ( + const Ruler& rRuler, + const MouseEvent& rMEvt); + + virtual USHORT PrepareClose( BOOL bUI = TRUE, BOOL bForBrowsing = FALSE ); + + PageKind GetPageKind() { return mePageKind; } + + Point GetMousePos() { return maMousePos; } + BOOL IsMousePosFreezed() { return mbMousePosFreezed; } + void SetMousePosFreezed( BOOL bIn ) { mbMousePosFreezed = bIn; } + + EditMode GetEditMode() const { return meEditMode; } + virtual SdPage* GetActualPage() { return mpActualPage; } + + /// inherited from sd::ViewShell + virtual SdPage* getCurrentPage() const; + + void ResetActualPage(); + void ResetActualLayer(); + BOOL SwitchPage(USHORT nPage); + BOOL IsSwitchPageAllowed() const; + + BOOL GotoBookmark(const String& rBookmark); + void MakeVisible(const Rectangle& rRect, ::Window& rWin); + + virtual void ReadFrameViewData(FrameView* pView); + virtual void WriteFrameViewData(); + + virtual ErrCode DoVerb(long nVerb); + virtual BOOL ActivateObject(SdrOle2Obj* pObj, long nVerb); + + void SetZoomOnPage( BOOL bZoom = TRUE ) { mbZoomOnPage = bZoom; } + BOOL IsZoomOnPage() { return mbZoomOnPage; } + void CheckLineTo (SfxRequest& rReq); + void FuTemp01(SfxRequest& rReq); + void FuTemp02(SfxRequest& rReq); + void FuTemp03(SfxRequest& rReq); + void FuTemp04(SfxRequest& rReq); + void SetChildWindowState( SfxItemSet& rSet ); + + void UpdateIMapDlg( SdrObject* pObj ); + + void LockInput(); + void UnlockInput(); + BOOL IsInputLocked() const { return mnLockCount > 0UL; } + + USHORT GetCurPageId() { return( maTabControl.GetCurPageId() ); } + + /** Show controls of the UI or hide them, depending on the given flag. + Do not call this method directly. Call the method at ViewShellBase + instead. + */ + virtual void ShowUIControls (bool bVisible = true); + + void ScannerEvent( const ::com::sun::star::lang::EventObject& rEventObject ); + + bool IsLayerModeActive (void) const; + + USHORT* GetSlotArray() const { return mpSlotArray; } + + virtual sal_Int8 AcceptDrop( const AcceptDropEvent& rEvt, DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, USHORT nPage, USHORT nLayer ); + virtual sal_Int8 ExecuteDrop( const ExecuteDropEvent& rEvt, DropTargetHelper& rTargetHelper, + ::sd::Window* pTargetWindow, USHORT nPage, USHORT nLayer ); + + virtual void WriteUserDataSequence ( ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >&, sal_Bool bBrowse = sal_False ); + virtual void ReadUserDataSequence ( const ::com::sun::star::uno::Sequence < ::com::sun::star::beans::PropertyValue >&, sal_Bool bBrowse = sal_False ); + + virtual void VisAreaChanged(const Rectangle& rRect); + + /** Create an accessible object representing the specified window. + @param pWindow + The returned object makes the document displayed in this window + accessible. + @return + Returns an <type>AccessibleDrawDocumentView</type> object. + */ + virtual ::com::sun::star::uno::Reference< + ::com::sun::star::accessibility::XAccessible> + CreateAccessibleDocumentView (::sd::Window* pWindow); + + /** Return the number of layers managed by the layer tab control. This + will usually differ from the number of layers managed by the layer + administrator. + @return + The number of layers managed by the layer tab control. The + returned value is independent of whether the layer modus is + currently active and the tab control is visible. + */ + virtual int GetTabLayerCount (void) const; + + /** Return the numerical id of the currently active layer as seen by the + layer tab control. + @return + The returned id is a number between zero (inclusive) and the + number of layers as returned by the + <member>GetTabLayerCount</member> method (exclusive). + */ + virtual int GetActiveTabLayerIndex (void) const; + + /** Set the active layer at the layer tab control and update the control + accordingly to reflect the change on screen. + @param nId + The id is expected to be a number between zero (inclusive) and + the number of layers as returned by the + <member>GetTabLayerCount</member> method (exclusive). Note that + Invalid values are ignored. No excpetion is thrown in that case. + */ + virtual void SetActiveTabLayerIndex (int nId); + + /** Return a pointer to the tab control for pages. + */ + TabControl* GetPageTabControl (void); + + /** Return a pointer to the tab control for layers. + */ + LayerTabBar* GetLayerTabControl (void); + + /** Renames the given slide using an SvxNameDialog + + @param nPageId the index of the page in the SdTabControl. + @param rName the new name of the slide. + + @return false, if the new name is invalid for some reason. + + <p>Implemented in <code>drviews8.cxx</code>.</p> + */ + bool RenameSlide( USHORT nPageId, const String & rName ); + + /** modifies the given layer with the given values */ + void ModifyLayer( SdrLayer* pLayer, const String& rLayerName, const String& rLayerTitle, const String& rLayerDesc, bool bIsVisible, bool bIsLocked, bool bIsPrintable ); + + virtual css::uno::Reference<css::drawing::XDrawSubController> CreateSubController (void); + + DrawView* GetDrawView() const { return mpDrawView; } + + /** Relocation to a new parent window is not supported for DrawViewShell + objects so this method always returns <FALSE/>. + */ + virtual bool RelocateToParentWindow (::Window* pParentWindow); + +protected: + DrawView* mpDrawView; + SdPage* mpActualPage; + Rectangle maMarkRect; + Point maMousePos; + BOOL mbMousePosFreezed; + TabControl maTabControl; + EditMode meEditMode; + PageKind mePageKind; + BOOL mbZoomOnPage; + BOOL mbIsRulerDrag; + ULONG mnLockCount; + Timer maCloseTimer; + BOOL mbReadOnly; + USHORT* mpSlotArray; + + static BOOL mbPipette; + + DECL_LINK( ClipboardChanged, TransferableDataHelper* ); + DECL_LINK( CloseHdl, Timer* pTimer ); + DECL_LINK( TabSplitHdl, TabBar * ); + DECL_LINK( NameObjectHdl, AbstractSvxNameDialog* ); + DECL_LINK( RenameSlideHdl, AbstractSvxNameDialog* ); + + void DeleteActualPage(); + void DeleteActualLayer(); + + virtual SvxRuler* CreateHRuler(::sd::Window* pWin, BOOL bIsFirst); + virtual SvxRuler* CreateVRuler(::sd::Window* pWin); + virtual void UpdateHRuler(); + virtual void UpdateVRuler(); + virtual long GetHCtrlWidth(); + virtual void SetZoomFactor(const Fraction& rZoomX, const Fraction& rZoomY); + virtual Size GetOptimalSizePixel() const; + + void SetupPage( Size &rSize, long nLeft, long nRight, long nUpper, long nLower, + BOOL bSize, BOOL bMargin, BOOL bScaleAll ); + + USHORT GetIdBySubId( USHORT nSId ); + void MapSlot( USHORT nSId ); + void UpdateToolboxImages( SfxItemSet &rSet, BOOL bPermanent = TRUE ); + USHORT GetMappedSlot( USHORT nSId ); + USHORT GetArrayId( USHORT nSId ); + + void GetMenuStateSel(SfxItemSet& rSet); + +private: + /** This flag controls whether the layer mode is active, i.e. the layer + dialog is visible. + */ + bool mbIsLayerModeActive; + + /** This item contains the clipboard formats of the current clipboard + content that are supported both by that content and by the + DrawViewShell. + */ + ::std::auto_ptr<SvxClipboardFmtItem> mpCurrentClipboardFormats; + + /** On some occasions it is necessary to make SwitchPage calls + asynchronously. + */ + tools::AsynchronousCall maAsynchronousSwitchPageCall; + + /** This flag is used to prevent nested calls to SwitchPage(). + */ + bool mbIsInSwitchPage; + + void Construct (DrawDocShell* pDocSh, PageKind ePageKind); + + /** Depending on the given request create a new page or duplicate an + existing one. See ViewShell::CreateOrDuplicatePage() for more + information. + */ + virtual SdPage* CreateOrDuplicatePage ( + SfxRequest& rRequest, + PageKind ePageKind, + SdPage* pPage); + + ::com::sun::star::uno::Reference< ::com::sun::star::scanner::XScannerManager > mxScannerManager; + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener > mxScannerListener; + TransferableClipboardListener* mpClipEvtLstnr; + BOOL mbPastePossible; + + virtual void Notify (SfxBroadcaster& rBC, const SfxHint& rHint); + + /** Stop a running slide show. The frame the show is running in is + destroyed if + a) it is running in its own frame, i.e. is a full screen show and + b) the given flag bCloseFrame is true. + @param bCloseFrame + Be carefull with this flag when stopping a full screen show. + When called from the destructor the flag has to be <FALSE/> or + otherwise we run into a loop of calls to destructors of the view + and the frame. + When called from other places the flag should be <TRUE/> so that + not an empty frame remains. When called with <TRUE/> it is the + responsibility of the caller to avoid an illegal reentrant + call. + */ + void StopSlideShow (bool bCloseFrame); + + /** Show the context menu for snap lines and points. Because snap lines + can not be selected the index of the snap line/point for which the + popup menu is opened has to be passed to the processing slot + handlers. This can be done only by manually showing the popup menu. + @param rPageView + The page view is used to access the help lines. + @param nSnapLineIndex + Index of the snap line or snap point for which to show the + context menu. + @param rMouseLocation + The mouse location defines the location at which to display the + context menu. + */ + void ShowSnapLineContextMenu ( + SdrPageView& rPageView, + const USHORT nSnapLineIndex, + const Point& rMouseLocation); + + using ViewShell::Notify; + + ::std::auto_ptr< AnnotationManager > mpAnnotationManager; + ::std::auto_ptr< ViewOverlayManager > mpViewOverlayManager; +}; + + +} // end of namespace sd + +#endif |