]>
Commit | Line | Data |
---|---|---|
e0c6027b VZ |
1 | /////////////////////////////////////////////////////////////////////////////// |
2 | // Name: wx/vlbox.h | |
3 | // Purpose: wxVListBox is a virtual listbox with lines of variable height | |
4 | // Author: Vadim Zeitlin | |
5 | // Modified by: | |
6 | // Created: 31.05.03 | |
7 | // RCS-ID: $Id$ | |
8 | // Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwindows.org> | |
9 | // Licence: wxWindows licence | |
10 | /////////////////////////////////////////////////////////////////////////////// | |
11 | ||
12 | #ifndef _WX_VLBOX_H_ | |
13 | #define _WX_VLBOX_H_ | |
14 | ||
15 | #include "wx/vscroll.h" // base class | |
16 | ||
be465555 VZ |
17 | class WXDLLEXPORT wxSelectionStore; |
18 | ||
e0c6027b VZ |
19 | #define wxVListBoxNameStr _T("wxVListBox") |
20 | ||
21 | // ---------------------------------------------------------------------------- | |
22 | // wxVListBox | |
23 | // ---------------------------------------------------------------------------- | |
24 | ||
25 | /* | |
26 | This class has two main differences from a regular listbox: it can have an | |
27 | arbitrarily huge number of items because it doesn't store them itself but | |
28 | uses OnDrawItem() callback to draw them and its items can have variable | |
29 | height as determined by OnMeasureItem(). | |
30 | ||
31 | It emits the same events as wxListBox and the same event macros may be used | |
32 | with it. | |
33 | */ | |
34 | class WXDLLEXPORT wxVListBox : public wxVScrolledWindow | |
35 | { | |
36 | public: | |
37 | // constructors and such | |
38 | // --------------------- | |
39 | ||
40 | // default constructor, you must call Create() later | |
41 | wxVListBox() { Init(); } | |
42 | ||
43 | // normal constructor which calls Create() internally | |
44 | wxVListBox(wxWindow *parent, | |
45 | wxWindowID id = wxID_ANY, | |
46 | const wxPoint& pos = wxDefaultPosition, | |
47 | const wxSize& size = wxDefaultSize, | |
e0c6027b VZ |
48 | long style = 0, |
49 | const wxString& name = wxVListBoxNameStr) | |
50 | { | |
51 | Init(); | |
52 | ||
be465555 | 53 | (void)Create(parent, id, pos, size, style, name); |
e0c6027b VZ |
54 | } |
55 | ||
56 | // really creates the control and sets the initial number of items in it | |
57 | // (which may be changed later with SetItemCount()) | |
58 | // | |
be465555 | 59 | // the only special style which may be specified here is wxLB_MULTIPLE |
e0c6027b VZ |
60 | // |
61 | // returns true on success or false if the control couldn't be created | |
62 | bool Create(wxWindow *parent, | |
63 | wxWindowID id = wxID_ANY, | |
64 | const wxPoint& pos = wxDefaultPosition, | |
65 | const wxSize& size = wxDefaultSize, | |
e0c6027b VZ |
66 | long style = 0, |
67 | const wxString& name = wxVListBoxNameStr); | |
68 | ||
be465555 VZ |
69 | // dtor does some internal cleanup (deletes m_selStore if any) |
70 | virtual ~wxVListBox(); | |
71 | ||
72 | ||
73 | // accessors | |
74 | // --------- | |
75 | ||
76 | // get the number of items in the control | |
77 | size_t GetItemCount() const { return GetLineCount(); } | |
78 | ||
79 | // does this control use multiple selection? | |
80 | bool HasMultipleSelection() const { return m_selStore != NULL; } | |
81 | ||
82 | // get the currently selected item or wxNOT_FOUND if there is no selection | |
83 | // | |
84 | // this method is only valid for the single selection listboxes | |
85 | int GetSelection() const | |
86 | { | |
87 | wxASSERT_MSG( !HasMultipleSelection(), | |
88 | _T("GetSelection() can't be used with wxLB_MULTIPLE") ); | |
89 | ||
90 | return m_current; | |
91 | } | |
92 | ||
93 | // is this item the current one? | |
94 | bool IsCurrent(size_t item) const { return item == (size_t)m_current; } | |
95 | ||
96 | // is this item selected? | |
97 | bool IsSelected(size_t item) const; | |
98 | ||
99 | // get the number of the selected items (maybe 0) | |
100 | // | |
101 | // this method is valid for both single and multi selection listboxes | |
102 | size_t GetSelectedCount() const; | |
103 | ||
104 | // get the first selected item, returns wxNOT_FOUND if none | |
105 | // | |
106 | // cookie is an opaque parameter which should be passed to | |
107 | // GetNextSelected() later | |
108 | // | |
109 | // this method is only valid for the multi selection listboxes | |
110 | int GetFirstSelected(unsigned long& cookie) const; | |
111 | ||
112 | // get next selection item, return wxNOT_FOUND if no more | |
113 | // | |
114 | // cookie must be the same parameter that was passed to GetFirstSelected() | |
115 | // before | |
116 | // | |
117 | // this method is only valid for the multi selection listboxes | |
118 | int GetNextSelected(unsigned long& cookie) const; | |
119 | ||
120 | // get the margins around each item | |
121 | wxPoint GetMargins() const { return m_ptMargins; } | |
122 | ||
e0c6027b VZ |
123 | |
124 | // operations | |
125 | // ---------- | |
126 | ||
127 | // set the number of items to be shown in the control | |
128 | // | |
129 | // this is just a synonym for wxVScrolledWindow::SetLineCount() | |
be465555 | 130 | void SetItemCount(size_t count); |
e0c6027b VZ |
131 | |
132 | // delete all items from the control | |
133 | void Clear() { SetItemCount(0); } | |
134 | ||
135 | // set the selection to the specified item, if it is -1 the selection is | |
136 | // unset | |
be465555 VZ |
137 | // |
138 | // this function is only valid for the single selection listboxes | |
139 | void SetSelection(int selection); | |
140 | ||
141 | // selects or deselects the specified item which must be valid (i.e. not | |
142 | // equal to -1) | |
143 | // | |
144 | // return true if the items selection status has changed or false | |
145 | // otherwise | |
146 | // | |
147 | // this function is only valid for the multiple selection listboxes | |
148 | bool Select(size_t item, bool select = true); | |
149 | ||
150 | // selects the items in the specified range whose end points may be given | |
151 | // in any order | |
152 | // | |
153 | // return true if any items selection status has changed, false otherwise | |
154 | // | |
155 | // this function is only valid for the single selection listboxes | |
156 | bool SelectRange(size_t from, size_t to); | |
157 | ||
158 | // toggle the selection of the specified item (must be valid) | |
159 | // | |
160 | // this function is only valid for the multiple selection listboxes | |
161 | void Toggle(size_t item) { Select(item, !IsSelected(item)); } | |
162 | ||
163 | // select all items in the listbox | |
164 | // | |
165 | // the return code indicates if any items were affected by this operation | |
166 | // (true) or if nothing has changed (false) | |
167 | bool SelectAll() { return DoSelectAll(true); } | |
168 | ||
169 | // unselect all items in the listbox | |
170 | // | |
171 | // the return code has the same meaning as for SelectAll() | |
172 | bool DeselectAll() { return DoSelectAll(false); } | |
e0c6027b VZ |
173 | |
174 | // set the margins: horizontal margin is the distance between the window | |
175 | // border and the item contents while vertical margin is half of the | |
176 | // distance between items | |
177 | // | |
178 | // by default both margins are 0 | |
179 | void SetMargins(const wxPoint& pt); | |
180 | void SetMargins(wxCoord x, wxCoord y) { SetMargins(wxPoint(x, y)); } | |
181 | ||
182 | ||
e0c6027b VZ |
183 | protected: |
184 | // the derived class must implement this function to actually draw the item | |
185 | // with the given index on the provided DC | |
186 | virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const = 0; | |
187 | ||
188 | // the derived class must implement this method to return the height of the | |
189 | // specified item | |
190 | virtual wxCoord OnMeasureItem(size_t n) const = 0; | |
191 | ||
192 | // this method may be used to draw separators between the lines; note that | |
193 | // the rectangle may be modified, typically to deflate it a bit before | |
194 | // passing to OnDrawItem() | |
195 | // | |
196 | // the base class version doesn't do anything | |
197 | virtual void OnDrawSeparator(wxDC& dc, wxRect& rect, size_t n) const; | |
198 | ||
199 | ||
200 | // we implement OnGetLineHeight() in terms of OnMeasureItem() because this | |
201 | // allows us to add borders to the items easily | |
202 | // | |
203 | // this function is not upposed to be overridden by the derived classes | |
204 | virtual wxCoord OnGetLineHeight(size_t line) const; | |
205 | ||
206 | ||
207 | // event handlers | |
208 | void OnPaint(wxPaintEvent& event); | |
209 | void OnKeyDown(wxKeyEvent& event); | |
210 | void OnLeftDown(wxMouseEvent& event); | |
211 | void OnLeftDClick(wxMouseEvent& event); | |
212 | ||
213 | ||
214 | // common part of all ctors | |
215 | void Init(); | |
216 | ||
be465555 VZ |
217 | // send the wxEVT_COMMAND_LISTBOX_SELECTED event |
218 | void SendSelectedEvent(); | |
219 | ||
220 | // common implementation of SelectAll() and DeselectAll() | |
221 | bool DoSelectAll(bool select); | |
222 | ||
223 | // change the current item (in single selection listbox it also implicitly | |
224 | // changes the selection); current may be -1 in which case there will be | |
225 | // no current item any more | |
226 | // | |
227 | // return true if the current item changed, false otherwise | |
228 | bool DoSetCurrent(int current); | |
229 | ||
230 | // common part of keyboard and mouse handling processing code | |
231 | void DoHandleItemClick(int item, bool shiftDown, bool ctrlDown); | |
e0c6027b VZ |
232 | |
233 | private: | |
be465555 VZ |
234 | // the current item or -1 |
235 | // | |
236 | // if m_selStore == NULL this is also the selected item, otherwise the | |
237 | // selections are managed by m_selStore | |
238 | int m_current; | |
239 | ||
240 | // the object managing our selected items if not NULL | |
241 | wxSelectionStore *m_selStore; | |
e0c6027b VZ |
242 | |
243 | // margins | |
244 | wxPoint m_ptMargins; | |
245 | ||
e0c6027b VZ |
246 | DECLARE_EVENT_TABLE() |
247 | }; | |
248 | ||
249 | #endif // _WX_VLBOX_H_ | |
250 |