]> git.saurik.com Git - wxWidgets.git/blame - include/wx/vlbox.h
wxCocoa: CodeWarrior (like GCC) mangles struct X and @class X identically.
[wxWidgets.git] / include / wx / vlbox.h
CommitLineData
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
17class 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 */
34class WXDLLEXPORT wxVListBox : public wxVScrolledWindow
35{
36public:
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
9a9b4940
VZ
123 // get the background colour of selected cells
124 const wxColour& GetSelectionBackground() const { return m_colBgSel; }
125
e0c6027b
VZ
126
127 // operations
128 // ----------
129
130 // set the number of items to be shown in the control
131 //
132 // this is just a synonym for wxVScrolledWindow::SetLineCount()
03495767 133 virtual void SetItemCount(size_t count);
e0c6027b
VZ
134
135 // delete all items from the control
136 void Clear() { SetItemCount(0); }
137
970b97a2
VZ
138 // set the selection to the specified item, if it is wxNOT_FOUND the
139 // selection is unset
be465555
VZ
140 //
141 // this function is only valid for the single selection listboxes
142 void SetSelection(int selection);
143
144 // selects or deselects the specified item which must be valid (i.e. not
970b97a2 145 // equal to wxNOT_FOUND)
be465555
VZ
146 //
147 // return true if the items selection status has changed or false
148 // otherwise
149 //
150 // this function is only valid for the multiple selection listboxes
151 bool Select(size_t item, bool select = true);
152
153 // selects the items in the specified range whose end points may be given
154 // in any order
155 //
156 // return true if any items selection status has changed, false otherwise
157 //
158 // this function is only valid for the single selection listboxes
159 bool SelectRange(size_t from, size_t to);
160
161 // toggle the selection of the specified item (must be valid)
162 //
163 // this function is only valid for the multiple selection listboxes
164 void Toggle(size_t item) { Select(item, !IsSelected(item)); }
165
166 // select all items in the listbox
167 //
168 // the return code indicates if any items were affected by this operation
169 // (true) or if nothing has changed (false)
170 bool SelectAll() { return DoSelectAll(true); }
171
172 // unselect all items in the listbox
173 //
174 // the return code has the same meaning as for SelectAll()
175 bool DeselectAll() { return DoSelectAll(false); }
e0c6027b
VZ
176
177 // set the margins: horizontal margin is the distance between the window
178 // border and the item contents while vertical margin is half of the
179 // distance between items
180 //
181 // by default both margins are 0
182 void SetMargins(const wxPoint& pt);
183 void SetMargins(wxCoord x, wxCoord y) { SetMargins(wxPoint(x, y)); }
184
9a9b4940
VZ
185 // change the background colour of the selected cells
186 void SetSelectionBackground(const wxColour& col);
187
e0c6027b 188
e0c6027b
VZ
189protected:
190 // the derived class must implement this function to actually draw the item
191 // with the given index on the provided DC
192 virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const = 0;
193
194 // the derived class must implement this method to return the height of the
195 // specified item
196 virtual wxCoord OnMeasureItem(size_t n) const = 0;
197
198 // this method may be used to draw separators between the lines; note that
199 // the rectangle may be modified, typically to deflate it a bit before
200 // passing to OnDrawItem()
201 //
202 // the base class version doesn't do anything
203 virtual void OnDrawSeparator(wxDC& dc, wxRect& rect, size_t n) const;
204
27d0dcd0
VZ
205 // this method is used to draw the items background and, maybe, a border
206 // around it
207 //
208 // the base class version implements a reasonable default behaviour which
209 // consists in drawing the selected item with the standard background
210 // colour and drawing a border around the item if it is either selected or
211 // current
212 virtual void OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const;
e0c6027b
VZ
213
214 // we implement OnGetLineHeight() in terms of OnMeasureItem() because this
215 // allows us to add borders to the items easily
216 //
0c8392ca 217 // this function is not supposed to be overridden by the derived classes
e0c6027b
VZ
218 virtual wxCoord OnGetLineHeight(size_t line) const;
219
220
221 // event handlers
222 void OnPaint(wxPaintEvent& event);
223 void OnKeyDown(wxKeyEvent& event);
224 void OnLeftDown(wxMouseEvent& event);
225 void OnLeftDClick(wxMouseEvent& event);
226
227
228 // common part of all ctors
229 void Init();
230
be465555
VZ
231 // send the wxEVT_COMMAND_LISTBOX_SELECTED event
232 void SendSelectedEvent();
233
234 // common implementation of SelectAll() and DeselectAll()
235 bool DoSelectAll(bool select);
236
237 // change the current item (in single selection listbox it also implicitly
970b97a2
VZ
238 // changes the selection); current may be wxNOT_FOUND in which case there
239 // will be no current item any more
be465555
VZ
240 //
241 // return true if the current item changed, false otherwise
242 bool DoSetCurrent(int current);
243
970b97a2
VZ
244 // flags for DoHandleItemClick
245 enum
246 {
247 ItemClick_Shift = 1, // item shift-clicked
248 ItemClick_Ctrl = 2, // ctrl
249 ItemClick_Kbd = 4 // item selected from keyboard
250 };
251
be465555 252 // common part of keyboard and mouse handling processing code
970b97a2 253 void DoHandleItemClick(int item, int flags);
e0c6027b
VZ
254
255private:
970b97a2 256 // the current item or wxNOT_FOUND
be465555
VZ
257 //
258 // if m_selStore == NULL this is also the selected item, otherwise the
259 // selections are managed by m_selStore
260 int m_current;
261
970b97a2
VZ
262 // the anchor of the selection for the multiselection listboxes:
263 // shift-clicking an item extends the selection from m_anchor to the item
264 // clicked, for example
265 //
266 // always wxNOT_FOUND for single selection listboxes
267 int m_anchor;
268
be465555
VZ
269 // the object managing our selected items if not NULL
270 wxSelectionStore *m_selStore;
e0c6027b
VZ
271
272 // margins
273 wxPoint m_ptMargins;
274
9a9b4940
VZ
275 // the selection bg colour
276 wxColour m_colBgSel;
277
278
e0c6027b 279 DECLARE_EVENT_TABLE()
27d0dcd0 280 DECLARE_NO_COPY_CLASS(wxVListBox)
0c8392ca 281 DECLARE_ABSTRACT_CLASS(wxVListBox)
e0c6027b
VZ
282};
283
284#endif // _WX_VLBOX_H_
285