diff options
Diffstat (limited to 'starmath/inc/view.hxx')
-rw-r--r-- | starmath/inc/view.hxx | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/starmath/inc/view.hxx b/starmath/inc/view.hxx new file mode 100644 index 000000000000..d716e72f9c07 --- /dev/null +++ b/starmath/inc/view.hxx @@ -0,0 +1,333 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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 VIEW_HXX +#define VIEW_HXX + +#include <sfx2/dockwin.hxx> +#include <sfx2/viewsh.hxx> +#include <svtools/scrwin.hxx> +#include <sfx2/ctrlitem.hxx> +#include <sfx2/shell.hxx> +#include <sfx2/viewfac.hxx> +#include <sfx2/viewfrm.hxx> +#include <vcl/timer.hxx> +#include <svtools/colorcfg.hxx> +#include "edit.hxx" +#include "node.hxx" + +class Menu; +class DataChangedEvent; +class SmClipboardChangeListener; +class SmDocShell; +class SmViewShell; +class SmPrintUIOptions; +class SmGraphicAccessible; + +/**************************************************************************/ + +class SmGraphicWindow : public ScrollableWindow +{ + Point aFormulaDrawPos; + + // old style editing pieces + Rectangle aCursorRect; + bool bIsCursorVisible; + bool bIsLineVisible; + AutoTimer aCaretBlinkTimer; +public: + bool IsCursorVisible() const { return bIsCursorVisible; } + void ShowCursor(bool bShow); + bool IsLineVisible() const { return bIsLineVisible; } + void ShowLine(bool bShow); + const SmNode * SetCursorPos(sal_uInt16 nRow, sal_uInt16 nCol); +protected: + void SetIsCursorVisible(bool bVis) { bIsCursorVisible = bVis; } + using Window::SetCursor; + void SetCursor(const SmNode *pNode); + void SetCursor(const Rectangle &rRect); + bool IsInlineEditEnabled() const; + +private: + ::com::sun::star::uno::Reference< + ::com::sun::star::accessibility::XAccessible > xAccessible; + SmGraphicAccessible * pAccessible; + + SmViewShell *pViewShell; + sal_uInt16 nZoom; + short nModifyCount; + +protected: + void SetFormulaDrawPos(const Point &rPos) { aFormulaDrawPos = rPos; } + + virtual void DataChanged( const DataChangedEvent& ); + virtual void Paint(const Rectangle&); + virtual void KeyInput(const KeyEvent& rKEvt); + virtual void Command(const CommandEvent& rCEvt); + virtual void StateChanged( StateChangedType eChanged ); + DECL_LINK(MenuSelectHdl, Menu *); + +private: + void RepaintViewShellDoc(); + DECL_LINK(CaretBlinkTimerHdl, AutoTimer *); + void CaretBlinkInit(); + void CaretBlinkStart(); + void CaretBlinkStop(); +public: + SmGraphicWindow(SmViewShell* pShell); + ~SmGraphicWindow(); + + // Window + virtual void MouseButtonDown(const MouseEvent &rMEvt); + virtual void GetFocus(); + virtual void LoseFocus(); + + SmViewShell * GetView() { return pViewShell; } + + using Window::SetZoom; + void SetZoom(sal_uInt16 Factor); + using Window::GetZoom; + sal_uInt16 GetZoom() const { return nZoom; } + + const Point & GetFormulaDrawPos() const { return aFormulaDrawPos; } + + void ZoomToFitInWindow(); + using ScrollableWindow::SetTotalSize; + void SetTotalSize(); + + void ApplyColorConfigValues( const svtools::ColorConfig &rColorCfg ); + + // for Accessibility + virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible(); + + using Window::GetAccessible; + SmGraphicAccessible * GetAccessible_Impl() { return pAccessible; } +}; + +/**************************************************************************/ + +class SmGraphicController: public SfxControllerItem +{ +protected: + SmGraphicWindow &rGraphic; +public: + SmGraphicController(SmGraphicWindow &, sal_uInt16, SfxBindings & ); + virtual void StateChanged(sal_uInt16 nSID, + SfxItemState eState, + const SfxPoolItem* pState); +}; + +/**************************************************************************/ + +class SmEditController: public SfxControllerItem +{ +protected: + SmEditWindow &rEdit; + +public: + SmEditController(SmEditWindow &, sal_uInt16, SfxBindings & ); +#if OSL_DEBUG_LEVEL > 1 + virtual ~SmEditController(); +#endif + + virtual void StateChanged(sal_uInt16 nSID, + SfxItemState eState, + const SfxPoolItem* pState); +}; + +/**************************************************************************/ + +class SmCmdBoxWindow : public SfxDockingWindow +{ + SmEditWindow aEdit; + SmEditController aController; + bool bExiting; + + Timer aInitialFocusTimer; + + DECL_LINK(InitialFocusTimerHdl, Timer *); + +protected : + + // Window + virtual void GetFocus(); + virtual void Resize(); + virtual void Paint(const Rectangle& rRect); + virtual void StateChanged( StateChangedType nStateChange ); + + virtual Size CalcDockingSize(SfxChildAlignment eAlign); + virtual SfxChildAlignment CheckAlignment(SfxChildAlignment eActual, + SfxChildAlignment eWish); + + virtual void ToggleFloatingMode(); + +public: + SmCmdBoxWindow(SfxBindings *pBindings, + SfxChildWindow *pChildWindow, + Window *pParent); + + virtual ~SmCmdBoxWindow (); + + void AdjustPosition(); + + SmEditWindow *GetEditWindow() { return (&aEdit); } + SmViewShell *GetView(); +}; + +/**************************************************************************/ + +class SmCmdBoxWrapper : public SfxChildWindow +{ + SFX_DECL_CHILDWINDOW(SmCmdBoxWrapper); + +protected: + SmCmdBoxWrapper(Window *pParentWindow, + sal_uInt16 nId, + SfxBindings *pBindings, + SfxChildWinInfo *pInfo); + +#if OSL_DEBUG_LEVEL > 1 + virtual ~SmCmdBoxWrapper(); +#endif + +public: + + SmEditWindow *GetEditWindow() + { + return (((SmCmdBoxWindow *)pWindow)->GetEditWindow()); + } + +}; + +/**************************************************************************/ + +namespace sfx2 { class FileDialogHelper; } +struct SmViewShell_Impl; + +class SmViewShell: public SfxViewShell +{ + // for handling the PasteClipboardState + friend class SmClipboardChangeListener; + + SmViewShell_Impl* pImpl; + + SmGraphicWindow aGraphic; + SmGraphicController aGraphicController; + String StatusText; + + ::com::sun::star::uno:: Reference < + ::com::sun::star::lang:: XEventListener > xClipEvtLstnr; + SmClipboardChangeListener* pClipEvtLstnr; + bool bPasteState; + + DECL_LINK( DialogClosedHdl, sfx2::FileDialogHelper* ); + virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); + + /** Used to determine whether insertions using SID_INSERTSYMBOL and SID_INSERTCOMMAND + * should be inserted into SmEditWindow or directly into the SmDocShell as done if the + * visual editor was last to have focus. + */ + bool bInsertIntoEditWindow; +protected: + + Size GetTextLineSize(OutputDevice& rDevice, + const String& rLine); + Size GetTextSize(OutputDevice& rDevice, + const String& rText, + long MaxWidth); + void DrawTextLine(OutputDevice& rDevice, + const Point& rPosition, + const String& rLine); + void DrawText(OutputDevice& rDevice, + const Point& rPosition, + const String& rText, + sal_uInt16 MaxWidth); + + virtual sal_uInt16 Print(SfxProgress &rProgress, sal_Bool bIsAPI); + virtual SfxPrinter *GetPrinter(sal_Bool bCreate = sal_False); + virtual sal_uInt16 SetPrinter(SfxPrinter *pNewPrinter, + sal_uInt16 nDiffFlags = SFX_PRINTER_ALL, bool bIsAPI=false); + + bool Insert( SfxMedium& rMedium ); + bool InsertFrom(SfxMedium &rMedium); + + virtual SfxTabPage *CreatePrintOptionsPage(Window *pParent, + const SfxItemSet &rOptions); + virtual void Deactivate(sal_Bool IsMDIActivate); + virtual void Activate(sal_Bool IsMDIActivate); + virtual Size GetOptimalSizePixel() const; + virtual void AdjustPosSizePixel(const Point &rPos, const Size &rSize); + virtual void InnerResizePixel(const Point &rOfs, const Size &rSize); + virtual void OuterResizePixel(const Point &rOfs, const Size &rSize); + virtual void QueryObjAreaPixel( Rectangle& rRect ) const; + virtual void SetZoomFactor( const Fraction &rX, const Fraction &rY ); + +public: + TYPEINFO(); + + SmViewShell(SfxViewFrame *pFrame, SfxViewShell *pOldSh); + ~SmViewShell(); + + SmDocShell * GetDoc() + { + return (SmDocShell *) GetViewFrame()->GetObjectShell(); + } + + SmEditWindow * GetEditWindow(); + SmGraphicWindow & GetGraphicWindow() { return aGraphic; } + const SmGraphicWindow & GetGraphicWindow() const { return aGraphic; } + + void SetStatusText(const String& Text); + + void ShowError( const SmErrorDesc *pErrorDesc ); + void NextError(); + void PrevError(); + + SFX_DECL_INTERFACE(SFX_INTERFACE_SMA_START+2) + SFX_DECL_VIEWFACTORY(SmViewShell); + + virtual void Execute( SfxRequest& rReq ); + virtual void GetState(SfxItemSet &); + + void Impl_Print( OutputDevice &rOutDev, const SmPrintUIOptions &rPrintUIOptions, + Rectangle aOutRect, Point aZeroPoint ); + + /** Set bInsertIntoEditWindow so we know where to insert + * + * This method is called whenever SmGraphicWindow or SmEditWindow gets focus, + * so that when text is inserted from catalog or elsewhere we know whether to + * insert for the visual editor, or the text editor. + */ + void SetInsertIntoEditWindow(bool bEditWindowHadFocusLast = true){ + bInsertIntoEditWindow = bEditWindowHadFocusLast; + } + bool IsInlineEditEnabled() const; +}; + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |