]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dataview.cpp
fixed wxString::FromAscii signature
[wxWidgets.git] / src / gtk / dataview.cpp
index 9023c136801ab440571e125ded5adba9082d9723..9b7df0db61eface0cc43e518ca52afe56067a0b2 100644 (file)
@@ -1173,6 +1173,51 @@ bool wxGtkDataViewModelNotifier::Cleared()
 // wxDataViewRenderer
 // ---------------------------------------------------------
 
+static gpointer s_user_data = NULL;
+
+static void
+wxgtk_cell_editable_editing_done( GtkCellEditable *editable, 
+                                  wxDataViewRenderer *wxrenderer )
+{
+    wxDataViewColumn *column = wxrenderer->GetOwner();
+    wxDataViewCtrl *dv = column->GetOwner();
+    wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, dv->GetId() );
+    event.SetDataViewColumn( column );
+    event.SetModel( dv->GetModel() );
+    wxDataViewItem item( s_user_data );
+    event.SetItem( item );
+    dv->GetEventHandler()->ProcessEvent( event );
+}
+
+static void 
+wxgtk_renderer_editing_started( GtkCellRenderer *cell, GtkCellEditable *editable,
+                                gchar *path, wxDataViewRenderer *wxrenderer )
+{
+    wxDataViewColumn *column = wxrenderer->GetOwner();
+    wxDataViewCtrl *dv = column->GetOwner();
+    wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, dv->GetId() );
+    event.SetDataViewColumn( column );
+    event.SetModel( dv->GetModel() );
+    GtkTreePath *tree_path = gtk_tree_path_new_from_string( path );
+    GtkTreeIter iter;
+    dv->GtkGetInternal()->get_iter( &iter, tree_path );
+    gtk_tree_path_free( tree_path );
+    wxDataViewItem item( iter.user_data );
+    event.SetItem( item );
+    dv->GetEventHandler()->ProcessEvent( event );
+
+    if (GTK_IS_CELL_EDITABLE(editable))
+    {
+        s_user_data = iter.user_data;
+    
+        g_signal_connect (GTK_CELL_EDITABLE (editable), "editing_done",
+            G_CALLBACK (wxgtk_cell_editable_editing_done),
+            (gpointer) wxrenderer );
+        
+    }
+}
+
+
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer, wxDataViewRendererBase)
 
 wxDataViewRenderer::wxDataViewRenderer( const wxString &varianttype, wxDataViewCellMode mode,
@@ -1185,6 +1230,16 @@ wxDataViewRenderer::wxDataViewRenderer( const wxString &varianttype, wxDataViewC
     //       after the m_renderer pointer has been initialized
 }
 
+void wxDataViewRenderer::GtkInitHandlers()
+{
+    if (!gtk_check_version(2,6,0))
+    {
+        g_signal_connect (GTK_CELL_RENDERER(m_renderer), "editing_started",
+                   G_CALLBACK (wxgtk_renderer_editing_started),
+                   this);
+    }
+}
+
 void wxDataViewRenderer::SetMode( wxDataViewCellMode mode )
 {
     GtkCellRendererMode gtkMode;
@@ -1349,6 +1404,8 @@ wxDataViewTextRenderer::wxDataViewTextRenderer( const wxString &varianttype, wxD
         g_value_unset( &gvalue );
 
         g_signal_connect_after( m_renderer, "edited", G_CALLBACK(wxGtkTextRendererEditedCallback), this );
+        
+        GtkInitHandlers();
     }
 
     SetMode(mode);
@@ -1612,6 +1669,8 @@ bool wxDataViewCustomRenderer::Init(wxDataViewCellMode mode, int align)
     SetMode(mode);
     SetAlignment(align);
 
+    GtkInitHandlers();
+    
     return true;
 }
 
@@ -1831,6 +1890,67 @@ bool wxDataViewDateRenderer::Activate( wxRect cell, wxDataViewModel *model,
     return true;
 }
 
+
+// --------------------------------------------------------- 
+// wxDataViewIconTextRenderer
+// --------------------------------------------------------- 
+
+IMPLEMENT_CLASS(wxDataViewIconTextRenderer, wxDataViewCustomRenderer)
+
+wxDataViewIconTextRenderer::wxDataViewIconTextRenderer( 
+  const wxString &varianttype, wxDataViewCellMode mode, int align ) :
+    wxDataViewCustomRenderer( varianttype, mode, align )
+{
+    SetMode(mode);
+    SetAlignment(align);
+}
+
+wxDataViewIconTextRenderer::~wxDataViewIconTextRenderer()
+{
+}
+    
+bool wxDataViewIconTextRenderer::SetValue( const wxVariant &value )
+{
+    m_value << value;
+    return true;
+}
+
+bool wxDataViewIconTextRenderer::GetValue( wxVariant &value ) const
+{
+    return false;
+}
+    
+bool wxDataViewIconTextRenderer::Render( wxRect cell, wxDC *dc, int state )
+{
+    dc->SetFont( GetOwner()->GetOwner()->GetFont() );
+    
+    const wxIcon &icon = m_value.GetIcon();
+    if (icon.IsOk())
+    {
+        dc->DrawIcon( icon, cell.x, cell.y ); // TODO centre
+        cell.x += icon.GetWidth()+4;
+    }
+    
+    dc->DrawText( m_value.GetText(), cell.x, cell.y );
+
+    return true;
+}
+
+wxSize wxDataViewIconTextRenderer::GetSize() const
+{
+    return wxSize(80,16);  // TODO
+}
+
+wxControl* wxDataViewIconTextRenderer::CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value )
+{
+    return NULL;
+}
+
+bool wxDataViewIconTextRenderer::GetValueFromEditorCtrl( wxControl* editor, wxVariant &value )
+{
+    return false;
+}
+
 // ---------------------------------------------------------
 // wxDataViewColumn
 // ---------------------------------------------------------
@@ -1918,6 +2038,9 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *column,
 
 IMPLEMENT_CLASS(wxDataViewColumn, wxDataViewColumnBase)
 
+#include <wx/listimpl.cpp>
+WX_DEFINE_LIST(wxDataViewColumnList);
+
 wxDataViewColumn::wxDataViewColumn( const wxString &title, wxDataViewRenderer *cell,
                                     unsigned int model_column, int width,
                                     wxAlignment align, int flags ) :
@@ -2257,17 +2380,19 @@ void wxDataViewCtrlInternal::BuildBranch( wxGtkTreeModelNode *node )
 {
     if (node->GetChildCount() == 0)
     {
-        wxDataViewItem child = m_wx_model->GetFirstChild( node->GetItem() );
-        while (child.IsOk())
+        wxDataViewItemArray children;
+        unsigned int count = m_wx_model->GetChildren( node->GetItem(), children );
+        unsigned int pos;
+        for (pos = 0; pos < count; pos++)
         {
+            wxDataViewItem child = children[pos];
+            
             if (m_wx_model->IsContainer( child ))
                 node->AddNode( new wxGtkTreeModelNode( node, child, this ) );
             else
                 node->AddLeave( child.GetID() );
     
             // Don't send any events here
-    
-            child = m_wx_model->GetNextSibling( child );
         }
     }
 }
@@ -2927,13 +3052,83 @@ bool wxDataViewCtrl::AppendColumn( wxDataViewColumn *col )
     if (!wxDataViewCtrlBase::AppendColumn(col))
         return false;
 
-    GtkTreeViewColumn *column = (GtkTreeViewColumn *)col->GetGtkHandle();
+    m_cols.Append( col );
 
-    gtk_tree_view_append_column( GTK_TREE_VIEW(m_treeview), column );
+    gtk_tree_view_append_column( GTK_TREE_VIEW(m_treeview), 
+                                 GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) );
 
     return true;
 }
 
+unsigned int wxDataViewCtrl::GetColumnCount() const
+{
+    return m_cols.GetCount();
+}
+
+wxDataViewColumn* wxDataViewCtrl::GetColumn( unsigned int pos ) const
+{
+    GtkTreeViewColumn *gtk_col = gtk_tree_view_get_column( GTK_TREE_VIEW(m_treeview), pos );
+    if (!gtk_col)
+        return NULL;
+        
+    wxDataViewColumnList::const_iterator iter;
+    for (iter = m_cols.begin(); iter != m_cols.end(); iter++)
+    {
+        wxDataViewColumn *col = *iter;
+        if (GTK_TREE_VIEW_COLUMN(col->GetGtkHandle()) == gtk_col)
+        {
+            return col;
+        }
+    }
+    
+    return NULL;
+}
+
+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;
+
+    return true;
+}
+
+bool wxDataViewCtrl::ClearColumns()
+{
+    wxDataViewColumnList::iterator 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();
+    
+    return true;
+}
+
+void wxDataViewCtrl::Expand( const wxDataViewItem & item )
+{
+    GtkTreeIter iter;
+    iter.user_data = item.GetID();
+    GtkTreePath *path = m_internal->get_path( &iter );
+    gtk_tree_view_expand_row( GTK_TREE_VIEW(m_treeview), path, false );
+    gtk_tree_path_free( path );
+}
+
+void wxDataViewCtrl::Collapse( const wxDataViewItem & item )
+{
+    GtkTreeIter iter;
+    iter.user_data = item.GetID();
+    GtkTreePath *path = m_internal->get_path( &iter );
+    gtk_tree_view_collapse_row( GTK_TREE_VIEW(m_treeview), path );
+    gtk_tree_path_free( path );
+}
+
 wxDataViewItem wxDataViewCtrl::GetSelection() const
 {
     GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
@@ -3102,10 +3297,10 @@ void wxDataViewCtrl::EnsureVisible( const wxDataViewItem & item, const wxDataVie
 }
 
 void wxDataViewCtrl::HitTest( const wxPoint &point, 
-                              wxDataViewItem &item,  wxDataViewColumn *column ) const
+                              wxDataViewItem &item,  wxDataViewColumn *&column ) const
 {
     item = wxDataViewItem(0);
-    column = 0;
+    column = NULL;
 }
 
 wxRect wxDataViewCtrl::GetItemRect( const wxDataViewItem &item, 
@@ -3116,6 +3311,8 @@ wxRect wxDataViewCtrl::GetItemRect( const wxDataViewItem &item,
 
 void wxDataViewCtrl::DoSetExpanderColumn()
 {
+    gtk_tree_view_set_expander_column( GTK_TREE_VIEW(m_treeview), 
+        GTK_TREE_VIEW_COLUMN( GetExpanderColumn()->GetGtkHandle() ) );
 }
 
 void wxDataViewCtrl::DoSetIndent()