0.9.10claws55
authorChristoph Hohmann <reboot@gmx.ch>
Thu, 6 May 2004 14:41:58 +0000 (14:41 +0000)
committerChristoph Hohmann <reboot@gmx.ch>
Thu, 6 May 2004 14:41:58 +0000 (14:41 +0000)
* src/gtk/prefswindow.c
        change window type to DIALOG

* src/folder.[ch]
* src/folderview.c
* src/news_gtk.c
        o add folder_remove()
        o change FolderUpdate hook flag names (NEW -> ADD, DESTROY -> REMOVE)
        o add new "sort" field to Folder, no longer sort folders by type
          higher sort values will be first in the folder list, new folders get 0
          and will be added to the end

* src/mainwindow.c
* src/gtk/Makefile.am
* src/gtk/foldersort.(c|h|glade)                        ** NEW **
        add dialog to allow users to change the folder order

12 files changed:
ChangeLog.claws
configure.ac
src/folder.c
src/folder.h
src/folderview.c
src/gtk/Makefile.am
src/gtk/foldersort.c [new file with mode: 0644]
src/gtk/foldersort.glade [new file with mode: 0644]
src/gtk/foldersort.h [new file with mode: 0644]
src/gtk/prefswindow.c
src/mainwindow.c
src/news_gtk.c

index 8edd20617c7865d60427b1a99cdd80957e14a7fb..26c43b84440250a7c0f9e48b30ce2fbac6984f78 100644 (file)
@@ -1,3 +1,22 @@
+2004-05-06 [christoph] 0.9.10claws55
+
+       * src/gtk/prefswindow.c
+               change window type to DIALOG
+
+       * src/folder.[ch]
+       * src/folderview.c
+       * src/news_gtk.c
+               o add folder_remove()
+               o change FolderUpdate hook flag names (NEW -> ADD, DESTROY -> REMOVE)
+               o add new "sort" field to Folder, no longer sort folders by type
+                 higher sort values will be first in the folder list, new folders get 0
+                 and will be added to the end
+
+       * src/mainwindow.c
+       * src/gtk/Makefile.am
+       * src/gtk/foldersort.(c|h|glade)                        ** NEW **
+               add dialog to allow users to change the folder order
+
 2004-05-04 [paul]      0.9.10claws54
 
        * src/inc.c
index 0ead2e8fa0df2925198fc1c1865a3a1cce42645b..7d35428a547d3e606d68c6a205948f7ce23fa0a1 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=9
 MICRO_VERSION=10
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=54
+EXTRA_VERSION=55
 
 if test $EXTRA_VERSION -eq 0; then
     VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}claws
index 028430fbf41a8f393a192321427550be3faae5da..70276d56ce3f2a42e46190f602187cea93f10237 100644 (file)
@@ -166,6 +166,7 @@ void folder_init(Folder *folder, const gchar *name)
 
        /* Init folder data */
        folder->account = NULL;
+       folder->sort = 0;
        folder->inbox = NULL;
        folder->outbox = NULL;
        folder->draft = NULL;
@@ -175,17 +176,10 @@ void folder_init(Folder *folder, const gchar *name)
 
 void folder_destroy(Folder *folder)
 {
-       FolderUpdateData hookdata;
-
        g_return_if_fail(folder != NULL);
        g_return_if_fail(folder->klass->destroy_folder != NULL);
 
-       folder_list = g_list_remove(folder_list, folder);
-
-       hookdata.folder = folder;
-       hookdata.update_flags = FOLDER_DESTROY_FOLDER;
-       hookdata.item = NULL;
-       hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
+       folder_remove(folder);
 
        folder_tree_destroy(folder);
 
@@ -229,6 +223,8 @@ void folder_set_xml(Folder *folder, XMLTag *tag)
                } else if (!strcmp(attr->name, "collapsed")) {
                        if (rootitem != NULL)
                                rootitem->collapsed = *attr->value == '1' ? TRUE : FALSE;
+               } else if (!strcmp(attr->name, "sort")) {
+                       folder->sort = atoi(attr->value);
                }
        }
 }
@@ -248,6 +244,7 @@ XMLTag *folder_get_xml(Folder *folder)
 
                xml_tag_add_attr(tag, "collapsed", g_strdup(rootitem->collapsed ? "1" : "0"));
        }
+       xml_tag_add_attr(tag, "sort", g_strdup_printf("%d", folder->sort));
 
        return tag;
 }
@@ -571,6 +568,17 @@ void folder_set_name(Folder *folder, const gchar *name)
        }
 }
 
+void folder_set_sort(Folder *folder, guint sort)
+{
+       g_return_if_fail(folder != NULL);
+
+       if (folder->sort != sort) {
+               folder_remove(folder);
+               folder->sort = sort;
+               folder_add(folder);
+       }
+}
+
 gboolean folder_tree_destroy_func(GNode *node, gpointer data) {
        FolderItem *item = (FolderItem *) node->data;
 
@@ -607,27 +615,28 @@ void folder_add(Folder *folder)
 
        for (i = 0, cur = folder_list; cur != NULL; cur = cur->next, i++) {
                cur_folder = FOLDER(cur->data);
-               if (FOLDER_TYPE(folder) == F_MH) {
-                       if (FOLDER_TYPE(cur_folder) != F_MH) break;
-               } else if (FOLDER_TYPE(folder) == F_MBOX) {
-                       if (FOLDER_TYPE(cur_folder) != F_MH &&
-                           FOLDER_TYPE(cur_folder) != F_MBOX) break;
-               } else if (FOLDER_TYPE(folder) == F_IMAP) {
-                       if (FOLDER_TYPE(cur_folder) != F_MH &&
-                           FOLDER_TYPE(cur_folder) != F_MBOX &&
-                           FOLDER_TYPE(cur_folder) != F_IMAP) break;
-               } else if (FOLDER_TYPE(folder) == F_NEWS) {
-                       if (FOLDER_TYPE(cur_folder) != F_MH &&
-                           FOLDER_TYPE(cur_folder) != F_MBOX &&
-                           FOLDER_TYPE(cur_folder) != F_IMAP &&
-                           FOLDER_TYPE(cur_folder) != F_NEWS) break;
-               }
+               if (cur_folder->sort < folder->sort)
+                       break;
        }
 
        folder_list = g_list_insert(folder_list, folder, i);
 
        hookdata.folder = folder;
-       hookdata.update_flags = FOLDER_NEW_FOLDER;
+       hookdata.update_flags = FOLDER_ADD_FOLDER;
+       hookdata.item = NULL;
+       hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
+}
+
+void folder_remove(Folder *folder)
+{
+       FolderUpdateData hookdata;
+
+       g_return_if_fail(folder != NULL);
+
+       folder_list = g_list_remove(folder_list, folder);
+
+       hookdata.folder = folder;
+       hookdata.update_flags = FOLDER_REMOVE_FOLDER;
        hookdata.item = NULL;
        hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
 }
@@ -774,7 +783,7 @@ FolderItem *folder_create_folder(FolderItem *parent, const gchar *name)
                new_item->cache = msgcache_new();
 
                hookdata.folder = new_item->folder;
-               hookdata.update_flags = FOLDER_TREE_CHANGED | FOLDER_NEW_FOLDERITEM;
+               hookdata.update_flags = FOLDER_TREE_CHANGED | FOLDER_ADD_FOLDERITEM;
                hookdata.item = new_item;
                hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
        }
@@ -1157,23 +1166,23 @@ gchar *folder_item_get_name(FolderItem *item)
 
        switch (item->stype) {
        case F_INBOX:
-               name = g_strdup(!strcmp2(item->name, INBOX_DIR) ? _("Inbox") :
+               name = g_strdup(!g_strcasecmp(item->name, INBOX_DIR) ? _("Inbox") :
                                item->name);
                break;
        case F_OUTBOX:
-               name = g_strdup(!strcmp2(item->name, OUTBOX_DIR) ? _("Sent") :
+               name = g_strdup(!g_strcasecmp(item->name, OUTBOX_DIR) ? _("Sent") :
                                item->name);
                break;
        case F_QUEUE:
-               name = g_strdup(!strcmp2(item->name, QUEUE_DIR) ? _("Queue") :
+               name = g_strdup(!g_strcasecmp(item->name, QUEUE_DIR) ? _("Queue") :
                                item->name);
                break;
        case F_TRASH:
-               name = g_strdup(!strcmp2(item->name, TRASH_DIR) ? _("Trash") :
+               name = g_strdup(!g_strcasecmp(item->name, TRASH_DIR) ? _("Trash") :
                                item->name);
                break;
        case F_DRAFT:
-               name = g_strdup(!strcmp2(item->name, DRAFT_DIR) ? _("Drafts") :
+               name = g_strdup(!g_strcasecmp(item->name, DRAFT_DIR) ? _("Drafts") :
                                item->name);
                break;
        default:
index 6e6ada021b45e7f4db68caed2792aa126973b7eb..aaf5ddd40db3ad648392299ff63e2dcf4501967d 100644 (file)
@@ -100,10 +100,10 @@ typedef enum
 
 typedef enum
 {
-       FOLDER_NEW_FOLDER               = 1 << 0,
-       FOLDER_DESTROY_FOLDER           = 1 << 1,
+       FOLDER_ADD_FOLDER               = 1 << 0,
+       FOLDER_REMOVE_FOLDER            = 1 << 1,
        FOLDER_TREE_CHANGED             = 1 << 2,
-       FOLDER_NEW_FOLDERITEM           = 1 << 3,
+       FOLDER_ADD_FOLDERITEM           = 1 << 3,
        FOLDER_REMOVE_FOLDERITEM        = 1 << 4,
 } FolderUpdateFlags;
 
@@ -137,6 +137,7 @@ struct _Folder
 
        gchar *name;
        PrefsAccount *account;
+       guint sort;
 
        FolderItem *inbox;
        FolderItem *outbox;
@@ -667,9 +668,12 @@ void        folder_set_ui_func     (Folder         *folder,
                                 gpointer        data);
 void        folder_set_name    (Folder         *folder,
                                 const gchar    *name);
+void       folder_set_sort     (Folder         *folder,
+                                guint           sort);
 void        folder_tree_destroy        (Folder         *folder);
 
 void   folder_add              (Folder         *folder);
+void   folder_remove           (Folder         *folder);
 
 GList *folder_get_list         (void);
 gint   folder_read_list                (void);
index 1eb461d5cccc3f875b908084cf19d89617e61671..837f0796690792281669df6a780cc8c8acd5388b 100644 (file)
@@ -1891,7 +1891,7 @@ gboolean folderview_update_folder(gpointer source, gpointer userdata)
        ctree = folderview->ctree;
        g_return_val_if_fail(ctree != NULL, FALSE);
 
-       if (hookdata->update_flags & FOLDER_NEW_FOLDERITEM)
+       if (hookdata->update_flags & FOLDER_ADD_FOLDERITEM)
                folderview_create_folder_node(folderview, hookdata->item);
        else if (hookdata->update_flags & FOLDER_REMOVE_FOLDERITEM) {
                GtkCTreeNode *node;
@@ -1899,7 +1899,7 @@ gboolean folderview_update_folder(gpointer source, gpointer userdata)
                node = gtk_ctree_find_by_row_data(GTK_CTREE(ctree), NULL, hookdata->item);
                if (node != NULL)
                        gtk_ctree_remove_node(GTK_CTREE(ctree), node);
-       } else if (hookdata->update_flags & (FOLDER_TREE_CHANGED | FOLDER_NEW_FOLDER | FOLDER_DESTROY_FOLDER))
+       } else if (hookdata->update_flags & (FOLDER_TREE_CHANGED | FOLDER_ADD_FOLDER | FOLDER_REMOVE_FOLDER))
                folderview_set(folderview);
 
        return FALSE;
index 7dce94c5f770ace6ce35cbf59a41ea9715b38c9c..37d593415753f89fcd2ccdfdfc6fbc5529913ce6 100644 (file)
@@ -8,6 +8,7 @@ libsylpheedgtk_la_SOURCES = \
        colorsel.c \
        description_window.c \
        filesel.c \
+       foldersort.c \
        gtkaspell.c \
        gtksctree.c \
        gtkshruler.c \
@@ -30,6 +31,7 @@ sylpheedgtkinclude_HEADERS = \
        colorsel.h \
        description_window.h \
        filesel.h \
+       foldersort.h \
        gtkaspell.h \
        gtksctree.h \
        gtkshruler.h \
diff --git a/src/gtk/foldersort.c b/src/gtk/foldersort.c
new file mode 100644 (file)
index 0000000..aaca22f
--- /dev/null
@@ -0,0 +1,267 @@
+/*
+ * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2004 Hiroyuki Yamamoto and the Sylpheed-Claws Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include "intl.h"
+#include "foldersort.h"
+#include "inc.h"
+#include "utils.h"
+
+typedef struct _FolderSortDialog FolderSortDialog;
+
+struct _FolderSortDialog
+{
+       GtkWidget *window;
+       GtkWidget *moveup_btn;
+       GtkWidget *movedown_btn;
+       GtkWidget *folderlist;
+
+       gint rows, selected;
+};
+
+static void destroy_dialog(FolderSortDialog *dialog)
+{
+       inc_unlock();
+       gtk_widget_destroy(dialog->window);
+
+       g_free(dialog);
+}
+
+static void ok_clicked(GtkWidget *widget, FolderSortDialog *dialog)
+{
+       Folder *folder;
+       int i;
+
+       for (i = 0; i < dialog->rows; i++) {
+               folder = gtk_clist_get_row_data(GTK_CLIST(dialog->folderlist), i);
+
+               folder_set_sort(folder, dialog->rows - i);
+       }
+
+       destroy_dialog(dialog);
+}
+
+static void cancel_clicked(GtkWidget *widget, FolderSortDialog *dialog)
+{
+       destroy_dialog(dialog);
+}
+
+static void set_selected(FolderSortDialog *dialog, gint row)
+{
+       if (row >= 0) {
+               gtk_widget_set_sensitive(dialog->moveup_btn, row > 0);
+               gtk_widget_set_sensitive(dialog->movedown_btn, row < (dialog->rows - 1));
+       } else {
+               gtk_widget_set_sensitive(dialog->moveup_btn, FALSE);
+               gtk_widget_set_sensitive(dialog->movedown_btn, FALSE);
+       }
+
+       dialog->selected = row;
+}
+
+static void moveup_clicked(GtkWidget *widget, FolderSortDialog *dialog)
+{
+       g_return_if_fail(dialog->selected > 0);
+
+       gtk_clist_swap_rows(GTK_CLIST(dialog->folderlist), dialog->selected, dialog->selected - 1);
+}
+
+static void movedown_clicked(GtkWidget *widget, FolderSortDialog *dialog)
+{
+       g_return_if_fail(dialog->selected < (dialog->rows - 1));
+
+       gtk_clist_swap_rows(GTK_CLIST(dialog->folderlist), dialog->selected, dialog->selected + 1);
+}
+
+static void row_selected(GtkCList *clist, gint row, gint column, GdkEventButton *event, FolderSortDialog *dialog)
+{
+       set_selected(dialog, row);
+}
+
+static void row_unselected(GtkCList *clist, gint row, gint column, GdkEventButton *event, FolderSortDialog *dialog)
+{
+       set_selected(dialog, -1);
+}
+
+static void row_moved(GtkCList *clist, gint srcpos, gint destpos, FolderSortDialog *dialog)
+{
+       if (dialog->selected == -1)
+               return;
+       else if (srcpos == dialog->selected)
+               set_selected(dialog, destpos);
+       else if (srcpos < dialog->selected && destpos >= dialog->selected)
+               set_selected(dialog, dialog->selected - 1);
+       else if (srcpos > dialog->selected && destpos <= dialog->selected)
+               set_selected(dialog, dialog->selected + 1);
+}
+
+void foldersort_open()
+{
+       FolderSortDialog *dialog = g_new0(FolderSortDialog, 1);
+       GList *flist;
+
+       /* BEGIN GLADE CODE */
+
+       GtkWidget *window;
+       GtkWidget *table1;
+       GtkWidget *label1;
+       GtkWidget *hbuttonbox1;
+       GtkWidget *ok_btn;
+       GtkWidget *cancel_btn;
+       GtkWidget *vbox1;
+       GtkWidget *moveup_btn;
+       GtkWidget *arrow1;
+       GtkWidget *movedown_btn;
+       GtkWidget *arrow2;
+       GtkWidget *scrolledwindow1;
+       GtkWidget *folderlist;
+       GtkWidget *label2;
+
+       window = gtk_window_new(GTK_WINDOW_DIALOG);
+       gtk_object_set_data(GTK_OBJECT(window), "window", window);
+       gtk_container_set_border_width(GTK_CONTAINER(window), 4);
+       gtk_window_set_title(GTK_WINDOW(window),
+                            _("Set folder sortorder"));
+       gtk_window_set_modal(GTK_WINDOW(window), TRUE);
+       gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);
+
+       table1 = gtk_table_new(3, 2, FALSE);
+       gtk_widget_show(table1);
+       gtk_container_add(GTK_CONTAINER(window), table1);
+       gtk_table_set_row_spacings(GTK_TABLE(table1), 4);
+       gtk_table_set_col_spacings(GTK_TABLE(table1), 4);
+
+       label1 =
+           gtk_label_new(_
+                         ("Move folders up or down to change\nthe sort order in the folderview"));
+       gtk_widget_show(label1);
+       gtk_table_attach(GTK_TABLE(table1), label1, 0, 1, 0, 1,
+                        (GtkAttachOptions) (GTK_FILL),
+                        (GtkAttachOptions) (0), 0, 0);
+       gtk_label_set_justify(GTK_LABEL(label1), GTK_JUSTIFY_LEFT);
+       gtk_misc_set_alignment(GTK_MISC(label1), 0, 0.5);
+
+       hbuttonbox1 = gtk_hbutton_box_new();
+       gtk_widget_show(hbuttonbox1);
+       gtk_table_attach(GTK_TABLE(table1), hbuttonbox1, 0, 1, 2, 3,
+                        (GtkAttachOptions) (GTK_FILL),
+                        (GtkAttachOptions) (0), 0, 0);
+       gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox1),
+                                 GTK_BUTTONBOX_END);
+       gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbuttonbox1), 0);
+       gtk_button_box_set_child_size(GTK_BUTTON_BOX(hbuttonbox1), 0, 0);
+       gtk_button_box_set_child_ipadding(GTK_BUTTON_BOX(hbuttonbox1), 0,
+                                         0);
+
+       ok_btn = gtk_button_new_with_label(_("Ok"));
+       gtk_widget_show(ok_btn);
+       gtk_container_add(GTK_CONTAINER(hbuttonbox1), ok_btn);
+       GTK_WIDGET_SET_FLAGS(ok_btn, GTK_CAN_DEFAULT);
+
+       cancel_btn = gtk_button_new_with_label(_("Cancel"));
+       gtk_widget_show(cancel_btn);
+       gtk_container_add(GTK_CONTAINER(hbuttonbox1), cancel_btn);
+       GTK_WIDGET_SET_FLAGS(cancel_btn, GTK_CAN_DEFAULT);
+
+       vbox1 = gtk_vbox_new(FALSE, 0);
+       gtk_widget_show(vbox1);
+       gtk_table_attach(GTK_TABLE(table1), vbox1, 1, 2, 1, 2,
+                        (GtkAttachOptions) (GTK_FILL),
+                        (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+       moveup_btn = gtk_button_new();
+       gtk_widget_show(moveup_btn);
+       gtk_box_pack_start(GTK_BOX(vbox1), moveup_btn, FALSE, FALSE, 0);
+
+       arrow1 = gtk_arrow_new(GTK_ARROW_UP, GTK_SHADOW_OUT);
+       gtk_widget_show(arrow1);
+       gtk_container_add(GTK_CONTAINER(moveup_btn), arrow1);
+
+       movedown_btn = gtk_button_new();
+       gtk_widget_show(movedown_btn);
+       gtk_box_pack_start(GTK_BOX(vbox1), movedown_btn, FALSE, FALSE, 0);
+
+       arrow2 = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_OUT);
+       gtk_widget_show(arrow2);
+       gtk_container_add(GTK_CONTAINER(movedown_btn), arrow2);
+
+       scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL);
+       gtk_widget_show(scrolledwindow1);
+       gtk_table_attach(GTK_TABLE(table1), scrolledwindow1, 0, 1, 1, 2,
+                        (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                        (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW
+                                      (scrolledwindow1),
+                                      GTK_POLICY_AUTOMATIC,
+                                      GTK_POLICY_ALWAYS);
+
+       folderlist = gtk_clist_new(1);
+       gtk_widget_show(folderlist);
+       gtk_container_add(GTK_CONTAINER(scrolledwindow1), folderlist);
+       gtk_clist_set_column_width(GTK_CLIST(folderlist), 0, 80);
+       gtk_clist_column_titles_show(GTK_CLIST(folderlist));
+
+       label2 = gtk_label_new(_("Folders"));
+       gtk_widget_show(label2);
+       gtk_clist_set_column_widget(GTK_CLIST(folderlist), 0, label2);
+       gtk_label_set_justify(GTK_LABEL(label2), GTK_JUSTIFY_LEFT);
+       gtk_misc_set_alignment(GTK_MISC(label2), 0, 0.5);
+
+       /* END GLADE CODE */
+
+       dialog->window = window;
+       dialog->moveup_btn = moveup_btn;
+       dialog->movedown_btn = movedown_btn;
+       dialog->folderlist = folderlist;
+
+       gtk_widget_show(window);
+       gtk_widget_set_sensitive(moveup_btn, FALSE);
+       gtk_widget_set_sensitive(movedown_btn, FALSE);
+       gtk_clist_set_reorderable(GTK_CLIST(folderlist), TRUE);
+
+       gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
+                           GTK_SIGNAL_FUNC(ok_clicked), dialog);
+       gtk_signal_connect(GTK_OBJECT(cancel_btn), "clicked",
+                           GTK_SIGNAL_FUNC(cancel_clicked), dialog);
+       gtk_signal_connect(GTK_OBJECT(moveup_btn), "clicked",
+                           GTK_SIGNAL_FUNC(moveup_clicked), dialog);
+       gtk_signal_connect(GTK_OBJECT(movedown_btn), "clicked",
+                           GTK_SIGNAL_FUNC(movedown_clicked), dialog);
+
+       gtk_signal_connect(GTK_OBJECT(folderlist), "select-row",
+                          GTK_SIGNAL_FUNC(row_selected), dialog);
+       gtk_signal_connect(GTK_OBJECT(folderlist), "unselect-row",
+                          GTK_SIGNAL_FUNC(row_unselected), dialog);
+       gtk_signal_connect(GTK_OBJECT(folderlist), "row-move",
+                          GTK_SIGNAL_FUNC(row_moved), dialog);
+
+       dialog->rows = 0;
+       dialog->selected = -1;
+       for (flist = folder_get_list(); flist != NULL; flist = g_list_next(flist)) {
+               Folder *folder = flist->data;
+               int row;
+               gchar *text[1];
+
+               text[0] = folder->name;
+               row = gtk_clist_append(GTK_CLIST(folderlist), text);
+               gtk_clist_set_row_data(GTK_CLIST(folderlist), row, folder);
+               dialog->rows++;
+       }
+
+       inc_lock();
+}
diff --git a/src/gtk/foldersort.glade b/src/gtk/foldersort.glade
new file mode 100644 (file)
index 0000000..849c07e
--- /dev/null
@@ -0,0 +1,227 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+  <name>Sylpheed-Claws</name>
+  <program_name>sylpheed-claws</program_name>
+  <directory></directory>
+  <source_directory>src</source_directory>
+  <pixmaps_directory>pixmaps</pixmaps_directory>
+  <language>C</language>
+  <gnome_support>False</gnome_support>
+  <gettext_support>True</gettext_support>
+  <output_main_file>False</output_main_file>
+  <output_support_files>False</output_support_files>
+  <output_build_files>False</output_build_files>
+</project>
+
+<widget>
+  <class>GtkWindow</class>
+  <name>window</name>
+  <border_width>4</border_width>
+  <title>Set folder sortorder</title>
+  <type>GTK_WINDOW_DIALOG</type>
+  <position>GTK_WIN_POS_NONE</position>
+  <modal>True</modal>
+  <default_width>400</default_width>
+  <default_height>300</default_height>
+  <allow_shrink>False</allow_shrink>
+  <allow_grow>True</allow_grow>
+  <auto_shrink>False</auto_shrink>
+
+  <widget>
+    <class>GtkTable</class>
+    <name>table1</name>
+    <rows>3</rows>
+    <columns>2</columns>
+    <homogeneous>False</homogeneous>
+    <row_spacing>4</row_spacing>
+    <column_spacing>4</column_spacing>
+
+    <widget>
+      <class>GtkLabel</class>
+      <name>label1</name>
+      <label>Move folders up or down to change
+the sort order in the folderview</label>
+      <justify>GTK_JUSTIFY_LEFT</justify>
+      <wrap>False</wrap>
+      <xalign>0</xalign>
+      <yalign>0.5</yalign>
+      <xpad>0</xpad>
+      <ypad>0</ypad>
+      <child>
+       <left_attach>0</left_attach>
+       <right_attach>1</right_attach>
+       <top_attach>0</top_attach>
+       <bottom_attach>1</bottom_attach>
+       <xpad>0</xpad>
+       <ypad>0</ypad>
+       <xexpand>False</xexpand>
+       <yexpand>False</yexpand>
+       <xshrink>False</xshrink>
+       <yshrink>False</yshrink>
+       <xfill>True</xfill>
+       <yfill>False</yfill>
+      </child>
+    </widget>
+
+    <widget>
+      <class>GtkHButtonBox</class>
+      <name>hbuttonbox1</name>
+      <layout_style>GTK_BUTTONBOX_END</layout_style>
+      <spacing>0</spacing>
+      <child_min_width>0</child_min_width>
+      <child_min_height>0</child_min_height>
+      <child_ipad_x>0</child_ipad_x>
+      <child_ipad_y>0</child_ipad_y>
+      <child>
+       <left_attach>0</left_attach>
+       <right_attach>1</right_attach>
+       <top_attach>2</top_attach>
+       <bottom_attach>3</bottom_attach>
+       <xpad>0</xpad>
+       <ypad>0</ypad>
+       <xexpand>False</xexpand>
+       <yexpand>False</yexpand>
+       <xshrink>False</xshrink>
+       <yshrink>False</yshrink>
+       <xfill>True</xfill>
+       <yfill>False</yfill>
+      </child>
+
+      <widget>
+       <class>GtkButton</class>
+       <name>ok_btn</name>
+       <can_default>True</can_default>
+       <can_focus>True</can_focus>
+       <label>Ok</label>
+       <relief>GTK_RELIEF_NORMAL</relief>
+      </widget>
+
+      <widget>
+       <class>GtkButton</class>
+       <name>cancel_btn</name>
+       <can_default>True</can_default>
+       <can_focus>True</can_focus>
+       <label>Cancel</label>
+       <relief>GTK_RELIEF_NORMAL</relief>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkVBox</class>
+      <name>vbox1</name>
+      <homogeneous>False</homogeneous>
+      <spacing>0</spacing>
+      <child>
+       <left_attach>1</left_attach>
+       <right_attach>2</right_attach>
+       <top_attach>1</top_attach>
+       <bottom_attach>2</bottom_attach>
+       <xpad>0</xpad>
+       <ypad>0</ypad>
+       <xexpand>False</xexpand>
+       <yexpand>False</yexpand>
+       <xshrink>False</xshrink>
+       <yshrink>False</yshrink>
+       <xfill>True</xfill>
+       <yfill>True</yfill>
+      </child>
+
+      <widget>
+       <class>GtkButton</class>
+       <name>moveup_btn</name>
+       <can_focus>True</can_focus>
+       <relief>GTK_RELIEF_NORMAL</relief>
+       <child>
+         <padding>0</padding>
+         <expand>False</expand>
+         <fill>False</fill>
+       </child>
+
+       <widget>
+         <class>GtkArrow</class>
+         <name>arrow1</name>
+         <arrow_type>GTK_ARROW_UP</arrow_type>
+         <shadow_type>GTK_SHADOW_OUT</shadow_type>
+         <xalign>0.5</xalign>
+         <yalign>0.5</yalign>
+         <xpad>0</xpad>
+         <ypad>0</ypad>
+       </widget>
+      </widget>
+
+      <widget>
+       <class>GtkButton</class>
+       <name>movedown_btn</name>
+       <can_focus>True</can_focus>
+       <relief>GTK_RELIEF_NORMAL</relief>
+       <child>
+         <padding>0</padding>
+         <expand>False</expand>
+         <fill>False</fill>
+       </child>
+
+       <widget>
+         <class>GtkArrow</class>
+         <name>arrow2</name>
+         <arrow_type>GTK_ARROW_DOWN</arrow_type>
+         <shadow_type>GTK_SHADOW_OUT</shadow_type>
+         <xalign>0.5</xalign>
+         <yalign>0.5</yalign>
+         <xpad>0</xpad>
+         <ypad>0</ypad>
+       </widget>
+      </widget>
+    </widget>
+
+    <widget>
+      <class>GtkScrolledWindow</class>
+      <name>scrolledwindow1</name>
+      <hscrollbar_policy>GTK_POLICY_AUTOMATIC</hscrollbar_policy>
+      <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
+      <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+      <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
+      <child>
+       <left_attach>0</left_attach>
+       <right_attach>1</right_attach>
+       <top_attach>1</top_attach>
+       <bottom_attach>2</bottom_attach>
+       <xpad>0</xpad>
+       <ypad>0</ypad>
+       <xexpand>True</xexpand>
+       <yexpand>True</yexpand>
+       <xshrink>False</xshrink>
+       <yshrink>False</yshrink>
+       <xfill>True</xfill>
+       <yfill>True</yfill>
+      </child>
+
+      <widget>
+       <class>GtkCList</class>
+       <name>folderlist</name>
+       <can_focus>True</can_focus>
+       <columns>1</columns>
+       <column_widths>80</column_widths>
+       <selection_mode>GTK_SELECTION_SINGLE</selection_mode>
+       <show_titles>True</show_titles>
+       <shadow_type>GTK_SHADOW_IN</shadow_type>
+
+       <widget>
+         <class>GtkLabel</class>
+         <child_name>CList:title</child_name>
+         <name>label2</name>
+         <label>Folders</label>
+         <justify>GTK_JUSTIFY_LEFT</justify>
+         <wrap>False</wrap>
+         <xalign>0</xalign>
+         <yalign>0.5</yalign>
+         <xpad>0</xpad>
+         <ypad>0</ypad>
+       </widget>
+      </widget>
+    </widget>
+  </widget>
+</widget>
+
+</GTK-Interface>
diff --git a/src/gtk/foldersort.h b/src/gtk/foldersort.h
new file mode 100644 (file)
index 0000000..403cad0
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2004 Hiroyuki Yamamoto and the Sylpheed-Claws Team
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef FOLDERSORT_H
+#define FOLDERSORT_H 1
+
+void foldersort_open(void);
+
+#endif /* FOLDERSORT_H */
index 7e930f92c019bc73bee1d6f2788a824b7332f0d0..9e2c68d1e41d80d214c6ea324543f9ffc3beed9c 100644 (file)
@@ -218,7 +218,7 @@ void prefswindow_open(const gchar *title, GSList *prefs_pages, gpointer data)
        prefswindow->data = data;
        prefswindow->prefs_pages = g_slist_copy(prefs_pages);
 
-       prefswindow->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       prefswindow->window = gtk_window_new(GTK_WINDOW_DIALOG);
        gtk_window_set_title(GTK_WINDOW(prefswindow->window), title);
        gtk_window_set_default_size(GTK_WINDOW(prefswindow->window), 600, 340);
        gtk_window_position (GTK_WINDOW(prefswindow->window), GTK_WIN_POS_CENTER);
index 7d9fa15efb521127114df5e0ad8b4f8afe956520..c0720565e446237f3c3d1e5d5ea79dc33d96c170 100644 (file)
@@ -89,6 +89,7 @@
 #include "localfolder.h"
 #include "filtering.h"
 #include "folderutils.h"
+#include "foldersort.h"
 
 #define AC_LABEL_WIDTH 240
 
@@ -150,6 +151,9 @@ static void update_folderview_cb (MainWindow        *mainwin,
 static void add_mailbox_cb      (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
+static void foldersort_cb       (MainWindow    *mainwin,
+                                 guint          action,
+                                 GtkWidget     *widget);
 static void import_mbox_cb      (MainWindow    *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
@@ -430,6 +434,7 @@ static GtkItemFactoryEntry mainwin_entries[] =
        {N_("/_File"),                          NULL, NULL, 0, "<Branch>"},
        {N_("/_File/_Add mailbox"),             NULL, NULL, 0, "<Branch>"},
        {N_("/_File/_Add mailbox/MH..."),       NULL, add_mailbox_cb, 0, NULL},
+       {N_("/_File/Change folder order"),      NULL, foldersort_cb,  0, NULL},
        {N_("/_File/_Import mbox file..."),     NULL, import_mbox_cb, 0, NULL},
        {N_("/_File/_Export to mbox file..."),  NULL, export_mbox_cb, 0, NULL},
        {N_("/_File/Empty _trash"),             "<shift>D", empty_trash_cb, 0, NULL},
@@ -1691,6 +1696,7 @@ void main_window_set_menu_sensitive(MainWindow *mainwin)
                {"/File/Add mailbox"                          , M_UNLOCKED},
 
                 {"/File/Add mailbox/MH..."                   , M_UNLOCKED},
+               {"/File/Change folder order"                  , M_UNLOCKED},
                {"/File/Export to mbox file..."               , M_UNLOCKED},
                {"/File/Empty trash"                          , M_UNLOCKED},
                {"/File/Work offline"                         , M_UNLOCKED},
@@ -2304,6 +2310,12 @@ static void update_folderview_cb(MainWindow *mainwin, guint action,
        folderview_check_new_all();
 }
 
+static void foldersort_cb(MainWindow *mainwin, guint action,
+                           GtkWidget *widget)
+{
+       foldersort_open();
+}
+
 static void import_mbox_cb(MainWindow *mainwin, guint action,
                           GtkWidget *widget)
 {
index 95975e420dbe0e58d8f2ee660b1a6a7c801ee49e..b800bf4472abf79956d09997d1e8d51267d4408d 100644 (file)
@@ -165,7 +165,7 @@ static void subscribe_newsgroup_cb(FolderView *folderview, guint action, GtkWidg
                folder_item_append(rootitem, newitem);
 
                hookdata.folder = newitem->folder;
-               hookdata.update_flags = FOLDER_TREE_CHANGED | FOLDER_NEW_FOLDERITEM;
+               hookdata.update_flags = FOLDER_TREE_CHANGED | FOLDER_ADD_FOLDERITEM;
                hookdata.item = newitem;
                hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
        }