xref: /trunk/main/sc/source/ui/inc/validate.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef SC_VALIDATE_HXX
29 #define SC_VALIDATE_HXX
30 
31 #include <sfx2/tabdlg.hxx>
32 #include <vcl/edit.hxx>
33 #include <vcl/fixed.hxx>
34 #include <vcl/lstbox.hxx>
35 #include <svtools/svmedit.hxx>
36 //<!--Added by PengYunQuan for Validity Cell Range Picker
37 #include "anyrefdg.hxx"
38 //-->Added by PengYunQuan for Validity Cell Range Picker
39 
40 // ============================================================================
41 
42 //<!--Added by PengYunQuan for Validity Cell Range Picker
43 struct  ScRefHandlerCaller{
44     virtual ~ScRefHandlerCaller(){}
45 };
46 class ScRefHandlerHelper
47 {
48 protected:
49     ScRefHandlerCaller  *m_pHandler;
50     void            (ScRefHandlerCaller::*m_pSetReferenceHdl)( const ScRange& , ScDocument* );
51     void            (ScRefHandlerCaller::*m_pSetActiveHdl)();
52     void            (ScRefHandlerCaller::*m_pRefInputStartPreHdl)( ScRefEdit* pEdit, ScRefButton* pButton );
53     void            (ScRefHandlerCaller::*m_pRefInputStartPostHdl)( ScRefEdit* pEdit, ScRefButton* pButton );
54     void            (ScRefHandlerCaller::*m_pRefInputDonePreHdl)();
55     void            (ScRefHandlerCaller::*m_pRefInputDonePostHdl)();
56 
57 public:
58     typedef void            (ScRefHandlerCaller::*PFUNCSETREFHDLTYPE)( const ScRange& , ScDocument* );
59     typedef void            (ScRefHandlerCaller::*PCOMMONHDLTYPE)();
60     typedef void            (ScRefHandlerCaller::*PINPUTSTARTDLTYPE)(  ScRefEdit* pEdit, ScRefButton* pButton );
61 
62     PFUNCSETREFHDLTYPE  SetSetRefHdl(  PFUNCSETREFHDLTYPE pNewHdl )
63     {
64         PFUNCSETREFHDLTYPE pOldHdl = m_pSetReferenceHdl;
65         m_pSetReferenceHdl = pNewHdl;
66         return pOldHdl;
67     }
68 
69     PCOMMONHDLTYPE  SetSetActHdl(  PCOMMONHDLTYPE pNewHdl )
70     {
71         PCOMMONHDLTYPE pOldHdl = m_pSetActiveHdl;
72         m_pSetActiveHdl = pNewHdl;
73         return pOldHdl;
74     }
75 
76     ScRefHandlerCaller  *SetHandler( ScRefHandlerCaller *pNewHandler )
77     {
78         ScRefHandlerCaller  *pOldHandler = m_pHandler;
79         m_pHandler = pNewHandler;
80         return pOldHandler;
81     }
82     void    SetRefInputStartPreHdl( PINPUTSTARTDLTYPE pNewHdl   ){  m_pRefInputStartPreHdl = pNewHdl;   }
83     void    SetRefInputDonePostHdl( void            (ScRefHandlerCaller::*pNewHdl)()    ){  m_pRefInputDonePostHdl = pNewHdl;   }
84     void    SetRefInputStartPostHdl(    PINPUTSTARTDLTYPE pNewHdl   ){  m_pRefInputStartPostHdl = pNewHdl;  }
85     void    SetRefInputDonePreHdl( void            (ScRefHandlerCaller::*pNewHdl)() ){  m_pRefInputDonePreHdl = pNewHdl;    }
86 
87     ScRefHandlerHelper():m_pHandler(NULL), m_pSetReferenceHdl( NULL ), m_pSetActiveHdl(NULL),  m_pRefInputStartPreHdl( NULL ), m_pRefInputStartPostHdl( NULL ), m_pRefInputDonePreHdl( NULL ),  m_pRefInputDonePostHdl( NULL ){}
88 };
89 //-->Added by PengYunQuan for Validity Cell Range Picker
90 
91 /** The "Validity" tab dialog. */
92 //<!--Modified by PengYunQuan for Validity Cell Range Picker
93 //class ScValidationDlg : public SfxTabDialog
94 class ScValidationDlg :public ScRefHdlrImpl<ScValidationDlg, SfxTabDialog, false>, public ScRefHandlerHelper
95 //-->Modified by PengYunQuan for Validity Cell Range Picker
96 {
97     //<!--Added by PengYunQuan for Validity Cell Range Picker
98     typedef ScRefHdlrImpl<ScValidationDlg, SfxTabDialog, false> ScValidationDlgBase;
99 
100     //Start_Moddify by liliang 03/26/2008 SODC_13677_2
101     DECL_LINK( OkHdl, Button * );
102     //End_Moddify by liliang 03/26/2008 SODC_13677_2
103     bool    m_bOwnRefHdlr:1;
104 
105     ScTabViewShell *m_pTabVwSh;
106     bool    m_bRefInputting:1;
107     bool    EnterRefStatus();
108     bool    LeaveRefStatus();
109     //-->Added by PengYunQuan for Validity Cell Range Picker
110 public:
111     //<!--Modified by PengYunQuan for Validity Cell Range Picker
112     //explicit                    ScValidationDlg( Window* pParent, const SfxItemSet* pArgSet );
113     explicit ScValidationDlg( Window* pParent, const SfxItemSet* pArgSet, ScTabViewShell * pTabViewSh, SfxBindings *pB = NULL );
114     //-->Modified by PengYunQuan for Validity Cell Range Picker
115     //<!--Added by PengYunQuan for Validity Cell Range Picker
116     virtual                     ~ScValidationDlg();
117     inline static ScValidationDlg * Find1AliveObject( Window *pAncestor );
118     bool    IsAlive();
119     inline  ScTabViewShell * GetTabViewShell();
120 
121     bool    SetupRefDlg();
122     bool    RemoveRefDlg( sal_Bool bRestoreModal = sal_True );
123 
124     virtual void            SetModal( sal_Bool bModal ){ ScValidationDlgBase::SetModalInputMode( bModal ); }
125 
126     virtual void            SetReference( const ScRange& rRef, ScDocument* pDoc )
127     {
128         if ( m_pHandler && m_pSetReferenceHdl )
129             (m_pHandler->*m_pSetReferenceHdl)( rRef, pDoc );
130     }
131 
132     virtual void            SetActive()
133     {
134         if ( m_pHandler && m_pSetActiveHdl )
135             (m_pHandler->*m_pSetActiveHdl)();
136     }
137 
138     void        CloseRefDialog()
139     {
140         DBG_ASSERT( false, "should not execute here!!!when the edit kill focus, should remove refhandler.\r\n" );
141 
142         if ( IsInExecute() )
143             EndDialog( sal_False );
144         else if ( GetStyle() & WB_CLOSEABLE )
145             Close();
146     }
147 
148     bool IsRefInputting(){  return m_bRefInputting; }
149 
150     virtual void        RefInputStart( ScRefEdit* pEdit, ScRefButton* pButton = NULL )
151     {
152         if( !CanInputStart( pEdit ) )
153             return;
154 
155         if ( m_pHandler && m_pRefInputStartPreHdl )
156             (m_pHandler->*m_pRefInputStartPreHdl)( pEdit, pButton );
157         m_bRefInputting = true;
158         ScValidationDlgBase::RefInputStart( pEdit, pButton );
159         if ( m_pHandler && m_pRefInputStartPostHdl )
160             (m_pHandler->*m_pRefInputStartPostHdl)( pEdit, pButton );
161     }
162 
163     virtual void        RefInputDone( sal_Bool bForced = sal_False )
164     {
165         if( !CanInputDone( bForced ) )
166             return;
167 
168         if ( m_pHandler && m_pRefInputDonePreHdl )
169             (m_pHandler->*m_pRefInputDonePreHdl)();
170 
171         ScValidationDlgBase::RefInputDone( bForced );
172         m_bRefInputting = false;
173 
174         if ( m_pHandler && m_pRefInputDonePostHdl )
175             (m_pHandler->*m_pRefInputDonePostHdl)();
176     }
177 
178     sal_Bool IsChildFocus();
179 
180     enum { SLOTID = SID_VALIDITY_REFERENCE };
181 
182     sal_Bool Close();
183     //-->Added by PengYunQuan for Validity Cell Range Picker
184 };
185 
186 
187 // ============================================================================
188 
189 /** The tab page "Criteria" from the Validation dialog. */
190 //<!--Modified by PengYunQuan for Validity Cell Range Picker
191 //class ScTPValidationValue : public SfxTabPage
192 class ScTPValidationValue : public ScRefHandlerCaller, public SfxTabPage
193 //-->Modified by PengYunQuan for Validity Cell Range Picker
194 {
195 public:
196     explicit                    ScTPValidationValue( Window* pParent, const SfxItemSet& rArgSet );
197     virtual                     ~ScTPValidationValue();
198 
199     static SfxTabPage*          Create( Window* pParent, const SfxItemSet& rArgSet );
200     static sal_uInt16*              GetRanges();
201 
202     virtual sal_Bool                FillItemSet( SfxItemSet& rArgSet );
203     virtual void                Reset( const SfxItemSet& rArgSet );
204 
205 private:
206     void                        Init();
207 
208     String                      GetFirstFormula() const;
209     String                      GetSecondFormula() const;
210 
211     void                        SetFirstFormula( const String& rFmlaStr );
212     void                        SetSecondFormula( const String& rFmlaStr );
213 
214                                 DECL_LINK( SelectHdl, ListBox* );
215                                 DECL_LINK( CheckHdl, CheckBox* );
216 
217     FixedText                   maFtAllow;
218     ListBox                     maLbAllow;
219     CheckBox                    maCbAllow;      /// Allow blank cells.
220     CheckBox                    maCbShow;       /// Show selection list in cell.
221     CheckBox                    maCbSort;       /// Sort selection list in cell.
222     FixedText                   maFtValue;
223     ListBox                     maLbValue;
224     FixedText                   maFtMin;
225     //<!--Modified by PengYunQuan for Validity Cell Range Picker
226     //Edit                        maEdMin;
227     ScRefEdit                        maEdMin;
228     //-->Modified by PengYunQuan for Validity Cell Range Picker
229     MultiLineEdit               maEdList;       /// Entries for explicit list
230     FixedText                   maFtMax;
231     //<!--Modified by PengYunQuan for Validity Cell Range Picker
232     //Edit                        maEdMax;
233     ScRefEdit                        maEdMax;
234     //-->Modified by PengYunQuan for Validity Cell Range Picker
235     FixedText                   maFtHint;       /// Hint text for cell range validity.
236 
237     String                      maStrMin;
238     String                      maStrMax;
239     String                      maStrValue;
240     String                      maStrRange;
241     String                      maStrList;
242     sal_Unicode                 mcFmlaSep;      /// List separator in formulas.
243     //<!--Added by PengYunQuan for Validity Cell Range Picker
244     DECL_LINK( EditSetFocusHdl, Edit *);
245     DECL_LINK( KillFocusHdl, Window *);
246     void    OnClick( Button *pBtn );
247     ScRefEdit   *m_pRefEdit;
248     class ScRefButtonEx:public ::ScRefButton
249     {
250         void Click();
251     public:
252         ScRefButtonEx( Window* pParent, const ResId& rResId, ScRefEdit* pEdit = NULL, ScRefHandler *pRefHdlr = NULL ): ::ScRefButton( pParent, rResId, pEdit, pRefHdlr ){}
253     }m_btnRef;
254     friend class ScRefButtonEx;
255     void            SetReferenceHdl( const ScRange& , ScDocument* );
256     void            SetActiveHdl();
257     void            RefInputStartPreHdl( ScRefEdit* pEdit, ScRefButton* pButton );
258     void            RefInputDonePreHdl();
259     void            RefInputDonePostHdl();
260     ScValidationDlg * GetValidationDlg();
261 
262     //TYPEINFO();
263     void            TidyListBoxes();
264 public:
265     sal_uInt16          GetAllowEntryPos();
266     String          GetMinText();
267     void    SetupRefDlg();
268     void    RemoveRefDlg();
269     //-->Added by PengYunQuan for Validity Cell Range Picker
270 };
271 
272 
273 //==================================================================
274 
275 class ScTPValidationHelp : public SfxTabPage
276 {
277 private:
278     TriStateBox     aTsbHelp;
279     FixedLine       aFlContent;
280     FixedText       aFtTitle;
281     Edit            aEdtTitle;
282     FixedText       aFtInputHelp;
283     MultiLineEdit   aEdInputHelp;
284 
285     const SfxItemSet& mrArgSet;
286 
287     void    Init();
288 
289     // Handler ------------------------
290     // DECL_LINK( SelectHdl, ListBox * );
291 
292 public:
293             ScTPValidationHelp( Window* pParent, const SfxItemSet& rArgSet );
294             ~ScTPValidationHelp();
295 
296     static  SfxTabPage* Create      ( Window* pParent, const SfxItemSet& rArgSet );
297     static  sal_uInt16*     GetRanges   ();
298     virtual sal_Bool        FillItemSet ( SfxItemSet& rArgSet );
299     virtual void        Reset       ( const SfxItemSet& rArgSet );
300 };
301 
302 //==================================================================
303 
304 class ScTPValidationError : public SfxTabPage
305 {
306 private:
307     TriStateBox     aTsbShow;
308     FixedLine       aFlContent;
309     FixedText       aFtAction;
310     ListBox         aLbAction;
311     PushButton      aBtnSearch;
312     FixedText       aFtTitle;
313     Edit            aEdtTitle;
314     FixedText       aFtError;
315     MultiLineEdit   aEdError;
316 
317     const SfxItemSet& mrArgSet;
318 
319     void    Init();
320 
321     // Handler ------------------------
322     DECL_LINK( SelectActionHdl, ListBox * );
323     DECL_LINK( ClickSearchHdl, PushButton * );
324 
325 public:
326             ScTPValidationError( Window* pParent, const SfxItemSet& rArgSet );
327             ~ScTPValidationError();
328 
329     static  SfxTabPage* Create      ( Window* pParent, const SfxItemSet& rArgSet );
330     static  sal_uInt16*     GetRanges   ();
331     virtual sal_Bool        FillItemSet ( SfxItemSet& rArgSet );
332     virtual void        Reset       ( const SfxItemSet& rArgSet );
333 };
334 
335 //<!--Added by PengYunQuan for Validity Cell Range Picker
336 inline ScTabViewShell *ScValidationDlg::GetTabViewShell()
337 {
338     return m_pTabVwSh;
339 }
340 
341 inline ScValidationDlg * ScValidationDlg::Find1AliveObject( Window *pAncestor )
342 {
343     return static_cast<ScValidationDlg *>( SC_MOD()->Find1RefWindow( SLOTID, pAncestor ) );
344 }
345 //-->Added by PengYunQuan for Validity Cell Range Picker
346 #endif // SC_VALIDATE_HXX
347 
348