add new ctree sorting code
[claws.git] / src / foldersel.c
index e9b10dd698995b84f86b77bbd18bae1e84f2853f..c9d197f95f6d51d1bc2500dde670eff14c2637b6 100644 (file)
@@ -86,6 +86,10 @@ static void key_pressed              (GtkWidget      *widget,
                                 GdkEventKey    *event,
                                 gpointer        data);
 
+static gint foldersel_clist_compare    (GtkCList       *clist,
+                                        gconstpointer   ptr1,
+                                        gconstpointer   ptr2);
+
 FolderItem *foldersel_folder_sel(Folder *cur_folder,
                                 FolderSelectionType type,
                                 const gchar *default_folder)
@@ -145,14 +149,13 @@ static void foldersel_create(void)
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
        gtk_window_set_modal(GTK_WINDOW(window), TRUE);
        gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, TRUE);
+       gtk_window_set_wmclass
+               (GTK_WINDOW(window), "folder_selection", "Sylpheed");
        gtk_signal_connect(GTK_OBJECT(window), "delete_event",
                           GTK_SIGNAL_FUNC(delete_event), NULL);
        gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
                           GTK_SIGNAL_FUNC(key_pressed), NULL);
-       gtk_signal_connect(GTK_OBJECT(window), "focus_in_event",
-                          GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
-       gtk_signal_connect(GTK_OBJECT(window), "focus_out_event",
-                          GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
+       MANAGE_WINDOW_SIGNALS_CONNECT(window);
 
        vbox = gtk_vbox_new(FALSE, 4);
        gtk_container_add(GTK_CONTAINER(window), vbox);
@@ -171,6 +174,7 @@ static void foldersel_create(void)
        gtk_ctree_set_expander_style(GTK_CTREE(ctree),
                                     GTK_CTREE_EXPANDER_SQUARE);
        gtk_ctree_set_indent(GTK_CTREE(ctree), CTREE_INDENT);
+       gtk_clist_set_compare_func(GTK_CLIST(ctree), foldersel_clist_compare);
        GTK_WIDGET_UNSET_FLAGS(GTK_CLIST(ctree)->column[0].button,
                               GTK_CAN_FOCUS);
        /* gtk_signal_connect(GTK_OBJECT(ctree), "tree_select_row",
@@ -219,7 +223,7 @@ static gboolean foldersel_gnode_func(GtkCTree *ctree, guint depth,
                name = _("Inbox");
                break;
        case F_OUTBOX:
-               name = _("Outbox");
+               name = _("Sent");
                break;
        case F_QUEUE:
                name = _("Queue");
@@ -228,7 +232,7 @@ static gboolean foldersel_gnode_func(GtkCTree *ctree, guint depth,
                name = _("Trash");
                break;
        case F_DRAFT:
-               name = _("Draft");
+               name = _("Drafts");
                break;
        default:
                name = item->name;
@@ -269,20 +273,21 @@ static void foldersel_expand_func(GtkCTree *ctree, GtkCTreeNode *node,
 #define SET_SPECIAL_FOLDER(item) \
 { \
        if (item) { \
-               GtkCTreeNode *node_, *sibling; \
+               GtkCTreeNode *node_, *parent, *sibling; \
  \
                node_ = gtk_ctree_find_by_row_data \
                        (GTK_CTREE(ctree), node, item); \
                if (!node_) \
                        g_warning("%s not found.\n", item->path); \
                else { \
-                       if (!prev) \
-                               sibling = GTK_CTREE_ROW(node)->children; \
-                       else \
+                       parent = GTK_CTREE_ROW(node_)->parent; \
+                       if (prev && parent == GTK_CTREE_ROW(prev)->parent) \
                                sibling = GTK_CTREE_ROW(prev)->sibling; \
+                       else \
+                               sibling = GTK_CTREE_ROW(parent)->children; \
                        if (node_ != sibling) \
                                gtk_ctree_move(GTK_CTREE(ctree), \
-                                              node_, node, sibling); \
+                                              node_, parent, sibling); \
                } \
  \
                prev = node_; \
@@ -314,7 +319,7 @@ static void foldersel_set_tree(Folder *cur_folder, FolderSelectionType type)
                                              folder->node,
                                              foldersel_gnode_func,
                                              NULL);
-               gtk_ctree_sort_recursive(GTK_CTREE(ctree), node);
+               gtk_sctree_sort_recursive(GTK_CTREE(ctree), node);
                SET_SPECIAL_FOLDER(folder->inbox);
                SET_SPECIAL_FOLDER(folder->outbox);
                SET_SPECIAL_FOLDER(folder->draft);
@@ -376,3 +381,17 @@ static void key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
        if (event && event->keyval == GDK_Escape)
                foldersel_cancel(NULL, NULL);
 }
+
+static gint foldersel_clist_compare(GtkCList *clist,
+                                   gconstpointer ptr1, gconstpointer ptr2)
+{
+       FolderItem *item1 = ((GtkCListRow *)ptr1)->data;
+       FolderItem *item2 = ((GtkCListRow *)ptr2)->data;
+
+       if (!item1->name)
+               return (item2->name != NULL);
+       if (!item2->name)
+               return -1;
+
+       return g_strcasecmp(item1->name, item2->name);
+}