aboutsummaryrefslogtreecommitdiffstats
path: root/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'widgets')
-rw-r--r--widgets/table/e-tree-memory.c66
-rw-r--r--widgets/table/e-tree-memory.h48
2 files changed, 102 insertions, 12 deletions
diff --git a/widgets/table/e-tree-memory.c b/widgets/table/e-tree-memory.c
index 88e9cd9a55..20d96ad6e6 100644
--- a/widgets/table/e-tree-memory.c
+++ b/widgets/table/e-tree-memory.c
@@ -546,3 +546,69 @@ e_tree_memory_node_remove (ETreeMemory *etree, ETreePath node)
return ret;
}
+
+typedef struct {
+ ETreeMemory *memory;
+ gpointer closure;
+ ETreeMemorySortCallback callback;
+} MemoryAndClosure;
+
+static int
+sort_callback(const void *data1, const void *data2, gpointer user_data)
+{
+ ETreePath path1 = (void *) data1;
+ ETreePath path2 = (void *) data2;
+ MemoryAndClosure *mac = user_data;
+ return (*mac->callback) (mac->memory, path1, path2, mac->closure);
+}
+
+void
+e_tree_memory_sort_node (ETreeMemory *etmm,
+ ETreePath node,
+ ETreeMemorySortCallback callback,
+ gpointer user_data)
+{
+ ETreeMemoryPath **children;
+ ETreeMemoryPath *child;
+ int count;
+ int i;
+ ETreeMemoryPath *path = node;
+ MemoryAndClosure mac;
+ ETreeMemoryPath *last;
+
+ i = 0;
+ for (child = path->first_child; child; child = child->next_sibling)
+ i++;
+
+ children = g_new(ETreeMemoryPath *, i);
+
+ count = i;
+
+ for (child = path->first_child, i = 0;
+ child;
+ child = child->next_sibling, i++) {
+ children[i] = child;
+ }
+
+ mac.memory = etmm;
+ mac.closure = user_data;
+ mac.callback = callback;
+
+ e_sort (children, count, sizeof (ETreeMemoryPath *), sort_callback, &mac);
+
+ last = NULL;
+ for (i = 0;
+ i < count;
+ i++) {
+ children[i]->prev_sibling = last;
+ if (last)
+ last->next_sibling = children[i];
+ last = children[i];
+ }
+ if (last)
+ last->next_sibling = NULL;
+
+ g_free(children);
+
+ e_tree_model_node_changed(E_TREE_MODEL(etmm), node);
+}
diff --git a/widgets/table/e-tree-memory.h b/widgets/table/e-tree-memory.h
index 264df86acb..633594c2d5 100644
--- a/widgets/table/e-tree-memory.h
+++ b/widgets/table/e-tree-memory.h
@@ -20,6 +20,8 @@ typedef struct ETreeMemory ETreeMemory;
typedef struct ETreeMemoryPriv ETreeMemoryPriv;
typedef struct ETreeMemoryClass ETreeMemoryClass;
+typedef int (*ETreeMemorySortCallback) (ETreeMemory *etmm, ETreePath path1, ETreePath path2, gpointer closure);
+
struct ETreeMemory {
ETreeModel base;
ETreeMemoryPriv *priv;
@@ -29,26 +31,48 @@ struct ETreeMemoryClass {
ETreeModelClass parent_class;
};
-GtkType e_tree_memory_get_type (void);
-void e_tree_memory_construct (ETreeMemory *etree);
-ETreeMemory *e_tree_memory_new (void);
+
+GtkType e_tree_memory_get_type (void);
+void e_tree_memory_construct (ETreeMemory *etree);
+ETreeMemory *e_tree_memory_new (void);
/* node operations */
-ETreePath e_tree_memory_node_insert (ETreeMemory *etree, ETreePath parent, int position, gpointer node_data);
-ETreePath e_tree_memory_node_insert_id (ETreeMemory *etree, ETreePath parent, int position, gpointer node_data, char *id);
-ETreePath e_tree_memory_node_insert_before (ETreeMemory *etree, ETreePath parent, ETreePath sibling, gpointer node_data);
-gpointer e_tree_memory_node_remove (ETreeMemory *etree, ETreePath path);
+ETreePath e_tree_memory_node_insert (ETreeMemory *etree,
+ ETreePath parent,
+ int position,
+ gpointer node_data);
+ETreePath e_tree_memory_node_insert_id (ETreeMemory *etree,
+ ETreePath parent,
+ int position,
+ gpointer node_data,
+ char *id);
+ETreePath e_tree_memory_node_insert_before (ETreeMemory *etree,
+ ETreePath parent,
+ ETreePath sibling,
+ gpointer node_data);
+gpointer e_tree_memory_node_remove (ETreeMemory *etree,
+ ETreePath path);
/* Freeze and thaw */
-void e_tree_memory_freeze (ETreeMemory *etree);
-void e_tree_memory_thaw (ETreeMemory *etree);
+void e_tree_memory_freeze (ETreeMemory *etree);
+void e_tree_memory_thaw (ETreeMemory *etree);
-void e_tree_memory_set_expanded_default (ETreeMemory *etree, gboolean expanded);
-gpointer e_tree_memory_node_get_data (ETreeMemory *etm, ETreePath node);
-void e_tree_memory_node_set_data (ETreeMemory *etm, ETreePath node, gpointer node_data);
+
+void e_tree_memory_set_expanded_default (ETreeMemory *etree,
+ gboolean expanded);
+gpointer e_tree_memory_node_get_data (ETreeMemory *etm,
+ ETreePath node);
+void e_tree_memory_node_set_data (ETreeMemory *etm,
+ ETreePath node,
+ gpointer node_data);
+void e_tree_memory_sort_node (ETreeMemory *etm,
+ ETreePath node,
+ ETreeMemorySortCallback callback,
+ gpointer user_data);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _E_TREE_MEMORY_H */
+