]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/vlbox.h
Don't duplicate event sending code in wxGTK wxListBox.
[wxWidgets.git] / include / wx / vlbox.h
index b1588627ba9c3424ba7072228da12b1af8d03877..96ab2bde6f3da88a98a3f7c5abe863fea0cb374d 100644 (file)
@@ -5,7 +5,7 @@
 // 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"
 
-#define wxVListBoxNameStr _T("wxVListBox")
+class WXDLLIMPEXP_FWD_CORE wxSelectionStore;
+extern WXDLLIMPEXP_DATA_CORE(const char) wxVListBoxNameStr[];
 
 // ----------------------------------------------------------------------------
 // wxVListBox
@@ -29,7 +31,7 @@
     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
@@ -43,44 +45,139 @@ public:
                wxWindowID id = wxID_ANY,
                const wxPoint& pos = wxDefaultPosition,
                const wxSize& size = wxDefaultSize,
-               size_t countItems = 0,
                long style = 0,
                const wxString& name = wxVListBoxNameStr)
     {
         Init();
 
-        (void)Create(parent, id, pos, size, countItems, style, name);
+        (void)Create(parent, id, pos, size, style, name);
     }
 
     // really creates the control and sets the initial number of items in it
     // (which may be changed later with SetItemCount())
     //
-    // there are no special styles defined for wxVListBox
+    // the only special style which may be specified here is wxLB_MULTIPLE
     //
     // returns true on success or false if the control couldn't be created
     bool Create(wxWindow *parent,
                 wxWindowID id = wxID_ANY,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
-                size_t countItems = 0,
                 long style = 0,
                 const wxString& name = wxVListBoxNameStr);
 
+    // dtor does some internal cleanup (deletes m_selStore if any)
+    virtual ~wxVListBox();
+
+
+    // accessors
+    // ---------
+
+    // get the number of items in the control
+    size_t GetItemCount() const { return GetRowCount(); }
+
+    // does this control use multiple selection?
+    bool HasMultipleSelection() const { return m_selStore != NULL; }
+
+    // get the currently selected item or wxNOT_FOUND if there is no selection
+    //
+    // this method is only valid for the single selection listboxes
+    int GetSelection() const
+    {
+        wxASSERT_MSG( !HasMultipleSelection(),
+                        wxT("GetSelection() can't be used with wxLB_MULTIPLE") );
+
+        return m_current;
+    }
+
+    // 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 number of the selected items (maybe 0)
+    //
+    // this method is valid for both single and multi selection listboxes
+    size_t GetSelectedCount() const;
+
+    // get the first selected item, returns wxNOT_FOUND if none
+    //
+    // cookie is an opaque parameter which should be passed to
+    // GetNextSelected() later
+    //
+    // this method is only valid for the multi selection listboxes
+    int GetFirstSelected(unsigned long& cookie) const;
+
+    // get next selection item, return wxNOT_FOUND if no more
+    //
+    // cookie must be the same parameter that was passed to GetFirstSelected()
+    // before
+    //
+    // this method is only valid for the multi selection listboxes
+    int GetNextSelected(unsigned long& cookie) 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) { SetLineCount(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
-    void SetSelection(int selection) { DoSetSelection(selection, false); }
+    // 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 wxNOT_FOUND)
+    //
+    // return true if the items selection status has changed or false
+    // otherwise
+    //
+    // this function is only valid for the multiple selection listboxes
+    bool Select(size_t item, bool select = true);
+
+    // selects the items in the specified range whose end points may be given
+    // in any order
+    //
+    // return true if any items selection status has changed, false otherwise
+    //
+    // this function is only valid for the single selection listboxes
+    bool SelectRange(size_t from, size_t to);
+
+    // toggle the selection of the specified item (must be valid)
+    //
+    // this function is only valid for the multiple selection listboxes
+    void Toggle(size_t item) { Select(item, !IsSelected(item)); }
+
+    // select all items in the listbox
+    //
+    // the return code indicates if any items were affected by this operation
+    // (true) or if nothing has changed (false)
+    bool SelectAll() { return DoSelectAll(true); }
+
+    // unselect all items in the listbox
+    //
+    // the return code has the same meaning as for SelectAll()
+    bool DeselectAll() { return DoSelectAll(false); }
 
     // set the margins: horizontal margin is the distance between the window
     // border and the item contents while vertical margin is half of the
@@ -90,24 +187,24 @@ public:
     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);
 
-    // accessors
-    // ---------
-
-    // get the number of items in the control
-    size_t GetItemCount() const { return GetLineCount(); }
-
-    // get the currently selected item or -1 if there is no selection
-    int GetSelection() const { return m_selection; }
+    // refreshes only the selected items
+    void RefreshSelected();
 
-    // is this item selected?
-    bool IsSelected(size_t line) const { return (int)line == m_selection; }
 
-    // get the margins around each item
-    wxPoint GetMargins() const { return m_ptMargins; }
+    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;
@@ -123,12 +220,20 @@ protected:
     // 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
@@ -136,24 +241,71 @@ protected:
     void OnKeyDown(wxKeyEvent& event);
     void OnLeftDown(wxMouseEvent& event);
     void OnLeftDClick(wxMouseEvent& event);
-
+    void OnSetOrKillFocus(wxFocusEvent& event);
+    void OnSize(wxSizeEvent& event);
 
     // common part of all ctors
     void Init();
 
-    // SetSelection() with additional parameter telling it whether to send a
-    // notification event or not
-    void DoSetSelection(int selection, bool sendEvent = true);
+    // send the wxEVT_COMMAND_LISTBOX_SELECTED event
+    void SendSelectedEvent();
+    virtual void InitEvent(wxCommandEvent& event, int n);
+
+    // common implementation of SelectAll() and DeselectAll()
+    bool DoSelectAll(bool select);
+
+    // change the current item (in single selection listbox it also implicitly
+    // 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, 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 selection or -1
-    int m_selection;
+    // 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()
+    wxDECLARE_NO_COPY_CLASS(wxVListBox);
+    DECLARE_ABSTRACT_CLASS(wxVListBox)
 };
 
 #endif // _WX_VLBOX_H_