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
SetWindow(Window * _pWindow)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:
GetWindow()111 Window * GetWindow(){ return m_pWindow; }
112 public:
CanInputStart(const ScRefEdit * pEdit)113 bool CanInputStart( const ScRefEdit *pEdit ){ return !!pEdit; }
CanInputDone(sal_Bool bForced)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:
operator Window*()127 operator Window *(){ return &m_rWindow; }
operator ->()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>
ScRefHdlrImplBase(TBindings * pB,TChildWindow * pCW,TParentWindow * pParent,TResId nResId)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>
ScRefHdlrImplBase(TParentWindow * pParent,TResId nResIdP,const TArg & rArg,SfxBindings * pB)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 >
~ScRefHdlrImplBase()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>
ScRefHdlrImplScRefHdlrImpl241 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
~ScRefHdlrImplScRefHdlrImpl246 ~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>
ScAnyRefDlgScAnyRefDlg255 ScAnyRefDlg( const T1 & rt1, const T2 & rt2, const T3 & rt3, const T4 & rt4 ):ScRefHdlrImpl< ScAnyRefDlg, SfxModelessDialog>(rt1, rt2, rt3, rt4){}
256 };
257 //============================================================================
258
CanInputStart(const ScRefEdit * pEdit)259 inline bool ScRefHandler::CanInputStart( const ScRefEdit *pEdit )
260 {
261 return m_aHelper.CanInputStart( pEdit );
262 }
263
CanInputDone(sal_Bool bForced)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