X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9d52aad39a4e3b52c5baa50b9cc55caaf91bb026..a220ccb313cde370ad6bec9b2285966525cb8f92:/include/wx/dataview.h diff --git a/include/wx/dataview.h b/include/wx/dataview.h index 90cb52b033..55e3d1e944 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -2,7 +2,7 @@ // Name: wx/dataview.h // Purpose: wxDataViewCtrl base classes // Author: Robert Roebling -// Modified by: +// Modified by: Bo Yang // Created: 08.01.06 // RCS-ID: $Id$ // Copyright: (c) Robert Roebling @@ -21,6 +21,7 @@ #include "wx/bitmap.h" #include "wx/variant.h" #include "wx/listctrl.h" +#include "wx/dynarray.h" #if defined(__WXGTK20__) // for testing @@ -44,7 +45,6 @@ class WXDLLIMPEXP_FWD_ADV wxDataViewCtrl; class WXDLLIMPEXP_FWD_ADV wxDataViewColumn; class WXDLLIMPEXP_FWD_ADV wxDataViewRenderer; class WXDLLIMPEXP_FWD_ADV wxDataViewModelNotifier; -class wxDataViewEventModelNotifier; extern WXDLLIMPEXP_DATA_ADV(const wxChar) wxDataViewCtrlNameStr[]; @@ -74,6 +74,7 @@ public: { m_id = item.m_id; } bool IsOk() const { return m_id != NULL; } void* GetID() const { return m_id; } + operator const void* () const { return m_id; } private: void* m_id; @@ -81,12 +82,39 @@ private: bool operator == (const wxDataViewItem &left, const wxDataViewItem &right); +WX_DEFINE_ARRAY(wxDataViewItem, wxDataViewItemArray); + +// --------------------------------------------------------- +// wxDataViewModelNotifier +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewModelNotifier +{ +public: + wxDataViewModelNotifier() { } + virtual ~wxDataViewModelNotifier() { m_owner = NULL; } + + virtual bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ) = 0; + virtual bool ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item ) = 0; + virtual bool ItemChanged( const wxDataViewItem &item ) = 0; + virtual bool ValueChanged( const wxDataViewItem &item, unsigned int col ) = 0; + virtual bool Cleared() = 0; + + virtual void Resort() = 0; + + void SetOwner( wxDataViewModel *owner ) { m_owner = owner; } + wxDataViewModel *GetOwner() { return m_owner; } + +private: + wxDataViewModel *m_owner; +}; + + // --------------------------------------------------------- // wxDataViewModel // --------------------------------------------------------- -typedef int (wxCALLBACK *wxDataViewModelCompare) - (const wxDataViewItem& item1, const wxDataViewItem& item2, unsigned int col, unsigned int option ); +WX_DECLARE_LIST(wxDataViewModelNotifier, wxDataViewModelNotifiers ); class WXDLLIMPEXP_ADV wxDataViewModel: public wxObjectRefData { @@ -107,55 +135,88 @@ public: const wxDataViewItem &item, unsigned int col ) = 0; // define hierachy - virtual bool HasChildren( const wxDataViewItem &item ) const = 0; + virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const = 0; + virtual bool IsContainer( const wxDataViewItem &item ) const = 0; virtual wxDataViewItem GetFirstChild( const wxDataViewItem &parent ) const = 0; virtual wxDataViewItem GetNextSibling( const wxDataViewItem &item ) const = 0; // delegated notifiers virtual bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ); - virtual bool ItemDeleted( const wxDataViewItem &item ); + virtual bool ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item ); virtual bool ItemChanged( const wxDataViewItem &item ); virtual bool ValueChanged( const wxDataViewItem &item, unsigned int col ); virtual bool Cleared(); + // delegatd action + virtual void Resort(); + void AddNotifier( wxDataViewModelNotifier *notifier ); void RemoveNotifier( wxDataViewModelNotifier *notifier ); - void SetCompareFunction( wxDataViewModelCompare func ) { m_cmpFunc = func; } - wxDataViewModelCompare GetCompareFunction() { return m_cmpFunc; } - + // default compare function + virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, + unsigned int column, bool ascending ); + virtual bool HasDefaultCompare() { return false; } + protected: // the user should not delete this class directly: he should use DecRef() instead! virtual ~wxDataViewModel() { } - wxList m_notifiers; - wxDataViewModelCompare m_cmpFunc; + wxDataViewModelNotifiers m_notifiers; }; // --------------------------------------------------------- -// wxDataViewModelNotifier +// wxDataViewIndexListModel // --------------------------------------------------------- -class WXDLLIMPEXP_ADV wxDataViewModelNotifier: public wxObject +class wxDataViewIndexListModel: public wxDataViewModel { public: - wxDataViewModelNotifier() { } - virtual ~wxDataViewModelNotifier() { m_owner = NULL; } + wxDataViewIndexListModel( unsigned int initial_size = 0 ); + ~wxDataViewIndexListModel(); + + virtual unsigned int GetRowCount() = 0; + + virtual void GetValue( wxVariant &variant, + unsigned int row, unsigned int col ) const = 0; - virtual bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ) = 0; - virtual bool ItemDeleted( const wxDataViewItem &item ) = 0; - virtual bool ItemChanged( const wxDataViewItem &item ) = 0; - virtual bool ValueChanged( const wxDataViewItem &item, unsigned int col ) = 0; - virtual bool Cleared() = 0; + virtual bool SetValue( const wxVariant &variant, + unsigned int row, unsigned int col ) = 0; + + void RowPrepended(); + void RowInserted( unsigned int before ); + void RowAppended(); + void RowDeleted( unsigned int row ); + void RowChanged( unsigned int row ); + void RowValueChanged( unsigned int row, unsigned int col ); + + // convert to/from row/wxDataViewItem + + unsigned int GetRow( const wxDataViewItem &item ) const; + wxDataViewItem GetItem( unsigned int row ) const; + + // compare based on index + + virtual int Compare( const wxDataViewItem &item1, const wxDataViewItem &item2, + unsigned int column, bool ascending ); + virtual bool HasDefaultCompare() { return true; } - void SetOwner( wxDataViewModel *owner ) { m_owner = owner; } - wxDataViewModel *GetOwner() { return m_owner; } + // implement base methods + virtual void GetValue( wxVariant &variant, + const wxDataViewItem &item, unsigned int col ) const; + virtual bool SetValue( const wxVariant &variant, + const wxDataViewItem &item, unsigned int col ); + virtual wxDataViewItem GetParent( const wxDataViewItem &item ) const; + virtual bool IsContainer( const wxDataViewItem &item ) const; + virtual wxDataViewItem GetFirstChild( const wxDataViewItem &parent ) const; + virtual wxDataViewItem GetNextSibling( const wxDataViewItem &item ) const; + private: - wxDataViewModel *m_owner; + wxDataViewItemArray m_hash; + unsigned int m_lastIndex; }; - //----------------------------------------------------------------------------- // wxDataViewEditorCtrlEvtHandler //----------------------------------------------------------------------------- @@ -354,43 +415,44 @@ public: wxDataViewModel* GetModel(); // short cuts - bool AppendTextColumn( const wxString &label, unsigned int model_column, + wxDataViewColumn *AppendTextColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, wxAlignment align = wxALIGN_CENTER, int flags = wxDATAVIEW_COL_RESIZABLE ); - bool AppendToggleColumn( const wxString &label, unsigned int model_column, + wxDataViewColumn *AppendToggleColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH, wxAlignment align = wxALIGN_CENTER, int flags = wxDATAVIEW_COL_RESIZABLE ); - bool AppendProgressColumn( const wxString &label, unsigned int model_column, + wxDataViewColumn *AppendProgressColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_DEFAULT_WIDTH, wxAlignment align = wxALIGN_CENTER, int flags = wxDATAVIEW_COL_RESIZABLE ); - bool AppendDateColumn( const wxString &label, unsigned int model_column, + wxDataViewColumn *AppendDateColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1, wxAlignment align = wxALIGN_CENTER, int flags = wxDATAVIEW_COL_RESIZABLE ); - bool AppendBitmapColumn( const wxString &label, unsigned int model_column, + wxDataViewColumn *AppendBitmapColumn( const wxString &label, unsigned int model_column, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, wxAlignment align = wxALIGN_CENTER, int flags = wxDATAVIEW_COL_RESIZABLE ); - bool AppendTextColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewColumn *AppendTextColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, wxAlignment align = wxALIGN_CENTER, int flags = wxDATAVIEW_COL_RESIZABLE ); - bool AppendToggleColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewColumn *AppendToggleColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_TOGGLE_DEFAULT_WIDTH, wxAlignment align = wxALIGN_CENTER, int flags = wxDATAVIEW_COL_RESIZABLE ); - bool AppendProgressColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewColumn *AppendProgressColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = wxDVC_DEFAULT_WIDTH, wxAlignment align = wxALIGN_CENTER, int flags = wxDATAVIEW_COL_RESIZABLE ); - bool AppendDateColumn( const wxBitmap &label, unsigned int model_column, + wxDataViewColumn *AppendDateColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode = wxDATAVIEW_CELL_ACTIVATABLE, int width = -1, wxAlignment align = wxALIGN_CENTER, int flags = wxDATAVIEW_COL_RESIZABLE ); - bool AppendBitmapColumn( const wxBitmap &label, unsigned int model_column, + + wxDataViewColumn *AppendBitmapColumn( const wxBitmap &label, unsigned int model_column, wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int width = -1, wxAlignment align = wxALIGN_CENTER, int flags = wxDATAVIEW_COL_RESIZABLE ); @@ -413,8 +475,23 @@ public: int GetIndent() const { return m_indent; } - // TODO selection code virtual wxDataViewItem GetSelection() = 0; + virtual int GetSelections( wxDataViewItemArray & sel ) const = 0; + virtual void SetSelections( const wxDataViewItemArray & sel ) = 0; + virtual void Select( const wxDataViewItem & item ) = 0; + virtual void Unselect( const wxDataViewItem & item ) = 0; + virtual bool IsSelected( const wxDataViewItem & item ) const = 0; + + virtual void SelectAll() = 0; + virtual void UnselectAll() = 0; + + virtual void EnsureVisible( const wxDataViewItem & item, + wxDataViewColumn *column = NULL ) = 0; + + virtual void HitTest( const wxPoint &point, + wxDataViewItem &item, unsigned int &column ) const = 0; + virtual wxRect GetItemRect( const wxDataViewItem &item, + unsigned int column ) const = 0; protected: virtual void DoSetExpanderColumn() = 0 ; @@ -423,7 +500,6 @@ protected: private: wxDataViewModel *m_model; wxList m_cols; - wxDataViewEventModelNotifier *m_eventNotifier; unsigned int m_expander_column; int m_indent ; @@ -487,7 +563,12 @@ private: BEGIN_DECLARE_EVENT_TYPES() DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_SELECTED, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_DESELECTED, -1) DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING, -1) DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK, -1) DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, -1) DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED, -1) @@ -508,12 +589,17 @@ typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&); wx__DECLARE_EVT1(wxEVT_COMMAND_DATAVIEW_ ## evt, id, wxDataViewEventHandler(fn)) #define EVT_DATAVIEW_ITEM_SELECTED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_SELECTED, id, fn) +#define EVT_DATAVIEW_ITEM_DESELECTED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_DESELECTED, id, fn) #define EVT_DATAVIEW_ITEM_ACTIVATED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_ACTIVATED, id, fn) +#define EVT_DATAVIEW_ITEM_COLLAPSING(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_COLLAPSING, id, fn) +#define EVT_DATAVIEW_ITEM_COLLAPSED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_COLLAPSED, id, fn) +#define EVT_DATAVIEW_ITEM_EXPANDING(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_EXPANDING, id, fn) +#define EVT_DATAVIEW_ITEM_EXPANDED(id, fn) wx__DECLARE_DATAVIEWEVT(ITEM_EXPANDED, id, fn) #define EVT_DATAVIEW_COLUMN_HEADER_CLICK(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_CLICK, id, fn) #define EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICKED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_HEADER_RIGHT_CLICK, id, fn) #define EVT_DATAVIEW_COLUMN_SORTED(id, fn) wx__DECLARE_DATAVIEWEVT(COLUMN_SORTED, id, fn) -#define EVT_DATAVIEW_MODEL_ITEM_ADDED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ITEM_APPENDED, id, fn) +#define EVT_DATAVIEW_MODEL_ITEM_ADDED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ITEM_ADDED, id, fn) #define EVT_DATAVIEW_MODEL_ITEM_DELETED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ITEM_DELETED, id, fn) #define EVT_DATAVIEW_MODEL_ITEM_CHANGED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ITEM_CHANGED, id, fn) #define EVT_DATAVIEW_MODEL_VALUE_CHANGED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_VALUE_CHANGED, id, fn)