X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1a661779516097cd84dc76ae878f4c2d32cca953..bfa78c63b9045c2a594ca6f04dc26a70c21f5f42:/include/wx/treelist.h diff --git a/include/wx/treelist.h b/include/wx/treelist.h index 1f013e8a37..081ecb09ca 100644 --- a/include/wx/treelist.h +++ b/include/wx/treelist.h @@ -26,8 +26,9 @@ class WXDLLIMPEXP_FWD_ADV wxDataViewCtrl; class WXDLLIMPEXP_FWD_ADV wxDataViewEvent; -extern WXDLLIMPEXP_DATA_CORE(const char) wxTreeListCtrlNameStr[]; +extern WXDLLIMPEXP_DATA_ADV(const char) wxTreeListCtrlNameStr[]; +class wxTreeListCtrl; class wxTreeListModel; class wxTreeListModelNode; @@ -77,6 +78,33 @@ typedef wxVector wxTreeListItems; extern WXDLLIMPEXP_DATA_ADV(const wxTreeListItem) wxTLI_FIRST; extern WXDLLIMPEXP_DATA_ADV(const wxTreeListItem) wxTLI_LAST; +// ---------------------------------------------------------------------------- +// wxTreeListItemComparator: defines order of wxTreeListCtrl items. +// ---------------------------------------------------------------------------- + +class wxTreeListItemComparator +{ +public: + wxTreeListItemComparator() { } + + // The comparison function should return negative, null or positive value + // depending on whether the first item is less than, equal to or greater + // than the second one. The items should be compared using their values for + // the given column. + virtual int + Compare(wxTreeListCtrl* treelist, + unsigned column, + wxTreeListItem first, + wxTreeListItem second) = 0; + + // Although this class is not used polymorphically by wxWidgets itself, + // provide virtual dtor in case it's used like this in the user code. + virtual ~wxTreeListItemComparator() { } + +private: + wxDECLARE_NO_COPY_CLASS(wxTreeListItemComparator); +}; + // ---------------------------------------------------------------------------- // wxTreeListCtrl: a control combining wxTree- and wxListCtrl features. // ---------------------------------------------------------------------------- @@ -322,6 +350,46 @@ public: wxCheckBoxState state) const; + + // Sorting. + // -------- + + // Sort by the given column, either in ascending (default) or descending + // sort order. + // + // By default, simple alphabetical sorting is done by this column contents + // but SetItemComparator() may be called to perform comparison in some + // other way. + void SetSortColumn(unsigned col, bool ascendingOrder = true); + + // If the control contents is sorted, return true and fill the output + // parameters with the column which is currently used for sorting and + // whether we sort using ascending or descending order. Otherwise, i.e. if + // the control contents is unsorted, simply return false. + bool GetSortColumn(unsigned* col, bool* ascendingOrder = NULL); + + // Set the object to use for comparing the items. It will be called when + // the control is being sorted because the user clicked on a sortable + // column. + // + // The provided pointer is stored by the control so the object it points to + // must have a life-time equal or greater to that of the control itself. In + // addition, the pointer can be NULL to stop using custom comparator and + // revert to the default alphabetical comparison. + void SetItemComparator(wxTreeListItemComparator* comparator); + + + // View window functions. + // ---------------------- + + // This control itself is entirely covered by the "view window" which is + // currently a wxDataViewCtrl but if you want to avoid relying on this to + // allow your code to work with later versions which might not be + // wxDataViewCtrl-based, use the first function only and only use the + // second one if you really need to call wxDataViewCtrl methods on it. + wxWindow* GetView() const; + wxDataViewCtrl* GetDataView() const { return m_view; } + private: // Common part of all ctors. void Init(); @@ -344,10 +412,14 @@ private: int imageOpened, wxClientData* data); - // Send wxTreeListEvent corresponding to the given wxDataViewEvent. + // Send wxTreeListEvent corresponding to the given wxDataViewEvent for an + // item (as opposed for column-oriented events). // // Also updates the original event "skipped" and "vetoed" flags. - void SendEvent(wxEventType evt, wxDataViewEvent& event); + void SendItemEvent(wxEventType evt, wxDataViewEvent& event); + + // Send wxTreeListEvent corresponding to the given column wxDataViewEvent. + void SendColumnEvent(wxEventType evt, wxDataViewEvent& event); // Called by wxTreeListModel when an item is toggled by the user. @@ -359,6 +431,7 @@ private: void OnItemExpanded(wxDataViewEvent& event); void OnItemActivated(wxDataViewEvent& event); void OnItemContextMenu(wxDataViewEvent& event); + void OnColumnSorted(wxDataViewEvent& event); void OnSize(wxSizeEvent& event); wxDECLARE_EVENT_TABLE(); @@ -367,6 +440,8 @@ private: wxDataViewCtrl* m_view; wxTreeListModel* m_model; + wxTreeListItemComparator* m_comparator; + // It calls our inherited protected wxWithImages::GetImage() method. friend class wxTreeListModel; @@ -378,19 +453,34 @@ private: // wxTreeListEvent: event generated by wxTreeListCtrl. // ---------------------------------------------------------------------------- -class wxTreeListEvent : public wxNotifyEvent +class WXDLLIMPEXP_ADV wxTreeListEvent : public wxNotifyEvent { public: - // The item affected by the event. + // Default ctor is provided for wxRTTI needs only but should never be used. + wxTreeListEvent() { Init(); } + + // The item affected by the event. Valid for all events except + // column-specific ones such as COLUMN_SORTED. wxTreeListItem GetItem() const { return m_item; } // The previous state of the item checkbox for ITEM_CHECKED events only. wxCheckBoxState GetOldCheckedState() const { return m_oldCheckedState; } + // The index of the column affected by the event. Currently only used by + // COLUMN_SORTED event. + unsigned GetColumn() const { return m_column; } virtual wxEvent* Clone() const { return new wxTreeListEvent(*this); } private: + // Common part of all ctors. + void Init() + { + m_column = static_cast(-1); + + m_oldCheckedState = wxCHK_UNDETERMINED; + } + // Ctor is private, only wxTreeListCtrl can create events of this type. wxTreeListEvent(wxEventType evtType, wxTreeListCtrl* treelist, @@ -399,6 +489,8 @@ private: m_item(item) { SetEventObject(treelist); + + Init(); } // Set the checkbox state before this event for ITEM_CHECKED events. @@ -407,14 +499,22 @@ private: m_oldCheckedState = state; } + // Set the column affected by this event for COLUMN_SORTED events. + void SetColumn(unsigned column) + { + m_column = column; + } + const wxTreeListItem m_item; wxCheckBoxState m_oldCheckedState; + unsigned m_column; + friend class wxTreeListCtrl; - wxDECLARE_ABSTRACT_CLASS(wxTreeListEvent); + wxDECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxTreeListEvent); }; // Event types and event table macros. @@ -456,6 +556,10 @@ wxDECLARE_TREELIST_EVENT(ITEM_CONTEXT_MENU); #define EVT_TREELIST_ITEM_CONTEXT_MENU(id, fn) \ wxEVT_TREELIST_GENERIC(ITEM_CONTEXT_MENU, id, fn) +wxDECLARE_TREELIST_EVENT(COLUMN_SORTED); +#define EVT_TREELIST_COLUMN_SORTED(id, fn) \ + wxEVT_TREELIST_GENERIC(COLUMN_SORTED, id, fn) + #undef wxDECLARE_TREELIST_EVENT #endif // wxUSE_TREELISTCTRL