From d8331a013b9cd0109a3a6d3c4e7b60b0b524eb06 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Tue, 24 Jul 2007 09:15:04 +0000 Subject: [PATCH] Send events from port-specific code, not common code, tested in samples git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47694 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/dataview.h | 2 +- samples/dataview/dataview.cpp | 37 +++++++++++++++++- src/common/datavcmn.cpp | 47 ----------------------- src/gtk/dataview.cpp | 71 ++++++++++++++++++++++++++++++++++- 4 files changed, 106 insertions(+), 51 deletions(-) diff --git a/include/wx/dataview.h b/include/wx/dataview.h index 911727ca24..1c5f4d0b97 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -576,7 +576,7 @@ typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&); #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) diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index 090bd0c470..7d958749da 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -412,6 +412,10 @@ public: void OnPrependList(wxCommandEvent& event); void OnDeleteList(wxCommandEvent& event); + void OnValueChanged( wxDataViewEvent &event ); + void OnItemAdded( wxDataViewEvent &event ); + void OnItemDeleted( wxDataViewEvent &event ); + private: wxDataViewCtrl* m_musicCtrl; wxObjectDataPtr m_music_model; @@ -461,6 +465,8 @@ enum ID_ABOUT = wxID_ABOUT, ID_EXIT = wxID_EXIT, + ID_MUSIC_CTRL = 50, + ID_ADD_MOZART = 100, ID_DELETE_MUSIC = 101, @@ -475,11 +481,16 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_BUTTON( ID_DELETE_MUSIC, MyFrame::OnDeleteMusic ) EVT_BUTTON( ID_PREPEND_LIST, MyFrame::OnPrependList ) EVT_BUTTON( ID_DELETE_LIST, MyFrame::OnDeleteList ) + EVT_DATAVIEW_MODEL_ITEM_ADDED( ID_MUSIC_CTRL, MyFrame::OnItemAdded ) + EVT_DATAVIEW_MODEL_ITEM_DELETED( ID_MUSIC_CTRL, MyFrame::OnItemDeleted ) + EVT_DATAVIEW_MODEL_VALUE_CHANGED( ID_MUSIC_CTRL, MyFrame::OnValueChanged ) END_EVENT_TABLE() MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h): wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h)) { + m_log = NULL; + SetIcon(wxICON(sample)); // build the menus: @@ -501,7 +512,7 @@ MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h): // MyMusic - m_musicCtrl = new wxDataViewCtrl( this, wxID_ANY, wxDefaultPosition, + m_musicCtrl = new wxDataViewCtrl( this, ID_MUSIC_CTRL, wxDefaultPosition, wxDefaultSize ); m_music_model = new MyMusicModel; @@ -581,6 +592,30 @@ void MyFrame::OnDeleteList( wxCommandEvent& WXUNUSED(event) ) m_list_model->DeleteItem( item ); } +void MyFrame::OnItemAdded( wxDataViewEvent &event ) +{ + if (!m_log) + return; + + m_log->AppendText( "EVT_DATAVIEW_MODEL_ITEM_ADDED\n" ); +} + +void MyFrame::OnItemDeleted( wxDataViewEvent &event ) +{ + if (!m_log) + return; + + m_log->AppendText( "EVT_DATAVIEW_MODEL_ITEM_DELETED\n" ); +} + +void MyFrame::OnValueChanged( wxDataViewEvent &event ) +{ + if (!m_log) + return; + + m_log->AppendText( "EVT_DATAVIEW_MODEL_VALUE_CHANGED\n" ); +} + void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) ) { wxAboutDialogInfo info; diff --git a/src/common/datavcmn.cpp b/src/common/datavcmn.cpp index 11b4e3af1e..89d8f183d5 100644 --- a/src/common/datavcmn.cpp +++ b/src/common/datavcmn.cpp @@ -528,42 +528,6 @@ void wxDataViewColumnBase::SetFlags(int flags) SetHidden((flags & wxDATAVIEW_COL_HIDDEN) != 0); } -// --------------------------------------------------------- -// wxDataViewEventModelNotifier -// --------------------------------------------------------- - -class WXDLLIMPEXP_ADV wxDataViewEventModelNotifier: public wxDataViewModelNotifier -{ -public: - wxDataViewEventModelNotifier( wxDataViewCtrl *ctrl ) { m_ctrl = ctrl; } - - bool SendEvent( wxEventType event_type, const wxDataViewItem &item, unsigned int col = 0 ) - { - wxDataViewEvent event( event_type, m_ctrl->GetId() ); - event.SetEventObject( m_ctrl ); - event.SetModel( m_ctrl->GetModel() ); - event.SetItem( item ); - event.SetColumn( col ); - m_ctrl->GetEventHandler()->ProcessEvent( event ); - return true; - } - - virtual bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ) - { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_ADDED, item ); } - virtual bool ItemDeleted( const wxDataViewItem &item ) - { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_DELETED, item ); } - virtual bool ItemChanged( const wxDataViewItem &item ) - { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_CHANGED, item ); } - virtual bool ValueChanged( const wxDataViewItem &item, unsigned int col ) - { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED, item, col ); } - virtual bool Cleared() - { return SendEvent( wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED, wxDataViewItem(0) ); } - -private: - wxDataViewCtrl *m_ctrl; -}; - - // --------------------------------------------------------- // wxDataViewCtrlBase // --------------------------------------------------------- @@ -574,7 +538,6 @@ wxDataViewCtrlBase::wxDataViewCtrlBase() { m_model = NULL; m_cols.DeleteContents( true ); - m_eventNotifier = NULL; m_expander_column = 0; m_indent = 8; } @@ -588,10 +551,6 @@ wxDataViewCtrlBase::~wxDataViewCtrlBase() if (m_model) { - if (m_eventNotifier) - m_model->RemoveNotifier( m_eventNotifier ); - m_eventNotifier = NULL; - m_model->DecRef(); m_model = NULL; } @@ -601,10 +560,6 @@ bool wxDataViewCtrlBase::AssociateModel( wxDataViewModel *model ) { if (m_model) { - if (m_eventNotifier) - m_model->RemoveNotifier( m_eventNotifier ); - m_eventNotifier = NULL; - m_model->DecRef(); // discard old model, if any } @@ -613,8 +568,6 @@ bool wxDataViewCtrlBase::AssociateModel( wxDataViewModel *model ) if (m_model) { m_model->IncRef(); - m_eventNotifier = new wxDataViewEventModelNotifier( (wxDataViewCtrl*) this ); - m_model->AddNotifier( m_eventNotifier ); } return true; diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index 41ed1b24e8..926d1e4645 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -75,7 +75,9 @@ public: bool ItemAdded( const wxDataViewItem &parent, const wxDataViewItem &item ); bool ItemDeleted( const wxDataViewItem &item ); - + bool ItemChanged( const wxDataViewItem &item ); + bool ValueChanged( const wxDataViewItem &item, unsigned int col ); + bool Cleared(); void Resort(); protected: @@ -1096,6 +1098,8 @@ bool wxGtkDataViewModelNotifier::ItemChanged( const wxDataViewItem &item ) GTK_TREE_MODEL(m_wxgtk_model), path, &iter ); gtk_tree_path_free (path); + m_owner->GtkGetInternal()->ItemChanged( item ); + return true; } @@ -1129,14 +1133,22 @@ bool wxGtkDataViewModelNotifier::ValueChanged( const wxDataViewItem &item, unsig // Redraw gtk_widget_queue_draw_area( GTK_WIDGET(widget), cell_area.x - xdiff, ydiff + cell_area.y, cell_area.width, cell_area.height ); + + m_owner->GtkGetInternal()->ValueChanged( item, model_col ); + + return true; } } - return true; + return false; } bool wxGtkDataViewModelNotifier::Cleared() { + // TODO: delete everything + + m_owner->GtkGetInternal()->Cleared(); + return false; } @@ -2240,6 +2252,10 @@ void wxDataViewCtrlInternal::InitTree() void wxDataViewCtrlInternal::BuildBranch( wxGtkTreeModelNode *node ) { + wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_ADDED, m_owner->GetId() ); + event.SetEventObject( m_owner ); + event.SetModel( m_owner->GetModel() ); + if (node->GetChildCount() == 0) { wxDataViewItem child = m_wx_model->GetFirstChild( node->GetItem() ); @@ -2249,6 +2265,10 @@ void wxDataViewCtrlInternal::BuildBranch( wxGtkTreeModelNode *node ) node->AddNode( new wxGtkTreeModelNode( node, child, this ) ); else node->AddLeave( child.GetID() ); + + event.SetItem( child ); + m_owner->GetEventHandler()->ProcessEvent( event ); + child = m_wx_model->GetNextSibling( child ); } } @@ -2266,6 +2286,13 @@ bool wxDataViewCtrlInternal::ItemAdded( const wxDataViewItem &parent, const wxDa parent_node->AddNode( new wxGtkTreeModelNode( parent_node, item, this ) ); else parent_node->AddLeave( item.GetID() ); + + wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_ADDED, m_owner->GetId() ); + event.SetEventObject( m_owner ); + event.SetModel( m_owner->GetModel() ); + event.SetItem( item ); + m_owner->GetEventHandler()->ProcessEvent( event ); + return true; } @@ -2273,6 +2300,46 @@ bool wxDataViewCtrlInternal::ItemDeleted( const wxDataViewItem &item ) { wxGtkTreeModelNode *parent = FindParentNode( item ); parent->DeleteChild( item.GetID() ); + + wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_DELETED, m_owner->GetId() ); + event.SetEventObject( m_owner ); + event.SetModel( m_owner->GetModel() ); + event.SetItem( item ); + m_owner->GetEventHandler()->ProcessEvent( event ); + + return true; +} + +bool wxDataViewCtrlInternal::ItemChanged( const wxDataViewItem &item ) +{ + wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_MODEL_ITEM_CHANGED, m_owner->GetId() ); + event.SetEventObject( m_owner ); + event.SetModel( m_owner->GetModel() ); + event.SetItem( item ); + m_owner->GetEventHandler()->ProcessEvent( event ); + + return true; +} + +bool wxDataViewCtrlInternal::ValueChanged( const wxDataViewItem &item, unsigned int col ) +{ + wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_MODEL_VALUE_CHANGED, m_owner->GetId() ); + event.SetEventObject( m_owner ); + event.SetModel( m_owner->GetModel() ); + event.SetColumn( col ); + event.SetItem( item ); + m_owner->GetEventHandler()->ProcessEvent( event ); + + return true; +} + +bool wxDataViewCtrlInternal::Cleared() +{ + wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_MODEL_CLEARED, m_owner->GetId() ); + event.SetEventObject( m_owner ); + event.SetModel( m_owner->GetModel() ); + m_owner->GetEventHandler()->ProcessEvent( event ); + return true; } -- 2.45.2