diff options
Diffstat (limited to 'sc/source/ui/inc/anyrefdg.hxx')
-rw-r--r-- | sc/source/ui/inc/anyrefdg.hxx | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/sc/source/ui/inc/anyrefdg.hxx b/sc/source/ui/inc/anyrefdg.hxx new file mode 100644 index 000000000000..8bca700a9122 --- /dev/null +++ b/sc/source/ui/inc/anyrefdg.hxx @@ -0,0 +1,267 @@ +/* -*- 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 SC_ANYREFDG_HXX +#define SC_ANYREFDG_HXX + +#include <vcl/button.hxx> +#include <vcl/edit.hxx> +#include <vcl/accel.hxx> +#include <sfx2/basedlgs.hxx> +#include <sfx2/tabdlg.hxx> +#include "address.hxx" +#include "cell.hxx" +#include "compiler.hxx" +#include "formula/funcutl.hxx" +#include "IAnyRefDialog.hxx" +#include "scresid.hxx" +#include "scmod.hxx" + +#include <memory> + +class SfxObjectShell; +class ScRange; +class ScDocument; +class ScTabViewShell; +class ScRefHandler; +class ScRangeList; +class SfxShell; + +class ScFormulaReferenceHelper +{ + IAnyRefDialog* m_pDlg; + ::std::auto_ptr<ScFormulaCell> pRefCell; + ::std::auto_ptr<ScCompiler> pRefComp; + formula::RefEdit* pRefEdit; // aktives Eingabefeld + formula::RefButton* pRefBtn; // Button dazu + Window* m_pWindow; + SfxBindings* m_pBindings; + ::std::auto_ptr<Accelerator> + pAccel; // fuer Enter/Escape + sal_Bool* pHiddenMarks; // Merkfeld fuer versteckte Controls + SCTAB nRefTab; // used for ShowReference + + String sOldDialogText; // Originaltitel des Dialogfensters + Size aOldDialogSize; // Originalgroesse Dialogfenster + Point aOldEditPos; // Originalposition des Eingabefeldes + Size aOldEditSize; // Originalgroesse des Eingabefeldes + Point aOldButtonPos; // Originalpositiuon des Buttons + + sal_Bool bEnableColorRef; + sal_Bool bHighLightRef; + sal_Bool bAccInserted; + + DECL_LINK( AccelSelectHdl, Accelerator* ); + +public: + ScFormulaReferenceHelper(IAnyRefDialog* _pDlg,SfxBindings* _pBindings); + ~ScFormulaReferenceHelper(); + + void ShowSimpleReference( const XubString& rStr ); + void ShowFormulaReference( const XubString& rStr ); + bool ParseWithNames( ScRangeList& rRanges, const String& rStr, ScDocument* pDoc ); + void Init(); + + void ShowReference( const XubString& rStr ); + void ReleaseFocus( formula::RefEdit* pEdit, formula::RefButton* pButton = NULL ); + void HideReference( sal_Bool bDoneRefMode = sal_True ); + void RefInputStart( formula::RefEdit* pEdit, formula::RefButton* pButton = NULL ); + void RefInputDone( sal_Bool bForced = false ); + void ToggleCollapsed( formula::RefEdit* pEdit, formula::RefButton* pButton = NULL ); + + inline void SetWindow(Window* _pWindow) { m_pWindow = _pWindow; } + sal_Bool DoClose( sal_uInt16 nId ); + void SetDispatcherLock( sal_Bool bLock ); + void EnableSpreadsheets( sal_Bool bFlag = sal_True, sal_Bool bChilds = sal_True ); + void ViewShellChanged( ScTabViewShell* pScViewShell ); + + static void enableInput(sal_Bool _bInput); + +protected: + Window * GetWindow(){ return m_pWindow; } + +public: + bool CanInputStart( const formula::RefEdit *pEdit ){ return !!pEdit; } + bool CanInputDone( sal_Bool bForced ){ return pRefEdit && (bForced || !pRefBtn); } +}; + +//============================================================================ + +class SC_DLLPUBLIC ScRefHandler : //public SfxModelessDialog, + public IAnyRefDialog +{ + Window & m_rWindow; + bool m_bInRefMode; + +public: + operator Window *(){ return &m_rWindow; } + Window * operator ->() { return static_cast<Window *>(*this); } + template<class,bool> friend class ScRefHdlrImplBase; + friend class formula::RefButton; + friend class formula::RefEdit; + +private: + ScFormulaReferenceHelper + m_aHelper; + SfxBindings* pMyBindings; + + Window* pActiveWin; + Timer aTimer; + String aDocName; // document on which the dialog was opened + + DECL_LINK( UpdateFocusHdl, Timer* ); + + +protected: + virtual sal_Bool DoClose( sal_uInt16 nId ); + + void SetDispatcherLock( sal_Bool bLock ); + + //Overwrite TWindow will implemented by ScRefHdlrImplBase + //virtual long PreNotify( NotifyEvent& rNEvt ); + + virtual void RefInputStart( formula::RefEdit* pEdit, formula::RefButton* pButton = NULL ); + virtual void RefInputDone( sal_Bool bForced = false ); + void ShowSimpleReference( const XubString& rStr ); + void ShowFormulaReference( const XubString& rStr ); + + bool ParseWithNames( ScRangeList& rRanges, const String& rStr, ScDocument* pDoc ); + +public: + ScRefHandler( Window &rWindow, SfxBindings* pB/*, SfxChildWindow* pCW, + Window* pParent, sal_uInt16 nResId*/, bool bBindRef ); + virtual ~ScRefHandler(); + + virtual void SetReference( const ScRange& rRef, ScDocument* pDoc ) = 0; + virtual void AddRefEntry(); + + virtual sal_Bool IsRefInputMode() const; + virtual sal_Bool IsTableLocked() const; + virtual sal_Bool IsDocAllowed( SfxObjectShell* pDocSh ) const; + + virtual void ShowReference( const XubString& rStr ); + virtual void HideReference( sal_Bool bDoneRefMode = sal_True ); + + virtual void ToggleCollapsed( formula::RefEdit* pEdit, formula::RefButton* pButton = NULL ); + virtual void ReleaseFocus( formula::RefEdit* pEdit, formula::RefButton* pButton = NULL ); + + virtual void ViewShellChanged( ScTabViewShell* pScViewShell ); + void SwitchToDocument(); + //SfxBindings& GetBindings(); + + virtual void SetActive() = 0; +// virtual sal_Bool Close(); + //Overwrite TWindow will implemented by ScRefHdlrImplBase + //virtual void StateChanged( StateChangedType nStateChange ); + +public: + bool EnterRefMode(); + bool LeaveRefMode(); + inline bool CanInputStart( const formula::RefEdit *pEdit ); + inline bool CanInputDone( sal_Bool bForced ); +}; + +//============================================================================ + +template< class TWindow, bool bBindRef = true > +class ScRefHdlrImplBase:public TWindow, public ScRefHandler +{ +public: + //Overwrite TWindow + virtual long PreNotify( NotifyEvent& rNEvt ); + virtual void StateChanged( StateChangedType nStateChange ); + +private: + template<class TBindings, class TChildWindow, class TParentWindow, class TResId> + ScRefHdlrImplBase( TBindings* pB, TChildWindow* pCW, + TParentWindow* pParent, TResId nResId); + + template<class TParentWindow, class TResId, class TArg> + ScRefHdlrImplBase( TParentWindow* pParent, TResId nResId, const TArg &rArg, SfxBindings *pB = NULL ); + + ~ScRefHdlrImplBase(); + + template<class, class, bool> friend struct ScRefHdlrImpl; +}; + +template<class TWindow, bool bBindRef> +template<class TBindings, class TChildWindow, class TParentWindow, class TResId> +ScRefHdlrImplBase<TWindow, bBindRef>::ScRefHdlrImplBase( TBindings* pB, TChildWindow* pCW, + TParentWindow* pParent, TResId nResId):TWindow(pB, pCW, pParent, ScResId(static_cast<sal_uInt16>( nResId ) ) ), ScRefHandler( *static_cast<TWindow*>(this), pB, bBindRef ){} + +template<class TWindow, bool bBindRef > +template<class TParentWindow, class TResId, class TArg> +ScRefHdlrImplBase<TWindow,bBindRef>::ScRefHdlrImplBase( TParentWindow* pParent, TResId nResIdP, const TArg &rArg, SfxBindings *pB /*= NULL*/ ) +:TWindow( pParent, ScResId(static_cast<sal_uInt16>( nResIdP )), rArg ), ScRefHandler( *static_cast<TWindow*>(this), pB, bBindRef ){} + +template<class TWindow, bool bBindRef > +ScRefHdlrImplBase<TWindow,bBindRef>::~ScRefHdlrImplBase(){} + +//============================================================================ +template<class TDerived, class TBase, bool bBindRef = true> +struct ScRefHdlrImpl: ScRefHdlrImplBase<TBase, bBindRef > +{ + enum { UNKNOWN_SLOTID = 0U, SLOTID = UNKNOWN_SLOTID }; + + template<class T1, class T2, class T3, class T4> + ScRefHdlrImpl( const T1 & rt1, const T2 & rt2, const T3 & rt3, const T4 & rt4 ):ScRefHdlrImplBase<TBase, bBindRef >(rt1, rt2, rt3, rt4 ) + { + SC_MOD()->RegisterRefWindow( static_cast<sal_uInt16>( static_cast<TDerived*>(this)->SLOTID ), this ); + } + + ~ScRefHdlrImpl() + { + SC_MOD()->UnregisterRefWindow( static_cast<sal_uInt16>( static_cast<TDerived*>(this)->SLOTID ), this ); + } +}; +//============================================================================ +struct ScAnyRefDlg : ::ScRefHdlrImpl< ScAnyRefDlg, SfxModelessDialog> +{ + template<class T1, class T2, class T3, class T4> + ScAnyRefDlg( const T1 & rt1, const T2 & rt2, const T3 & rt3, const T4 & rt4 ):ScRefHdlrImpl< ScAnyRefDlg, SfxModelessDialog>(rt1, rt2, rt3, rt4){} +}; +//============================================================================ + +inline bool ScRefHandler::CanInputStart( const formula::RefEdit *pEdit ) +{ + return m_aHelper.CanInputStart( pEdit ); +} + +inline bool ScRefHandler::CanInputDone( sal_Bool bForced ) +{ + return m_aHelper.CanInputDone( bForced ); +} + +template <> SC_DLLPUBLIC void ScRefHdlrImplBase<SfxModelessDialog,true>::StateChanged( StateChangedType nStateChange ); +template <> SC_DLLPUBLIC long ScRefHdlrImplBase<SfxModelessDialog,true>::PreNotify( NotifyEvent& rNEvt ); +template <> SC_DLLPUBLIC void ScRefHdlrImplBase<SfxTabDialog,false>::StateChanged( StateChangedType nStateChange ); +template <> SC_DLLPUBLIC long ScRefHdlrImplBase<SfxTabDialog,false>::PreNotify( NotifyEvent& rNEvt ); + +#endif // SC_ANYREFDG_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |