// Modified by:
// Created: 31.05.03
// RCS-ID: $Id$
-// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwindows.org>
+// Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
#define _WX_VLBOX_H_
#include "wx/vscroll.h" // base class
+#include "wx/bitmap.h"
-class WXDLLEXPORT wxSelectionStore;
+class WXDLLIMPEXP_FWD_CORE wxSelectionStore;
#define wxVListBoxNameStr _T("wxVListBox")
It emits the same events as wxListBox and the same event macros may be used
with it.
*/
-class WXDLLEXPORT wxVListBox : public wxVScrolledWindow
+class WXDLLIMPEXP_CORE wxVListBox : public wxVScrolledWindow
{
public:
// constructors and such
// ---------
// get the number of items in the control
- size_t GetItemCount() const { return GetLineCount(); }
+ size_t GetItemCount() const { return GetRowCount(); }
// does this control use multiple selection?
bool HasMultipleSelection() const { return m_selStore != NULL; }
// is this item the current one?
bool IsCurrent(size_t item) const { return item == (size_t)m_current; }
+ #ifdef __WXUNIVERSAL__
+ bool IsCurrent() const { return wxVScrolledWindow::IsCurrent(); }
+ #endif
// is this item selected?
bool IsSelected(size_t item) const;
// get the margins around each item
wxPoint GetMargins() const { return m_ptMargins; }
+ // get the background colour of selected cells
+ const wxColour& GetSelectionBackground() const { return m_colBgSel; }
+
+ // get the item rect, returns empty rect if the item is not visible
+ wxRect GetItemRect(size_t n) const;
// operations
// ----------
// set the number of items to be shown in the control
//
- // this is just a synonym for wxVScrolledWindow::SetLineCount()
- void SetItemCount(size_t count);
+ // this is just a synonym for wxVScrolledWindow::SetRowCount()
+ virtual void SetItemCount(size_t count);
// delete all items from the control
void Clear() { SetItemCount(0); }
- // set the selection to the specified item, if it is -1 the selection is
- // unset
+ // set the selection to the specified item, if it is wxNOT_FOUND the
+ // selection is unset
//
// this function is only valid for the single selection listboxes
void SetSelection(int selection);
// selects or deselects the specified item which must be valid (i.e. not
- // equal to -1)
+ // equal to wxNOT_FOUND)
//
// return true if the items selection status has changed or false
// otherwise
void SetMargins(const wxPoint& pt);
void SetMargins(wxCoord x, wxCoord y) { SetMargins(wxPoint(x, y)); }
+ // change the background colour of the selected cells
+ void SetSelectionBackground(const wxColour& col);
+
+ // refreshes only the selected items
+ void RefreshSelected();
+
+
+ virtual wxVisualAttributes GetDefaultAttributes() const
+ {
+ return GetClassDefaultAttributes(GetWindowVariant());
+ }
+
+ static wxVisualAttributes
+ GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
protected:
+ virtual wxBorder GetDefaultBorder() const { return wxBORDER_THEME; }
+
// the derived class must implement this function to actually draw the item
// with the given index on the provided DC
virtual void OnDrawItem(wxDC& dc, const wxRect& rect, size_t n) const = 0;
// the base class version doesn't do anything
virtual void OnDrawSeparator(wxDC& dc, wxRect& rect, size_t n) const;
+ // this method is used to draw the items background and, maybe, a border
+ // around it
+ //
+ // the base class version implements a reasonable default behaviour which
+ // consists in drawing the selected item with the standard background
+ // colour and drawing a border around the item if it is either selected or
+ // current
+ virtual void OnDrawBackground(wxDC& dc, const wxRect& rect, size_t n) const;
- // we implement OnGetLineHeight() in terms of OnMeasureItem() because this
+ // we implement OnGetRowHeight() in terms of OnMeasureItem() because this
// allows us to add borders to the items easily
//
- // this function is not upposed to be overridden by the derived classes
- virtual wxCoord OnGetLineHeight(size_t line) const;
+ // this function is not supposed to be overridden by the derived classes
+ virtual wxCoord OnGetRowHeight(size_t line) const;
// event handlers
void OnKeyDown(wxKeyEvent& event);
void OnLeftDown(wxMouseEvent& event);
void OnLeftDClick(wxMouseEvent& event);
-
+ void OnSetOrKillFocus(wxFocusEvent& event);
// common part of all ctors
void Init();
bool DoSelectAll(bool select);
// change the current item (in single selection listbox it also implicitly
- // changes the selection); current may be -1 in which case there will be
- // no current item any more
+ // changes the selection); current may be wxNOT_FOUND in which case there
+ // will be no current item any more
//
// return true if the current item changed, false otherwise
bool DoSetCurrent(int current);
+ // flags for DoHandleItemClick
+ enum
+ {
+ ItemClick_Shift = 1, // item shift-clicked
+ ItemClick_Ctrl = 2, // ctrl
+ ItemClick_Kbd = 4 // item selected from keyboard
+ };
+
// common part of keyboard and mouse handling processing code
- void DoHandleItemClick(int item, bool shiftDown, bool ctrlDown);
+ void DoHandleItemClick(int item, int flags);
+
+ // paint the background of the given item using the provided colour if it's
+ // valid, otherwise just return false and do nothing (this is used by
+ // OnDrawBackground())
+ bool DoDrawSolidBackground(const wxColour& col,
+ wxDC& dc,
+ const wxRect& rect,
+ size_t n) const;
private:
- // the current item or -1
+ // the current item or wxNOT_FOUND
//
// if m_selStore == NULL this is also the selected item, otherwise the
// selections are managed by m_selStore
int m_current;
+ // the anchor of the selection for the multiselection listboxes:
+ // shift-clicking an item extends the selection from m_anchor to the item
+ // clicked, for example
+ //
+ // always wxNOT_FOUND for single selection listboxes
+ int m_anchor;
+
// the object managing our selected items if not NULL
wxSelectionStore *m_selStore;
// margins
wxPoint m_ptMargins;
+ // the selection bg colour
+ wxColour m_colBgSel;
+
DECLARE_EVENT_TABLE()
+ DECLARE_NO_COPY_CLASS(wxVListBox)
+ DECLARE_ABSTRACT_CLASS(wxVListBox)
};
#endif // _WX_VLBOX_H_