]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dataview.cpp
1. don't assert if we're passed an empty defaultDir and full path in
[wxWidgets.git] / src / gtk / dataview.cpp
index 34f2ce3746a00192add0cce1f51c0ae5abcdf90c..37a761a59fc51321ba28727ce359592214a9f807 100644 (file)
@@ -247,10 +247,14 @@ wxgtk_list_store_get_column_type (GtkTreeModel *tree_model,
 
     GType gtype = G_TYPE_INVALID;
 
-    wxString wxtype = list_store->model->GetColType( (size_t) index );
+    wxString wxtype = list_store->model->GetColType( (unsigned int) index );
 
     if (wxtype == wxT("string"))
         gtype = G_TYPE_STRING;
+    else
+    {
+        wxFAIL_MSG( _T("non-string columns not supported yet") );
+    }
 
     return gtype;
 }
@@ -264,7 +268,7 @@ wxgtk_list_store_get_iter (GtkTreeModel *tree_model,
     g_return_val_if_fail (GTK_IS_WX_LIST_STORE (tree_model), FALSE);
     g_return_val_if_fail (gtk_tree_path_get_depth (path) > 0, FALSE);
 
-    size_t i = (size_t)gtk_tree_path_get_indices (path)[0];
+    unsigned int i = (unsigned int)gtk_tree_path_get_indices (path)[0];
 
     if (i >= list_store->model->GetNumberOfRows())
         return FALSE;
@@ -300,38 +304,22 @@ wxgtk_list_store_get_value (GtkTreeModel *tree_model,
     g_return_if_fail (GTK_IS_WX_LIST_STORE (tree_model) );
 
     wxDataViewListModel *model = list_store->model;
-    wxString mtype = model->GetColType( (size_t) column );
+    wxString mtype = model->GetColType( (unsigned int) column );
     if (mtype == wxT("string"))
     {
         wxVariant variant;
         g_value_init( value, G_TYPE_STRING );
-        model->GetValue( variant, (size_t) column, (size_t) iter->user_data );
-        g_value_set_string( value, wxGTK_CONV(variant.GetString()) );
+        model->GetValue( variant,
+                         (unsigned int) column,
+                         (unsigned int) iter->user_data );
+
+        // FIXME: we should support different encodings here
+        g_value_set_string( value, wxGTK_CONV_SYS(variant.GetString()) );
     }
     else
     {
+        wxFAIL_MSG( _T("non-string columns not supported yet") );
     }
-
-#if 0
-  GtkTreeDataList *list;
-  gint tmp_column = column;
-
-  g_return_if_fail (column < GTK_LIST_STORE (tree_model)->n_columns);
-  g_return_if_fail (GTK_LIST_STORE (tree_model)->stamp == iter->stamp);
-
-  list = G_SLIST (iter->user_data)->data;
-
-  while (tmp_column-- > 0 && list)
-    list = list->next;
-
-  if (list == NULL)
-    g_value_init (value, GTK_LIST_STORE (tree_model)->column_headers[column]);
-  else
-    _gtk_tree_data_list_node_to_value (list,
-                                       GTK_LIST_STORE (tree_model)->column_headers[column],
-                                       value);
-#endif
-
 }
 
 static gboolean
@@ -429,7 +417,7 @@ wxgtk_list_store_iter_parent (GtkTreeModel *tree_model,
 }
 
 //-----------------------------------------------------------------------------
-// define new GTK+ class wxGtkCellRenderer
+// define new GTK+ class wxGtkRendererRenderer
 //-----------------------------------------------------------------------------
 
 extern "C" {
@@ -451,7 +439,7 @@ struct _GtkWxCellRenderer
   GtkCellRenderer parent;
 
   /*< private >*/
-  wxDataViewCustomCell *cell;
+  wxDataViewCustomRenderer *cell;
   guint32 last_click;
 };
 
@@ -569,7 +557,7 @@ gtk_wx_cell_renderer_get_size (GtkCellRenderer *renderer,
                                gint            *height)
 {
     GtkWxCellRenderer *wxrenderer = (GtkWxCellRenderer *) renderer;
-    wxDataViewCustomCell *cell = wxrenderer->cell;
+    wxDataViewCustomRenderer *cell = wxrenderer->cell;
 
     wxSize size = cell->GetSize();
 
@@ -615,7 +603,7 @@ gtk_wx_cell_renderer_render (GtkCellRenderer      *renderer,
 
 {
     GtkWxCellRenderer *wxrenderer = (GtkWxCellRenderer *) renderer;
-    wxDataViewCustomCell *cell = wxrenderer->cell;
+    wxDataViewCustomRenderer *cell = wxrenderer->cell;
 
     GdkRectangle rect;
     gtk_wx_cell_renderer_get_size (renderer, widget, cell_area,
@@ -666,7 +654,7 @@ gtk_wx_cell_renderer_activate(
                         GtkCellRendererState     flags )
 {
     GtkWxCellRenderer *wxrenderer = (GtkWxCellRenderer *) renderer;
-    wxDataViewCustomCell *cell = wxrenderer->cell;
+    wxDataViewCustomRenderer *cell = wxrenderer->cell;
 
     GdkRectangle rect;
     gtk_wx_cell_renderer_get_size (renderer, widget, cell_area,
@@ -685,10 +673,10 @@ gtk_wx_cell_renderer_activate(
     wxDataViewListModel *model = cell->GetOwner()->GetOwner()->GetModel();
 
     GtkTreePath *treepath = gtk_tree_path_new_from_string( path );
-    size_t model_row = (size_t)gtk_tree_path_get_indices (treepath)[0];
+    unsigned int model_row = (unsigned int)gtk_tree_path_get_indices (treepath)[0];
     gtk_tree_path_free( treepath );
 
-    size_t model_col = cell->GetOwner()->GetModelColumn();
+    unsigned int model_col = cell->GetOwner()->GetModelColumn();
 
     if (event->type == GDK_BUTTON_PRESS)
     {
@@ -731,11 +719,11 @@ public:
 
     virtual bool RowAppended();
     virtual bool RowPrepended();
-    virtual bool RowInserted( size_t before );
-    virtual bool RowDeleted( size_t row );
-    virtual bool RowChanged( size_t row );
-    virtual bool ValueChanged( size_t col, size_t row );
-    virtual bool RowsReordered( size_t *new_order );
+    virtual bool RowInserted( unsigned int before );
+    virtual bool RowDeleted( unsigned int row );
+    virtual bool RowChanged( unsigned int row );
+    virtual bool ValueChanged( unsigned int col, unsigned int row );
+    virtual bool RowsReordered( unsigned int *new_order );
     virtual bool Cleared();
 
     GtkWxListStore      *m_gtk_store;
@@ -755,7 +743,7 @@ wxGtkDataViewListModelNotifier::wxGtkDataViewListModelNotifier(
 
 bool wxGtkDataViewListModelNotifier::RowAppended()
 {
-    size_t pos = m_wx_model->GetNumberOfRows()-1;
+    unsigned int pos = m_wx_model->GetNumberOfRows()-1;
 
     GtkTreeIter iter;
     iter.stamp = m_gtk_store->stamp;
@@ -783,7 +771,7 @@ bool wxGtkDataViewListModelNotifier::RowPrepended()
     return true;
 }
 
-bool wxGtkDataViewListModelNotifier::RowInserted( size_t before )
+bool wxGtkDataViewListModelNotifier::RowInserted( unsigned int before )
 {
     GtkTreeIter iter;
     iter.stamp = m_gtk_store->stamp;
@@ -797,7 +785,7 @@ bool wxGtkDataViewListModelNotifier::RowInserted( size_t before )
     return true;
 }
 
-bool wxGtkDataViewListModelNotifier::RowDeleted( size_t row )
+bool wxGtkDataViewListModelNotifier::RowDeleted( unsigned int row )
 {
     GtkTreePath *path = gtk_tree_path_new ();
     gtk_tree_path_append_index (path, (gint) row);
@@ -807,7 +795,7 @@ bool wxGtkDataViewListModelNotifier::RowDeleted( size_t row )
     return true;
 }
 
-bool wxGtkDataViewListModelNotifier::RowChanged( size_t row )
+bool wxGtkDataViewListModelNotifier::RowChanged( unsigned int row )
 {
     GtkTreeIter iter;
     iter.stamp = m_gtk_store->stamp;
@@ -819,7 +807,7 @@ bool wxGtkDataViewListModelNotifier::RowChanged( size_t row )
     return true;
 }
 
-bool wxGtkDataViewListModelNotifier::ValueChanged( size_t model_col, size_t model_row )
+bool wxGtkDataViewListModelNotifier::ValueChanged( unsigned int model_col, unsigned int model_row )
 {
     // This adds GTK+'s missing MVC logic for ValueChanged
     wxNode *node = GetOwner()->m_viewingColumns.GetFirst();
@@ -850,9 +838,9 @@ bool wxGtkDataViewListModelNotifier::ValueChanged( size_t model_col, size_t mode
     return true;
 }
 
-bool wxGtkDataViewListModelNotifier::RowsReordered( size_t *new_order )
+bool wxGtkDataViewListModelNotifier::RowsReordered( unsigned int *new_order )
 {
-    // Assume sizeof(size_t)= == sizeof(gint)
+    // Assume sizeof(unsigned int)= == sizeof(gint)
 
     GtkTreePath *path = gtk_tree_path_new ();
     gtk_tree_model_rows_reordered (GTK_TREE_MODEL (m_gtk_store), path, NULL, (gint*)new_order);
@@ -879,19 +867,19 @@ bool wxGtkDataViewListModelNotifier::Cleared()
 }
 
 // ---------------------------------------------------------
-// wxDataViewCell
+// wxDataViewRenderer
 // ---------------------------------------------------------
 
-IMPLEMENT_ABSTRACT_CLASS(wxDataViewCell, wxDataViewCellBase)
+IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer, wxDataViewRendererBase)
 
-wxDataViewCell::wxDataViewCell( const wxString &varianttype, wxDataViewCellMode mode ) :
-    wxDataViewCellBase( varianttype, mode )
+wxDataViewRenderer::wxDataViewRenderer( const wxString &varianttype, wxDataViewCellMode mode ) :
+    wxDataViewRendererBase( varianttype, mode )
 {
     m_renderer = NULL;
 }
 
 // ---------------------------------------------------------
-// wxDataViewTextCell
+// wxDataViewTextRenderer
 // ---------------------------------------------------------
 
 extern "C" {
@@ -902,7 +890,7 @@ static void wxGtkTextRendererEditedCallback( GtkCellRendererText *renderer,
 static void wxGtkTextRendererEditedCallback( GtkCellRendererText *renderer,
     gchar *arg1, gchar *arg2, gpointer user_data )
 {
-    wxDataViewTextCell *cell = (wxDataViewTextCell*) user_data;
+    wxDataViewTextRenderer *cell = (wxDataViewTextRenderer*) user_data;
 
     wxString tmp = wxGTK_CONV_BACK( arg2 );
     wxVariant value = tmp;
@@ -912,19 +900,19 @@ static void wxGtkTextRendererEditedCallback( GtkCellRendererText *renderer,
     wxDataViewListModel *model = cell->GetOwner()->GetOwner()->GetModel();
 
     GtkTreePath *path = gtk_tree_path_new_from_string( arg1 );
-    size_t model_row = (size_t)gtk_tree_path_get_indices (path)[0];
+    unsigned int model_row = (unsigned int)gtk_tree_path_get_indices (path)[0];
     gtk_tree_path_free( path );
 
-    size_t model_col = cell->GetOwner()->GetModelColumn();
+    unsigned int model_col = cell->GetOwner()->GetModelColumn();
 
     model->SetValue( value, model_col, model_row );
     model->ValueChanged( model_col, model_row );
 }
 
-IMPLEMENT_CLASS(wxDataViewTextCell, wxDataViewCell)
+IMPLEMENT_CLASS(wxDataViewTextRenderer, wxDataViewRenderer)
 
-wxDataViewTextCell::wxDataViewTextCell( const wxString &varianttype, wxDataViewCellMode mode ) :
-    wxDataViewCell( varianttype, mode )
+wxDataViewTextRenderer::wxDataViewTextRenderer( const wxString &varianttype, wxDataViewCellMode mode ) :
+    wxDataViewRenderer( varianttype, mode )
 {
     m_renderer = (void*) gtk_cell_renderer_text_new();
 
@@ -940,20 +928,20 @@ wxDataViewTextCell::wxDataViewTextCell( const wxString &varianttype, wxDataViewC
     }
 }
 
-bool wxDataViewTextCell::SetValue( const wxVariant &value )
+bool wxDataViewTextRenderer::SetValue( const wxVariant &value )
 {
     wxString tmp = value;
 
     GValue gvalue = { 0, };
     g_value_init( &gvalue, G_TYPE_STRING );
-    g_value_set_string( &gvalue, wxGTK_CONV( tmp ) );
+    g_value_set_string( &gvalue, wxGTK_CONV_FONT( tmp, GetOwner()->GetOwner()->GetFont() ) );
     g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue );
     g_value_unset( &gvalue );
 
     return true;
 }
 
-bool wxDataViewTextCell::GetValue( wxVariant &value )
+bool wxDataViewTextRenderer::GetValue( wxVariant &value )
 {
     GValue gvalue = { 0, };
     g_value_init( &gvalue, G_TYPE_STRING );
@@ -967,18 +955,18 @@ bool wxDataViewTextCell::GetValue( wxVariant &value )
 }
 
 // --------------------------------------------------------- 
-// wxDataViewBitmapCell
+// wxDataViewBitmapRenderer
 // --------------------------------------------------------- 
 
-IMPLEMENT_CLASS(wxDataViewBitmapCell, wxDataViewCell)
+IMPLEMENT_CLASS(wxDataViewBitmapRenderer, wxDataViewRenderer)
 
-wxDataViewBitmapCell::wxDataViewBitmapCell( const wxString &varianttype, wxDataViewCellMode mode ) :
-    wxDataViewCell( varianttype, mode )
+wxDataViewBitmapRenderer::wxDataViewBitmapRenderer( const wxString &varianttype, wxDataViewCellMode mode ) :
+    wxDataViewRenderer( varianttype, mode )
 {
     m_renderer = (void*) gtk_cell_renderer_pixbuf_new();
 }
 
-bool wxDataViewBitmapCell::SetValue( const wxVariant &value )
+bool wxDataViewBitmapRenderer::SetValue( const wxVariant &value )
 {
     if (value.GetType() == wxT("wxBitmap"))
     {
@@ -1019,13 +1007,13 @@ bool wxDataViewBitmapCell::SetValue( const wxVariant &value )
     return false;
 }
 
-bool wxDataViewBitmapCell::GetValue( wxVariant &value )
+bool wxDataViewBitmapRenderer::GetValue( wxVariant &value )
 {
     return false;
 }
     
 // ---------------------------------------------------------
-// wxDataViewToggleCell
+// wxDataViewToggleRenderer
 // ---------------------------------------------------------
 
 extern "C" {
@@ -1036,7 +1024,7 @@ static void wxGtkToggleRendererToggledCallback( GtkCellRendererToggle *renderer,
 static void wxGtkToggleRendererToggledCallback( GtkCellRendererToggle *renderer,
     gchar *path, gpointer user_data )
 {
-    wxDataViewToggleCell *cell = (wxDataViewToggleCell*) user_data;
+    wxDataViewToggleRenderer *cell = (wxDataViewToggleRenderer*) user_data;
 
     // get old value
     GValue gvalue = { 0, };
@@ -1054,20 +1042,20 @@ static void wxGtkToggleRendererToggledCallback( GtkCellRendererToggle *renderer,
     wxDataViewListModel *model = cell->GetOwner()->GetOwner()->GetModel();
 
     GtkTreePath *gtk_path = gtk_tree_path_new_from_string( path );
-    size_t model_row = (size_t)gtk_tree_path_get_indices (gtk_path)[0];
+    unsigned int model_row = (unsigned int)gtk_tree_path_get_indices (gtk_path)[0];
     gtk_tree_path_free( gtk_path );
 
-    size_t model_col = cell->GetOwner()->GetModelColumn();
+    unsigned int model_col = cell->GetOwner()->GetModelColumn();
 
     model->SetValue( value, model_col, model_row );
     model->ValueChanged( model_col, model_row );
 }
 
-IMPLEMENT_CLASS(wxDataViewToggleCell, wxDataViewCell)
+IMPLEMENT_CLASS(wxDataViewToggleRenderer, wxDataViewRenderer)
 
-wxDataViewToggleCell::wxDataViewToggleCell( const wxString &varianttype,
+wxDataViewToggleRenderer::wxDataViewToggleRenderer( const wxString &varianttype,
                         wxDataViewCellMode mode ) :
-    wxDataViewCell( varianttype, mode )
+    wxDataViewRenderer( varianttype, mode )
 {
     m_renderer = (void*) gtk_cell_renderer_toggle_new();
 
@@ -1093,7 +1081,7 @@ wxDataViewToggleCell::wxDataViewToggleCell( const wxString &varianttype,
     }
 }
 
-bool wxDataViewToggleCell::SetValue( const wxVariant &value )
+bool wxDataViewToggleRenderer::SetValue( const wxVariant &value )
 {
     bool tmp = value;
 
@@ -1106,7 +1094,7 @@ bool wxDataViewToggleCell::SetValue( const wxVariant &value )
     return true;
 }
 
-bool wxDataViewToggleCell::GetValue( wxVariant &value )
+bool wxDataViewToggleRenderer::GetValue( wxVariant &value )
 {
     GValue gvalue = { 0, };
     g_value_init( &gvalue, G_TYPE_BOOLEAN );
@@ -1120,7 +1108,7 @@ bool wxDataViewToggleCell::GetValue( wxVariant &value )
 }
 
 // ---------------------------------------------------------
-// wxDataViewCustomCell
+// wxDataViewCustomRenderer
 // ---------------------------------------------------------
 
 class wxDataViewCtrlDC: public wxWindowDC
@@ -1145,14 +1133,14 @@ public:
 };
 
 // ---------------------------------------------------------
-// wxDataViewCustomCell
+// wxDataViewCustomRenderer
 // ---------------------------------------------------------
 
-IMPLEMENT_CLASS(wxDataViewCustomCell, wxDataViewCell)
+IMPLEMENT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
 
-wxDataViewCustomCell::wxDataViewCustomCell( const wxString &varianttype,
+wxDataViewCustomRenderer::wxDataViewCustomRenderer( const wxString &varianttype,
                           wxDataViewCellMode mode, bool no_init ) :
-    wxDataViewCell( varianttype, mode )
+    wxDataViewRenderer( varianttype, mode )
 {
     m_dc = NULL;
 
@@ -1162,7 +1150,7 @@ wxDataViewCustomCell::wxDataViewCustomCell( const wxString &varianttype,
         Init();
 }
 
-bool wxDataViewCustomCell::Init()
+bool wxDataViewCustomRenderer::Init()
 {
     GtkWxCellRenderer *renderer = (GtkWxCellRenderer *) gtk_wx_cell_renderer_new();
     renderer->cell = this;
@@ -1181,13 +1169,13 @@ bool wxDataViewCustomCell::Init()
     return true;
 }
 
-wxDataViewCustomCell::~wxDataViewCustomCell()
+wxDataViewCustomRenderer::~wxDataViewCustomRenderer()
 {
     if (m_dc)
         delete m_dc;
 }
 
-wxDC *wxDataViewCustomCell::GetDC()
+wxDC *wxDataViewCustomRenderer::GetDC()
 {
     if (m_dc == NULL)
     {
@@ -1202,14 +1190,14 @@ wxDC *wxDataViewCustomCell::GetDC()
 }
 
 // ---------------------------------------------------------
-// wxDataViewProgressCell
+// wxDataViewProgressRenderer
 // ---------------------------------------------------------
 
-IMPLEMENT_CLASS(wxDataViewProgressCell, wxDataViewCustomCell)
+IMPLEMENT_CLASS(wxDataViewProgressRenderer, wxDataViewCustomRenderer)
 
-wxDataViewProgressCell::wxDataViewProgressCell( const wxString &label,
+wxDataViewProgressRenderer::wxDataViewProgressRenderer( const wxString &label,
     const wxString &varianttype, wxDataViewCellMode mode ) :
-    wxDataViewCustomCell( varianttype, mode, true )
+    wxDataViewCustomRenderer( varianttype, mode, true )
 {
     m_label = label;
     m_value = 0;
@@ -1221,7 +1209,9 @@ wxDataViewProgressCell::wxDataViewProgressCell( const wxString &label,
 
         GValue gvalue = { 0, };
         g_value_init( &gvalue, G_TYPE_STRING );
-        g_value_set_boolean( &gvalue, wxGTK_CONV(m_label) );
+
+        // FIXME: font encoding support
+        g_value_set_string( &gvalue, wxGTK_CONV_SYS(m_label) );
         g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue );
         g_value_unset( &gvalue );
     }
@@ -1229,23 +1219,23 @@ wxDataViewProgressCell::wxDataViewProgressCell( const wxString &label,
 #endif
     {
         // Use custom cell code
-        wxDataViewCustomCell::Init();
+        wxDataViewCustomRenderer::Init();
     }
 }
 
-wxDataViewProgressCell::~wxDataViewProgressCell()
+wxDataViewProgressRenderer::~wxDataViewProgressRenderer()
 {
 }
 
-bool wxDataViewProgressCell::SetValue( const wxVariant &value )
+bool wxDataViewProgressRenderer::SetValue( const wxVariant &value )
 {
 #ifdef __WXGTK26__
     if (!gtk_check_version(2,6,0))
     {
-        gint tmp = (int) value;
+        gint tmp = (long) value;
         GValue gvalue = { 0, };
         g_value_init( &gvalue, G_TYPE_INT );
-        g_value_set_boolean( &gvalue, tmp );
+        g_value_set_int( &gvalue, tmp );
         g_object_set_property( G_OBJECT(m_renderer), "value", &gvalue );
         g_value_unset( &gvalue );
     }
@@ -1261,7 +1251,7 @@ bool wxDataViewProgressCell::SetValue( const wxVariant &value )
     return true;
 }
 
-bool wxDataViewProgressCell::Render( wxRect cell, wxDC *dc, int state )
+bool wxDataViewProgressRenderer::Render( wxRect cell, wxDC *dc, int state )
 {
     double pct = (double)m_value / 100.0;
     wxRect bar = cell;
@@ -1277,20 +1267,20 @@ bool wxDataViewProgressCell::Render( wxRect cell, wxDC *dc, int state )
     return true;
 }
 
-wxSize wxDataViewProgressCell::GetSize()
+wxSize wxDataViewProgressRenderer::GetSize()
 {
     return wxSize(40,12);
 }
 
 // ---------------------------------------------------------
-// wxDataViewDateCell
+// wxDataViewDateRenderer
 // ---------------------------------------------------------
 
-class wxDataViewDateCellPopupTransient: public wxPopupTransientWindow
+class wxDataViewDateRendererPopupTransient: public wxPopupTransientWindow
 {
 public:
-    wxDataViewDateCellPopupTransient( wxWindow* parent, wxDateTime *value,
-        wxDataViewListModel *model, size_t col, size_t row ) :
+    wxDataViewDateRendererPopupTransient( wxWindow* parent, wxDateTime *value,
+        wxDataViewListModel *model, unsigned int col, unsigned int row ) :
         wxPopupTransientWindow( parent, wxBORDER_SIMPLE )
     {
         m_model = model;
@@ -1311,18 +1301,18 @@ public:
 
     wxCalendarCtrl      *m_cal;
     wxDataViewListModel *m_model;
-    size_t               m_col;
-    size_t               m_row;
+    unsigned int               m_col;
+    unsigned int               m_row;
 
 private:
     DECLARE_EVENT_TABLE()
 };
 
-BEGIN_EVENT_TABLE(wxDataViewDateCellPopupTransient,wxPopupTransientWindow)
-    EVT_CALENDAR( -1, wxDataViewDateCellPopupTransient::OnCalendar )
+BEGIN_EVENT_TABLE(wxDataViewDateRendererPopupTransient,wxPopupTransientWindow)
+    EVT_CALENDAR( -1, wxDataViewDateRendererPopupTransient::OnCalendar )
 END_EVENT_TABLE()
 
-void wxDataViewDateCellPopupTransient::OnCalendar( wxCalendarEvent &event )
+void wxDataViewDateRendererPopupTransient::OnCalendar( wxCalendarEvent &event )
 {
     wxDateTime date = event.GetDate();
     wxVariant value = date;
@@ -1331,22 +1321,22 @@ void wxDataViewDateCellPopupTransient::OnCalendar( wxCalendarEvent &event )
     DismissAndNotify();
 }
 
-IMPLEMENT_CLASS(wxDataViewDateCell, wxDataViewCustomCell)
+IMPLEMENT_CLASS(wxDataViewDateRenderer, wxDataViewCustomRenderer)
 
-wxDataViewDateCell::wxDataViewDateCell( const wxString &varianttype,
+wxDataViewDateRenderer::wxDataViewDateRenderer( const wxString &varianttype,
                         wxDataViewCellMode mode ) :
-    wxDataViewCustomCell( varianttype, mode )
+    wxDataViewCustomRenderer( varianttype, mode )
 {
 }
 
-bool wxDataViewDateCell::SetValue( const wxVariant &value )
+bool wxDataViewDateRenderer::SetValue( const wxVariant &value )
 {
     m_date = value.GetDateTime();
 
     return true;
 }
 
-bool wxDataViewDateCell::Render( wxRect cell, wxDC *dc, int state )
+bool wxDataViewDateRenderer::Render( wxRect cell, wxDC *dc, int state )
 {
     dc->SetFont( GetOwner()->GetOwner()->GetFont() );
     wxString tmp = m_date.FormatDate();
@@ -1355,7 +1345,7 @@ bool wxDataViewDateCell::Render( wxRect cell, wxDC *dc, int state )
     return true;
 }
 
-wxSize wxDataViewDateCell::GetSize()
+wxSize wxDataViewDateRenderer::GetSize()
 {
     wxDataViewCtrl* view = GetOwner()->GetOwner();
     wxString tmp = m_date.FormatDate();
@@ -1364,13 +1354,13 @@ wxSize wxDataViewDateCell::GetSize()
     return wxSize(x,y+d);
 }
 
-bool wxDataViewDateCell::Activate( wxRect cell, wxDataViewListModel *model, size_t col, size_t row )
+bool wxDataViewDateRenderer::Activate( wxRect cell, wxDataViewListModel *model, unsigned int col, unsigned int row )
 {
     wxVariant variant;
     model->GetValue( variant, col, row );
     wxDateTime value = variant.GetDateTime();
 
-    wxDataViewDateCellPopupTransient *popup = new wxDataViewDateCellPopupTransient(
+    wxDataViewDateRendererPopupTransient *popup = new wxDataViewDateRendererPopupTransient(
         GetOwner()->GetOwner()->GetParent(), &value, model, col, row );
     wxPoint pos = wxGetMousePosition();
     popup->Move( pos );
@@ -1384,6 +1374,27 @@ bool wxDataViewDateCell::Activate( wxRect cell, wxDataViewListModel *model, size
 // wxDataViewColumn
 // ---------------------------------------------------------
 
+
+static gboolean
+gtk_dataview_header_button_press_callback( GtkWidget *widget,
+                                           GdkEventButton *gdk_event,
+                                           wxDataViewColumn *column )
+{
+    if (gdk_event->type != GDK_BUTTON_PRESS)
+        return TRUE;
+        
+    if (gdk_event->button == 1)
+    {
+        wxDataViewCtrl *dv = column->GetOwner();
+        wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK, dv->GetId() );
+        event.SetDataViewColumn( column );
+        event.SetModel( dv->GetModel() );
+        dv->GetEventHandler()->ProcessEvent( event );
+    }
+    
+    return TRUE;
+}
+
 extern "C" {
 static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column,
                             GtkCellRenderer *cell,
@@ -1402,9 +1413,9 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column,
     g_return_if_fail (GTK_IS_WX_LIST_STORE (model));
     GtkWxListStore *list_store = (GtkWxListStore *) model;
 
-    wxDataViewCell *cell = (wxDataViewCell*) data;
+    wxDataViewRenderer *cell = (wxDataViewRenderer*) data;
 
-    size_t model_row = (size_t) iter->user_data;
+    unsigned int model_row = (unsigned int) iter->user_data;
 
     wxVariant value;
     list_store->model->GetValue( value, cell->GetOwner()->GetModelColumn(), model_row );
@@ -1419,44 +1430,202 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column,
 
 IMPLEMENT_CLASS(wxDataViewColumn, wxDataViewColumnBase)
 
-wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewCell *cell, size_t model_column,
-    int fixed_width, wxDataViewColumnSizing sizing, int flags ) :
-    wxDataViewColumnBase( title, cell, model_column, flags )
+wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewRenderer *cell, unsigned int model_column,
+    int width, int flags ) :
+    wxDataViewColumnBase( title, cell, model_column, width, flags )
 {
+    m_isConnected = false;
+
     GtkCellRenderer *renderer = (GtkCellRenderer *) cell->GetGtkHandle();
 
     GtkTreeViewColumn *column = gtk_tree_view_column_new();
+    m_column = (void*) column;
+    
+    gtk_tree_view_column_set_clickable( column, true );
+    
+    SetTitle( title );
 
-    gtk_tree_view_column_set_title( column, wxGTK_CONV(title) );
+    if (flags & wxDATAVIEW_COL_RESIZABLE)
+        gtk_tree_view_column_set_resizable( column, true );
+    if (flags & wxDATAVIEW_COL_HIDDEN)
+        gtk_tree_view_column_set_visible( column, false );
+    if (flags & wxDATAVIEW_COL_SORTABLE)
+        gtk_tree_view_column_set_sort_indicator( column, true );
 
-    if (sizing == wxDATAVIEW_COL_WIDTH_FIXED)
-        gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_FIXED );
-    else if (sizing == wxDATAVIEW_COL_WIDTH_GROW)
-        gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_GROW_ONLY );
+    if (width > 0)
+        gtk_tree_view_column_set_fixed_width( column, width );
     else
-        gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_AUTOSIZE );
-
-    if (fixed_width > 0)
-        gtk_tree_view_column_set_fixed_width( column, fixed_width );
+        gtk_tree_view_column_set_fixed_width( column, 70 );  // FIXME
+        
+    gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_FIXED );
 
-    gtk_tree_view_column_pack_start( column, renderer, TRUE );
+    gtk_tree_view_column_pack_end( column, renderer, FALSE );
 
     gtk_tree_view_column_set_cell_data_func( column, renderer,
         wxGtkTreeCellDataFunc, (gpointer) cell, NULL );
 
+}
+
+wxDataViewColumn::wxDataViewColumn( const wxBitmap &bitmap, wxDataViewRenderer *cell, unsigned int model_column,
+    int width, int flags ) :
+    wxDataViewColumnBase( bitmap, cell, model_column, width, flags )
+{
+    m_isConnected = false;
+    
+    GtkCellRenderer *renderer = (GtkCellRenderer *) cell->GetGtkHandle();
+
+    GtkTreeViewColumn *column = gtk_tree_view_column_new();
     m_column = (void*) column;
+
+    SetBitmap( bitmap );
+
+    if (flags & wxDATAVIEW_COL_RESIZABLE)
+        gtk_tree_view_column_set_resizable( column, true );
+    if (flags & wxDATAVIEW_COL_HIDDEN)
+        gtk_tree_view_column_set_visible( column, false );
+    if (flags & wxDATAVIEW_COL_SORTABLE)
+        gtk_tree_view_column_set_sort_indicator( column, true );
+
+    if (width > 0)
+        gtk_tree_view_column_set_fixed_width( column, width );
+    else
+        gtk_tree_view_column_set_fixed_width( column, 70 );  // FIXME
+        
+    gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_FIXED );
+
+    gtk_tree_view_column_pack_end( column, renderer, FALSE );
+
+    gtk_tree_view_column_set_cell_data_func( column, renderer,
+        wxGtkTreeCellDataFunc, (gpointer) cell, NULL );
 }
 
 wxDataViewColumn::~wxDataViewColumn()
 {
 }
 
+void wxDataViewColumn::OnInternalIdle()
+{
+    if (m_isConnected)
+        return;
+        
+    if (GTK_WIDGET_REALIZED(GetOwner()->m_treeview))
+    {
+        GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column;
+        if (column->button)
+        {
+            g_signal_connect(column->button, "button_press_event",
+                      G_CALLBACK (gtk_dataview_header_button_press_callback), this);
+    
+            m_isConnected = true;
+        }
+    }
+}
+
+void wxDataViewColumn::SetOwner( wxDataViewCtrl *owner )
+{
+    wxDataViewColumnBase::SetOwner( owner );
+    
+    GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column;
+    
+    gtk_tree_view_column_set_title( column, wxGTK_CONV_FONT(GetTitle(), GetOwner()->GetFont() ) );
+}
+
 void wxDataViewColumn::SetTitle( const wxString &title )
 {
     wxDataViewColumnBase::SetTitle( title );
 
     GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column;
-    gtk_tree_view_column_set_title( column, wxGTK_CONV(title) );
+    
+    if (m_isConnected)
+    {
+        // disconnect before column->button gets recreated
+        g_signal_handlers_disconnect_by_func( column->button, 
+                      (void*) gtk_dataview_header_button_press_callback, this);
+                      
+        m_isConnected = false;
+    }
+
+    // FIXME: can it really happen that we don't have the owner here??
+    wxDataViewCtrl *ctrl = GetOwner();
+    gtk_tree_view_column_set_title( column, ctrl ? wxGTK_CONV_FONT(title, ctrl->GetFont())
+                                                 : wxGTK_CONV_SYS(title) );
+
+    gtk_tree_view_column_set_widget( column, NULL );
+}
+
+void wxDataViewColumn::SetBitmap( const wxBitmap &bitmap )
+{
+    wxDataViewColumnBase::SetBitmap( bitmap );
+
+    GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column;
+    if (bitmap.Ok())
+    {
+        GtkImage *gtk_image = GTK_IMAGE( gtk_image_new() );
+        
+        GdkBitmap *mask = (GdkBitmap *) NULL;
+        if (bitmap.GetMask())
+            mask = bitmap.GetMask()->GetBitmap();
+
+        if (bitmap.HasPixbuf())
+        {
+            gtk_image_set_from_pixbuf(GTK_IMAGE(gtk_image),
+                                      bitmap.GetPixbuf());
+        }
+        else
+        {
+            gtk_image_set_from_pixmap(GTK_IMAGE(gtk_image),
+                                      bitmap.GetPixmap(), mask);
+        }
+        gtk_widget_show( GTK_WIDGET(gtk_image) );
+        
+        gtk_tree_view_column_set_widget( column, GTK_WIDGET(gtk_image) );
+    }
+    else
+    {
+        gtk_tree_view_column_set_widget( column, NULL );
+    }
+}
+
+void wxDataViewColumn::SetAlignment( wxAlignment align )
+{
+    GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column;
+    
+    gfloat xalign = 0.0;
+    if (align == wxALIGN_RIGHT)
+        xalign = 1.0;
+    if (align == wxALIGN_CENTER)
+        xalign = 0.5;
+        
+    gtk_tree_view_column_set_alignment( column, xalign );    
+}
+
+void wxDataViewColumn::SetSortable( bool sortable )
+{
+    GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column;
+    gtk_tree_view_column_set_sort_indicator( column, sortable );
+}
+
+bool wxDataViewColumn::GetSortable()
+{
+    GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column;
+    return gtk_tree_view_column_get_sort_indicator( column );
+}
+
+void wxDataViewColumn::SetSortOrder( bool ascending )
+{
+    GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column;
+    
+    if (ascending)
+        gtk_tree_view_column_set_sort_order( column, GTK_SORT_ASCENDING );
+    else
+        gtk_tree_view_column_set_sort_order( column, GTK_SORT_DESCENDING );
+}
+
+bool wxDataViewColumn::IsSortOrderAscending()
+{
+    GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column;
+    
+    return (gtk_tree_view_column_get_sort_order( column ) != GTK_SORT_DESCENDING);
 }
 
 int wxDataViewColumn::GetWidth()
@@ -1474,6 +1643,33 @@ int wxDataViewColumn::GetFixedWidth()
     return gtk_tree_view_column_get_fixed_width( (GtkTreeViewColumn *)m_column );
 }
 
+//-----------------------------------------------------------------------------
+// wxDataViewCtrl signal callbacks
+//-----------------------------------------------------------------------------
+
+static void
+wxdataview_selection_changed_callback( GtkTreeSelection* selection, wxDataViewCtrl *dv )
+{
+    if (!GTK_WIDGET_REALIZED(dv->m_widget))
+        return;
+    
+    wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ROW_SELECTED, dv->GetId() );
+    event.SetRow( dv->GetSelection() );
+    event.SetModel( dv->GetModel() );
+    dv->GetEventHandler()->ProcessEvent( event );
+}
+
+static void
+wxdataview_row_activated_callback( GtkTreeView* treeview, GtkTreePath *path, 
+                                   GtkTreeViewColumn *column, wxDataViewCtrl *dv )
+{
+    wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ROW_ACTIVATED, dv->GetId() );
+    unsigned int row = (unsigned int)gtk_tree_path_get_indices (path)[0];
+    event.SetRow( row );
+    event.SetModel( dv->GetModel() );
+    dv->GetEventHandler()->ProcessEvent( event );
+}
+
 //-----------------------------------------------------------------------------
 // wxDataViewCtrl
 //-----------------------------------------------------------------------------
@@ -1514,6 +1710,11 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
     m_treeview = gtk_tree_view_new();
     gtk_container_add (GTK_CONTAINER (m_widget), m_treeview);
 
+#ifdef __WXGTK26__
+    if (!gtk_check_version(2,6,0))
+        gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), TRUE );
+#endif
+
     if (style & wxDV_MULTIPLE)
     {
         GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
@@ -1528,9 +1729,28 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
 
     PostCreation(size);
 
+    GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+    g_signal_connect_after (selection, "changed",
+                            G_CALLBACK (wxdataview_selection_changed_callback), this);
+    g_signal_connect_after (m_treeview, "row_activated",
+                            G_CALLBACK (wxdataview_row_activated_callback), this);
+
     return true;
 }
 
+void wxDataViewCtrl::OnInternalIdle()
+{
+    wxWindow::OnInternalIdle();
+    
+    unsigned int cols = GetNumberOfColumns();
+    unsigned int i;
+    for (i = 0; i < cols; i++)
+    {
+        wxDataViewColumn *col = GetColumn( i );
+        col->OnInternalIdle();
+    }
+}
+
 bool wxDataViewCtrl::AssociateModel( wxDataViewListModel *model )
 {
     if (!wxDataViewCtrlBase::AssociateModel( model ))
@@ -1561,6 +1781,152 @@ bool wxDataViewCtrl::AppendColumn( wxDataViewColumn *col )
     return true;
 }
 
+void wxDataViewCtrl::SetSelection( int row )
+{
+    GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+    
+    if (row < 0)
+    {
+        gtk_tree_selection_unselect_all( selection );
+    }
+    else
+    {
+        GtkTreePath *path = gtk_tree_path_new ();
+        gtk_tree_path_append_index( path, row );
+        
+        gtk_tree_selection_select_path( selection, path );
+        
+        gtk_tree_path_free( path );
+    }
+}
+
+void wxDataViewCtrl::Unselect( unsigned int row )
+{
+    GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+    
+    GtkTreePath *path = gtk_tree_path_new ();
+    gtk_tree_path_append_index( path, row );
+        
+    gtk_tree_selection_unselect_path( selection, path );
+        
+    gtk_tree_path_free( path );
+}
+
+void wxDataViewCtrl::SetSelectionRange( unsigned int from, unsigned int to )
+{
+}
+
+void wxDataViewCtrl::SetSelections( const wxArrayInt& aSelections)
+{
+}
+    
+bool wxDataViewCtrl::IsSelected( unsigned int row ) const
+{
+    GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+    
+    GtkTreePath *path = gtk_tree_path_new ();
+    gtk_tree_path_append_index( path, row );
+    
+    gboolean ret =  gtk_tree_selection_path_is_selected( selection, path );
+    
+    gtk_tree_path_free( path );
+    
+    return ret;
+}
+
+int wxDataViewCtrl::GetSelection() const
+{
+    GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+    if (HasFlag(wxDV_MULTIPLE))
+    {
+        GtkTreeModel *model;
+        GList *list = gtk_tree_selection_get_selected_rows( selection, &model );
+        
+        // do something
+        if (list)
+        {
+            // list = g_list_nth( list, 0 );  should be a noop
+            GtkTreePath *path = (GtkTreePath*) list->data;
+            
+            unsigned int row = (unsigned int)gtk_tree_path_get_indices (path)[0];
+        
+            // delete list
+            g_list_foreach( list, (GFunc) gtk_tree_path_free, NULL );
+            g_list_free( list );
+            
+            return (int) row;
+        }
+    }
+    else
+    {
+        
+        GtkTreeModel *model;
+        GtkTreeIter iter;
+        gboolean has_selection = gtk_tree_selection_get_selected( selection, &model, &iter );
+        if (has_selection)
+        {
+            unsigned int row = (wxUIntPtr) iter.user_data;
+            return (int) row;
+        }
+    }
+    
+    return -1;
+}
+
+int wxDataViewCtrl::GetSelections(wxArrayInt& aSelections) const
+{
+    aSelections.Clear();
+
+    GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+    if (HasFlag(wxDV_MULTIPLE))
+    {
+        GtkTreeModel *model;
+        GList *list = gtk_tree_selection_get_selected_rows( selection, &model );
+        
+        int count = 0;
+        while (list)
+        {
+            
+            // list = g_list_nth( list, 0 );  should be a noop
+            GtkTreePath *path = (GtkTreePath*) list->data;
+            
+            unsigned int row = (unsigned int)gtk_tree_path_get_indices (path)[0];
+            
+            aSelections.Add( (int) row );
+        
+            list = g_list_next( list );            
+        }
+        
+        // delete list
+        g_list_foreach( list, (GFunc) gtk_tree_path_free, NULL );
+        g_list_free( list );
+        
+        return count;
+    }
+    else
+    {
+        GtkTreeModel *model;
+        GtkTreeIter iter;
+        gboolean has_selection = gtk_tree_selection_get_selected( selection, &model, &iter );
+        if (has_selection)
+        {
+            unsigned int row = (wxUIntPtr) iter.user_data;
+            aSelections.Add( (int) row );
+            return 1;
+        }
+    }
+    
+    return 0;
+}
+
+// static
+wxVisualAttributes
+wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
+{
+    return GetDefaultAttributesFromGTKWidget(gtk_tree_view_new);
+}
+
+
 #endif
     // !wxUSE_GENERICDATAVIEWCTRL