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

@@ -460,6 +460,7 @@ All (GUI):
- Support float, double and file name values in wxGenericValidator (troelsk).
- Fix keyboard navigation in wxGrid with hidden columns (ivan_14_32).
- Add wxDataViewEvent::IsEditCancelled() (Allonii).
- Send EVT_DATAVIEW_ITEM_CONTEXT_MENU events even when not clicking on an item.
- Allow marking wxTreeBook nodes to expand initially in XRC (RedTide).
- Added customizable wxDocManager::OnMRUFileNotExist() virtual method.
- Fix stock labels when not using mnemonics for Chinese (cw.ahbong).

View File

@@ -735,7 +735,11 @@ public:
@event{EVT_DATAVIEW_ITEM_VALUE_CHANGED(id, func)}
Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED event.
@event{EVT_DATAVIEW_ITEM_CONTEXT_MENU(id, func)}
Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU event.
Process a @c wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU event
generated when the user right clicks inside the control. Notice that
this menu is generated even if the click didn't occur on any valid
item, in this case wxDataViewEvent::GetItem() simply returns an
invalid item.
@event{EVT_DATAVIEW_COLUMN_HEADER_CLICK(id, func)}
Process a @c wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICKED event.
@event{EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK(id, func)}

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())
{
}

View File

@@ -4536,23 +4536,22 @@ gtk_dataview_button_press_callback( GtkWidget *WXUNUSED(widget),
GtkTreeViewColumn *column = NULL;
gint cell_x = 0;
gint cell_y = 0;
if (gtk_tree_view_get_path_at_pos(
gtk_tree_view_get_path_at_pos
(
GTK_TREE_VIEW(dv->GtkGetTreeView()),
(int) gdk_event->x, (int) gdk_event->y,
path.ByRef(),
&column,
&cell_x,
&cell_y))
{
if (path)
{
&cell_y
);
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, dv->GetId() );
if (path)
event.SetItem(dv->GTKPathToItem(path));
event.SetModel( dv->GetModel() );
return dv->HandleWindowEvent( event );
}
}
}
return FALSE;
}