From 1821abd1cefa47a69f5c95394e515dca25b095e6 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Mon, 28 May 2007 14:46:52 +0000 Subject: [PATCH] Implemented dataview_model notification event to the ctrl (and then the user). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46231 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/dataviewctrl.tex | 18 ++++++++++ include/wx/dataview.h | 36 +++++++++++-------- src/common/datavcmn.cpp | 65 ++++++++++++++++++++++++++++++++-- 3 files changed, 102 insertions(+), 17 deletions(-) diff --git a/docs/latex/wx/dataviewctrl.tex b/docs/latex/wx/dataviewctrl.tex index 5d42d43e51..27cf2590f6 100644 --- a/docs/latex/wx/dataviewctrl.tex +++ b/docs/latex/wx/dataviewctrl.tex @@ -60,6 +60,24 @@ macros to direct input to member functions that take a \end{twocollist} +Additionally, you can get informed about changes to the +\helpref{model}{wxDataViewListModel}, to which a wxDataViewCtrl +has been associated. These events correspond to the interface +offered by \helpref{wxDataViewListModelNotifier}{wxdataviewlistmodelnotifier}. + +\twocolwidtha{7cm} +\begin{twocollist}\itemsep=0pt + +\twocolitem{{\bf EVT\_DATAVIEW\_MODEL\_ROW\_PREPENDED(id, func)}}{Processes a wxEVT\_COMMAND\_DATAVIEW\_MODEL\_ROW\_PREPENDED event.} +\twocolitem{{\bf EVT\_DATAVIEW\_MODEL\_ROW\_APPENDED(id, func)}}{Processes a wxEVT\_COMMAND\_DATAVIEW\_MODEL\_ROW\_APPENDED event.} +\twocolitem{{\bf EVT\_DATAVIEW\_MODEL\_ROW\_INSERTED(id, func)}}{Processes a wxEVT\_COMMAND\_DATAVIEW\_MODEL\_ROW\_INSERTED event.} +\twocolitem{{\bf EVT\_DATAVIEW\_MODEL\_ROW\_DELETED(id, func)}}{Processes a wxEVT\_COMMAND\_DATAVIEW\_MODEL\_ROW\_DELETED event.} +\twocolitem{{\bf EVT\_DATAVIEW\_MODEL\_ROW\_CHANGED(id, func)}}{Processes a wxEVT\_COMMAND\_DATAVIEW\_MODEL\_ROW\_CHANGED event.} +\twocolitem{{\bf EVT\_DATAVIEW\_MODEL\_VALUE\_CHANGED(id, func)}}{Processes a wxEVT\_COMMAND\_DATAVIEW\_MODEL\_VALUE\_CHANGED event.} +\twocolitem{{\bf EVT\_DATAVIEW\_MODEL\_ROWS\_REORDERED(id, func)}}{Processes a wxEVT\_COMMAND\_DATAVIEW\_MODEL\_ROWS\_REORDERED event.} +\twocolitem{{\bf EVT\_DATAVIEW\_MODEL\_CLEARED(id, func)}}{Processes a wxEVT\_COMMAND\_DATAVIEW\_MODEL\_CLEARED event.} + +\end{twocollist} \wxheading{Derived from} diff --git a/include/wx/dataview.h b/include/wx/dataview.h index 9cbdf29fef..88c8fc11d6 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -44,6 +44,7 @@ class WXDLLIMPEXP_ADV wxDataViewListModel; class WXDLLIMPEXP_ADV wxDataViewCtrl; class WXDLLIMPEXP_ADV wxDataViewColumn; class WXDLLIMPEXP_ADV wxDataViewRenderer; +class wxDataViewEventListModelNotifier; extern WXDLLIMPEXP_DATA_ADV(const wxChar) wxDataViewCtrlNameStr[]; @@ -104,19 +105,6 @@ private: // wxDataViewListModel // --------------------------------------------------------- -class WXDLLIMPEXP_ADV wxDataViewViewingColumn: public wxObject -{ -public: - wxDataViewViewingColumn( wxDataViewColumn *view_column, unsigned int model_column ) - { - m_viewColumn = view_column; - m_modelColumn = model_column; - } - - wxDataViewColumn *m_viewColumn; - unsigned int m_modelColumn; -}; - class WXDLLIMPEXP_ADV wxDataViewListModel: public wxDataViewModel { public: @@ -151,10 +139,9 @@ protected: // the user should not delete this class directly: he should use DecRef() instead! virtual ~wxDataViewListModel(); - wxList m_notifiers; + wxList m_notifiers; }; - // --------------------------------------------------------- // wxDataViewSortedListModel // --------------------------------------------------------- @@ -481,6 +468,7 @@ public: private: wxDataViewListModel *m_model; wxList m_cols; + wxDataViewEventListModelNotifier *m_eventNotifier; protected: DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCtrlBase) @@ -553,6 +541,15 @@ BEGIN_DECLARE_EVENT_TYPES() DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_ROW_ACTIVATED, -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) + // notifications from the model to the control + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_MODEL_ROW_APPENDED, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_MODEL_ROW_PREPENDED, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_MODEL_ROW_INSERTED, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_MODEL_ROW_DELETED, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_MODEL_ROW_CHANGED, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_MODEL_ROWS_REORDERED, -1) + DECLARE_EXPORTED_EVENT_TYPE(WXDLLIMPEXP_ADV, wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED, -1) END_DECLARE_EVENT_TYPES() typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&); @@ -568,6 +565,15 @@ typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&); #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_MODEL_ROW_APPENDED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ROW_APPENDED, id, fn) +#define EVT_DATAVIEW_MODEL_ROW_PREPENDED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ROW_PREPENDED, id, fn) +#define EVT_DATAVIEW_MODEL_ROW_INSERTED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ROW_INSERTED, id, fn) +#define EVT_DATAVIEW_MODEL_ROW_DELETED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ROW_DELETED, id, fn) +#define EVT_DATAVIEW_MODEL_ROW_CHANGED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ROW_CHANGED, id, fn) +#define EVT_DATAVIEW_MODEL_VALUE_CHANGED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_VALUE_CHANGED, id, fn) +#define EVT_DATAVIEW_MODEL_ROWS_REORDERED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_ROWS_REORDERED, id, fn) +#define EVT_DATAVIEW_MODEL_CLEARED(id, fn) wx__DECLARE_DATAVIEWEVT(MODEL_CLEARED, id, fn) + #if defined(wxUSE_GENERICDATAVIEWCTRL) #include "wx/generic/dataview.h" diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index 0e9b950771..ee19ec15f1 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -872,6 +872,44 @@ void wxDataViewColumnBase::SetFlags(int flags) SetHidden((flags & wxDATAVIEW_COL_HIDDEN) != 0); } +// --------------------------------------------------------- +// wxDataViewEventListModelNotifier +// --------------------------------------------------------- + +class WXDLLIMPEXP_ADV wxDataViewEventListModelNotifier: public wxDataViewListModelNotifier +{ +public: + wxDataViewEventListModelNotifier( wxDataViewCtrl *ctrl ) { m_ctrl = ctrl; } + + bool SendEvent( wxEventType event_type, unsigned int row = 0, unsigned int col = 0 ) + { + wxDataViewEvent event( event_type, m_ctrl->GetId() ); + event.SetEventObject( m_ctrl ); + event.SetModel( m_ctrl->GetModel() ); + event.SetRow( row ); + event.SetColumn( col ); + m_ctrl->GetEventHandler()->ProcessEvent( event ); + return true; + } + + virtual bool RowAppended() { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ROW_APPENDED ); } + virtual bool RowPrepended() { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ROW_PREPENDED ); } + virtual bool RowInserted( unsigned int before ) + { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ROW_INSERTED, before ); } + virtual bool RowDeleted( unsigned int row ) + { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ROW_DELETED, row ); } + virtual bool RowChanged( unsigned int row ) + { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ROW_CHANGED, row ); } + virtual bool ValueChanged( unsigned int col, unsigned int row ) + { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED, row, col ); } + virtual bool RowsReordered( unsigned int *new_order ) + { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ROWS_REORDERED ); } + virtual bool Cleared() { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED ); } + +private: + wxDataViewCtrl *m_ctrl; +}; + // --------------------------------------------------------- // wxDataViewCtrlBase @@ -883,6 +921,7 @@ wxDataViewCtrlBase::wxDataViewCtrlBase() { m_model = NULL; m_cols.DeleteContents( true ); + m_eventNotifier = NULL; } wxDataViewCtrlBase::~wxDataViewCtrlBase() @@ -894,6 +933,10 @@ wxDataViewCtrlBase::~wxDataViewCtrlBase() if (m_model) { + if (m_eventNotifier) + m_model->RemoveNotifier( m_eventNotifier ); + m_eventNotifier = NULL; + m_model->DecRef(); m_model = NULL; } @@ -901,13 +944,23 @@ wxDataViewCtrlBase::~wxDataViewCtrlBase() bool wxDataViewCtrlBase::AssociateModel( wxDataViewListModel *model ) { - if ( m_model ) + if (m_model) + { + if (m_eventNotifier) + m_model->RemoveNotifier( m_eventNotifier ); + m_eventNotifier = NULL; + m_model->DecRef(); // discard old model, if any + } // add our own reference to the new model: m_model = model; - if ( m_model ) + if (m_model) + { m_model->IncRef(); + m_eventNotifier = new wxDataViewEventListModelNotifier( (wxDataViewCtrl*) this ); + m_model->AddNotifier( m_eventNotifier ); + } return true; } @@ -1035,5 +1088,13 @@ DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ROW_ACTIVATED) DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK) DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_APPENDED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_PREPENDED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_INSERTED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_DELETED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ROW_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_ROWS_REORDERED) +DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED) #endif