+
+static void chk_update_val(GtkWidget *widget, gpointer data)
+{
+ gboolean *val = (gboolean *)data;
+ *val = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+}
+
+static gboolean imap_gtk_subscribe_func(GNode *node, gpointer data)
+{
+ FolderItem *item = node->data;
+ gboolean action = GPOINTER_TO_INT(data);
+
+ if (item->path)
+ imap_subscribe(item->folder, item, NULL, action);
+
+ return FALSE;
+}
+
+static void subscribe_cb_full(FolderView *folderview, guint action)
+{
+ FolderItem *item;
+ gchar *message, *name;
+ AlertValue avalue;
+ GtkWidget *rec_chk;
+ gboolean recurse = FALSE;
+
+ if ((item = folderview_get_selected_item(folderview)) == NULL) return;
+ cm_return_if_fail(item->folder != NULL);
+
+ name = trim_string(item->name, 32);
+ AUTORELEASE_STR(name, {g_free(name); return;});
+
+ if (action && item->folder->account->imap_subsonly) {
+ GList *child_list = NULL;
+ GList *transc_list = NULL;
+
+ message = g_markup_printf_escaped
+ (_("Do you want to search for unsubscribed subfolders of '%s'?"),
+ name);
+
+ rec_chk = gtk_check_button_new_with_label(_("Search recursively"));
+
+ g_signal_connect(G_OBJECT(rec_chk), "toggled",
+ G_CALLBACK(chk_update_val), &recurse);
+
+ avalue = alertpanel_full(_("Subscriptions"), message,
+ GTK_STOCK_CANCEL, g_strconcat("+", _("_Search"), NULL),
+ NULL, FALSE, rec_chk, ALERT_QUESTION, G_ALERTDEFAULT);
+ g_free(message);
+ if (avalue != G_ALERTALTERNATE) return;
+
+ child_list = imap_scan_subtree(item->folder, item, TRUE, recurse);
+
+ if (child_list) {
+ GList *cur;
+ int r = -1;
+ gchar *msg = g_strdup_printf(_("Choose a subfolder of %s to subscribe to: "),
+ item->name);
+ gchar *child_folder = NULL;
+
+ for (cur = child_list; cur; cur = cur->next) {
+ transc_list = g_list_append(transc_list,
+ imap_modified_utf7_to_utf8(cur->data, FALSE));
+ }
+
+ transc_list = g_list_sort(transc_list, g_str_equal);
+
+ child_folder = input_dialog_combo(_("Subscribe"),
+ msg,
+ transc_list->next?_("All of them"):transc_list->data, transc_list);
+ g_free(msg);
+ if (child_folder && strcmp(child_folder, _("All of them"))) {
+ gchar *transc_folder = imap_utf8_to_modified_utf7(child_folder, FALSE);
+ r = imap_subscribe(item->folder, NULL, transc_folder, TRUE);
+ g_free(transc_folder);
+ } else if (child_folder) {
+ for (cur = child_list; cur; cur = cur->next)
+ r = imap_subscribe(item->folder, NULL, (gchar *)cur->data, TRUE);
+ }
+ g_free(child_folder);
+ for (cur = child_list; cur; cur = cur->next)
+ g_free((gchar *)cur->data);
+ for (cur = transc_list; cur; cur = cur->next)
+ g_free((gchar *)cur->data);
+ if (r == 0)
+ folderview_rescan_tree(item->folder, FALSE);
+ } else {
+ alertpanel_notice(_("This folder is already subscribed and "
+ "has no unsubscribed subfolders.\n\nIf there are new folders, "
+ "created and subscribed to from another client, use \"Check "
+ "for new folders\" at the mailbox's root folder."));
+ }
+ g_list_free(child_list);
+ return;
+ }
+ message = g_markup_printf_escaped
+ (_("Do you want to %s the '%s' folder?"),
+ action?_("subscribe"):_("unsubscribe"), name);
+
+ rec_chk = gtk_check_button_new_with_label(_("Apply to subfolders"));
+
+ g_signal_connect(G_OBJECT(rec_chk), "toggled",
+ G_CALLBACK(chk_update_val), &recurse);
+
+ avalue = alertpanel_full(_("Subscriptions"), message,
+ GTK_STOCK_CANCEL, action?g_strconcat("+", _("_Subscribe"), NULL):
+ g_strconcat("+", _("_Unsubscribe"), NULL), NULL, FALSE,
+ rec_chk, ALERT_QUESTION, G_ALERTDEFAULT);
+ g_free(message);
+ if (avalue != G_ALERTALTERNATE) return;
+
+ FolderItem *opened = folderview_get_opened_item(folderview);
+ FolderItem *selected = folderview_get_selected_item(folderview);
+ if (!action) {
+ if (opened == selected ||
+ folder_is_child_of(selected, opened)) {
+ summary_clear_all(folderview->summaryview);
+ folderview_close_opened(folderview, TRUE);
+ }
+ }
+
+ if (recurse) {
+ g_node_traverse(item->node, G_PRE_ORDER,
+ G_TRAVERSE_ALL, -1, imap_gtk_subscribe_func, GINT_TO_POINTER(action));
+ } else {
+ imap_subscribe(item->folder, item, NULL, action);
+ }
+
+ if (!action && item->folder->account->imap_subsonly)
+ folderview_rescan_tree(item->folder, FALSE);
+}
+
+static void subscribe_cb(GtkAction *action, gpointer data)
+{
+ subscribe_cb_full((FolderView *)data, 1);
+}
+
+static void unsubscribe_cb(GtkAction *action, gpointer data)
+{
+ subscribe_cb_full((FolderView *)data, 0);
+}
+
+static void subscribed_cb(GtkAction *action, gpointer data)
+{
+ FolderView *folderview = (FolderView *)data;
+ FolderItem *item = folderview_get_selected_item(folderview);
+ FolderItem *opened = folderview_get_opened_item(folderview);
+
+ if (!item || !item->folder || !item->folder->account)
+ return;
+ if (item->folder->account->imap_subsonly == gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)))
+ return;
+
+ if (opened == item ||
+ folder_is_child_of(item, opened)) {
+ summary_clear_all(folderview->summaryview);
+ folderview_close_opened(folderview, TRUE);
+ }
+
+ item->folder->account->imap_subsonly = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
+ folderview_rescan_tree(item->folder, FALSE);
+}
+
+static void download_cb(GtkAction *action, gpointer data)
+{
+ FolderView *folderview = (FolderView *)data;
+ FolderItem *item;
+
+ if ((item = folderview_get_selected_item(folderview)) == NULL)
+ return;
+ imap_gtk_synchronise(item, 0);
+}