]>
Commit | Line | Data |
---|---|---|
1e6feb95 VZ |
1 | /////////////////////////////////////////////////////////////////////////////// |
2 | // Name: wx/univ/listbox.h | |
3 | // Purpose: the universal listbox | |
4 | // Author: Vadim Zeitlin | |
5 | // Modified by: | |
6 | // Created: 30.08.00 | |
a3870b2f | 7 | // Copyright: (c) 2000 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> |
65571936 | 8 | // Licence: wxWindows licence |
1e6feb95 VZ |
9 | /////////////////////////////////////////////////////////////////////////////// |
10 | ||
11 | #ifndef _WX_UNIV_LISTBOX_H_ | |
12 | #define _WX_UNIV_LISTBOX_H_ | |
13 | ||
1e6feb95 | 14 | #include "wx/scrolwin.h" // for wxScrollHelper |
ed39ff57 | 15 | #include "wx/dynarray.h" |
18dbdd3c | 16 | #include "wx/arrstr.h" |
1e6feb95 VZ |
17 | |
18 | // ---------------------------------------------------------------------------- | |
19 | // the actions supported by this control | |
20 | // ---------------------------------------------------------------------------- | |
21 | ||
22 | // change the current item | |
9a83f860 VZ |
23 | #define wxACTION_LISTBOX_SETFOCUS wxT("setfocus") // select the item |
24 | #define wxACTION_LISTBOX_MOVEDOWN wxT("down") // select item below | |
25 | #define wxACTION_LISTBOX_MOVEUP wxT("up") // select item above | |
26 | #define wxACTION_LISTBOX_PAGEDOWN wxT("pagedown") // go page down | |
27 | #define wxACTION_LISTBOX_PAGEUP wxT("pageup") // go page up | |
28 | #define wxACTION_LISTBOX_START wxT("start") // go to first item | |
29 | #define wxACTION_LISTBOX_END wxT("end") // go to last item | |
30 | #define wxACTION_LISTBOX_FIND wxT("find") // find item by 1st letter | |
1e6feb95 VZ |
31 | |
32 | // do something with the current item | |
9a83f860 VZ |
33 | #define wxACTION_LISTBOX_ACTIVATE wxT("activate") // activate (choose) |
34 | #define wxACTION_LISTBOX_TOGGLE wxT("toggle") // togglee selected state | |
35 | #define wxACTION_LISTBOX_SELECT wxT("select") // sel this, unsel others | |
36 | #define wxACTION_LISTBOX_SELECTADD wxT("selectadd") // add to selection | |
37 | #define wxACTION_LISTBOX_UNSELECT wxT("unselect") // unselect | |
38 | #define wxACTION_LISTBOX_ANCHOR wxT("selanchor") // anchor selection | |
1e6feb95 VZ |
39 | |
40 | // do something with the selection globally (not for single selection ones) | |
9a83f860 VZ |
41 | #define wxACTION_LISTBOX_SELECTALL wxT("selectall") // select all items |
42 | #define wxACTION_LISTBOX_UNSELECTALL wxT("unselectall") // unselect all items | |
43 | #define wxACTION_LISTBOX_SELTOGGLE wxT("togglesel") // invert the selection | |
44 | #define wxACTION_LISTBOX_EXTENDSEL wxT("extend") // extend to item | |
1e6feb95 VZ |
45 | |
46 | // ---------------------------------------------------------------------------- | |
47 | // wxListBox: a list of selectable items | |
48 | // ---------------------------------------------------------------------------- | |
49 | ||
53a2db12 | 50 | class WXDLLIMPEXP_CORE wxListBox : public wxListBoxBase, public wxScrollHelper |
1e6feb95 VZ |
51 | { |
52 | public: | |
53 | // ctors and such | |
afe13769 | 54 | wxListBox() : wxScrollHelper(this) { Init(); } |
1e6feb95 VZ |
55 | wxListBox(wxWindow *parent, |
56 | wxWindowID id, | |
57 | const wxPoint& pos = wxDefaultPosition, | |
58 | const wxSize& size = wxDefaultSize, | |
59 | int n = 0, const wxString choices[] = (const wxString *) NULL, | |
60 | long style = 0, | |
61 | const wxValidator& validator = wxDefaultValidator, | |
6463b9f5 | 62 | const wxString& name = wxListBoxNameStr ) |
afe13769 | 63 | : wxScrollHelper(this) |
6463b9f5 JS |
64 | { |
65 | Init(); | |
66 | ||
67 | Create(parent, id, pos, size, n, choices, style, validator, name); | |
68 | } | |
584ad2a3 MB |
69 | wxListBox(wxWindow *parent, |
70 | wxWindowID id, | |
71 | const wxPoint& pos, | |
72 | const wxSize& size, | |
73 | const wxArrayString& choices, | |
74 | long style = 0, | |
75 | const wxValidator& validator = wxDefaultValidator, | |
76 | const wxString& name = wxListBoxNameStr ); | |
1e6feb95 VZ |
77 | |
78 | virtual ~wxListBox(); | |
79 | ||
80 | bool Create(wxWindow *parent, | |
81 | wxWindowID id, | |
82 | const wxPoint& pos = wxDefaultPosition, | |
83 | const wxSize& size = wxDefaultSize, | |
84 | int n = 0, const wxString choices[] = (const wxString *) NULL, | |
85 | long style = 0, | |
86 | const wxValidator& validator = wxDefaultValidator, | |
87 | const wxString& name = wxListBoxNameStr); | |
584ad2a3 MB |
88 | bool Create(wxWindow *parent, |
89 | wxWindowID id, | |
90 | const wxPoint& pos, | |
91 | const wxSize& size, | |
92 | const wxArrayString& choices, | |
93 | long style = 0, | |
94 | const wxValidator& validator = wxDefaultValidator, | |
95 | const wxString& name = wxListBoxNameStr); | |
1e6feb95 VZ |
96 | |
97 | // implement the listbox interface defined by wxListBoxBase | |
a236aa20 VZ |
98 | virtual void DoClear(); |
99 | virtual void DoDeleteOneItem(unsigned int n); | |
1e6feb95 | 100 | |
6f34862c VZ |
101 | virtual unsigned int GetCount() const; |
102 | virtual wxString GetString(unsigned int n) const; | |
aa61d352 | 103 | virtual void SetString(unsigned int n, const wxString& s); |
6f34862c | 104 | virtual int FindString(const wxString& s, bool bCase = false) const; |
1e6feb95 VZ |
105 | |
106 | virtual bool IsSelected(int n) const | |
107 | { return m_selections.Index(n) != wxNOT_FOUND; } | |
1e6feb95 VZ |
108 | virtual int GetSelection() const; |
109 | virtual int GetSelections(wxArrayInt& aSelections) const; | |
110 | ||
111 | protected: | |
6f02a879 | 112 | virtual void DoSetSelection(int n, bool select); |
a236aa20 VZ |
113 | |
114 | virtual int DoInsertItems(const wxArrayStringsAdapter& items, | |
115 | unsigned int pos, | |
116 | void **clientData, | |
117 | wxClientDataType type); | |
118 | ||
119 | // universal wxComboBox implementation internally uses wxListBox | |
5bcc2e54 | 120 | friend class WXDLLIMPEXP_FWD_CORE wxComboBox; |
1e6feb95 VZ |
121 | |
122 | virtual void DoSetFirstItem(int n); | |
123 | ||
aa61d352 VZ |
124 | virtual void DoSetItemClientData(unsigned int n, void* clientData); |
125 | virtual void* DoGetItemClientData(unsigned int n) const; | |
1e6feb95 VZ |
126 | |
127 | public: | |
128 | // override some more base class methods | |
129 | virtual bool SetFont(const wxFont& font); | |
130 | ||
131 | // the wxUniversal-specific methods | |
132 | // -------------------------------- | |
133 | ||
134 | // the current item is the same as the selected one for wxLB_SINGLE | |
135 | // listboxes but for the other ones it is just the focused item which may | |
136 | // be selected or not | |
137 | int GetCurrentItem() const { return m_current; } | |
138 | void SetCurrentItem(int n); | |
139 | ||
140 | // select the item which is diff items below the current one | |
141 | void ChangeCurrent(int diff); | |
142 | ||
143 | // activate (i.e. send a LISTBOX_DOUBLECLICKED message) the specified or | |
144 | // current (if -1) item | |
145 | void Activate(int item = -1); | |
146 | ||
147 | // select or unselect the specified or current (if -1) item | |
a290fa5a | 148 | void DoSelect(int item = -1, bool sel = true); |
1e6feb95 VZ |
149 | |
150 | // more readable wrapper | |
a290fa5a | 151 | void DoUnselect(int item) { DoSelect(item, false); } |
1e6feb95 VZ |
152 | |
153 | // select an item and send a notification about it | |
154 | void SelectAndNotify(int item); | |
155 | ||
156 | // ensure that the given item is visible by scrolling it into view | |
157 | virtual void EnsureVisible(int n); | |
158 | ||
159 | // find the first item [strictly] after the current one which starts with | |
a290fa5a | 160 | // the given string and make it the current one, return true if the current |
1e6feb95 | 161 | // item changed |
a290fa5a WS |
162 | bool FindItem(const wxString& prefix, bool strictlyAfter = false); |
163 | bool FindNextItem(const wxString& prefix) { return FindItem(prefix, true); } | |
1e6feb95 VZ |
164 | |
165 | // extend the selection to span the range from the anchor (see below) to | |
166 | // the specified or current item | |
167 | void ExtendSelection(int itemTo = -1); | |
168 | ||
169 | // make this item the new selection anchor: extending selection with | |
170 | // ExtendSelection() will work with it | |
171 | void AnchorSelection(int itemFrom) { m_selAnchor = itemFrom; } | |
172 | ||
173 | // get, calculating it if necessary, the number of items per page, the | |
174 | // height of each line and the max width of an item | |
175 | int GetItemsPerPage() const; | |
176 | wxCoord GetLineHeight() const; | |
177 | wxCoord GetMaxWidth() const; | |
178 | ||
179 | // override the wxControl virtual methods | |
180 | virtual bool PerformAction(const wxControlAction& action, | |
181 | long numArg = 0l, | |
182 | const wxString& strArg = wxEmptyString); | |
183 | ||
9467bdb7 VZ |
184 | static wxInputHandler *GetStdInputHandler(wxInputHandler *handlerDef); |
185 | virtual wxInputHandler *DoGetStdInputHandler(wxInputHandler *handlerDef) | |
186 | { | |
187 | return GetStdInputHandler(handlerDef); | |
188 | } | |
189 | ||
e39af974 JS |
190 | // idle processing |
191 | virtual void OnInternalIdle(); | |
81b344a5 | 192 | |
1e6feb95 VZ |
193 | protected: |
194 | // geometry | |
195 | virtual wxSize DoGetBestClientSize() const; | |
196 | virtual void DoSetSize(int x, int y, | |
197 | int width, int height, | |
198 | int sizeFlags = wxSIZE_AUTO); | |
199 | ||
200 | virtual void DoDraw(wxControlRenderer *renderer); | |
201 | virtual wxBorder GetDefaultBorder() const; | |
202 | ||
a236aa20 VZ |
203 | // special hook for wxCheckListBox which allows it to update its internal |
204 | // data when a new item is inserted into the listbox | |
205 | virtual void OnItemInserted(unsigned int WXUNUSED(pos)) { } | |
206 | ||
207 | ||
1e6feb95 VZ |
208 | // common part of all ctors |
209 | void Init(); | |
210 | ||
211 | // event handlers | |
1e6feb95 VZ |
212 | void OnSize(wxSizeEvent& event); |
213 | ||
1e6feb95 VZ |
214 | // refresh the given item(s) or everything |
215 | void RefreshItems(int from, int count); | |
216 | void RefreshItem(int n); | |
217 | void RefreshFromItemToEnd(int n); | |
218 | void RefreshAll(); | |
219 | ||
220 | // send an event of the given type (using m_current by default) | |
221 | bool SendEvent(wxEventType type, int item = -1); | |
222 | ||
223 | // calculate the number of items per page using our current size | |
224 | void CalcItemsPerPage(); | |
225 | ||
226 | // can/should we have a horz scrollbar? | |
227 | bool HasHorzScrollbar() const | |
228 | { return (m_windowStyle & wxLB_HSCROLL) != 0; } | |
229 | ||
230 | // redraw the items in the given range only: called from DoDraw() | |
231 | virtual void DoDrawRange(wxControlRenderer *renderer, | |
232 | int itemFirst, int itemLast); | |
233 | ||
234 | // update the scrollbars and then ensure that the item is visible | |
235 | void DoEnsureVisible(int n); | |
236 | ||
237 | // mark horz scrollbar for updating | |
238 | void RefreshHorzScrollbar(); | |
239 | ||
240 | // update (show/hide/adjust) the scrollbars | |
241 | void UpdateScrollbars(); | |
242 | ||
243 | // refresh the items specified by m_updateCount and m_updateFrom | |
244 | void UpdateItems(); | |
245 | ||
246 | // the array containing all items (it is sorted if the listbox has | |
e1d6e01c | 247 | // wxLB_SORT style) |
6f34862c VZ |
248 | union |
249 | { | |
250 | wxArrayString *unsorted; | |
251 | wxSortedArrayString *sorted; | |
252 | } m_strings; | |
1e6feb95 VZ |
253 | |
254 | // this array contains the indices of the selected items (for the single | |
255 | // selection listboxes only the first element of it is used and contains | |
256 | // the current selection) | |
257 | wxArrayInt m_selections; | |
258 | ||
259 | // and this one the client data (either void or wxClientData) | |
260 | wxArrayPtrVoid m_itemsClientData; | |
261 | ||
262 | // the current item | |
263 | int m_current; | |
264 | ||
265 | private: | |
266 | // the range of elements which must be updated: if m_updateCount is 0 no | |
267 | // update is needed, if it is -1 everything must be updated, otherwise | |
268 | // m_updateCount items starting from m_updateFrom have to be redrawn | |
269 | int m_updateFrom, | |
270 | m_updateCount; | |
271 | ||
272 | // the height of one line in the listbox (all lines have the same height) | |
273 | wxCoord m_lineHeight; | |
274 | ||
275 | // the maximal width of a listbox item and the item which has it | |
276 | wxCoord m_maxWidth; | |
277 | int m_maxWidthItem; | |
278 | ||
279 | // the extents of horz and vert scrollbars | |
280 | int m_scrollRangeX, | |
281 | m_scrollRangeY; | |
282 | ||
283 | // the number of items per page | |
284 | size_t m_itemsPerPage; | |
285 | ||
286 | // if the number of items has changed we may need to show/hide the | |
287 | // scrollbar | |
288 | bool m_updateScrollbarX, m_updateScrollbarY, | |
289 | m_showScrollbarX, m_showScrollbarY; | |
290 | ||
291 | // if the current item has changed, we might need to scroll if it went out | |
292 | // of the window | |
293 | bool m_currentChanged; | |
294 | ||
295 | // the anchor from which the selection is extended for the listboxes with | |
296 | // wxLB_EXTENDED style - this is set to the last item which was selected | |
297 | // by not extending the selection but by choosing it directly | |
298 | int m_selAnchor; | |
299 | ||
300 | DECLARE_EVENT_TABLE() | |
301 | DECLARE_DYNAMIC_CLASS(wxListBox) | |
302 | }; | |
303 | ||
1e6feb95 | 304 | #endif // _WX_UNIV_LISTBOX_H_ |