Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #ifndef INCLUDED_SC_SOURCE_UI_INC_VALIDATE_HXX
21 : #define INCLUDED_SC_SOURCE_UI_INC_VALIDATE_HXX
22 :
23 : #include <sfx2/tabdlg.hxx>
24 : #include <vcl/edit.hxx>
25 : #include <vcl/fixed.hxx>
26 : #include <vcl/layout.hxx>
27 : #include <vcl/lstbox.hxx>
28 : #include <vcl/vclmedit.hxx>
29 : #include <svtools/svmedit.hxx>
30 :
31 : #include "anyrefdg.hxx"
32 :
33 0 : struct ScRefHandlerCaller{
34 0 : virtual ~ScRefHandlerCaller(){}
35 : };
36 : class ScRefHandlerHelper
37 : {
38 : protected:
39 : ScRefHandlerCaller *m_pHandler;
40 : void (ScRefHandlerCaller::*m_pSetReferenceHdl)( const ScRange& , ScDocument* );
41 : void (ScRefHandlerCaller::*m_pSetActiveHdl)();
42 : void (ScRefHandlerCaller::*m_pRefInputStartPreHdl)( formula::RefEdit* pEdit, formula::RefButton* pButton );
43 : void (ScRefHandlerCaller::*m_pRefInputStartPostHdl)( formula::RefEdit* pEdit, formula::RefButton* pButton );
44 : void (ScRefHandlerCaller::*m_pRefInputDonePreHdl)();
45 : void (ScRefHandlerCaller::*m_pRefInputDonePostHdl)();
46 :
47 : public:
48 : typedef void (ScRefHandlerCaller::*PFUNCSETREFHDLTYPE)( const ScRange& , ScDocument* );
49 : typedef void (ScRefHandlerCaller::*PCOMMONHDLTYPE)();
50 : typedef void (ScRefHandlerCaller::*PINPUTSTARTDLTYPE)( formula::RefEdit* pEdit, formula::RefButton* pButton );
51 :
52 0 : PFUNCSETREFHDLTYPE SetSetRefHdl( PFUNCSETREFHDLTYPE pNewHdl )
53 : {
54 0 : PFUNCSETREFHDLTYPE pOldHdl = m_pSetReferenceHdl;
55 0 : m_pSetReferenceHdl = pNewHdl;
56 0 : return pOldHdl;
57 : }
58 :
59 0 : PCOMMONHDLTYPE SetSetActHdl( PCOMMONHDLTYPE pNewHdl )
60 : {
61 0 : PCOMMONHDLTYPE pOldHdl = m_pSetActiveHdl;
62 0 : m_pSetActiveHdl = pNewHdl;
63 0 : return pOldHdl;
64 : }
65 :
66 0 : ScRefHandlerCaller *SetHandler( ScRefHandlerCaller *pNewHandler )
67 : {
68 0 : ScRefHandlerCaller *pOldHandler = m_pHandler;
69 0 : m_pHandler = pNewHandler;
70 0 : return pOldHandler;
71 : }
72 0 : void SetRefInputStartPreHdl( PINPUTSTARTDLTYPE pNewHdl ){ m_pRefInputStartPreHdl = pNewHdl; }
73 0 : void SetRefInputDonePostHdl( void (ScRefHandlerCaller::*pNewHdl)() ){ m_pRefInputDonePostHdl = pNewHdl; }
74 : void SetRefInputStartPostHdl( PINPUTSTARTDLTYPE pNewHdl ){ m_pRefInputStartPostHdl = pNewHdl; }
75 : void SetRefInputDonePreHdl( void (ScRefHandlerCaller::*pNewHdl)() ){ m_pRefInputDonePreHdl = pNewHdl; }
76 :
77 0 : ScRefHandlerHelper():m_pHandler(NULL), m_pSetReferenceHdl( NULL ), m_pSetActiveHdl(NULL), m_pRefInputStartPreHdl( NULL ), m_pRefInputStartPostHdl( NULL ), m_pRefInputDonePreHdl( NULL ), m_pRefInputDonePostHdl( NULL ){}
78 : };
79 :
80 : class ScValidationDlg;
81 :
82 : /** The tab page "Criteria" from the Validation dialog. */
83 0 : class ScTPValidationValue : public ScRefHandlerCaller, public SfxTabPage
84 : {
85 : public:
86 : explicit ScTPValidationValue( vcl::Window* pParent, const SfxItemSet& rArgSet );
87 :
88 : static SfxTabPage* Create( vcl::Window* pParent, const SfxItemSet* rArgSet );
89 : static const sal_uInt16* GetRanges();
90 :
91 : virtual bool FillItemSet( SfxItemSet* rArgSet ) SAL_OVERRIDE;
92 : virtual void Reset( const SfxItemSet* rArgSet ) SAL_OVERRIDE;
93 :
94 : private:
95 : void Init();
96 :
97 : OUString GetFirstFormula() const;
98 : OUString GetSecondFormula() const;
99 :
100 : void SetFirstFormula( const OUString& rFmlaStr );
101 : void SetSecondFormula( const OUString& rFmlaStr );
102 :
103 : DECL_LINK(SelectHdl, void *);
104 : DECL_LINK(CheckHdl, void *);
105 :
106 : ListBox* m_pLbAllow;
107 : CheckBox* m_pCbAllow; /// Allow blank cells.
108 : CheckBox* m_pCbShow; /// Show selection list in cell.
109 : CheckBox* m_pCbSort; /// Sort selection list in cell.
110 : FixedText* m_pFtValue;
111 : ListBox* m_pLbValue;
112 : FixedText* m_pFtMin;
113 : VclContainer* m_pMinGrid;
114 : formula::RefEdit* m_pEdMin;
115 : VclMultiLineEdit* m_pEdList; /// Entries for explicit list
116 : FixedText* m_pFtMax;
117 : formula::RefEdit* m_pEdMax;
118 : FixedText* m_pFtHint; /// Hint text for cell range validity.
119 :
120 : OUString maStrMin;
121 : OUString maStrMax;
122 : OUString maStrValue;
123 : OUString maStrRange;
124 : OUString maStrList;
125 : sal_Unicode mcFmlaSep; /// List separator in formulas.
126 :
127 : DECL_LINK(EditSetFocusHdl, void *);
128 : DECL_LINK( KillFocusHdl, vcl::Window *);
129 : void OnClick( Button *pBtn );
130 : formula::RefEdit* m_pRefEdit;
131 : public:
132 0 : class ScRefButtonEx : public ::formula::RefButton
133 : {
134 : ScTPValidationValue* m_pPage;
135 : virtual void Click() SAL_OVERRIDE;
136 : public:
137 0 : ScRefButtonEx(vcl::Window* pParent, WinBits nStyle)
138 : : ::formula::RefButton(pParent, nStyle)
139 0 : , m_pPage(NULL)
140 : {
141 0 : }
142 0 : void SetParentPage(ScTPValidationValue *pPage)
143 : {
144 0 : m_pPage = pPage;
145 0 : }
146 0 : ScTPValidationValue* GetParentPage()
147 : {
148 0 : return m_pPage;
149 : }
150 : };
151 : private:
152 : ScRefButtonEx* m_pBtnRef;
153 : VclContainer* m_pRefGrid;
154 : friend class ScRefButtonEx;
155 : void SetReferenceHdl( const ScRange& , ScDocument* );
156 : void SetActiveHdl();
157 : void RefInputStartPreHdl( formula::RefEdit* pEdit, formula::RefButton* pButton );
158 : void RefInputDonePostHdl();
159 : ScValidationDlg * GetValidationDlg();
160 : public:
161 : sal_uInt16 GetAllowEntryPos();
162 : OUString GetMinText();
163 : void SetupRefDlg();
164 : void RemoveRefDlg();
165 : };
166 :
167 : /** The "Validity" tab dialog. */
168 : class ScValidationDlg
169 : : public ScRefHdlrImpl<ScValidationDlg, SfxTabDialog, false>
170 : , public ScRefHandlerHelper
171 : {
172 : typedef ScRefHdlrImpl<ScValidationDlg, SfxTabDialog, false> ScValidationDlgBase;
173 :
174 : DECL_LINK( OkHdl, Button * );
175 :
176 : ScTabViewShell *m_pTabVwSh;
177 : VclHBox* m_pHBox;
178 : sal_uInt16 m_nValuePageId;
179 : bool m_bOwnRefHdlr:1;
180 : bool m_bRefInputting:1;
181 :
182 : bool EnterRefStatus();
183 : bool LeaveRefStatus();
184 :
185 : public:
186 : explicit ScValidationDlg( vcl::Window* pParent, const SfxItemSet* pArgSet, ScTabViewShell * pTabViewSh, SfxBindings *pB = NULL );
187 0 : virtual ~ScValidationDlg()
188 0 : {
189 0 : if( m_bOwnRefHdlr )
190 0 : RemoveRefDlg( false );
191 0 : }
192 0 : static ScValidationDlg * Find1AliveObject( vcl::Window *pAncestor )
193 : {
194 0 : return static_cast<ScValidationDlg *>( SC_MOD()->Find1RefWindow( SLOTID, pAncestor ) );
195 : }
196 0 : ScTabViewShell *GetTabViewShell()
197 : {
198 0 : return m_pTabVwSh;
199 : }
200 :
201 : bool SetupRefDlg();
202 : bool RemoveRefDlg( bool bRestoreModal = true );
203 :
204 0 : virtual void SetModal( bool bModal ){ ScValidationDlgBase::SetModalInputMode( bModal ); }
205 :
206 0 : virtual void SetReference( const ScRange& rRef, ScDocument* pDoc ) SAL_OVERRIDE
207 : {
208 0 : if ( m_pHandler && m_pSetReferenceHdl )
209 0 : (m_pHandler->*m_pSetReferenceHdl)( rRef, pDoc );
210 0 : }
211 :
212 0 : virtual void SetActive() SAL_OVERRIDE
213 : {
214 0 : if ( m_pHandler && m_pSetActiveHdl )
215 0 : (m_pHandler->*m_pSetActiveHdl)();
216 0 : }
217 :
218 : void CloseRefDialog()
219 : {
220 : OSL_FAIL( "should not execute here!!!when the edit kill focus, should remove refhandler.\r\n" );
221 :
222 : if ( IsInExecute() )
223 : EndDialog( RET_CANCEL );
224 : else if ( GetStyle() & WB_CLOSEABLE )
225 : Close();
226 : }
227 :
228 0 : bool IsRefInputting(){ return m_bRefInputting; }
229 0 : vcl::Window* get_refinput_shrink_parent() { return m_pHBox; }
230 :
231 0 : virtual void RefInputStart( formula::RefEdit* pEdit, formula::RefButton* pButton = NULL ) SAL_OVERRIDE
232 : {
233 0 : if( !CanInputStart( pEdit ) )
234 0 : return;
235 :
236 0 : if ( m_pHandler && m_pRefInputStartPreHdl )
237 0 : (m_pHandler->*m_pRefInputStartPreHdl)( pEdit, pButton );
238 0 : m_bRefInputting = true;
239 0 : ScValidationDlgBase::RefInputStart( pEdit, pButton );
240 0 : if ( m_pHandler && m_pRefInputStartPostHdl )
241 0 : (m_pHandler->*m_pRefInputStartPostHdl)( pEdit, pButton );
242 : }
243 :
244 0 : virtual void RefInputDone( bool bForced = false ) SAL_OVERRIDE
245 : {
246 0 : if( !CanInputDone( bForced ) )
247 0 : return;
248 :
249 0 : if ( m_pHandler && m_pRefInputDonePreHdl )
250 0 : (m_pHandler->*m_pRefInputDonePreHdl)();
251 :
252 0 : ScValidationDlgBase::RefInputDone( bForced );
253 0 : m_bRefInputting = false;
254 :
255 0 : if ( m_pHandler && m_pRefInputDonePostHdl )
256 0 : (m_pHandler->*m_pRefInputDonePostHdl)();
257 : }
258 :
259 : bool IsChildFocus();
260 :
261 : enum { SLOTID = SID_VALIDITY_REFERENCE };
262 :
263 0 : bool Close() SAL_OVERRIDE
264 : {
265 0 : if( m_bOwnRefHdlr )
266 : {
267 0 : if (SfxTabPage* pPage = GetTabPage(m_nValuePageId))
268 0 : static_cast<ScTPValidationValue*>(pPage)->RemoveRefDlg();
269 : }
270 :
271 0 : return ScValidationDlgBase::Close();
272 : }
273 : };
274 :
275 : class ScTPValidationHelp : public SfxTabPage
276 : {
277 : private:
278 : TriStateBox* pTsbHelp;
279 : Edit* pEdtTitle;
280 : VclMultiLineEdit* pEdInputHelp;
281 :
282 : void Init();
283 :
284 : // Handler ------------------------
285 : // DECL_LINK( SelectHdl, ListBox * );
286 :
287 : public:
288 : ScTPValidationHelp( vcl::Window* pParent, const SfxItemSet& rArgSet );
289 : virtual ~ScTPValidationHelp();
290 :
291 : static SfxTabPage* Create ( vcl::Window* pParent, const SfxItemSet* rArgSet );
292 : virtual bool FillItemSet ( SfxItemSet* rArgSet ) SAL_OVERRIDE;
293 : virtual void Reset ( const SfxItemSet* rArgSet ) SAL_OVERRIDE;
294 : };
295 :
296 : class ScTPValidationError : public SfxTabPage
297 : {
298 : private:
299 : TriStateBox* m_pTsbShow;
300 : ListBox* m_pLbAction;
301 : PushButton* m_pBtnSearch;
302 : Edit* m_pEdtTitle;
303 : FixedText* m_pFtError;
304 : VclMultiLineEdit* m_pEdError;
305 :
306 : void Init();
307 :
308 : // Handler ------------------------
309 : DECL_LINK(SelectActionHdl, void *);
310 : DECL_LINK(ClickSearchHdl, void *);
311 :
312 : public:
313 : ScTPValidationError( vcl::Window* pParent, const SfxItemSet& rArgSet );
314 : virtual ~ScTPValidationError();
315 :
316 : static SfxTabPage* Create ( vcl::Window* pParent, const SfxItemSet* rArgSet );
317 : virtual bool FillItemSet ( SfxItemSet* rArgSet ) SAL_OVERRIDE;
318 : virtual void Reset ( const SfxItemSet* rArgSet ) SAL_OVERRIDE;
319 : };
320 :
321 : #endif // INCLUDED_SC_SOURCE_UI_INC_VALIDATE_HXX
322 :
323 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|