]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dataview.cpp
update setup for OpenVMS
[wxWidgets.git] / src / gtk / dataview.cpp
index a86917692441d2a7b36e8ca0d186844b7de40574..9d842d79e3b3b7eb1a672788755e9ae0449ab1aa 100644 (file)
@@ -92,10 +92,10 @@ public:
 
     // sorting interface
     void SetSortOrder( GtkSortType sort_order ) { m_sort_order = sort_order; }
-    GtkSortType GetSortOrder()                  { return m_sort_order; }
+    GtkSortType GetSortOrder() const            { return m_sort_order; }
 
     void SetSortColumn( int column )            { m_sort_column = column; }
-    int GetSortColumn()                         { return m_sort_column; }
+    int GetSortColumn() const                   { return m_sort_column; }
 
     void SetDataViewSortColumn( wxDataViewColumn *column ) { m_dataview_sort_column = column; }
     wxDataViewColumn *GetDataViewSortColumn()   { return m_dataview_sort_column; }
@@ -104,6 +104,7 @@ public:
 
     // accessors
     wxDataViewModel* GetDataViewModel() { return m_wx_model; }
+    const wxDataViewModel* GetDataViewModel() const { return m_wx_model; }
     wxDataViewCtrl* GetOwner()          { return m_owner; }
     GtkWxTreeModel* GetGtkModel()       { return m_gtk_model; }
 
@@ -883,7 +884,6 @@ static GtkCellEditable *gtk_wx_cell_renderer_text_start_editing(
 
 
 static GObjectClass *text_cell_parent_class = NULL;
-static GObjectClass *text_cell_grand_parent_class = NULL;
 
 }  // extern "C"
 
@@ -2973,6 +2973,36 @@ bool wxDataViewColumn::IsReorderable() const
 // wxGtkTreeModelNode
 //-----------------------------------------------------------------------------
 
+#if 0
+class wxGtkTreeModelChildWithPos
+{
+public:
+    unsigned int pos;
+    void        *id;
+};
+
+static
+int wxGtkTreeModelChildWithPosCmp( const void* data1, const void* data2, const void* user_data )
+{
+    const wxGtkTreeModelChildWithPos* child1 = (const wxGtkTreeModelChildWithPos*) data1;
+    const wxGtkTreeModelChildWithPos* child2 = (const wxGtkTreeModelChildWithPos*) data2;
+    const wxDataViewCtrlInternal *internal = (const wxDataViewCtrlInternal *) user_data;
+    int ret = internal->GetDataViewModel()->Compare( child1->id, child2->id,
+        internal->GetSortColumn(), (internal->GetSortOrder() == GTK_SORT_DESCENDING) );
+
+    return ret;
+}
+#else
+static
+int LINKAGEMODE wxGtkTreeModelChildPtrCmp( void*** data1, void*** data2 )
+{
+    return gs_internal->GetDataViewModel()->Compare( **data1, **data2,
+        gs_internal->GetSortColumn(), (gs_internal->GetSortOrder() == GTK_SORT_ASCENDING) );
+}
+
+WX_DEFINE_ARRAY_PTR( void**, wxGtkTreeModelChildrenPtr );
+#endif
+
 void wxGtkTreeModelNode::Resort()
 {
     size_t child_count = GetChildCount();
@@ -2991,14 +3021,68 @@ void wxGtkTreeModelNode::Resort()
         return;
     }
 
+    gint *new_order = new gint[child_count];
+
+#if 1
+    // m_children has the original *void
+    // ptrs points to these
+    wxGtkTreeModelChildrenPtr ptrs;
+    size_t i;
+    for (i = 0; i < child_count; i++)
+       ptrs.Add( &(m_children[i]) );
+    // Sort the ptrs
+    gs_internal = m_internal;
+    ptrs.Sort( &wxGtkTreeModelChildPtrCmp );
     wxGtkTreeModelChildren temp;
+    void** base_ptr = &(m_children[0]);
+    // Transfer positions to new_order array and 
+    // IDs to temp
+    for (i = 0; i < child_count; i++)
+    {
+        new_order[i] = ptrs[i] - base_ptr;
+        temp.Add( *ptrs[i] );
+    }
+
+    // Transfer IDs back to m_children
+    m_children.Clear();
     WX_APPEND_ARRAY( temp, m_children );
+#endif
+#if 0
+    // Too slow
 
-    gs_internal = m_internal;
-    m_children.Sort( &wxGtkTreeModelChildCmp );
+    // Build up array with IDs and original positions
+    wxGtkTreeModelChildWithPos* temp = new wxGtkTreeModelChildWithPos[child_count];
+    size_t i;
+    for (i = 0; i < child_count; i++)
+    {
+       temp[i].pos = i;
+       temp[i].id = m_children[i];
+    }
+    // Sort array keeping original positions
+    wxQsort( temp, child_count, sizeof(wxGtkTreeModelChildWithPos),
+             &wxGtkTreeModelChildWithPosCmp, m_internal );
+    // Transfer positions to new_order array and
+    // IDs to m_children
+    m_children.Clear();
+    for (i = 0; i < child_count; i++)
+    {
+       new_order[i] = temp[i].pos;
+       m_children.Add( temp[i].id );
+    }
+    // Delete array
+    delete [] temp;
+#endif
 
-    gint *new_order = new gint[child_count];
+#if 0
+    // Too slow
+    
+    wxGtkTreeModelChildren temp;
+    WX_APPEND_ARRAY( temp, m_children );
 
+    gs_internal = m_internal;
+    m_children.Sort( &wxGtkTreeModelChildCmp );
+    
     unsigned int pos;
     for (pos = 0; pos < child_count; pos++)
     {
@@ -3006,6 +3090,7 @@ void wxGtkTreeModelNode::Resort()
         int old_pos = temp.Index( id );
         new_order[pos] = old_pos;
     }
+#endif
 
     GtkTreeModel *gtk_tree_model = GTK_TREE_MODEL( m_internal->GetGtkModel() );
 
@@ -3020,7 +3105,8 @@ void wxGtkTreeModelNode::Resort()
     gtk_tree_path_free (path);
 
     delete [] new_order;
-
+    
+    unsigned int pos;
     for (pos = 0; pos < node_count; pos++)
     {
         wxGtkTreeModelNode *node = m_nodes.Item( pos );