Implement vetoing editing in wxDataViewTextRenderer under GTK+ and test it in the sample (see also #10495)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59457 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -98,6 +98,7 @@ public: // event handlers
|
|||||||
void OnCollapsed( wxDataViewEvent &event );
|
void OnCollapsed( wxDataViewEvent &event );
|
||||||
void OnSelectionChanged( wxDataViewEvent &event );
|
void OnSelectionChanged( wxDataViewEvent &event );
|
||||||
|
|
||||||
|
void OnStartEditing( wxDataViewEvent &event );
|
||||||
void OnEditingStarted( wxDataViewEvent &event );
|
void OnEditingStarted( wxDataViewEvent &event );
|
||||||
void OnEditingDone( wxDataViewEvent &event );
|
void OnEditingDone( wxDataViewEvent &event );
|
||||||
|
|
||||||
@@ -287,6 +288,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
|||||||
EVT_DATAVIEW_ITEM_COLLAPSED(ID_MUSIC_CTRL, MyFrame::OnCollapsed)
|
EVT_DATAVIEW_ITEM_COLLAPSED(ID_MUSIC_CTRL, MyFrame::OnCollapsed)
|
||||||
EVT_DATAVIEW_SELECTION_CHANGED(ID_MUSIC_CTRL, MyFrame::OnSelectionChanged)
|
EVT_DATAVIEW_SELECTION_CHANGED(ID_MUSIC_CTRL, MyFrame::OnSelectionChanged)
|
||||||
|
|
||||||
|
EVT_DATAVIEW_ITEM_START_EDITING(ID_MUSIC_CTRL, MyFrame::OnStartEditing)
|
||||||
EVT_DATAVIEW_ITEM_EDITING_STARTED(ID_MUSIC_CTRL, MyFrame::OnEditingStarted)
|
EVT_DATAVIEW_ITEM_EDITING_STARTED(ID_MUSIC_CTRL, MyFrame::OnEditingStarted)
|
||||||
EVT_DATAVIEW_ITEM_EDITING_DONE(ID_MUSIC_CTRL, MyFrame::OnEditingDone)
|
EVT_DATAVIEW_ITEM_EDITING_DONE(ID_MUSIC_CTRL, MyFrame::OnEditingDone)
|
||||||
|
|
||||||
@@ -842,6 +844,20 @@ void MyFrame::OnExpanding( wxDataViewEvent &event )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MyFrame::OnStartEditing( wxDataViewEvent &event )
|
||||||
|
{
|
||||||
|
wxString artist = m_music_model->GetArtist( event.GetItem() );
|
||||||
|
if (artist == "Ludwig van Beethoven")
|
||||||
|
{
|
||||||
|
event.Veto();
|
||||||
|
|
||||||
|
if (!m_log)
|
||||||
|
return;
|
||||||
|
|
||||||
|
wxLogMessage( "wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING vetoed, Item: %s", artist );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MyFrame::OnEditingStarted( wxDataViewEvent &event )
|
void MyFrame::OnEditingStarted( wxDataViewEvent &event )
|
||||||
{
|
{
|
||||||
if (!m_log)
|
if (!m_log)
|
||||||
|
@@ -69,6 +69,15 @@ wxString MyMusicTreeModel::GetTitle( const wxDataViewItem &item ) const
|
|||||||
return node->m_title;
|
return node->m_title;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxString MyMusicTreeModel::GetArtist( const wxDataViewItem &item ) const
|
||||||
|
{
|
||||||
|
MyMusicTreeModelNode *node = (MyMusicTreeModelNode*) item.GetID();
|
||||||
|
if (!node) // happens if item.IsOk()==false
|
||||||
|
return wxEmptyString;
|
||||||
|
|
||||||
|
return node->m_artist;
|
||||||
|
}
|
||||||
|
|
||||||
int MyMusicTreeModel::GetYear( const wxDataViewItem &item ) const
|
int MyMusicTreeModel::GetYear( const wxDataViewItem &item ) const
|
||||||
{
|
{
|
||||||
MyMusicTreeModelNode *node = (MyMusicTreeModelNode*) item.GetID();
|
MyMusicTreeModelNode *node = (MyMusicTreeModelNode*) item.GetID();
|
||||||
|
@@ -124,6 +124,7 @@ public:
|
|||||||
// helper method for wxLog
|
// helper method for wxLog
|
||||||
|
|
||||||
wxString GetTitle( const wxDataViewItem &item ) const;
|
wxString GetTitle( const wxDataViewItem &item ) const;
|
||||||
|
wxString GetArtist( const wxDataViewItem &item ) const;
|
||||||
int GetYear( const wxDataViewItem &item ) const;
|
int GetYear( const wxDataViewItem &item ) const;
|
||||||
|
|
||||||
// helper methods to change the model
|
// helper methods to change the model
|
||||||
|
@@ -835,7 +835,153 @@ wxgtk_tree_model_has_default_sort_func (GtkTreeSortable *sortable)
|
|||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// define new GTK+ class wxGtkRendererRenderer
|
// define new GTK+ class GtkWxRendererText
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
#define GTK_TYPE_WX_CELL_RENDERER_TEXT (gtk_wx_cell_renderer_text_get_type ())
|
||||||
|
#define GTK_WX_CELL_RENDERER_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_WX_CELL_RENDERER_TEXT, GtkWxCellRendererText))
|
||||||
|
#define GTK_WX_CELL_RENDERER_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_WX_CELL_RENDERER_TEXT, GtkWxCellRendererTextClass))
|
||||||
|
#define GTK_IS_WX_CELL_RENDERER_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_WX_CELL_RENDERER_TEXT))
|
||||||
|
#define GTK_IS_WX_CELL_RENDERER_TEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_WX_CELL_RENDERER_TEXT))
|
||||||
|
#define GTK_WX_CELL_RENDERER_TEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_WX_CELL_RENDERER_TEXT, GtkWxCellRendererTextClass))
|
||||||
|
|
||||||
|
GType gtk_wx_cell_renderer_text_get_type (void);
|
||||||
|
|
||||||
|
typedef struct _GtkWxCellRendererText GtkWxCellRendererText;
|
||||||
|
typedef struct _GtkWxCellRendererTextClass GtkWxCellRendererTextClass;
|
||||||
|
|
||||||
|
struct _GtkWxCellRendererText
|
||||||
|
{
|
||||||
|
GtkCellRendererText parent;
|
||||||
|
|
||||||
|
wxDataViewRenderer *wx_renderer;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _GtkWxCellRendererTextClass
|
||||||
|
{
|
||||||
|
GtkCellRendererTextClass cell_parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static GtkWxCellRendererText *gtk_wx_cell_renderer_text_new (void);
|
||||||
|
static void gtk_wx_cell_renderer_text_init (
|
||||||
|
GtkWxCellRendererText *cell );
|
||||||
|
static void gtk_wx_cell_renderer_text_class_init(
|
||||||
|
GtkWxCellRendererTextClass *klass );
|
||||||
|
static void gtk_wx_cell_renderer_text_finalize (
|
||||||
|
GObject *object );
|
||||||
|
static GtkCellEditable *gtk_wx_cell_renderer_text_start_editing(
|
||||||
|
GtkCellRenderer *cell,
|
||||||
|
GdkEvent *event,
|
||||||
|
GtkWidget *widget,
|
||||||
|
const gchar *path,
|
||||||
|
GdkRectangle *background_area,
|
||||||
|
GdkRectangle *cell_area,
|
||||||
|
GtkCellRendererState flags );
|
||||||
|
|
||||||
|
|
||||||
|
static GObjectClass *text_cell_parent_class = NULL;
|
||||||
|
static GObjectClass *text_cell_grand_parent_class = NULL;
|
||||||
|
|
||||||
|
} // extern "C"
|
||||||
|
|
||||||
|
GType
|
||||||
|
gtk_wx_cell_renderer_text_get_type (void)
|
||||||
|
{
|
||||||
|
static GType cell_wx_type = 0;
|
||||||
|
|
||||||
|
if (!cell_wx_type)
|
||||||
|
{
|
||||||
|
const GTypeInfo cell_wx_info =
|
||||||
|
{
|
||||||
|
sizeof (GtkWxCellRendererTextClass),
|
||||||
|
NULL, /* base_init */
|
||||||
|
NULL, /* base_finalize */
|
||||||
|
(GClassInitFunc) gtk_wx_cell_renderer_text_class_init,
|
||||||
|
NULL, /* class_finalize */
|
||||||
|
NULL, /* class_data */
|
||||||
|
sizeof (GtkWxCellRendererText),
|
||||||
|
0, /* n_preallocs */
|
||||||
|
(GInstanceInitFunc) gtk_wx_cell_renderer_text_init,
|
||||||
|
};
|
||||||
|
|
||||||
|
cell_wx_type = g_type_register_static( GTK_TYPE_CELL_RENDERER_TEXT,
|
||||||
|
"GtkWxCellRendererText", &cell_wx_info, (GTypeFlags)0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
return cell_wx_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_wx_cell_renderer_text_init (GtkWxCellRendererText *cell)
|
||||||
|
{
|
||||||
|
cell->wx_renderer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_wx_cell_renderer_text_class_init (GtkWxCellRendererTextClass *klass)
|
||||||
|
{
|
||||||
|
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||||
|
GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (klass);
|
||||||
|
|
||||||
|
text_cell_parent_class = (GObjectClass*) g_type_class_peek_parent (klass);
|
||||||
|
|
||||||
|
object_class->finalize = gtk_wx_cell_renderer_text_finalize;
|
||||||
|
|
||||||
|
cell_class->start_editing = gtk_wx_cell_renderer_text_start_editing;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_wx_cell_renderer_text_finalize (GObject *object)
|
||||||
|
{
|
||||||
|
/* must chain up */
|
||||||
|
(* G_OBJECT_CLASS (text_cell_parent_class)->finalize) (object);
|
||||||
|
}
|
||||||
|
|
||||||
|
GtkWxCellRendererText*
|
||||||
|
gtk_wx_cell_renderer_text_new (void)
|
||||||
|
{
|
||||||
|
return (GtkWxCellRendererText*) g_object_new (GTK_TYPE_WX_CELL_RENDERER_TEXT, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GtkCellEditable *gtk_wx_cell_renderer_text_start_editing(
|
||||||
|
GtkCellRenderer *gtk_renderer,
|
||||||
|
GdkEvent *gdk_event,
|
||||||
|
GtkWidget *widget,
|
||||||
|
const gchar *path,
|
||||||
|
GdkRectangle *background_area,
|
||||||
|
GdkRectangle *cell_area,
|
||||||
|
GtkCellRendererState flags )
|
||||||
|
{
|
||||||
|
GtkWxCellRendererText *wxgtk_renderer = (GtkWxCellRendererText *) gtk_renderer;
|
||||||
|
wxDataViewRenderer *wx_renderer = wxgtk_renderer->wx_renderer;
|
||||||
|
|
||||||
|
GtkTreePath *treepath = gtk_tree_path_new_from_string( path );
|
||||||
|
GtkTreeIter iter;
|
||||||
|
wx_renderer->GetOwner()->GetOwner()->GtkGetInternal()->get_iter( &iter, treepath );
|
||||||
|
wxDataViewItem item( (void*) iter.user_data );;
|
||||||
|
gtk_tree_path_free( treepath );
|
||||||
|
|
||||||
|
wxDataViewColumn *column = wx_renderer->GetOwner();
|
||||||
|
wxDataViewCtrl *dv = column->GetOwner();
|
||||||
|
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING, dv->GetId() );
|
||||||
|
event.SetDataViewColumn( column );
|
||||||
|
event.SetModel( dv->GetModel() );
|
||||||
|
event.SetColumn( wx_renderer->GetOwner()->GetModelColumn() );
|
||||||
|
event.SetItem( item );
|
||||||
|
dv->HandleWindowEvent( event );
|
||||||
|
|
||||||
|
if (event.IsAllowed())
|
||||||
|
return GTK_CELL_RENDERER_CLASS(text_cell_parent_class)->
|
||||||
|
start_editing( gtk_renderer, gdk_event, widget, path, background_area, cell_area, flags );
|
||||||
|
else
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
// define new GTK+ class GtkWxCellRenderer
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -975,8 +1121,6 @@ gtk_wx_cell_renderer_new (void)
|
|||||||
return (GtkCellRenderer*) g_object_new (GTK_TYPE_WX_CELL_RENDERER, NULL);
|
return (GtkCellRenderer*) g_object_new (GTK_TYPE_WX_CELL_RENDERER, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static GtkCellEditable *gtk_wx_cell_renderer_start_editing(
|
static GtkCellEditable *gtk_wx_cell_renderer_start_editing(
|
||||||
GtkCellRenderer *renderer,
|
GtkCellRenderer *renderer,
|
||||||
GdkEvent *WXUNUSED(event),
|
GdkEvent *WXUNUSED(event),
|
||||||
@@ -1383,6 +1527,9 @@ static void
|
|||||||
wxgtk_renderer_editing_started( GtkCellRenderer *WXUNUSED(cell), GtkCellEditable *editable,
|
wxgtk_renderer_editing_started( GtkCellRenderer *WXUNUSED(cell), GtkCellEditable *editable,
|
||||||
gchar *path, wxDataViewRenderer *wxrenderer )
|
gchar *path, wxDataViewRenderer *wxrenderer )
|
||||||
{
|
{
|
||||||
|
if (!editable)
|
||||||
|
return;
|
||||||
|
|
||||||
wxDataViewColumn *column = wxrenderer->GetOwner();
|
wxDataViewColumn *column = wxrenderer->GetOwner();
|
||||||
wxDataViewCtrl *dv = column->GetOwner();
|
wxDataViewCtrl *dv = column->GetOwner();
|
||||||
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, dv->GetId() );
|
wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, dv->GetId() );
|
||||||
@@ -1585,7 +1732,9 @@ wxDataViewTextRenderer::wxDataViewTextRenderer( const wxString &varianttype, wxD
|
|||||||
int align ) :
|
int align ) :
|
||||||
wxDataViewRenderer( varianttype, mode, align )
|
wxDataViewRenderer( varianttype, mode, align )
|
||||||
{
|
{
|
||||||
m_renderer = (GtkCellRenderer*) gtk_cell_renderer_text_new();
|
GtkWxCellRendererText *text_renderer = gtk_wx_cell_renderer_text_new();
|
||||||
|
text_renderer->wx_renderer = this;
|
||||||
|
m_renderer = (GtkCellRenderer*) text_renderer;
|
||||||
|
|
||||||
if (mode & wxDATAVIEW_CELL_EDITABLE)
|
if (mode & wxDATAVIEW_CELL_EDITABLE)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user