]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dataview.cpp
capture mouse to be notified when it exists the popup rect (bug 1372228)
[wxWidgets.git] / src / gtk / dataview.cpp
index eec47ab88b70d021b6f126acc9c524ccf01cb2f1..49f3dedb26fd04289a5a94c6aef70d8c9556760e 100644 (file)
@@ -299,6 +299,7 @@ wxgtk_list_store_get_value (GtkTreeModel *tree_model,
     GtkWxListStore *list_store = (GtkWxListStore *) tree_model;
     g_return_if_fail (GTK_IS_WX_LIST_STORE (tree_model) );
 
+#if 0
     wxDataViewListModel *model = list_store->model;
     wxString mtype = model->GetColType( (unsigned int) column );
     if (mtype == wxT("string"))
@@ -311,6 +312,7 @@ wxgtk_list_store_get_value (GtkTreeModel *tree_model,
     else
     {
     }
+#endif
 
 #if 0
   GtkTreeDataList *list;
@@ -946,7 +948,11 @@ bool wxDataViewTextRenderer::SetValue( const wxVariant &value )
 
     GValue gvalue = { 0, };
     g_value_init( &gvalue, G_TYPE_STRING );
+#if wxUSE_UNICODE
     g_value_set_string( &gvalue, wxGTK_CONV( tmp ) );
+#else
+    g_value_set_string( &gvalue, wxGTK_CONV_FONT( tmp, GetOwner()->GetOwner()->GetFont() ) );
+#endif
     g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue );
     g_value_unset( &gvalue );
 
@@ -1221,7 +1227,11 @@ wxDataViewProgressRenderer::wxDataViewProgressRenderer( const wxString &label,
 
         GValue gvalue = { 0, };
         g_value_init( &gvalue, G_TYPE_STRING );
-        g_value_set_boolean( &gvalue, wxGTK_CONV(m_label) );
+#if wxUSE_UNICODE
+        g_value_set_string( &gvalue, wxGTK_CONV(m_label) );
+#else
+        g_value_set_string( &gvalue, wxGTK_CONV_SYS(m_label) );
+#endif
         g_object_set_property( G_OBJECT(m_renderer), "text", &gvalue );
         g_value_unset( &gvalue );
     }
@@ -1242,10 +1252,10 @@ 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 );
     }
@@ -1384,6 +1394,27 @@ bool wxDataViewDateRenderer::Activate( wxRect cell, wxDataViewListModel *model,
 // 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,
@@ -1423,11 +1454,16 @@ wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewRenderer *c
     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();
-
-    gtk_tree_view_column_set_title( column, wxGTK_CONV(title) );
+    m_column = (void*) column;
+    
+    gtk_tree_view_column_set_clickable( column, true );
+    
+    SetTitle( title );
 
     if (flags & wxDATAVIEW_COL_RESIZABLE)
         gtk_tree_view_column_set_resizable( column, true );
@@ -1437,29 +1473,186 @@ wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewRenderer *c
         gtk_tree_view_column_set_sort_indicator( column, true );
 
     if (width > 0)
-    {
         gtk_tree_view_column_set_fixed_width( column, width );
-        gtk_tree_view_column_set_sizing( column, GTK_TREE_VIEW_COLUMN_FIXED );
-    }
+    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( 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;
+    
+#if wxUSE_UNICODE
+#else
+    gtk_tree_view_column_set_title( column, wxGTK_CONV_FONT(GetTitle(), GetOwner()->GetFont() ) );
+#endif
+}
+
 void wxDataViewColumn::SetTitle( const wxString &title )
 {
     wxDataViewColumnBase::SetTitle( title );
 
     GtkTreeViewColumn *column = (GtkTreeViewColumn *)m_column;
+    
+    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;
+    }
+
+#if wxUSE_UNICODE
     gtk_tree_view_column_set_title( column, wxGTK_CONV(title) );
+#else
+    if (GetOwner())
+        gtk_tree_view_column_set_title( column, wxGTK_CONV_FONT(title, GetOwner()->GetFont() ) );
+    else
+        gtk_tree_view_column_set_title( column, "" );
+#endif
+
+    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()
@@ -1484,6 +1677,9 @@ int wxDataViewColumn::GetFixedWidth()
 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() );
@@ -1541,6 +1737,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) );
@@ -1553,17 +1754,30 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
 
     m_parent->DoAddChild( this );
 
+    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);
 
-    PostCreation(size);
-
     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 ))
@@ -1732,6 +1946,13 @@ int wxDataViewCtrl::GetSelections(wxArrayInt& aSelections) const
     return 0;
 }
 
+// static
+wxVisualAttributes
+wxDataViewCtrl::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))
+{
+    return GetDefaultAttributesFromGTKWidget(gtk_tree_view_new);
+}
+
 
 #endif
     // !wxUSE_GENERICDATAVIEWCTRL