managesieve: let refresh button always be sensitive
[claws.git] / src / plugins / managesieve / sieve_manager.c
index 9e89bad13124647b824bcb57ee0e212d20abea4c..b6d92c114e62ed8da2e29247728c21436764e44b 100644 (file)
@@ -59,15 +59,10 @@ typedef struct {
        gchar *filter_name;
 } CommandDataName;
 
-typedef struct {
-       SieveManagerPage *page;
-       gchar *filter_name;
-       SieveEditorPage *editor_page;
-       gboolean first_line;
-} CommandDataGetScript;
-
 static void account_changed(GtkWidget *widget, SieveManagerPage *page);
-void sieve_manager_close(GtkWidget *widget, SieveManagerPage *page);
+static void sieve_manager_close(GtkWidget *widget, SieveManagerPage *page);
+static gboolean sieve_manager_deleted(GtkWidget *widget, GdkEvent *event,
+               SieveManagerPage *page);
 static void filter_set_active(SieveManagerPage *page, gchar *filter_name);
 gboolean filter_find_by_name (GtkTreeModel *model, GtkTreeIter *iter,
                gchar *filter_name);
@@ -157,46 +152,24 @@ static void filter_add(GtkWidget *widget, SieveManagerPage *page)
        if (!filter_name || !filter_name[0])
                return;
 
-       sieve_editor_new(session, filter_name);
-       /*
-       sieve_session_add_script(session, filter_name
-                       (sieve_session_data_cb_fn)filter_added, (gpointer)page);
-                       */
+       sieve_editor_show(sieve_editor_new(session, filter_name));
 }
 
-static void filter_got_data(SieveSession *session, gchar *contents,
-               CommandDataGetScript *cmd_data)
+static void filter_got_load_error(SieveSession *session, gpointer data)
 {
-       SieveManagerPage *page = cmd_data->page;
-       SieveEditorPage *editor;
+       SieveManagerPage *page = data;
 
-       if (!contents) {
-               g_free(cmd_data->filter_name);
-               g_free(cmd_data);
-               return;
-       } else if (contents == (void *)-1) {
-               got_session_error(session, _("Unable to get script contents"), page);
-               return;
-       }
-
-       if (cmd_data->first_line) {
-               cmd_data->first_line = FALSE;
-               editor = sieve_editor_new(session, cmd_data->filter_name);
-               cmd_data->editor_page = editor;
-       } else {
-               editor = cmd_data->editor_page;
-               sieve_editor_append_text(editor, "\n", 1);
-       }
-       sieve_editor_append_text(editor, contents, strlen(contents));
+       got_session_error(session, _("Unable to get script contents"), page);
 }
 
 static void filter_edit(GtkWidget *widget, SieveManagerPage *page)
 {
        SieveEditorPage *editor;
-       CommandDataGetScript *cmd_data;
        SieveSession *session = page->active_session;
+
        if (!session)
                return;
+
        gchar *filter_name = filters_list_get_selected_filter(page->filters_list);
        if (!filter_name)
                return;
@@ -205,23 +178,20 @@ static void filter_edit(GtkWidget *widget, SieveManagerPage *page)
        if (editor) {
                sieve_editor_present(editor);
        } else {
-               cmd_data = g_new0(CommandDataGetScript, 1);
-               cmd_data->first_line = TRUE;
-               cmd_data->filter_name = filter_name;
-               cmd_data->page = page;
-
-               sieve_session_get_script(session, filter_name,
-                       (sieve_session_data_cb_fn)filter_got_data, cmd_data);
+               editor = sieve_editor_new(session, filter_name);
+               sieve_editor_load(editor,
+                       (sieve_session_cb_fn)filter_got_load_error, page);
        }
 }
 
-static void filter_renamed(SieveSession *session, gboolean success,
-               CommandDataRename *data)
+static void filter_renamed(SieveSession *session, gboolean abort,
+               gboolean success, CommandDataRename *data)
 {
        SieveManagerPage *page = data->page;
        GSList *cur;
 
-       if (!success) {
+       if (abort) {
+       } else if (!success) {
                got_session_error(session, "Unable to rename script", page);
        } else {
                manager_sessions_foreach(cur, session, page) {
@@ -261,13 +231,14 @@ static void filter_rename(GtkWidget *widget, SieveManagerPage *page)
                        (sieve_session_data_cb_fn)filter_renamed, (gpointer)cmd_data);
 }
 
-static void filter_activated(SieveSession *session, gboolean success,
-               CommandDataName *cmd_data)
+static void filter_activated(SieveSession *session, gboolean abort,
+               gboolean success, CommandDataName *cmd_data)
 {
        SieveManagerPage *page = cmd_data->page;
        GSList *cur;
 
-       if (!success) {
+       if (abort) {
+       } else if (!success) {
                got_session_error(session, "Unable to set active script", page);
        } else {
                manager_sessions_foreach(cur, session, page) {
@@ -292,13 +263,15 @@ static void sieve_set_active_filter(SieveManagerPage *page, gchar *filter_name)
                        (sieve_session_data_cb_fn)filter_activated, cmd_data);
 }
 
-static void filter_deleted(SieveSession *session, const gchar *err_msg,
+static void filter_deleted(SieveSession *session, gboolean abort,
+               const gchar *err_msg,
                CommandDataName *cmd_data)
 {
        SieveManagerPage *page = cmd_data->page;
        GSList *cur;
 
-       if (err_msg) {
+       if (abort) {
+       } else if (err_msg) {
                got_session_error(session, err_msg, page);
        } else {
                manager_sessions_foreach(cur, session, page) {
@@ -550,6 +523,8 @@ static void size_allocate_cb(GtkWidget *widget, GtkAllocation *allocation)
 static void got_session_error(SieveSession *session, const gchar *msg,
                SieveManagerPage *page)
 {
+       if (!g_slist_find(manager_pages, page))
+               return;
        if (page->active_session != session)
                return;
        gtk_label_set_text(GTK_LABEL(page->status_text), msg);
@@ -575,9 +550,11 @@ static void sieve_manager_on_connected(SieveSession *session,
        }
 }
 
-static void got_filter_listed(SieveSession *session, SieveScript *script,
-               SieveManagerPage *page)
+static void got_filter_listed(SieveSession *session, gboolean abort,
+               SieveScript *script, SieveManagerPage *page)
 {
+       if (abort)
+               return;
        if (!script) {
                got_session_error(session, "Unable to list scripts", page);
                return;
@@ -626,7 +603,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;
@@ -655,6 +632,8 @@ static SieveManagerPage *sieve_manager_page_new()
                        G_CALLBACK (manager_key_pressed), page);
        g_signal_connect (G_OBJECT(window), "size_allocate",
                         G_CALLBACK (size_allocate_cb), NULL);
+       g_signal_connect (G_OBJECT(window), "delete_event",
+                        G_CALLBACK (sieve_manager_deleted), page);
 
        if (!geometry.min_height) {
                geometry.min_width = 350;
@@ -723,9 +702,13 @@ static SieveManagerPage *sieve_manager_page_new()
 
        /* Buttons */
 
+       vbox_allbuttons = gtk_vbox_new (FALSE, 0);
+       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);
@@ -753,7 +736,7 @@ static SieveManagerPage *sieve_manager_page_new()
 
        /* 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);
 
@@ -787,7 +770,14 @@ static SieveManagerPage *sieve_manager_page_new()
        return page;
 }
 
-void sieve_manager_close(GtkWidget *widget, SieveManagerPage *page)
+static gboolean sieve_manager_deleted(GtkWidget *widget, GdkEvent *event,
+               SieveManagerPage *page)
+{
+       sieve_manager_done(page);
+       return FALSE;
+}
+
+static void sieve_manager_close(GtkWidget *widget, SieveManagerPage *page)
 {
        sieve_manager_done(page);
 }
@@ -795,6 +785,7 @@ void sieve_manager_close(GtkWidget *widget, SieveManagerPage *page)
 void sieve_manager_done(SieveManagerPage *page)
 {
        manager_pages = g_slist_remove(manager_pages, page);
+       sieve_sessions_discard_callbacks(page);
        gtk_widget_destroy(page->window);
        g_free(page);
 }