]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dataview.cpp
added wxMSW-specific wxEntryStart() overload taking WinMain-like parameters
[wxWidgets.git] / src / gtk / dataview.cpp
index 27008e6b0afbb5e4f4abd4ad665627d3def5869c..8618280d370aba6aaa5f0f716660f54f46d5b824 100644 (file)
@@ -480,6 +480,15 @@ static gboolean gtk_wx_cell_renderer_activate(
                         GdkRectangle            *background_area,
                         GdkRectangle            *cell_area,
                         GtkCellRendererState     flags );
+static GtkCellEditable *gtk_wx_cell_renderer_start_editing(
+                        GtkCellRenderer         *cell,
+                        GdkEvent                *event,
+                        GtkWidget               *widget,
+                        const gchar             *path,
+                        GdkRectangle            *background_area,
+                        GdkRectangle            *cell_area,
+                        GtkCellRendererState     flags );
+
 
 static GObjectClass *cell_parent_class = NULL;
 
@@ -532,6 +541,7 @@ gtk_wx_cell_renderer_class_init (GtkWxCellRendererClass *klass)
     cell_class->get_size = gtk_wx_cell_renderer_get_size;
     cell_class->render = gtk_wx_cell_renderer_render;
     cell_class->activate = gtk_wx_cell_renderer_activate;
+    cell_class->start_editing = gtk_wx_cell_renderer_start_editing;
 }
 
 static void
@@ -547,6 +557,48 @@ gtk_wx_cell_renderer_new (void)
     return (GtkCellRenderer*) g_object_new (GTK_TYPE_WX_CELL_RENDERER, NULL);
 }
 
+
+
+static GtkCellEditable *gtk_wx_cell_renderer_start_editing(
+                        GtkCellRenderer         *renderer,
+                        GdkEvent                *event,
+                        GtkWidget               *widget,
+                        const gchar             *path,
+                        GdkRectangle            *background_area,
+                        GdkRectangle            *cell_area,
+                        GtkCellRendererState     flags )
+{
+    GtkWxCellRenderer *wxrenderer = (GtkWxCellRenderer *) renderer;
+    wxDataViewCustomRenderer *cell = wxrenderer->cell;
+    if (!cell->HasEditorCtrl())
+        return NULL;
+
+    GdkRectangle rect;
+    gtk_wx_cell_renderer_get_size (renderer, widget, cell_area,
+                                   &rect.x,
+                                   &rect.y,
+                                   &rect.width,
+                                   &rect.height);
+
+    rect.x += cell_area->x;
+    rect.y += cell_area->y;
+//    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 );
+
+    wxDataViewListModel *model = cell->GetOwner()->GetOwner()->GetModel();
+
+    GtkTreePath *treepath = gtk_tree_path_new_from_string( path );
+    unsigned int model_row = (unsigned int)gtk_tree_path_get_indices (treepath)[0];
+    gtk_tree_path_free( treepath );
+
+    cell->StartEditing( model_row, renderrect );
+
+    return NULL;
+}
+
 static void
 gtk_wx_cell_renderer_get_size (GtkCellRenderer *renderer,
                                GtkWidget       *widget,
@@ -681,11 +733,11 @@ gtk_wx_cell_renderer_activate(
     if (!event)
     {
         bool ret = false;
-        
+
         // activated by <ENTER>
         if (cell->Activate( renderrect, model, model_col, model_row ))
                     ret = true;
-        
+
         return ret;
     }
     else if (event->type == GDK_BUTTON_PRESS)
@@ -726,6 +778,7 @@ class wxGtkDataViewListModelNotifier: public wxDataViewListModelNotifier
 {
 public:
     wxGtkDataViewListModelNotifier( GtkWxListStore* gtk_store, wxDataViewListModel *wx_model );
+    ~wxGtkDataViewListModelNotifier();
 
     virtual bool RowAppended();
     virtual bool RowPrepended();
@@ -736,13 +789,6 @@ public:
     virtual bool RowsReordered( unsigned int *new_order );
     virtual bool Cleared();
 
-    virtual bool Freed()
-    {
-        m_wx_model = NULL;
-        m_gtk_store = NULL;
-        return wxDataViewListModelNotifier::Freed();
-    }
-
     GtkWxListStore      *m_gtk_store;
     wxDataViewListModel *m_wx_model;
 };
@@ -758,6 +804,12 @@ wxGtkDataViewListModelNotifier::wxGtkDataViewListModelNotifier(
     m_wx_model = wx_model;
 }
 
+wxGtkDataViewListModelNotifier::~wxGtkDataViewListModelNotifier()
+{
+    m_wx_model = NULL;
+    m_gtk_store = NULL;
+}
+
 bool wxGtkDataViewListModelNotifier::RowAppended()
 {
     unsigned int pos = m_wx_model->GetRowCount()-1;
@@ -844,10 +896,14 @@ bool wxGtkDataViewListModelNotifier::ValueChanged( unsigned int model_col, unsig
             gtk_tree_view_get_cell_area( widget, path, column, &cell_area );
             gtk_tree_path_free( path );
 
+            GtkAdjustment* hadjust = gtk_tree_view_get_hadjustment( widget );
+            double d = gtk_adjustment_get_value( hadjust );
+            int xdiff = (int) d;
+
             int ydiff = column->button->allocation.height;
             // Redraw
             gtk_widget_queue_draw_area( GTK_WIDGET(widget),
-                cell_area.x, ydiff + cell_area.y, cell_area.width, cell_area.height );
+                cell_area.x - xdiff, ydiff + cell_area.y, cell_area.width, cell_area.height );
         }
 
         node = node->GetNext();
@@ -1052,7 +1108,7 @@ wxDataViewTextRenderer::wxDataViewTextRenderer( const wxString &varianttype, wxD
                                                 int align ) :
     wxDataViewRenderer( varianttype, mode, align )
 {
-    m_renderer = (GtkWidget*) gtk_cell_renderer_text_new();
+    m_renderer = (GtkCellRenderer*) gtk_cell_renderer_text_new();
 
     if (mode & wxDATAVIEW_CELL_EDITABLE)
     {
@@ -1127,7 +1183,7 @@ wxDataViewBitmapRenderer::wxDataViewBitmapRenderer( const wxString &varianttype,
                                                     int align ) :
     wxDataViewRenderer( varianttype, mode, align )
 {
-    m_renderer = (GtkWidget*) gtk_cell_renderer_pixbuf_new();
+    m_renderer = (GtkCellRenderer*) gtk_cell_renderer_pixbuf_new();
 
     SetMode(mode);
     SetAlignment(align);
@@ -1224,7 +1280,7 @@ wxDataViewToggleRenderer::wxDataViewToggleRenderer( const wxString &varianttype,
                                                     wxDataViewCellMode mode, int align ) :
     wxDataViewRenderer( varianttype, mode, align )
 {
-    m_renderer = (GtkWidget*) gtk_cell_renderer_toggle_new();
+    m_renderer = (GtkCellRenderer*) gtk_cell_renderer_toggle_new();
 
     if (mode & wxDATAVIEW_CELL_ACTIVATABLE)
     {
@@ -1319,7 +1375,7 @@ bool wxDataViewCustomRenderer::Init(wxDataViewCellMode mode, int align)
     GtkWxCellRenderer *renderer = (GtkWxCellRenderer *) gtk_wx_cell_renderer_new();
     renderer->cell = this;
 
-    m_renderer = (GtkWidget*) renderer;
+    m_renderer = (GtkCellRenderer*) renderer;
 
     SetMode(mode);
     SetAlignment(align);
@@ -1363,7 +1419,7 @@ wxDataViewProgressRenderer::wxDataViewProgressRenderer( const wxString &label,
 #ifdef __WXGTK26__
     if (!gtk_check_version(2,6,0))
     {
-        m_renderer = (GtkWidget*) gtk_cell_renderer_progress_new();
+        m_renderer = (GtkCellRenderer*) gtk_cell_renderer_progress_new();
 
         GValue gvalue = { 0, };
         g_value_init( &gvalue, G_TYPE_STRING );
@@ -1599,6 +1655,19 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column,
                     cell->GetVariantType().c_str() );
 
     cell->SetValue( value );
+    
+/*
+    To set the background to this
+    wxColour colour(30,100,255);
+    GdkColor *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 );
+*/ 
 }
 
 IMPLEMENT_CLASS(wxDataViewColumn, wxDataViewColumnBase)
@@ -1870,6 +1939,49 @@ wxdataview_row_activated_callback( GtkTreeView* treeview, GtkTreePath *path,
 // wxDataViewCtrl
 //-----------------------------------------------------------------------------
 
+//-----------------------------------------------------------------------------
+// InsertChild for wxDataViewCtrl
+//-----------------------------------------------------------------------------
+
+static void wxInsertChildInDataViewCtrl( wxWindowGTK* parent, wxWindowGTK* child )
+{
+    wxDataViewCtrl * dvc = (wxDataViewCtrl*) parent;
+    GtkWidget *treeview = dvc->GtkGetTreeView();
+
+    // Insert widget in GtkTreeView
+    if (GTK_WIDGET_REALIZED(treeview))
+        gtk_widget_set_parent_window( child->m_widget,
+          gtk_tree_view_get_bin_window( GTK_TREE_VIEW(treeview) ) );
+    gtk_widget_set_parent( child->m_widget, treeview );
+}
+
+static
+void gtk_dataviewctrl_size_callback( GtkWidget *WXUNUSED(widget),
+                                     GtkAllocation *alloc,
+                                     wxDataViewCtrl *win )
+{
+
+    wxWindowList::Node *node = win->GetChildren().GetFirst();
+    while (node)
+    {
+        wxWindow *child = node->GetData();
+
+        GtkRequisition req;
+        gtk_widget_size_request( child->m_widget, &req );
+
+        GtkAllocation alloc;
+        alloc.x = child->m_x;
+        alloc.y = child->m_y;
+        alloc.width = child->m_width;
+        alloc.height = child->m_height;
+        gtk_widget_size_allocate( child->m_widget, &alloc );
+
+        node = node->GetNext();
+    }
+}
+
+
+
 IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl, wxDataViewCtrlBase)
 
 wxDataViewCtrl::~wxDataViewCtrl()
@@ -1893,8 +2005,6 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
 {
     Init();
 
-    m_needParent = true;
-
     if (!PreCreation( parent, pos, size ) ||
         !CreateBase( parent, id, pos, size, style, validator ))
     {
@@ -1902,6 +2012,8 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
         return false;
     }
 
+    m_insertCallback = wxInsertChildInDataViewCtrl;
+
     m_widget = gtk_scrolled_window_new (NULL, NULL);
 
     GtkScrolledWindowSetBorder(m_widget, style);
@@ -1909,6 +2021,9 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
     m_treeview = gtk_tree_view_new();
     gtk_container_add (GTK_CONTAINER (m_widget), m_treeview);
 
+    g_signal_connect (m_treeview, "size_allocate",
+                     G_CALLBACK (gtk_dataviewctrl_size_callback), this);
+
 #ifdef __WXGTK26__
     if (!gtk_check_version(2,6,0))
         gtk_tree_view_set_fixed_height_mode( GTK_TREE_VIEW(m_treeview), TRUE );
@@ -1939,7 +2054,9 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
     }
     else
 #endif
+    {
         gtk_tree_view_set_rules_hint( GTK_TREE_VIEW(m_treeview), (style & wxDV_HORIZ_RULES) != 0 );
+    }
 
     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (m_widget),
         GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);