]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dataview.cpp
use IMPLEMENT_APP_CONSOLE and not IMPLEMENT_APP for console apps
[wxWidgets.git] / src / gtk / dataview.cpp
index d725ee6746edb2e542a31efde9bf8599a29bceac..dcaa4c1af9b99b430796975ec3a898fdfa5a30c8 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,
@@ -1468,8 +1474,21 @@ wxDataViewCellMode wxDataViewRenderer::GetMode() const
     return ret;
 }
 
-void wxDataViewRenderer::SetAlignment( int align )
+void wxDataViewRenderer::GtkUpdateAlignment()
 {
+    int align = m_alignment;
+    
+    // query alignment from column ?
+    if (align == -1)
+    {
+        // None there yet
+        if (GetOwner() == NULL)
+            return;
+        
+        align = GetOwner()->GetAlignment();
+        align |= wxALIGN_CENTRE_VERTICAL;
+    }
+    
     // horizontal alignment:
 
     gfloat xalign = 0.0;
@@ -1499,40 +1518,16 @@ void wxDataViewRenderer::SetAlignment( int align )
     g_value_unset( &gvalue2 );
 }
 
-int wxDataViewRenderer::GetAlignment() const
+void wxDataViewRenderer::SetAlignment( int align )
 {
-    int ret = 0;
-    GValue gvalue;
-
-    // horizontal alignment:
-
-    g_object_get( G_OBJECT(m_renderer), "xalign", &gvalue, NULL );
-    float xalign = g_value_get_float( &gvalue );
-    if (xalign < 0.5)
-        ret |= wxALIGN_LEFT;
-    else if (xalign == 0.5)
-        ret |= wxALIGN_CENTER_HORIZONTAL;
-    else
-        ret |= wxALIGN_RIGHT;
-    g_value_unset( &gvalue );
-
-
-    // vertical alignment:
-
-    g_object_get( G_OBJECT(m_renderer), "yalign", &gvalue, NULL );
-    float yalign = g_value_get_float( &gvalue );
-    if (yalign < 0.5)
-        ret |= wxALIGN_TOP;
-    else if (yalign == 0.5)
-        ret |= wxALIGN_CENTER_VERTICAL;
-    else
-        ret |= wxALIGN_BOTTOM;
-    g_value_unset( &gvalue );
-
-    return ret;
+    m_alignment = align;
+    GtkUpdateAlignment();
 }
 
-
+int wxDataViewRenderer::GetAlignment() const
+{
+    return m_alignment;
+}
 
 // ---------------------------------------------------------
 // wxDataViewTextRenderer
@@ -2445,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,
@@ -2484,39 +2489,27 @@ 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( gtk_label_get_text( GTK_LABEL(m_label) ) );
 }
 
 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())
@@ -2532,13 +2525,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 );
     }
 }
 
@@ -2564,6 +2555,9 @@ void wxDataViewColumn::SetAlignment( wxAlignment align )
         xalign = 0.5;
 
     gtk_tree_view_column_set_alignment( column, xalign );
+    
+    if (m_renderer && m_renderer->GetAlignment() == -1)
+        m_renderer->GtkUpdateAlignment();
 }
 
 wxAlignment wxDataViewColumn::GetAlignment() const
@@ -3578,6 +3572,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 );
@@ -3589,6 +3585,8 @@ void wxDataViewCtrl::Init()
 {
     m_notifier = NULL;
     m_internal = NULL;
+    
+    m_cols.DeleteContents( true );
 }
 
 static GtkTargetEntry gs_target;
@@ -3626,7 +3624,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)
@@ -3718,6 +3719,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;
@@ -3778,6 +3787,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();
@@ -3790,7 +3821,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)
@@ -3807,9 +3838,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;
 }
@@ -3817,14 +3846,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;
 }