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 #ifndef SC_ANYREFDG_HXX 25 #define SC_ANYREFDG_HXX 26 27 #ifndef _IMAGEBTN_HXX 28 #include <vcl/button.hxx> 29 #endif 30 #ifndef _EDIT_HXX 31 #include <vcl/edit.hxx> 32 #endif 33 #ifndef _ACCEL_HXX 34 #include <vcl/accel.hxx> 35 #endif 36 #include <sfx2/basedlgs.hxx> 37 #include "address.hxx" 38 #include "cell.hxx" 39 #include "compiler.hxx" 40 #include "formula/funcutl.hxx" 41 #include "IAnyRefDialog.hxx" 42 #include "scresid.hxx" 43 #include <memory> 44 45 class SfxObjectShell; 46 class ScRange; 47 class ScDocument; 48 class ScTabViewShell; 49 //The class of ScAnyRefDlg is rewritten by PengYunQuan for Validity Cell Range Picker 50 //class ScAnyRefDlg; 51 class ScRefHandler; 52 class ScRangeList; 53 //<!--Added by PengYunQuan for Validity Cell Range Picker 54 class SfxShell; 55 #include "scmod.hxx" 56 57 typedef formula::RefButton ScRefButton; 58 typedef formula::RefEdit ScRefEdit; 59 //-->Added by PengYunQuan for Validity Cell Range Picker 60 class ScFormulaReferenceHelper 61 { 62 IAnyRefDialog* m_pDlg; 63 ::std::auto_ptr<ScFormulaCell> pRefCell; 64 ::std::auto_ptr<ScCompiler> pRefComp; 65 formula::RefEdit* pRefEdit; // aktives Eingabefeld 66 formula::RefButton* pRefBtn; // Button dazu 67 Window* m_pWindow; 68 SfxBindings* m_pBindings; 69 ::std::auto_ptr<Accelerator> 70 pAccel; // fuer Enter/Escape 71 sal_Bool* pHiddenMarks; // Merkfeld fuer versteckte Controls 72 SCTAB nRefTab; // used for ShowReference 73 74 String sOldDialogText; // Originaltitel des Dialogfensters 75 Size aOldDialogSize; // Originalgroesse Dialogfenster 76 Point aOldEditPos; // Originalposition des Eingabefeldes 77 Size aOldEditSize; // Originalgroesse des Eingabefeldes 78 Point aOldButtonPos; // Originalpositiuon des Buttons 79 80 sal_Bool bEnableColorRef; 81 sal_Bool bHighLightRef; 82 sal_Bool bAccInserted; 83 84 DECL_LINK( AccelSelectHdl, Accelerator* ); 85 86 public: 87 ScFormulaReferenceHelper(IAnyRefDialog* _pDlg,SfxBindings* _pBindings); 88 ~ScFormulaReferenceHelper(); 89 90 void ShowSimpleReference( const XubString& rStr ); 91 void ShowFormulaReference( const XubString& rStr ); 92 bool ParseWithNames( ScRangeList& rRanges, const String& rStr, ScDocument* pDoc ); 93 void Init(); 94 95 void ShowReference( const XubString& rStr ); 96 void ReleaseFocus( formula::RefEdit* pEdit, formula::RefButton* pButton = NULL ); 97 void HideReference( sal_Bool bDoneRefMode = sal_True ); 98 void RefInputStart( formula::RefEdit* pEdit, formula::RefButton* pButton = NULL ); 99 void RefInputDone( sal_Bool bForced = sal_False ); 100 void ToggleCollapsed( formula::RefEdit* pEdit, formula::RefButton* pButton = NULL ); 101 102 inline void SetWindow(Window* _pWindow) { m_pWindow = _pWindow; } 103 sal_Bool DoClose( sal_uInt16 nId ); 104 void SetDispatcherLock( sal_Bool bLock ); 105 void EnableSpreadsheets( sal_Bool bFlag = sal_True, sal_Bool bChilds = sal_True ); 106 void ViewShellChanged( ScTabViewShell* pScViewShell ); 107 108 static void enableInput(sal_Bool _bInput); 109 //<!--Added by PengYunQuan for Validity Cell Range Picker 110 protected: 111 Window * GetWindow(){ return m_pWindow; } 112 public: 113 bool CanInputStart( const ScRefEdit *pEdit ){ return !!pEdit; } 114 bool CanInputDone( sal_Bool bForced ){ return pRefEdit && (bForced || !pRefBtn); } 115 //<!--Added by PengYunQuan for Validity Cell Range Picker 116 }; 117 //============================================================================ 118 119 //The class of ScAnyRefDlg is rewritten by PengYunQuan for Validity Cell Range Picker 120 class SC_DLLPUBLIC ScRefHandler : //public SfxModelessDialog, 121 public IAnyRefDialog 122 { 123 //<!--Added by PengYunQuan for Validity Cell Range Picker 124 Window & m_rWindow; 125 bool m_bInRefMode; 126 public: 127 operator Window *(){ return &m_rWindow; } 128 Window * operator ->() { return static_cast<Window *>(*this); } 129 template<class,bool> friend class ScRefHdlrImplBase; 130 //-->Added by PengYunQuan for Validity Cell Range Picker 131 friend class formula::RefButton; 132 friend class formula::RefEdit; 133 134 private: 135 ScFormulaReferenceHelper 136 m_aHelper; 137 SfxBindings* pMyBindings; 138 139 Window* pActiveWin; 140 Timer aTimer; 141 String aDocName; // document on which the dialog was opened 142 143 DECL_LINK( UpdateFocusHdl, Timer* ); 144 145 146 protected: 147 virtual sal_Bool DoClose( sal_uInt16 nId ); 148 149 void SetDispatcherLock( sal_Bool bLock ); 150 151 //Overwrite TWindow will implemented by ScRefHdlrImplBase 152 //virtual long PreNotify( NotifyEvent& rNEvt ); 153 154 virtual void RefInputStart( formula::RefEdit* pEdit, formula::RefButton* pButton = NULL ); 155 virtual void RefInputDone( sal_Bool bForced = sal_False ); 156 void ShowSimpleReference( const XubString& rStr ); 157 void ShowFormulaReference( const XubString& rStr ); 158 159 bool ParseWithNames( ScRangeList& rRanges, const String& rStr, ScDocument* pDoc ); 160 161 public: 162 ScRefHandler( Window &rWindow, SfxBindings* pB/*, SfxChildWindow* pCW, 163 Window* pParent, sal_uInt16 nResId*/, bool bBindRef ); 164 virtual ~ScRefHandler(); 165 166 virtual void SetReference( const ScRange& rRef, ScDocument* pDoc ) = 0; 167 virtual void AddRefEntry(); 168 169 virtual sal_Bool IsRefInputMode() const; 170 virtual sal_Bool IsTableLocked() const; 171 virtual sal_Bool IsDocAllowed( SfxObjectShell* pDocSh ) const; 172 173 virtual void ShowReference( const XubString& rStr ); 174 virtual void HideReference( sal_Bool bDoneRefMode = sal_True ); 175 176 virtual void ToggleCollapsed( formula::RefEdit* pEdit, formula::RefButton* pButton = NULL ); 177 virtual void ReleaseFocus( formula::RefEdit* pEdit, formula::RefButton* pButton = NULL ); 178 179 virtual void ViewShellChanged( ScTabViewShell* pScViewShell ); 180 void SwitchToDocument(); 181 //SfxBindings& GetBindings(); 182 183 virtual void SetActive() = 0; 184 // virtual sal_Bool Close(); 185 //Overwrite TWindow will implemented by ScRefHdlrImplBase 186 //virtual void StateChanged( StateChangedType nStateChange ); 187 188 //<!--Added by PengYunQuan for Validity Cell Range Picker 189 public: 190 bool EnterRefMode(); 191 bool LeaveRefMode(); 192 inline bool CanInputStart( const ScRefEdit *pEdit ); 193 inline bool CanInputDone( sal_Bool bForced ); 194 //-->Added by PengYunQuan for Validity Cell Range Picker 195 }; 196 197 198 //============================================================================ 199 //<!--Added by PengYunQuan for Validity Cell Range Picker 200 template< class TWindow, bool bBindRef = true > 201 class ScRefHdlrImplBase:public TWindow, public ScRefHandler 202 { 203 public: 204 //Overwrite TWindow 205 virtual long PreNotify( NotifyEvent& rNEvt ); 206 virtual void StateChanged( StateChangedType nStateChange ); 207 208 private: 209 template<class TBindings, class TChildWindow, class TParentWindow, class TResId> 210 ScRefHdlrImplBase( TBindings* pB, TChildWindow* pCW, 211 TParentWindow* pParent, TResId nResId); 212 213 template<class TParentWindow, class TResId, class TArg> 214 ScRefHdlrImplBase( TParentWindow* pParent, TResId nResId, const TArg &rArg, SfxBindings *pB = NULL ); 215 216 ~ScRefHdlrImplBase(); 217 218 template<class, class, bool> friend struct ScRefHdlrImpl; 219 }; 220 221 template<class TWindow, bool bBindRef> 222 template<class TBindings, class TChildWindow, class TParentWindow, class TResId> 223 ScRefHdlrImplBase<TWindow, bBindRef>::ScRefHdlrImplBase( TBindings* pB, TChildWindow* pCW, 224 TParentWindow* pParent, TResId nResId):TWindow(pB, pCW, pParent, ScResId(static_cast<sal_uInt16>( nResId ) ) ), ScRefHandler( *static_cast<TWindow*>(this), pB, bBindRef ){} 225 226 template<class TWindow, bool bBindRef > 227 template<class TParentWindow, class TResId, class TArg> 228 ScRefHdlrImplBase<TWindow,bBindRef>::ScRefHdlrImplBase( TParentWindow* pParent, TResId nResIdP, const TArg &rArg, SfxBindings *pB /*= NULL*/ ) 229 :TWindow( pParent, ScResId(static_cast<sal_uInt16>( nResIdP )), rArg ), ScRefHandler( *static_cast<TWindow*>(this), pB, bBindRef ){} 230 231 template<class TWindow, bool bBindRef > 232 ScRefHdlrImplBase<TWindow,bBindRef>::~ScRefHdlrImplBase(){} 233 234 //============================================================================ 235 template<class TDerived, class TBase, bool bBindRef = true> 236 struct ScRefHdlrImpl: ScRefHdlrImplBase<TBase, bBindRef > 237 { 238 enum { UNKNOWN_SLOTID = 0U, SLOTID = UNKNOWN_SLOTID }; 239 240 template<class T1, class T2, class T3, class T4> 241 ScRefHdlrImpl( const T1 & rt1, const T2 & rt2, const T3 & rt3, const T4 & rt4 ):ScRefHdlrImplBase<TBase, bBindRef >(rt1, rt2, rt3, rt4 ) 242 { 243 SC_MOD()->RegisterRefWindow( static_cast<sal_uInt16>( static_cast<TDerived*>(this)->SLOTID ), this ); 244 } 245 246 ~ScRefHdlrImpl() 247 { 248 SC_MOD()->UnregisterRefWindow( static_cast<sal_uInt16>( static_cast<TDerived*>(this)->SLOTID ), this ); 249 } 250 }; 251 //============================================================================ 252 struct ScAnyRefDlg : ::ScRefHdlrImpl< ScAnyRefDlg, SfxModelessDialog> 253 { 254 template<class T1, class T2, class T3, class T4> 255 ScAnyRefDlg( const T1 & rt1, const T2 & rt2, const T3 & rt3, const T4 & rt4 ):ScRefHdlrImpl< ScAnyRefDlg, SfxModelessDialog>(rt1, rt2, rt3, rt4){} 256 }; 257 //============================================================================ 258 259 inline bool ScRefHandler::CanInputStart( const ScRefEdit *pEdit ) 260 { 261 return m_aHelper.CanInputStart( pEdit ); 262 } 263 264 inline bool ScRefHandler::CanInputDone( sal_Bool bForced ) 265 { 266 return m_aHelper.CanInputDone( bForced ); 267 } 268 269 template <> SC_DLLPUBLIC void ScRefHdlrImplBase<SfxModelessDialog,true>::StateChanged( StateChangedType nStateChange ); 270 template <> SC_DLLPUBLIC long ScRefHdlrImplBase<SfxModelessDialog,true>::PreNotify( NotifyEvent& rNEvt ); 271 #include <sfx2/tabdlg.hxx> 272 template <> SC_DLLPUBLIC void ScRefHdlrImplBase<SfxTabDialog,false>::StateChanged( StateChangedType nStateChange ); 273 template <> SC_DLLPUBLIC long ScRefHdlrImplBase<SfxTabDialog,false>::PreNotify( NotifyEvent& rNEvt ); 274 275 //<!--Added by PengYunQuan for Validity Cell Range Picker 276 #endif // SC_ANYREFDG_HXX 277 278