2005-01-27 [colin] 1.0.0cvs16
[claws.git] / src / compose.c
index 13f4e7917526825183fc1df1ced8779a386f3235..78c747894efe8ed61b6ff8dc5846f36f86078164 100644 (file)
@@ -425,9 +425,8 @@ static void compose_toggle_sign_cb  (gpointer        data,
 static void compose_toggle_encrypt_cb  (gpointer        data,
                                         guint           action,
                                         GtkWidget      *widget);
-static void compose_set_privacy_system_cb(gpointer        data,
-                                        guint           action,
-                                        GtkWidget      *widget);
+static void compose_set_privacy_system_cb(GtkWidget      *widget,
+                                         gpointer        data);
 static void compose_update_privacy_system_menu_item(Compose * compose);
 static void activate_privacy_system     (Compose *compose, 
                                          PrefsAccount *account);
@@ -512,6 +511,8 @@ static gboolean compose_send_control_enter  (Compose        *compose);
 static gint compose_defer_auto_save_draft      (Compose        *compose);
 static PrefsAccount *compose_guess_forward_account_from_msginfo        (MsgInfo *msginfo);
 
+static void compose_close      (Compose *compose);
+
 static GtkItemFactoryEntry compose_popup_entries[] =
 {
        {N_("/_Add..."),        NULL, compose_attach_cb, 0, NULL},
@@ -648,7 +649,7 @@ static GtkItemFactoryEntry compose_entries[] =
 #endif
        {N_("/_Options"),               NULL, NULL, 0, "<Branch>"},
        {N_("/_Options/Privacy System"),                NULL, NULL,   0, "<Branch>"},
-       {N_("/_Options/Privacy System/None"),   NULL, compose_set_privacy_system_cb,   0, "<RadioItem>"},
+       {N_("/_Options/Privacy System/None"),   NULL, NULL,   0, "<RadioItem>"},
        {N_("/_Options/Si_gn"),         NULL, compose_toggle_sign_cb   , 0, "<ToggleItem>"},
        {N_("/_Options/_Encrypt"),      NULL, compose_toggle_encrypt_cb, 0, "<ToggleItem>"},
        {N_("/_Options/---"),           NULL,           NULL,   0, "<Separator>"},
@@ -1389,7 +1390,7 @@ Compose *compose_redirect(PrefsAccount *account, MsgInfo *msginfo)
        ifactory = gtk_item_factory_from_widget(compose->popupmenu);
        menu_set_sensitive(ifactory, "/Add...", FALSE);
        menu_set_sensitive(ifactory, "/Remove", FALSE);
-       menu_set_sensitive(ifactory, "/Property...", FALSE);
+       menu_set_sensitive(ifactory, "/Properties...", FALSE);
 
        ifactory = gtk_item_factory_from_widget(compose->menubar);
        menu_set_sensitive(ifactory, "/Message/Save", FALSE);
@@ -2760,13 +2761,21 @@ static void compose_wrap_line_all_full(Compose *compose, gboolean autowrap)
                                }
 
                                GET_CHAR(cur_pos, cb, clen);
-
-                               /* insert space if it's alphanumeric */
-                               if ((cur_pos != line_pos) &&
-                                   ((clen > 1) || isalnum((guchar)cb[0]))) {
-                                       gtk_stext_insert(text, NULL, NULL,
-                                                       NULL, " ", 1);
-                                       tlen++;
+                               /* insert space between the next line */
+                               if (cur_pos > 0) {
+                                       gint clen_prev;
+                                       gchar cb_prev[MB_LEN_MAX];
+
+                                       GET_CHAR(cur_pos - 1, cb_prev,
+                                                clen_prev);
+                                       if ((clen_prev != clen && clen > 1) ||
+                                           (clen == 1 &&
+                                            !isspace((guchar)cb[0]))) {
+                                               gtk_stext_insert
+                                                       (text, NULL, NULL,
+                                                        NULL, " ", 1);
+                                               tlen++;
+                                       }
                                }
 
                                /* and start over with current line */
@@ -3130,7 +3139,7 @@ gint compose_send(Compose *compose)
 
        if (prefs_common.send_dialog_mode != SEND_DIALOG_ALWAYS) {
                compose->sending = FALSE;
-               gtk_widget_destroy(compose->window);
+               compose_close(compose);
                /* No more compose access in the normal codepath 
                 * after this point! */
        }
@@ -3163,7 +3172,7 @@ gint compose_send(Compose *compose)
                folder_item_remove_msg(folder, msgnum);
                folder_item_scan(folder);
                if (prefs_common.send_dialog_mode == SEND_DIALOG_ALWAYS)
-                       gtk_widget_destroy(compose->window);
+                       compose_close(compose);
        } else {
                alertpanel_error(_("The message was queued but could not be "
                                   "sent.\nUse \"Send queued messages\" from "
@@ -3456,6 +3465,10 @@ static gint compose_write_to_file(Compose *compose, FILE *fp, gint action)
        mimetext->subtype = g_strdup("plain");
        g_hash_table_insert(mimetext->typeparameters, g_strdup("charset"),
                            g_strdup(out_codeset));
+       /* protect trailing spaces when signing message */
+       if (action == COMPOSE_WRITE_FOR_SEND && compose->use_signing && 
+           privacy_system_can_sign(compose->privacy_system))
+               encoding = ENC_QUOTED_PRINTABLE;
        if (encoding != ENC_UNKNOWN)
                procmime_encode_content(mimetext, encoding);
 
@@ -4980,15 +4993,18 @@ static void compose_update_priority_menu_item(Compose * compose)
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
 }      
 
-static void compose_set_privacy_system_cb(gpointer data,
-                                         guint action,
-                                         GtkWidget *widget)
+static void compose_set_privacy_system_cb(GtkWidget *widget, gpointer data)
 {
        Compose *compose = (Compose *) data;
        gchar *systemid;
        GtkItemFactory *ifactory;
        gboolean can_sign = FALSE, can_encrypt = FALSE;
 
+       g_return_if_fail(GTK_IS_CHECK_MENU_ITEM(widget));
+
+       if (!GTK_CHECK_MENU_ITEM(widget)->active)
+               return;
+
        systemid = gtk_object_get_data(GTK_OBJECT(widget), "privacy_system");
        g_free(compose->privacy_system);
        compose->privacy_system = NULL;
@@ -4999,6 +5015,8 @@ static void compose_set_privacy_system_cb(gpointer data,
                can_encrypt = privacy_system_can_encrypt(systemid);
        }
 
+       debug_print("activated privacy system: %s\n", systemid != NULL ? systemid : "None");
+
        ifactory = gtk_item_factory_from_widget(compose->menubar);
        menu_set_sensitive(ifactory, "/Options/Sign", can_sign);
        menu_set_sensitive(ifactory, "/Options/Encrypt", can_encrypt);
@@ -5083,18 +5101,18 @@ void compose_update_actions_menu(Compose *compose)
 void compose_update_privacy_systems_menu(Compose *compose)
 {
        static gchar *branch_path = "/Options/Privacy System";
+       static gboolean connected = FALSE;
        GtkItemFactory *ifactory;
        GtkWidget *menuitem;
-       gchar *menu_path;
        GSList *systems, *cur;
        GList *amenu;
-       GtkItemFactoryEntry ifentry = {NULL, NULL, NULL, 0, "<Branch>"};
        GtkWidget *widget;
+       GtkWidget *system_none;
+       GSList *group;
 
        ifactory = gtk_item_factory_from_widget(compose->menubar);
 
        /* remove old entries */
-       ifentry.path = branch_path;
        menuitem = gtk_item_factory_get_widget(ifactory, branch_path);
        g_return_if_fail(menuitem != NULL);
 
@@ -5105,26 +5123,29 @@ void compose_update_privacy_systems_menu(Compose *compose)
                amenu = alist;
        }
 
-       ifentry.accelerator     = NULL;
-       ifentry.callback_action = 0;
-       ifentry.callback        = compose_set_privacy_system_cb;
-       ifentry.item_type       = "/Options/Privacy System/None";
+       system_none = gtk_item_factory_get_widget(ifactory,
+               "/Options/Privacy System/None");
+       if (!connected) {
+               gtk_signal_connect(GTK_OBJECT(system_none), "activate",
+                       GTK_SIGNAL_FUNC(compose_set_privacy_system_cb), compose);
+               connected = TRUE;
+       }
 
        systems = privacy_get_system_ids();
        for (cur = systems; cur != NULL; cur = g_slist_next(cur)) {
                gchar *systemid = cur->data;
 
-               menu_path = g_strdup_printf("%s/%s", branch_path,
-                                           privacy_system_get_name(systemid));
-               ifentry.path = menu_path;
-               gtk_item_factory_create_item(ifactory, &ifentry, compose, 1);
-               widget = gtk_item_factory_get_widget(ifactory, menu_path);
-
+               group = gtk_radio_menu_item_group(GTK_RADIO_MENU_ITEM(system_none));
+               widget = gtk_radio_menu_item_new_with_label(group,
+                       privacy_system_get_name(systemid));
                gtk_object_set_data_full(GTK_OBJECT(widget), "privacy_system",
                                         g_strdup(systemid), g_free);
+               gtk_signal_connect(GTK_OBJECT(widget), "activate",
+                       GTK_SIGNAL_FUNC(compose_set_privacy_system_cb), compose);
 
+               gtk_menu_append(GTK_MENU(system_none->parent), widget);
+               gtk_widget_show(widget);
                g_free(systemid);
-               g_free(menu_path);
        }
        g_slist_free(systems);
 }
@@ -6050,7 +6071,8 @@ static void compose_send_later_cb(gpointer data, guint action,
        gint val;
 
        val = compose_queue_sub(compose, NULL, NULL, TRUE);
-       if (!val) gtk_widget_destroy(compose->window);
+       if (!val) 
+               compose_close(compose);
 }
 
 void compose_draft (gpointer data) 
@@ -6101,7 +6123,7 @@ static void compose_draft_cb(gpointer data, guint action, GtkWidget *widget)
        }
        fprintf(fp, "X-Sylpheed-Sign:%d\n", compose->use_signing);
        fprintf(fp, "X-Sylpheed-Encrypt:%d\n", compose->use_encryption);
-       fprintf(fp, "X-Sylpheed-Gnupg-Mode:%s\n", compose->privacy_system);
+       fprintf(fp, "X-Sylpheed-Privacy-System:%s\n", compose->privacy_system);
        fprintf(fp, "\n");
 
        if (compose_write_to_file(compose, fp, COMPOSE_WRITE_FOR_STORE) < 0) {
@@ -6143,7 +6165,7 @@ static void compose_draft_cb(gpointer data, guint action, GtkWidget *widget)
        lock = FALSE;
 
        if (action == COMPOSE_QUIT_EDITING)
-               gtk_widget_destroy(compose->window);
+               compose_close(compose);
        else {
                struct stat s;
                gchar *path;
@@ -6279,7 +6301,7 @@ static void compose_close_cb(gpointer data, guint action, GtkWidget *widget)
                }
        }
 
-       gtk_widget_destroy(compose->window);
+       compose_close(compose);
 }
 
 static void compose_address_cb(gpointer data, guint action, GtkWidget *widget)
@@ -6870,6 +6892,17 @@ static PrefsAccount *compose_guess_forward_account_from_msginfo(MsgInfo *msginfo
        return account;
 }
 
+static void compose_close(Compose *compose)
+{
+       gint x, y;
+
+       g_return_if_fail(compose);
+       gtkut_widget_get_uposition(compose->window, &x, &y);
+       prefs_common.compose_x = x;
+       prefs_common.compose_y = y;
+       gtk_widget_destroy(compose->window);
+}
+
 /**
  * Add entry field for each address in list.
  * \param compose     E-Mail composition object.
@@ -6890,3 +6923,16 @@ static void compose_add_field_list( Compose *compose, GList *listAddress ) {
  * End of Source.
  */
 
+void compose_reply_from_messageview(MessageView *msgview, GSList *msginfo_list, 
+                                   guint action)
+{
+       gchar *body;
+
+       g_return_if_fail(msgview != NULL);
+
+       g_return_if_fail(msginfo_list != NULL);
+
+       body = messageview_get_selection(msgview);
+       compose_reply_mode((ComposeMode)action, msginfo_list, body);
+       g_free(body);
+}