1 ///////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxVListBox is a virtual listbox with lines of variable height
4 // Author: Vadim Zeitlin
7 // Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
8 // Licence: wxWindows licence
9 ///////////////////////////////////////////////////////////////////////////////
14 #include "wx/vscroll.h" // base class
15 #include "wx/bitmap.h"
17 class WXDLLIMPEXP_FWD_CORE wxSelectionStore
;
18 extern WXDLLIMPEXP_DATA_CORE(const char) wxVListBoxNameStr
[];
20 // ----------------------------------------------------------------------------
22 // ----------------------------------------------------------------------------
25 This class has two main differences from a regular listbox: it can have an
26 arbitrarily huge number of items because it doesn't store them itself but
27 uses OnDrawItem() callback to draw them and its items can have variable
28 height as determined by OnMeasureItem().
30 It emits the same events as wxListBox and the same event macros may be used
33 class WXDLLIMPEXP_CORE wxVListBox
: public wxVScrolledWindow
36 // constructors and such
37 // ---------------------
39 // default constructor, you must call Create() later
40 wxVListBox() { Init(); }
42 // normal constructor which calls Create() internally
43 wxVListBox(wxWindow
*parent
,
44 wxWindowID id
= wxID_ANY
,
45 const wxPoint
& pos
= wxDefaultPosition
,
46 const wxSize
& size
= wxDefaultSize
,
48 const wxString
& name
= wxVListBoxNameStr
)
52 (void)Create(parent
, id
, pos
, size
, style
, name
);
55 // really creates the control and sets the initial number of items in it
56 // (which may be changed later with SetItemCount())
58 // the only special style which may be specified here is wxLB_MULTIPLE
60 // returns true on success or false if the control couldn't be created
61 bool Create(wxWindow
*parent
,
62 wxWindowID id
= wxID_ANY
,
63 const wxPoint
& pos
= wxDefaultPosition
,
64 const wxSize
& size
= wxDefaultSize
,
66 const wxString
& name
= wxVListBoxNameStr
);
68 // dtor does some internal cleanup (deletes m_selStore if any)
69 virtual ~wxVListBox();
75 // get the number of items in the control
76 size_t GetItemCount() const { return GetRowCount(); }
78 // does this control use multiple selection?
79 bool HasMultipleSelection() const { return m_selStore
!= NULL
; }
81 // get the currently selected item or wxNOT_FOUND if there is no selection
83 // this method is only valid for the single selection listboxes
84 int GetSelection() const
86 wxASSERT_MSG( !HasMultipleSelection(),
87 wxT("GetSelection() can't be used with wxLB_MULTIPLE") );
92 // is this item the current one?
93 bool IsCurrent(size_t item
) const { return item
== (size_t)m_current
; }
94 #ifdef __WXUNIVERSAL__
95 bool IsCurrent() const { return wxVScrolledWindow::IsCurrent(); }
98 // is this item selected?
99 bool IsSelected(size_t item
) const;
101 // get the number of the selected items (maybe 0)
103 // this method is valid for both single and multi selection listboxes
104 size_t GetSelectedCount() const;
106 // get the first selected item, returns wxNOT_FOUND if none
108 // cookie is an opaque parameter which should be passed to
109 // GetNextSelected() later
111 // this method is only valid for the multi selection listboxes
112 int GetFirstSelected(unsigned long& cookie
) const;
114 // get next selection item, return wxNOT_FOUND if no more
116 // cookie must be the same parameter that was passed to GetFirstSelected()
119 // this method is only valid for the multi selection listboxes
120 int GetNextSelected(unsigned long& cookie
) const;
122 // get the margins around each item
123 wxPoint
GetMargins() const { return m_ptMargins
; }
125 // get the background colour of selected cells
126 const wxColour
& GetSelectionBackground() const { return m_colBgSel
; }
128 // get the item rect, returns empty rect if the item is not visible
129 wxRect
GetItemRect(size_t n
) const;
134 // set the number of items to be shown in the control
136 // this is just a synonym for wxVScrolledWindow::SetRowCount()
137 virtual void SetItemCount(size_t count
);
139 // delete all items from the control
140 void Clear() { SetItemCount(0); }
142 // set the selection to the specified item, if it is wxNOT_FOUND the
143 // selection is unset
145 // this function is only valid for the single selection listboxes
146 void SetSelection(int selection
);
148 // selects or deselects the specified item which must be valid (i.e. not
149 // equal to wxNOT_FOUND)
151 // return true if the items selection status has changed or false
154 // this function is only valid for the multiple selection listboxes
155 bool Select(size_t item
, bool select
= true);
157 // selects the items in the specified range whose end points may be given
160 // return true if any items selection status has changed, false otherwise
162 // this function is only valid for the single selection listboxes
163 bool SelectRange(size_t from
, size_t to
);
165 // toggle the selection of the specified item (must be valid)
167 // this function is only valid for the multiple selection listboxes
168 void Toggle(size_t item
) { Select(item
, !IsSelected(item
)); }
170 // select all items in the listbox
172 // the return code indicates if any items were affected by this operation
173 // (true) or if nothing has changed (false)
174 bool SelectAll() { return DoSelectAll(true); }
176 // unselect all items in the listbox
178 // the return code has the same meaning as for SelectAll()
179 bool DeselectAll() { return DoSelectAll(false); }
181 // set the margins: horizontal margin is the distance between the window
182 // border and the item contents while vertical margin is half of the
183 // distance between items
185 // by default both margins are 0
186 void SetMargins(const wxPoint
& pt
);
187 void SetMargins(wxCoord x
, wxCoord y
) { SetMargins(wxPoint(x
, y
)); }
189 // change the background colour of the selected cells
190 void SetSelectionBackground(const wxColour
& col
);
192 // refreshes only the selected items
193 void RefreshSelected();
196 virtual wxVisualAttributes
GetDefaultAttributes() const
198 return GetClassDefaultAttributes(GetWindowVariant());
201 static wxVisualAttributes
202 GetClassDefaultAttributes(wxWindowVariant variant
= wxWINDOW_VARIANT_NORMAL
);
205 virtual wxBorder
GetDefaultBorder() const { return wxBORDER_THEME
; }
207 // the derived class must implement this function to actually draw the item
208 // with the given index on the provided DC
209 virtual void OnDrawItem(wxDC
& dc
, const wxRect
& rect
, size_t n
) const = 0;
211 // the derived class must implement this method to return the height of the
213 virtual wxCoord
OnMeasureItem(size_t n
) const = 0;
215 // this method may be used to draw separators between the lines; note that
216 // the rectangle may be modified, typically to deflate it a bit before
217 // passing to OnDrawItem()
219 // the base class version doesn't do anything
220 virtual void OnDrawSeparator(wxDC
& dc
, wxRect
& rect
, size_t n
) const;
222 // this method is used to draw the items background and, maybe, a border
225 // the base class version implements a reasonable default behaviour which
226 // consists in drawing the selected item with the standard background
227 // colour and drawing a border around the item if it is either selected or
229 virtual void OnDrawBackground(wxDC
& dc
, const wxRect
& rect
, size_t n
) const;
231 // we implement OnGetRowHeight() in terms of OnMeasureItem() because this
232 // allows us to add borders to the items easily
234 // this function is not supposed to be overridden by the derived classes
235 virtual wxCoord
OnGetRowHeight(size_t line
) const;
239 void OnPaint(wxPaintEvent
& event
);
240 void OnKeyDown(wxKeyEvent
& event
);
241 void OnLeftDown(wxMouseEvent
& event
);
242 void OnLeftDClick(wxMouseEvent
& event
);
243 void OnSetOrKillFocus(wxFocusEvent
& event
);
244 void OnSize(wxSizeEvent
& event
);
246 // common part of all ctors
249 // send the wxEVT_LISTBOX event
250 void SendSelectedEvent();
251 virtual void InitEvent(wxCommandEvent
& event
, int n
);
253 // common implementation of SelectAll() and DeselectAll()
254 bool DoSelectAll(bool select
);
256 // change the current item (in single selection listbox it also implicitly
257 // changes the selection); current may be wxNOT_FOUND in which case there
258 // will be no current item any more
260 // return true if the current item changed, false otherwise
261 bool DoSetCurrent(int current
);
263 // flags for DoHandleItemClick
266 ItemClick_Shift
= 1, // item shift-clicked
267 ItemClick_Ctrl
= 2, // ctrl
268 ItemClick_Kbd
= 4 // item selected from keyboard
271 // common part of keyboard and mouse handling processing code
272 void DoHandleItemClick(int item
, int flags
);
274 // paint the background of the given item using the provided colour if it's
275 // valid, otherwise just return false and do nothing (this is used by
276 // OnDrawBackground())
277 bool DoDrawSolidBackground(const wxColour
& col
,
283 // the current item or wxNOT_FOUND
285 // if m_selStore == NULL this is also the selected item, otherwise the
286 // selections are managed by m_selStore
289 // the anchor of the selection for the multiselection listboxes:
290 // shift-clicking an item extends the selection from m_anchor to the item
291 // clicked, for example
293 // always wxNOT_FOUND for single selection listboxes
296 // the object managing our selected items if not NULL
297 wxSelectionStore
*m_selStore
;
302 // the selection bg colour
305 DECLARE_EVENT_TABLE()
306 wxDECLARE_NO_COPY_CLASS(wxVListBox
);
307 DECLARE_ABSTRACT_CLASS(wxVListBox
)
310 #endif // _WX_VLBOX_H_