]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dataview.cpp
derive wxSTC from wxTextEntryBase to provide even more wxTextCtrl-like methods (see...
[wxWidgets.git] / src / gtk / dataview.cpp
index 0ecca2c7f12ba81e73ca9308bb439ba9c804a0e6..697d1cf9cc962e13636c5ae6394a53e7375b295a 100644 (file)
@@ -155,7 +155,7 @@ public:
 
     ~wxGtkTreeModelNode()
     {
-        size_t count = m_children.GetCount();
+        size_t count = m_nodes.GetCount();
         size_t i;
         for (i = 0; i < count; i++)
         {
@@ -975,8 +975,14 @@ static GtkCellEditable *gtk_wx_cell_renderer_start_editing(
 {
     GtkWxCellRenderer *wxrenderer = (GtkWxCellRenderer *) renderer;
     wxDataViewCustomRenderer *cell = wxrenderer->cell;
+    
+    // Renderer doesn't support in-place editing
     if (!cell->HasEditorCtrl())
         return NULL;
+        
+    // An in-place editing control is still around
+    if (cell->GetEditorCtrl())
+        return NULL;
 
     GdkRectangle rect;
     gtk_wx_cell_renderer_get_size (renderer, widget, cell_area,
@@ -2434,6 +2440,16 @@ void wxDataViewColumn::Init(wxAlignment align, int flags, int width)
 
     SetWidth( width );
 
+    // Create container for icon and label
+    GtkWidget *box = gtk_hbox_new( FALSE, 1 );
+    gtk_widget_show( box );
+    // gtk_container_set_border_width((GtkContainer*)box, 2);
+    m_image = gtk_image_new();
+    gtk_box_pack_start(GTK_BOX(box), m_image, FALSE, FALSE, 1);
+    m_label = gtk_label_new("");
+    gtk_box_pack_end( GTK_BOX(box), GTK_WIDGET(m_label), FALSE, FALSE, 1 );
+    gtk_tree_view_column_set_widget( column, box );
+    
     gtk_tree_view_column_pack_end( column, renderer, TRUE );
 
     gtk_tree_view_column_set_cell_data_func( column, renderer,
@@ -2473,39 +2489,30 @@ void wxDataViewColumn::SetOwner( wxDataViewCtrl *owner )
 
 void wxDataViewColumn::SetTitle( const wxString &title )
 {
-    GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column);
-
-    if (m_isConnected)
-    {
-        // disconnect before column->button gets recreated
-        g_signal_handlers_disconnect_by_func( column->button,
-                      (GtkWidget*) 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())
+    gtk_label_set_text( GTK_LABEL(m_label), ctrl ? wxGTK_CONV_FONT(title, ctrl->GetFont())
                                                  : wxGTK_CONV_SYS(title) );
-
-    gtk_tree_view_column_set_widget( column, NULL );
+    if (title.empty())
+        gtk_widget_hide( m_label );
+    else
+        gtk_widget_show( m_label );
 }
 
 wxString wxDataViewColumn::GetTitle() const
 {
-    const gchar *str = gtk_tree_view_column_get_title( GTK_TREE_VIEW_COLUMN(m_column) );
-    return wxConvFileName->cMB2WX(str);
+    return wxGTK_CONV_BACK_FONT(
+            gtk_label_get_text( GTK_LABEL(m_label) ),
+            GetOwner()->GetFont()
+           );
 }
 
 void wxDataViewColumn::SetBitmap( const wxBitmap &bitmap )
 {
     wxDataViewColumnBase::SetBitmap( bitmap );
 
-    GtkTreeViewColumn *column = GTK_TREE_VIEW_COLUMN(m_column);
     if (bitmap.Ok())
     {
-        GtkImage *gtk_image = GTK_IMAGE( gtk_image_new() );
+        GtkImage *gtk_image = GTK_IMAGE(m_image);
 
         GdkBitmap *mask = (GdkBitmap *) NULL;
         if (bitmap.GetMask())
@@ -2521,13 +2528,11 @@ void wxDataViewColumn::SetBitmap( const wxBitmap &bitmap )
             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) );
+        gtk_widget_show( m_image );
     }
     else
     {
-        gtk_tree_view_column_set_widget( column, NULL );
+        gtk_widget_hide( m_image );
     }
 }
 
@@ -3570,6 +3575,8 @@ wxDataViewCtrl::~wxDataViewCtrl()
     if (m_notifier)
         GetModel()->RemoveNotifier( m_notifier );
 
+    m_cols.Clear();
+
     // remove the model from the GtkTreeView before it gets destroyed by the
     // wxDataViewCtrlBase's dtor
     gtk_tree_view_set_model( GTK_TREE_VIEW(m_treeview), NULL );
@@ -3581,6 +3588,8 @@ void wxDataViewCtrl::Init()
 {
     m_notifier = NULL;
     m_internal = NULL;
+    
+    m_cols.DeleteContents( true );
 }
 
 static GtkTargetEntry gs_target;
@@ -3618,7 +3627,10 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
 
 #ifdef __WXGTK26__
     if (!gtk_check_version(2,6,0))
-        gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), TRUE );
+    {
+        bool fixed = (style & wxDV_VARIABLE_LINE_HEIGHT) == 0;
+        gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), fixed );
+    }
 #endif
 
     if (style & wxDV_MULTIPLE)
@@ -3710,6 +3722,14 @@ bool wxDataViewCtrl::AssociateModel( wxDataViewModel *model )
     if (!wxDataViewCtrlBase::AssociateModel( model ))
         return false;
 
+#ifdef __WXGTK26__
+    if (!gtk_check_version(2,6,0))
+    {
+        bool fixed = (((GetWindowStyle() & wxDV_VARIABLE_LINE_HEIGHT) == 0) || (model->IsVirtualListModel()));
+        gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), fixed );
+    }
+#endif
+
     GtkWxTreeModel *gtk_model = wxgtk_tree_model_new();
     m_internal = new wxDataViewCtrlInternal( this, model, gtk_model );
     gtk_model->internal = m_internal;
@@ -3770,6 +3790,28 @@ bool wxDataViewCtrl::PrependColumn( wxDataViewColumn *col )
     return true;
 }
 
+bool wxDataViewCtrl::InsertColumn( unsigned int pos, wxDataViewColumn *col )
+{
+    if (!wxDataViewCtrlBase::InsertColumn(pos,col))
+        return false;
+
+    m_cols.Insert( pos, col );
+
+#ifdef __WXGTK26__
+    if (!gtk_check_version(2,6,0))
+    {
+        if (gtk_tree_view_column_get_sizing( GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) ) !=
+               GTK_TREE_VIEW_COLUMN_FIXED)
+           gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), FALSE );
+    }
+#endif
+
+    gtk_tree_view_insert_column( GTK_TREE_VIEW(m_treeview),
+                                 GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()), pos );
+
+    return true;
+}
+
 unsigned int wxDataViewCtrl::GetColumnCount() const
 {
     return m_cols.GetCount();
@@ -3782,7 +3824,7 @@ wxDataViewColumn* wxDataViewCtrl::GetColumn( unsigned int pos ) const
         return NULL;
 
     wxDataViewColumnList::const_iterator iter;
-    for (iter = m_cols.begin(); iter != m_cols.end(); iter++)
+    for (iter = m_cols.begin(); iter != m_cols.end(); ++iter)
     {
         wxDataViewColumn *col = *iter;
         if (GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) == gtk_col)
@@ -3799,9 +3841,7 @@ bool wxDataViewCtrl::DeleteColumn( wxDataViewColumn *column )
     gtk_tree_view_remove_column( GTK_TREE_VIEW(m_treeview),
                                  GTK_TREE_VIEW_COLUMN(column->GetGtkHandle()) );
 
-    m_cols.remove( column );
-
-    delete column;
+    m_cols.DeleteObject( column );
 
     return true;
 }
@@ -3809,14 +3849,14 @@ bool wxDataViewCtrl::DeleteColumn( wxDataViewColumn *column )
 bool wxDataViewCtrl::ClearColumns()
 {
     wxDataViewColumnList::iterator iter;
-    for (iter = m_cols.begin(); iter != m_cols.end(); iter++)
+    for (iter = m_cols.begin(); iter != m_cols.end(); ++iter)
     {
         wxDataViewColumn *col = *iter;
         gtk_tree_view_remove_column( GTK_TREE_VIEW(m_treeview),
                                      GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) );
     }
 
-    m_cols.clear();
+    m_cols.Clear();
 
     return true;
 }