#include "wx/gtk/dc.h"
#include "wx/gtk/dcclient.h"
+#include "wx/gtk/private/gdkconv.h"
+using namespace wxGTKImpl;
+
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
wxDataViewCtrl* GetOwner() { return m_owner; }
GtkWxTreeModel* GetGtkModel() { return m_gtk_model; }
+ // item can be deleted already in the model
+ int GetIndexOf( const wxDataViewItem &parent, const wxDataViewItem &item );
+
protected:
void InitTree();
wxGtkTreeModelNode *FindNode( const wxDataViewItem &item );
gtype = G_TYPE_STRING;
else
{
- gtype = G_TYPE_STRING;
- // wxFAIL_MSG( wxT("non-string columns not supported yet") );
+ gtype = G_TYPE_POINTER;
+ // wxFAIL_MSG( wxT("non-string columns not supported for searching yet") );
}
return gtype;
{
GtkWxTreeModel *wxtree_model = (GtkWxTreeModel *) tree_model;
g_return_val_if_fail (GTK_IS_WX_TREE_MODEL (wxtree_model), FALSE);
- g_return_val_if_fail (wxtree_model->stamp == parent->stamp, FALSE);
+ if (parent)
+ {
+ g_return_val_if_fail (wxtree_model->stamp == parent->stamp, FALSE);
+ }
return wxtree_model->internal->iter_children( iter, parent );
}
// rect.width -= renderer->xpad * 2;
// rect.height -= renderer->ypad * 2;
-// wxRect renderrect( rect.x, rect.y, rect.width, rect.height );
- wxRect renderrect( cell_area->x, cell_area->y, cell_area->width, cell_area->height );
+// wxRect renderrect(wxRectFromGDKRect(&rect));
+ wxRect renderrect(wxRectFromGDKRect(cell_area));
GtkTreePath *treepath = gtk_tree_path_new_from_string( path );
GtkTreeIter iter;
GtkWxCellRenderer *wxrenderer = (GtkWxCellRenderer *) renderer;
wxDataViewCustomRenderer *cell = wxrenderer->cell;
- cell->window = window;
- cell->widget = widget;
- cell->background_area = (void*) background_area;
- cell->cell_area = (void*) cell_area;
- cell->expose_area = (void*) expose_area;
- cell->flags = (int) flags;
+ cell->GTKStashRenderParams(window, widget,
+ background_area, expose_area, flags);
- GdkRectangle rect;
- gtk_wx_cell_renderer_get_size (renderer, widget, cell_area,
- &rect.x,
- &rect.y,
- &rect.width,
- &rect.height);
+ wxRect rect(wxRectFromGDKRect(cell_area));
+ rect = rect.Deflate(renderer->xpad, renderer->ypad);
- rect.x += cell_area->x;
- rect.y += cell_area->y;
- rect.width -= renderer->xpad * 2;
- rect.height -= renderer->ypad * 2;
+ wxWindowDC* dc = (wxWindowDC*) cell->GetDC();
+ wxWindowDCImpl *impl = (wxWindowDCImpl *) dc->GetImpl();
- GdkRectangle dummy;
- if (gdk_rectangle_intersect (expose_area, &rect, &dummy))
+ // Reinitialize wxWindowDC's GDK window if drawing occurs into a different
+ // window such as a DnD drop window.
+ if (window != impl->m_gdkwindow)
{
- wxRect renderrect( rect.x, rect.y, rect.width, rect.height );
- wxWindowDC* dc = (wxWindowDC*) cell->GetDC();
- wxWindowDCImpl *impl = (wxWindowDCImpl *) dc->GetImpl();
-
- // Reinitialize wxWindowDC's GDK window if drawing occurs into a different
- // window such as a DnD drop window.
- if (window != impl->m_gdkwindow)
- {
- impl->Destroy();
- impl->m_gdkwindow = window;
- impl->SetUpDC();
- }
-
- int state = 0;
- if (flags & GTK_CELL_RENDERER_SELECTED)
- state |= wxDATAVIEW_CELL_SELECTED;
- if (flags & GTK_CELL_RENDERER_PRELIT)
- state |= wxDATAVIEW_CELL_PRELIT;
- if (flags & GTK_CELL_RENDERER_INSENSITIVE)
- state |= wxDATAVIEW_CELL_INSENSITIVE;
- if (flags & GTK_CELL_RENDERER_INSENSITIVE)
- state |= wxDATAVIEW_CELL_INSENSITIVE;
- if (flags & GTK_CELL_RENDERER_FOCUSED)
- state |= wxDATAVIEW_CELL_FOCUSED;
- cell->Render( renderrect, dc, state );
+ impl->Destroy();
+ impl->m_gdkwindow = window;
+ impl->SetUpDC();
}
+
+ int state = 0;
+ if (flags & GTK_CELL_RENDERER_SELECTED)
+ state |= wxDATAVIEW_CELL_SELECTED;
+ if (flags & GTK_CELL_RENDERER_PRELIT)
+ state |= wxDATAVIEW_CELL_PRELIT;
+ if (flags & GTK_CELL_RENDERER_INSENSITIVE)
+ state |= wxDATAVIEW_CELL_INSENSITIVE;
+ if (flags & GTK_CELL_RENDERER_INSENSITIVE)
+ state |= wxDATAVIEW_CELL_INSENSITIVE;
+ if (flags & GTK_CELL_RENDERER_FOCUSED)
+ state |= wxDATAVIEW_CELL_FOCUSED;
+ cell->WXCallRender( rect, dc, state );
}
static gboolean
rect.width -= renderer->xpad * 2;
rect.height -= renderer->ypad * 2;
- wxRect renderrect( rect.x, rect.y, rect.width, rect.height );
+ wxRect renderrect(wxRectFromGDKRect(&rect));
wxDataViewModel *model = cell->GetOwner()->GetOwner()->GetModel();
bool wxGtkDataViewModelNotifier::ItemDeleted( const wxDataViewItem &parent, const wxDataViewItem &item )
{
+#if 0
+ // using _get_path for a deleted item cannot be
+ // a good idea
GtkTreeIter iter;
iter.stamp = m_wxgtk_model->stamp;
iter.user_data = (gpointer) item.GetID();
-
GtkTreePath *path = wxgtk_tree_model_get_path(
GTK_TREE_MODEL(m_wxgtk_model), &iter );
+#else
+ // so get the path from the parent
+ GtkTreeIter iter;
+ iter.stamp = m_wxgtk_model->stamp;
+ iter.user_data = (gpointer) parent.GetID();
+ GtkTreePath *path = wxgtk_tree_model_get_path(
+ GTK_TREE_MODEL(m_wxgtk_model), &iter );
+ // and add the final index ourselves
+ int index = m_owner->GtkGetInternal()->GetIndexOf( parent, item );
+ gtk_tree_path_append_index( path, index );
+#endif
+
gtk_tree_model_row_deleted(
GTK_TREE_MODEL(m_wxgtk_model), path );
gtk_tree_path_free (path);
return m_alignment;
}
+void wxDataViewRenderer::EnableEllipsize(wxEllipsizeMode mode)
+{
+#ifdef __WXGTK26__
+ if ( gtk_check_version(2, 6, 0) != NULL )
+ return;
+
+ GtkCellRendererText * const rend = GtkGetTextRenderer();
+ if ( !rend )
+ return;
+
+ // we use the same values in wxEllipsizeMode as PangoEllipsizeMode so we
+ // can just cast between them
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, PANGO_TYPE_ELLIPSIZE_MODE );
+ g_value_set_enum( &gvalue, static_cast<PangoEllipsizeMode>(mode) );
+ g_object_set_property( G_OBJECT(rend), "ellipsize", &gvalue );
+ g_value_unset( &gvalue );
+#else // GTK < 2.6
+ wxUnusedVar(mode);
+#endif // GTK 2.6/before
+}
+
+wxEllipsizeMode wxDataViewRenderer::GetEllipsizeMode() const
+{
+#ifdef __WXGTK26__
+ if ( gtk_check_version(2, 6, 0) != NULL )
+ return wxELLIPSIZE_NONE;
+
+ GtkCellRendererText * const rend = GtkGetTextRenderer();
+ if ( !rend )
+ return wxELLIPSIZE_NONE;
+
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, PANGO_TYPE_ELLIPSIZE_MODE );
+ g_object_get_property( G_OBJECT(rend), "ellipsize", &gvalue );
+ wxEllipsizeMode
+ mode = static_cast<wxEllipsizeMode>(g_value_get_enum( &gvalue ));
+ g_value_unset( &gvalue );
+
+ return mode;
+#else // GTK < 2.6
+ return wxELLIPSIZE_NONE;
+#endif // GTK 2.6/before
+}
+
void
wxDataViewRenderer::GtkOnTextEdited(const gchar *itempath, const wxString& str)
{
unsigned col)
{
wxDataViewModel *model = GetOwner()->GetOwner()->GetModel();
- model->SetValue( value, item, col );
- model->ValueChanged( item, col );
+ model->ChangeValue( value, item, col );
}
// ---------------------------------------------------------
}
+namespace
+{
+
+// helper function used by wxDataViewTextRenderer and
+// wxDataViewCustomRenderer::RenderText(): it applies the attributes to the
+// given text renderer and returns true if anything was done
+bool GtkApplyAttr(GtkCellRendererText *renderer, const wxDataViewItemAttr& attr)
+{
+ bool usingDefaultAttrs = true;
+ if (attr.HasColour())
+ {
+ const GdkColor * const gcol = attr.GetColour().GetColor();
+
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, GDK_TYPE_COLOR );
+ g_value_set_boxed( &gvalue, gcol );
+ g_object_set_property( G_OBJECT(renderer), "foreground_gdk", &gvalue );
+ g_value_unset( &gvalue );
+
+ usingDefaultAttrs = false;
+ }
+ else
+ {
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, G_TYPE_BOOLEAN );
+ g_value_set_boolean( &gvalue, FALSE );
+ g_object_set_property( G_OBJECT(renderer), "foreground-set", &gvalue );
+ g_value_unset( &gvalue );
+ }
+
+ if (attr.GetItalic())
+ {
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, PANGO_TYPE_STYLE );
+ g_value_set_enum( &gvalue, PANGO_STYLE_ITALIC );
+ g_object_set_property( G_OBJECT(renderer), "style", &gvalue );
+ g_value_unset( &gvalue );
+
+ usingDefaultAttrs = false;
+ }
+ else
+ {
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, G_TYPE_BOOLEAN );
+ g_value_set_boolean( &gvalue, FALSE );
+ g_object_set_property( G_OBJECT(renderer), "style-set", &gvalue );
+ g_value_unset( &gvalue );
+ }
+
+
+ if (attr.GetBold())
+ {
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, PANGO_TYPE_WEIGHT );
+ g_value_set_enum( &gvalue, PANGO_WEIGHT_BOLD );
+ g_object_set_property( G_OBJECT(renderer), "weight", &gvalue );
+ g_value_unset( &gvalue );
+
+ usingDefaultAttrs = false;
+ }
+ else
+ {
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, G_TYPE_BOOLEAN );
+ g_value_set_boolean( &gvalue, FALSE );
+ g_object_set_property( G_OBJECT(renderer), "weight-set", &gvalue );
+ g_value_unset( &gvalue );
+ }
+
+#if 0
+ if (attr.HasBackgroundColour())
+ {
+ wxColour colour = attr.GetBackgroundColour();
+ const GdkColor * const gcol = colour.GetColor();
+
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, GDK_TYPE_COLOR );
+ g_value_set_boxed( &gvalue, gcol );
+ g_object_set_property( G_OBJECT(renderer), "cell-background_gdk", &gvalue );
+ g_value_unset( &gvalue );
+ }
+ else
+ {
+ GValue gvalue = { 0, };
+ g_value_init( &gvalue, G_TYPE_BOOLEAN );
+ g_value_set_boolean( &gvalue, FALSE );
+ g_object_set_property( G_OBJECT(renderer), "cell-background-set", &gvalue );
+ g_value_unset( &gvalue );
+ }
+#endif
+
+ return !usingDefaultAttrs;
+}
+
+} // anonymous namespace
+
IMPLEMENT_CLASS(wxDataViewTextRenderer, wxDataViewRenderer)
wxDataViewTextRenderer::wxDataViewTextRenderer( const wxString &varianttype, wxDataViewCellMode mode,
g_value_unset( &gvalue );
}
+bool wxDataViewTextRenderer::GtkSetAttr(const wxDataViewItemAttr& attr)
+{
+ return GtkApplyAttr(GtkGetTextRenderer(), attr);
+}
+
+GtkCellRendererText *wxDataViewTextRenderer::GtkGetTextRenderer() const
+{
+ return GTK_CELL_RENDERER_TEXT(m_renderer);
+}
+
// ---------------------------------------------------------
// wxDataViewBitmapRenderer
// ---------------------------------------------------------
unsigned int model_col = cell->GetOwner()->GetModelColumn();
- model->SetValue( value, item, model_col );
- model->ValueChanged( item, model_col );
+ model->ChangeValue( value, item, model_col );
}
IMPLEMENT_CLASS(wxDataViewToggleRenderer, wxDataViewRenderer)
IMPLEMENT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
wxDataViewCustomRenderer::wxDataViewCustomRenderer( const wxString &varianttype,
- wxDataViewCellMode mode, int align,
- bool no_init ) :
- wxDataViewRenderer( varianttype, mode, align )
+ wxDataViewCellMode mode,
+ int align,
+ bool no_init )
+ : wxDataViewCustomRendererBase( varianttype, mode, align )
{
m_dc = NULL;
m_text_renderer = NULL;
Init(mode, align);
}
-void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset,
- wxRect WXUNUSED(cell), wxDC *WXUNUSED(dc), int WXUNUSED(state) )
+GtkCellRendererText *wxDataViewCustomRenderer::GtkGetTextRenderer() const
+{
+ if ( !m_text_renderer )
+ {
+ // we create it on demand so need to do it even from a const function
+ const_cast<wxDataViewCustomRenderer *>(this)->
+ m_text_renderer = GTK_CELL_RENDERER_TEXT(gtk_cell_renderer_text_new());
+ }
+
+ return m_text_renderer;
+}
+
+void wxDataViewCustomRenderer::RenderText( const wxString &text,
+ int xoffset,
+ wxRect cell,
+ wxDC *WXUNUSED(dc),
+ int WXUNUSED(state) )
{
-#if 0
- wxDataViewCtrl *view = GetOwner()->GetOwner();
- wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ?
- wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) :
- view->GetForegroundColour();
- dc->SetTextForeground(col);
- dc->DrawText( text, cell.x + xoffset, cell.y + ((cell.height - dc->GetCharHeight()) / 2));
-#else
- if (!m_text_renderer)
- m_text_renderer = gtk_cell_renderer_text_new();
+
+ GtkCellRendererText * const textRenderer = GtkGetTextRenderer();
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_STRING );
g_value_set_string( &gvalue, wxGTK_CONV_FONT( text, GetOwner()->GetOwner()->GetFont() ) );
- g_object_set_property( G_OBJECT(m_text_renderer), "text", &gvalue );
+ g_object_set_property( G_OBJECT(textRenderer), "text", &gvalue );
g_value_unset( &gvalue );
- ((GdkRectangle*) cell_area)->x += xoffset;
- ((GdkRectangle*) cell_area)->width -= xoffset;
+ GtkApplyAttr(textRenderer, GetAttr());
- gtk_cell_renderer_render( m_text_renderer,
- window,
- widget,
- (GdkRectangle*) background_area,
- (GdkRectangle*) cell_area,
- (GdkRectangle*) expose_area,
- (GtkCellRendererState) flags );
+ GdkRectangle cell_area;
+ wxRectToGDKRect(cell, cell_area);
+ cell_area.x += xoffset;
+ cell_area.width -= xoffset;
- ((GdkRectangle*) cell_area)->x -= xoffset;
- ((GdkRectangle*) cell_area)->width += xoffset;
-#endif
+ gtk_cell_renderer_render( GTK_CELL_RENDERER(textRenderer),
+ m_renderParams.window,
+ m_renderParams.widget,
+ m_renderParams.background_area,
+ &cell_area,
+ m_renderParams.expose_area,
+ (GtkCellRendererState) m_renderParams.flags );
}
bool wxDataViewCustomRenderer::Init(wxDataViewCellMode mode, int align)
{
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_STRING );
- g_value_set_string( &gvalue, wxGTK_CONV_FONT( value.GetString(), GetOwner()->GetOwner()->GetFont() ) );
+ g_value_set_string(&gvalue,
+ wxGTK_CONV_FONT(value.GetString(),
+ GetOwner()->GetOwner()->GetFont()));
g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue );
g_value_unset( &gvalue );
}
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_STRING );
g_object_get_property( G_OBJECT(m_renderer), "text", &gvalue );
- wxString temp = wxGTK_CONV_BACK_FONT( g_value_get_string( &gvalue ),
- const_cast<wxDataViewChoiceRenderer*>(this)->GetOwner()->GetOwner()->GetFont() );
+ wxString temp = wxGTK_CONV_BACK_FONT(g_value_get_string(&gvalue),
+ GetOwner()->GetOwner()->GetFont());
g_value_unset( &gvalue );
value = temp;
g_value_unset( &gvalue );
}
+// ----------------------------------------------------------------------------
+// wxDataViewChoiceByIndexRenderer
+// ----------------------------------------------------------------------------
+
+wxDataViewChoiceByIndexRenderer::wxDataViewChoiceByIndexRenderer( const wxArrayString &choices,
+ wxDataViewCellMode mode, int alignment ) :
+ wxDataViewChoiceRenderer( choices, mode, alignment )
+{
+}
+
+void wxDataViewChoiceByIndexRenderer::GtkOnTextEdited(const gchar *itempath, const wxString& str)
+{
+ wxVariant value( (long) GetChoices().Index( str ) );
+
+ if (!Validate( value ))
+ return;
+
+ GtkTreePath *path = gtk_tree_path_new_from_string( itempath );
+ GtkTreeIter iter;
+ GetOwner()->GetOwner()->GtkGetInternal()->get_iter( &iter, path );
+ wxDataViewItem item( (void*) iter.user_data );;
+ gtk_tree_path_free( path );
+
+ GtkOnCellChanged(value, item, GetOwner()->GetModelColumn());
+}
+
+bool wxDataViewChoiceByIndexRenderer::SetValue( const wxVariant &value )
+{
+ wxVariant string_value = GetChoice( value.GetLong() );
+ return wxDataViewChoiceRenderer::SetValue( string_value );
+}
+
+bool wxDataViewChoiceByIndexRenderer::GetValue( wxVariant &value ) const
+{
+ wxVariant string_value;
+ if (!wxDataViewChoiceRenderer::GetValue( string_value ))
+ return false;
+
+ value = (long) GetChoices().Index( string_value.GetString() );
+ return true;
+}
+
// ---------------------------------------------------------
// wxDataViewDateRenderer
// ---------------------------------------------------------
void wxDataViewDateRendererPopupTransient::OnCalendar( wxCalendarEvent &event )
{
- wxDateTime date = event.GetDate();
- wxVariant value = date;
- m_model->SetValue( value, m_item, m_col );
- m_model->ValueChanged( m_item, m_col );
+ m_model->ChangeValue( event.GetDate(), m_item, m_col );
DismissAndNotify();
}
cell->SetValue( value );
- // deal with attributes
- wxDataViewItemAttr attr;
- if ( !wx_model->GetAttr( item, cell->GetOwner()->GetModelColumn(), attr )
- && cell->GtkIsUsingDefaultAttrs() )
- {
- // no custom attributes specified and we're already using the default
- // ones -- nothing to do
+ // deal with attributes: if the renderer doesn't support them at all, we
+ // don't even need to query the model for them
+ if ( !cell->GtkSupportsAttrs() )
return;
- }
-
- bool usingDefaultAttrs = true;
- if (attr.HasColour())
- {
- const GdkColor * const gcol = attr.GetColour().GetColor();
-
- GValue gvalue = { 0, };
- g_value_init( &gvalue, GDK_TYPE_COLOR );
- g_value_set_boxed( &gvalue, gcol );
- g_object_set_property( G_OBJECT(renderer), "foreground_gdk", &gvalue );
- g_value_unset( &gvalue );
-
- usingDefaultAttrs = false;
- }
- else
- {
- GValue gvalue = { 0, };
- g_value_init( &gvalue, G_TYPE_BOOLEAN );
- g_value_set_boolean( &gvalue, FALSE );
- g_object_set_property( G_OBJECT(renderer), "foreground-set", &gvalue );
- g_value_unset( &gvalue );
- }
-
- if (attr.GetItalic())
- {
- GValue gvalue = { 0, };
- g_value_init( &gvalue, PANGO_TYPE_STYLE );
- g_value_set_enum( &gvalue, PANGO_STYLE_ITALIC );
- g_object_set_property( G_OBJECT(renderer), "style", &gvalue );
- g_value_unset( &gvalue );
-
- usingDefaultAttrs = false;
- }
- else
- {
- GValue gvalue = { 0, };
- g_value_init( &gvalue, G_TYPE_BOOLEAN );
- g_value_set_boolean( &gvalue, FALSE );
- g_object_set_property( G_OBJECT(renderer), "style-set", &gvalue );
- g_value_unset( &gvalue );
- }
-
-
- if (attr.GetBold())
- {
- GValue gvalue = { 0, };
- g_value_init( &gvalue, PANGO_TYPE_WEIGHT );
- g_value_set_enum( &gvalue, PANGO_WEIGHT_BOLD );
- g_object_set_property( G_OBJECT(renderer), "weight", &gvalue );
- g_value_unset( &gvalue );
-
- usingDefaultAttrs = false;
- }
- else
- {
- GValue gvalue = { 0, };
- g_value_init( &gvalue, G_TYPE_BOOLEAN );
- g_value_set_boolean( &gvalue, FALSE );
- g_object_set_property( G_OBJECT(renderer), "weight-set", &gvalue );
- g_value_unset( &gvalue );
- }
-#if 0
- if (attr.HasBackgroundColour())
- {
- wxColour colour = attr.GetBackgroundColour();
- const GdkColor * const gcol = colour.GetColor();
-
- GValue gvalue = { 0, };
- g_value_init( &gvalue, GDK_TYPE_COLOR );
- g_value_set_boxed( &gvalue, gcol );
- g_object_set_property( G_OBJECT(renderer), "cell-background_gdk", &gvalue );
- g_value_unset( &gvalue );
- }
- else
+ // it can support attributes so check if this item has any
+ wxDataViewItemAttr attr;
+ if ( wx_model->GetAttr( item, cell->GetOwner()->GetModelColumn(), attr )
+ || !cell->GtkIsUsingDefaultAttrs() )
{
- GValue gvalue = { 0, };
- g_value_init( &gvalue, G_TYPE_BOOLEAN );
- g_value_set_boolean( &gvalue, FALSE );
- g_object_set_property( G_OBJECT(renderer), "cell-background-set", &gvalue );
- g_value_unset( &gvalue );
+ bool usingDefaultAttrs = !cell->GtkSetAttr(attr);
+ cell->GtkSetUsingDefaultAttrs(usingDefaultAttrs);
}
-#endif
-
- cell->GtkSetUsingDefaultAttrs(usingDefaultAttrs);
+ // else: no custom attributes specified and we're already using the default
+ // ones -- nothing to do
}
} // extern "C"
{
if (m_isConnected)
return;
-
+
if (GTK_WIDGET_REALIZED(GetOwner()->m_treeview))
{
GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column);
g_signal_connect(column->button, "button_press_event",
G_CALLBACK (gtk_dataview_header_button_press_callback), this);
+ // otherwise the event will be blocked by GTK+
+ gtk_tree_view_column_set_clickable( column, TRUE );
+
m_isConnected = true;
}
}
GtkTreePath *wxDataViewCtrlInternal::get_path( GtkTreeIter *iter )
{
+ // When this is called from ItemDeleted(), the item is already
+ // deleted in the model.
+
GtkTreePath *retval = gtk_tree_path_new ();
if (m_wx_model->IsVirtualListModel())
{
+ // iter is root, add nothing
+ if (!iter->user_data)
+ return retval;
+
// user_data is just the index +1
int i = ( (wxUIntPtr) iter->user_data ) -1;
gtk_tree_path_append_index (retval, i);
return TRUE;
}
- wxDataViewItem item( (void*) parent->user_data );
+
+ wxDataViewItem item;
+ if (parent)
+ item = wxDataViewItem( (void*) parent->user_data );
if (!m_wx_model->IsContainer( item ))
return FALSE;
}
}
+// item can be deleted already in the model
+int wxDataViewCtrlInternal::GetIndexOf( const wxDataViewItem &parent, const wxDataViewItem &item )
+{
+ if (m_wx_model->IsVirtualListModel())
+ {
+ return wxPtrToUInt(item.GetID()) - 1;
+ }
+ else
+ {
+ wxGtkTreeModelNode *parent_node = FindNode( parent );
+ wxGtkTreeModelChildren &children = parent_node->GetChildren();
+ size_t j;
+ for (j = 0; j < children.GetCount(); j++)
+ {
+ if (children[j] == item.GetID())
+ return j;
+ }
+ }
+ return -1;
+}
+
+
static wxGtkTreeModelNode*
wxDataViewCtrlInternal_FindNode( wxDataViewModel * model, wxGtkTreeModelNode *treeNode, const wxDataViewItem &item )
{
if( node && node->GetNodes().GetCount() != 0 )
{
int len = node->GetNodes().GetCount();
- wxGtkTreeModelNodes nodes = node->GetNodes();
+ wxGtkTreeModelNodes &nodes = node->GetNodes();
int j = 0;
for( ; j < len; j ++)
{
const wxPoint& pos, const wxSize& size,
long style, const wxValidator& validator )
{
- Init();
-
if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator ))
{
bool wxDataViewCtrl::AssociateModel( wxDataViewModel *model )
{
- if (GetModel())
- {
- delete m_internal;
- m_internal = NULL;
-
- delete m_notifier;
- m_notifier = NULL;
- }
+ wxDELETE(m_internal);
if (!wxDataViewCtrlBase::AssociateModel( model ))
return false;