1 /////////////////////////////////////////////////////////////////////////////
2 // Name:        wx/pickerbase.h
3 // Purpose:     wxPickerBase definition
4 // Author:      Francesco Montorsi (based on Vadim Zeitlin's code)
5 // Modified by:
6 // Created:     14/4/2006
7 // Copyright:   (c) Vadim Zeitlin, Francesco Montorsi
8 // Licence:     wxWindows Licence
9 /////////////////////////////////////////////////////////////////////////////
10 
11 #ifndef _WX_PICKERBASE_H_BASE_
12 #define _WX_PICKERBASE_H_BASE_
13 
14 #include "wx/control.h"
15 #include "wx/sizer.h"
16 #include "wx/containr.h"
17 
18 class WXDLLIMPEXP_FWD_CORE wxTextCtrl;
19 class WXDLLIMPEXP_FWD_CORE wxToolTip;
20 
21 extern WXDLLIMPEXP_DATA_CORE(const char) wxButtonNameStr[];
22 
23 // ----------------------------------------------------------------------------
24 // wxPickerBase is the base class for the picker controls which support
25 // a wxPB_USE_TEXTCTRL style; i.e. for those pickers which can use an auxiliary
26 // text control next to the 'real' picker.
27 //
28 // The wxTextPickerHelper class manages enabled/disabled state of the text control,
29 // its sizing and positioning.
30 // ----------------------------------------------------------------------------
31 
32 #define wxPB_USE_TEXTCTRL           0x0002
33 #define wxPB_SMALL                  0x8000
34 
35 class WXDLLIMPEXP_CORE wxPickerBase : public wxNavigationEnabled<wxControl>
36 {
37 public:
38     // ctor: text is the associated text control
wxPickerBase()39     wxPickerBase() : m_text(NULL), m_picker(NULL), m_sizer(NULL)
40         { }
~wxPickerBase()41     virtual ~wxPickerBase() {}
42 
43 
44     // if present, intercepts wxPB_USE_TEXTCTRL style and creates the text control
45     // The 3rd argument is the initial wxString to display in the text control
46     bool CreateBase(wxWindow *parent,
47                     wxWindowID id,
48                     const wxString& text = wxEmptyString,
49                     const wxPoint& pos = wxDefaultPosition,
50                     const wxSize& size = wxDefaultSize,
51                     long style = 0,
52                     const wxValidator& validator = wxDefaultValidator,
53                     const wxString& name = wxButtonNameStr);
54 
55 public:     // public API
56 
57     // margin between the text control and the picker
SetInternalMargin(int newmargin)58     void SetInternalMargin(int newmargin)
59         { GetTextCtrlItem()->SetBorder(newmargin); m_sizer->Layout(); }
GetInternalMargin()60     int GetInternalMargin() const
61         { return GetTextCtrlItem()->GetBorder(); }
62 
63     // proportion of the text control
SetTextCtrlProportion(int prop)64     void SetTextCtrlProportion(int prop)
65         { GetTextCtrlItem()->SetProportion(prop); m_sizer->Layout(); }
GetTextCtrlProportion()66     int GetTextCtrlProportion() const
67         { return GetTextCtrlItem()->GetProportion(); }
68 
69     // proportion of the picker control
SetPickerCtrlProportion(int prop)70     void SetPickerCtrlProportion(int prop)
71         { GetPickerCtrlItem()->SetProportion(prop); m_sizer->Layout(); }
GetPickerCtrlProportion()72     int GetPickerCtrlProportion() const
73         { return GetPickerCtrlItem()->GetProportion(); }
74 
IsTextCtrlGrowable()75     bool IsTextCtrlGrowable() const
76         { return (GetTextCtrlItem()->GetFlag() & wxGROW) != 0; }
77     void SetTextCtrlGrowable(bool grow = true)
78     {
79         int f = GetDefaultTextCtrlFlag();
80         if ( grow )
81             f |= wxGROW;
82         else
83             f &= ~wxGROW;
84 
85         GetTextCtrlItem()->SetFlag(f);
86     }
87 
IsPickerCtrlGrowable()88     bool IsPickerCtrlGrowable() const
89         { return (GetPickerCtrlItem()->GetFlag() & wxGROW) != 0; }
90     void SetPickerCtrlGrowable(bool grow = true)
91     {
92         int f = GetDefaultPickerCtrlFlag();
93         if ( grow )
94             f |= wxGROW;
95         else
96             f &= ~wxGROW;
97 
98         GetPickerCtrlItem()->SetFlag(f);
99     }
100 
HasTextCtrl()101     bool HasTextCtrl() const
102         { return m_text != NULL; }
GetTextCtrl()103     wxTextCtrl *GetTextCtrl()
104         { return m_text; }
GetPickerCtrl()105     wxControl *GetPickerCtrl()
106         { return m_picker; }
107 
SetTextCtrl(wxTextCtrl * text)108     void SetTextCtrl(wxTextCtrl* text)
109         { m_text = text; }
SetPickerCtrl(wxControl * picker)110     void SetPickerCtrl(wxControl* picker)
111         { m_picker = picker; }
112 
113     // methods that derived class must/may override
114     virtual void UpdatePickerFromTextCtrl() = 0;
115     virtual void UpdateTextCtrlFromPicker() = 0;
116 
117 protected:
118     // overridden base class methods
119 #if wxUSE_TOOLTIPS
120     virtual void DoSetToolTip(wxToolTip *tip);
121 #endif // wxUSE_TOOLTIPS
122 
123 
124     // event handlers
125     void OnTextCtrlDelete(wxWindowDestroyEvent &);
126     void OnTextCtrlUpdate(wxCommandEvent &);
127     void OnTextCtrlKillFocus(wxFocusEvent &);
128 
129     // returns the set of styles for the attached wxTextCtrl
130     // from given wxPickerBase's styles
GetTextCtrlStyle(long style)131     virtual long GetTextCtrlStyle(long style) const
132         { return (style & wxWINDOW_STYLE_MASK); }
133 
134     // returns the set of styles for the m_picker
GetPickerStyle(long style)135     virtual long GetPickerStyle(long style) const
136         { return (style & wxWINDOW_STYLE_MASK); }
137 
138 
GetPickerCtrlItem()139     wxSizerItem *GetPickerCtrlItem() const
140     {
141         if (this->HasTextCtrl())
142             return m_sizer->GetItem((size_t)1);
143         return m_sizer->GetItem((size_t)0);
144     }
145 
GetTextCtrlItem()146     wxSizerItem *GetTextCtrlItem() const
147     {
148         wxASSERT(this->HasTextCtrl());
149         return m_sizer->GetItem((size_t)0);
150     }
151 
GetDefaultPickerCtrlFlag()152     int GetDefaultPickerCtrlFlag() const
153     {
154         // on macintosh, without additional borders
155         // there's not enough space for focus rect
156         return wxALIGN_CENTER_VERTICAL|wxGROW
157 #ifdef __WXMAC__
158             | wxTOP | wxRIGHT | wxBOTTOM
159 #endif
160             ;
161     }
162 
GetDefaultTextCtrlFlag()163     int GetDefaultTextCtrlFlag() const
164     {
165         // on macintosh, without wxALL there's not enough space for focus rect
166         return wxALIGN_CENTER_VERTICAL
167 #ifdef __WXMAC__
168             | wxALL
169 #else
170             | wxRIGHT
171 #endif
172             ;
173     }
174 
175     void PostCreation();
176 
177 protected:
178     wxTextCtrl *m_text;     // can be NULL
179     wxControl *m_picker;
180     wxBoxSizer *m_sizer;
181 
182 private:
183     DECLARE_ABSTRACT_CLASS(wxPickerBase)
184 };
185 
186 
187 #endif
188     // _WX_PICKERBASE_H_BASE_
189