diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index 6383ede75f..e443e2c25d 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -71,8 +71,8 @@ public: unsigned int nPanel, unsigned long style = 0); -public: // event handlers - +private: + // event handlers void OnStyleChange(wxCommandEvent& event); void OnSetBackgroundColour(wxCommandEvent& event); void OnSetForegroundColour(wxCommandEvent& event); @@ -127,7 +127,12 @@ public: // event handlers void OnDropPossible( wxDataViewEvent &event ); void OnDrop( wxDataViewEvent &event ); -private: + void OnDataViewChar(wxKeyEvent& event); + + // helper used by both OnDeleteSelected() and OnDataViewChar() + void DeleteSelectedItems(); + + wxNotebook* m_notebook; // the controls stored in the various tabs of the main notebook: @@ -510,6 +515,9 @@ void MyFrame::BuildDataViewCtrl(wxPanel* parent, unsigned int nPanel, unsigned l m_ctrl[0] = new wxDataViewCtrl( parent, ID_MUSIC_CTRL, wxDefaultPosition, wxDefaultSize, style ); + m_ctrl[0]->Connect(wxEVT_CHAR, + wxKeyEventHandler(MyFrame::OnDataViewChar), + NULL, this); m_music_model = new MyMusicTreeModel; m_ctrl[0]->AssociateModel( m_music_model.get() ); @@ -851,7 +859,7 @@ void MyFrame::OnAddMozart( wxCommandEvent& WXUNUSED(event) ) m_music_model->AddToClassical( "Kleine Nachtmusik", "Wolfgang Mozart", 1787 ); } -void MyFrame::OnDeleteSelected( wxCommandEvent& WXUNUSED(event) ) +void MyFrame::DeleteSelectedItems() { wxDataViewItemArray items; int len = m_ctrl[0]->GetSelections( items ); @@ -860,6 +868,11 @@ void MyFrame::OnDeleteSelected( wxCommandEvent& WXUNUSED(event) ) m_music_model->Delete( items[i] ); } +void MyFrame::OnDeleteSelected( wxCommandEvent& WXUNUSED(event) ) +{ + DeleteSelectedItems(); +} + void MyFrame::OnDeleteYear( wxCommandEvent& WXUNUSED(event) ) { m_ctrl[0]->DeleteColumn( m_ctrl[0]->GetColumn( 2 ) ); @@ -1074,6 +1087,13 @@ void MyFrame::OnRightClick( wxMouseEvent &event ) event.GetX(), event.GetY() ); } +void MyFrame::OnDataViewChar(wxKeyEvent& event) +{ + if ( event.GetKeyCode() == WXK_DELETE ) + DeleteSelectedItems(); + else + event.Skip(); +} // ---------------------------------------------------------------------------- // MyFrame - event handlers for the second page diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index dc1bf273c0..dd7813621d 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -3281,7 +3281,15 @@ void wxDataViewMainWindow::DestroyTree() void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) { - if ( GetParent()->HandleAsNavigationKey(event) ) + wxWindow * const parent = GetParent(); + + // propagate the char event upwards + wxKeyEvent eventForParent(event); + eventForParent.SetEventObject(parent); + if ( parent->ProcessWindowEvent(eventForParent) ) + return; + + if ( parent->HandleAsNavigationKey(event) ) return; // no item -> nothing to do @@ -3299,7 +3307,6 @@ void wxDataViewMainWindow::OnChar( wxKeyEvent &event ) { case WXK_RETURN: { - wxWindow *parent = GetParent(); wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, parent->GetId()); le.SetItem( GetItemByRow(m_currentRow) ); @@ -3861,6 +3868,11 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, m_clientArea = new wxDataViewMainWindow( this, wxID_ANY ); + // We use the cursor keys for moving the selection, not scrolling, so call + // this method to ensure wxScrollHelperEvtHandler doesn't catch all + // keyboard events forwarded to us from wxListMainWindow. + DisableKeyboardScrolling(); + if (HasFlag(wxDV_NO_HEADER)) m_headerArea = NULL; else