Send EVT_DATAVIEW_ITEM_CONTEXT_MENU events even when not clicking on an item.

Always send this event, even if the user right clicked outside of the client
area. This is useful for showing item-independent commands in the context
menu.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@69177 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2011-09-21 15:07:56 +00:00
parent da2e758f83
commit 7ed24cb652
4 changed files with 49 additions and 32 deletions

View File

@@ -3555,6 +3555,37 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
}
xpos += c->GetWidth();
}
wxDataViewModel* const model = GetModel();
const unsigned int current = GetLineAt( y );
const wxDataViewItem item = GetItemByRow(current);
// Handle right clicking here, before everything else as context menu
// events should be sent even when we click outside of any item, unlike all
// the other ones.
if (event.RightUp())
{
wxWindow *parent = GetParent();
wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, parent->GetId());
le.SetEventObject(parent);
le.SetModel(model);
if ( item.IsOk() && col )
{
le.SetItem( item );
le.SetColumn( col->GetModelColumn() );
le.SetDataViewColumn( col );
wxVariant value;
model->GetValue( value, item, col->GetModelColumn() );
le.SetValue(value);
}
parent->ProcessWindowEvent(le);
return;
}
if (!col)
{
event.Skip();
@@ -3562,7 +3593,6 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
}
wxDataViewRenderer *cell = col->GetRenderer();
unsigned int current = GetLineAt( y );
if ((current >= GetRowCount()) || (x > GetEndOfLastCol()))
{
// Unselect all if below the last row ?
@@ -3625,8 +3655,6 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
}
}
wxDataViewModel *model = GetModel();
#if wxUSE_DRAG_AND_DROP
if (event.Dragging())
{
@@ -3648,12 +3676,12 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
m_owner->CalcUnscrolledPosition( m_dragStart.x, m_dragStart.y,
&m_dragStart.x, &m_dragStart.y );
unsigned int drag_item_row = GetLineAt( m_dragStart.y );
wxDataViewItem item = GetItemByRow( drag_item_row );
wxDataViewItem itemDragged = GetItemByRow( drag_item_row );
// Notify cell about drag
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG, m_owner->GetId() );
event.SetEventObject( m_owner );
event.SetItem( item );
event.SetItem( itemDragged );
event.SetModel( model );
if (!m_owner->HandleWindowEvent( event ))
return;
@@ -3686,7 +3714,6 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
m_lastOnSame = false;
}
wxDataViewItem item = GetItemByRow(current);
bool ignore_other_columns =
((expander != col) &&
(model->IsContainer(item)) &&
@@ -3786,20 +3813,6 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
SendSelectionChangedEvent(GetItemByRow( m_currentRow ) );
}
}
else if (event.RightUp())
{
wxVariant value;
model->GetValue( value, item, col->GetModelColumn() );
wxWindow *parent = GetParent();
wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, parent->GetId());
le.SetItem( item );
le.SetColumn( col->GetModelColumn() );
le.SetDataViewColumn( col );
le.SetEventObject(parent);
le.SetModel(GetModel());
le.SetValue(value);
parent->ProcessWindowEvent(le);
}
else if (event.MiddleDown())
{
}