managesieve: ensure space above Refresh button
[claws.git] / src / plugins / managesieve / sieve_manager.c
index fab67035aa4f8846a86cb816cc22bdf02dd0b43b..afdb36a64384cd747c673b2fa189e49a23184c36 100644 (file)
@@ -59,6 +59,7 @@ typedef struct {
        gchar *filter_name;
 } CommandDataName;
 
+static void filter_got_load_error(SieveSession *session, gpointer data);
 static void account_changed(GtkWidget *widget, SieveManagerPage *page);
 static void sieve_manager_close(GtkWidget *widget, SieveManagerPage *page);
 static gboolean sieve_manager_deleted(GtkWidget *widget, GdkEvent *event,
@@ -79,6 +80,13 @@ static GSList *manager_pages = NULL;
                if ((page = (SieveManagerPage *)cur->data) && \
                        page->active_session == session)
 
+void sieve_managers_done()
+{
+       GSList *list = manager_pages;
+       manager_pages = NULL;
+       g_slist_free_full(list, (GDestroyNotify)sieve_manager_done);
+}
+
 static void filters_list_clear(SieveManagerPage *page)
 {
        GtkListStore *list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(page->filters_list)));
@@ -145,6 +153,7 @@ static gchar *filters_list_get_selected_filter(GtkWidget *list_view)
 static void filter_add(GtkWidget *widget, SieveManagerPage *page)
 {
        SieveSession *session = page->active_session;
+       SieveEditorPage *editor;
        if (!session)
                return;
        gchar *filter_name = input_dialog(_("Add Sieve script"),
@@ -152,7 +161,18 @@ static void filter_add(GtkWidget *widget, SieveManagerPage *page)
        if (!filter_name || !filter_name[0])
                return;
 
-       sieve_editor_show(sieve_editor_new(session, filter_name));
+       editor = sieve_editor_get(session, filter_name);
+       if (editor) {
+               /* TODO: show error that filter already exists */
+               sieve_editor_present(editor);
+               g_free(filter_name);
+               sieve_editor_load(editor,
+                       (sieve_session_cb_fn)filter_got_load_error, page);
+       } else {
+               editor = sieve_editor_new(session, filter_name);
+               editor->is_new = TRUE;
+               sieve_editor_show(editor);
+       }
 }
 
 static void filter_got_load_error(SieveSession *session, gpointer data)
@@ -232,14 +252,14 @@ static void filter_rename(GtkWidget *widget, SieveManagerPage *page)
 }
 
 static void filter_activated(SieveSession *session, gboolean abort,
-               gboolean success, CommandDataName *cmd_data)
+               const gchar *err, CommandDataName *cmd_data)
 {
        SieveManagerPage *page = cmd_data->page;
        GSList *cur;
 
        if (abort) {
-       } else if (!success) {
-               got_session_error(session, "Unable to set active script", page);
+       } else if (err) {
+               got_session_error(session, err, page);
        } else {
                manager_sessions_foreach(cur, session, page) {
                        filter_set_active(page, cmd_data->filter_name);
@@ -437,6 +457,7 @@ static void filters_create_list_view_columns(SieveManagerPage *page,
 {
        GtkTreeViewColumn *column;
        GtkCellRenderer *renderer;
+       GtkWidget *label;
 
        /* Name */
        renderer = gtk_cell_renderer_text_new();
@@ -459,8 +480,14 @@ static void filters_create_list_view_columns(SieveManagerPage *page,
                 NULL);
        gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column);
        gtk_tree_view_column_set_alignment (column, 0.5);
-       CLAWS_SET_TIP(gtk_tree_view_column_get_widget(column),
+
+       /* the column header needs a widget to have a tooltip */
+       label = gtk_label_new(gtk_tree_view_column_get_title(column));
+       gtk_widget_show(label);
+       gtk_tree_view_column_set_widget(column, label);
+       CLAWS_SET_TIP(label,
                        _("An account can only have one active script at a time."));
+
        g_signal_connect(G_OBJECT(renderer), "toggled",
                         G_CALLBACK(filter_active_toggled), page);
 
@@ -603,7 +630,7 @@ static SieveManagerPage *sieve_manager_page_new()
 {
        SieveManagerPage *page;
        GtkWidget *window;
-       GtkWidget *hbox, *vbox, *vbox_buttons;
+       GtkWidget *hbox, *vbox, *vbox_allbuttons, *vbox_buttons;
        GtkWidget *accounts_menu;
        GtkWidget *label;
        GtkWidget *scrolledwin;
@@ -644,6 +671,8 @@ static SieveManagerPage *sieve_manager_page_new()
                                      GDK_HINT_MIN_SIZE);
        gtk_widget_set_size_request(window, sieve_config.manager_win_width,
                        sieve_config.manager_win_height);
+       gtk_window_set_type_hint(GTK_WINDOW(window),
+                       GDK_WINDOW_TYPE_HINT_DIALOG);
 
        vbox = gtk_vbox_new (FALSE, 10);
        gtk_container_add (GTK_CONTAINER (window), vbox);
@@ -702,9 +731,13 @@ static SieveManagerPage *sieve_manager_page_new()
 
        /* Buttons */
 
+       vbox_allbuttons = gtk_vbox_new (FALSE, 8);
+       gtk_box_pack_start (GTK_BOX (hbox), vbox_allbuttons, FALSE, FALSE, 0);
+
+       /* buttons that depend on there being a connection */
        vbox_buttons = gtk_vbox_new (FALSE, 8);
        gtk_widget_set_sensitive(vbox_buttons, FALSE);
-       gtk_box_pack_start (GTK_BOX (hbox), vbox_buttons, FALSE, FALSE, 0);
+       gtk_box_pack_start (GTK_BOX (vbox_allbuttons), vbox_buttons, FALSE, FALSE, 0);
 
        /* new */
        btn = gtk_button_new_from_stock(GTK_STOCK_NEW);
@@ -725,14 +758,14 @@ static SieveManagerPage *sieve_manager_page_new()
                        G_CALLBACK (filter_delete), page);
 
        /* rename */
-       btn = gtk_button_new_with_label("Rename");
+       btn = gtk_button_new_with_label(_("Rename"));
        gtk_box_pack_start (GTK_BOX (vbox_buttons), btn, FALSE, FALSE, 0);
        g_signal_connect (G_OBJECT(btn), "clicked",
                        G_CALLBACK (filter_rename), page);
 
        /* refresh */
        btn = gtk_button_new_from_stock(GTK_STOCK_REFRESH);
-       gtk_box_pack_end (GTK_BOX (vbox_buttons), btn, FALSE, FALSE, 0);
+       gtk_box_pack_end (GTK_BOX (vbox_allbuttons), btn, FALSE, FALSE, 0);
        g_signal_connect (G_OBJECT(btn), "clicked",
                        G_CALLBACK (account_changed), page);
 
@@ -792,3 +825,14 @@ void sieve_manager_show()
        manager_pages = g_slist_prepend(manager_pages, page);
        gtk_widget_show_all(page->window);
 }
+
+void sieve_manager_script_created(SieveSession *session, const gchar *name)
+{
+       SieveManagerPage *page;
+       SieveScript script = {.name = (gchar *)name};
+       GSList *cur;
+
+       manager_sessions_foreach(cur, session, page) {
+               filters_list_insert_filter(page, &script);
+       }
+}