2007-09-03 [wwp] 3.0.0cvs3
[claws.git] / src / compose.c
index ae5a530a764f9ef69d7cfd25221acbc36c39fa59..1d981130b0a26c43b61dad9cb026afb017bbd1ca 100644 (file)
@@ -925,7 +925,7 @@ static void compose_create_tags(GtkTextView *text, Compose *compose)
                                           NULL);
        }
        
-       gtk_text_buffer_create_tag(buffer, "signature",
+       compose->signature_tag = gtk_text_buffer_create_tag(buffer, "signature",
                                   "foreground-gdk", &signature_color,
                                   NULL);
        
@@ -2671,9 +2671,7 @@ static gchar *compose_quote_fmt(Compose *compose, MsgInfo *msginfo,
                buf = quote_fmt_get_buffer();
                if (buf == NULL) {
                        gint line = quote_fmt_get_line();
-                       gchar *msg = g_strdup_printf(err_msg, line);
-                       alertpanel_error(msg);
-                       g_free(msg);
+                       alertpanel_error(err_msg, line);
                        goto error;
                }
        } else
@@ -3006,10 +3004,9 @@ static void compose_insert_sig(Compose *compose, gboolean replace)
        GtkTextMark *mark;
        GtkTextIter iter, iter_end;
        gint cur_pos;
-       gchar *search = NULL;
        gboolean prev_autowrap;
-       gboolean found = FALSE, shift = FALSE;
-
+       gboolean found = FALSE;
+       gboolean exists = FALSE;
        
        g_return_if_fail(compose->account != NULL);
 
@@ -3025,54 +3022,55 @@ static void compose_insert_sig(Compose *compose, gboolean replace)
 
        gtk_text_buffer_get_end_iter(buffer, &iter);
 
-       search = compose->sig_str;
-again:
-       if (replace && search) {
+       exists = (compose->sig_str != NULL);
+
+       if (replace) {
                GtkTextIter first_iter, start_iter, end_iter;
 
                gtk_text_buffer_get_start_iter(buffer, &first_iter);
 
-               if (compose->sig_str[0] == '\0')
+               if (!exists || compose->sig_str[0] == '\0')
                        found = FALSE;
                else
-                       found = gtk_text_iter_forward_search(&first_iter,
-                                                            search,
-                                                            GTK_TEXT_SEARCH_TEXT_ONLY,
-                                                            &start_iter, &end_iter,
-                                                            NULL);
+                       found = gtk_text_iter_forward_to_tag_toggle(&first_iter,
+                                       compose->signature_tag);
 
                if (found) {
-                       gtk_text_buffer_delete(buffer, &start_iter, &end_iter);
-                       iter = start_iter;
-               }
+                       /* include previous \n\n */
+                       gtk_text_iter_backward_chars(&first_iter, 2);
+                       start_iter = first_iter;
+                       end_iter = first_iter;
+                       /* skip re-start */
+                       found = gtk_text_iter_forward_to_tag_toggle(&end_iter,
+                                       compose->signature_tag);
+                       found &= gtk_text_iter_forward_to_tag_toggle(&end_iter,
+                                       compose->signature_tag);
+                       if (found) {
+                               gtk_text_buffer_delete(buffer, &start_iter, &end_iter);
+                               iter = start_iter;
+                       }
+               } 
        } 
-       if (replace && !found && search && strlen(search) > 2
-       &&  search[0] == '\n' && search[1] == '\n') {
-               search ++;
-               shift = TRUE;
-               goto again;
-       }
 
        g_free(compose->sig_str);
        compose->sig_str = compose_get_signature_str(compose);
-       if (!compose->sig_str || (replace && !compose->account->auto_sig))
-               compose->sig_str = g_strdup("");
 
        cur_pos = gtk_text_iter_get_offset(&iter);
-       if (shift && found)
-               gtk_text_buffer_insert(buffer, &iter, compose->sig_str + 1, -1);
-       else
-               gtk_text_buffer_insert(buffer, &iter, compose->sig_str, -1);
-       /* skip \n\n */
-       gtk_text_buffer_get_iter_at_offset(buffer, &iter, cur_pos);
-       gtk_text_iter_forward_char(&iter);
-       gtk_text_iter_forward_char(&iter);
-       gtk_text_buffer_get_end_iter(buffer, &iter_end);
-       gtk_text_buffer_apply_tag_by_name(buffer,"signature",&iter, &iter_end);
 
-       if (cur_pos > gtk_text_buffer_get_char_count (buffer))
-               cur_pos = gtk_text_buffer_get_char_count (buffer);
+       if (!compose->sig_str || (replace && !compose->account->auto_sig)) {
+               g_free(compose->sig_str);
+               compose->sig_str = NULL;
+       } else {
+               gtk_text_buffer_insert(buffer, &iter, compose->sig_str, -1);
+               /* remove \n\n */
+               gtk_text_buffer_get_iter_at_offset(buffer, &iter, cur_pos);
+               gtk_text_iter_forward_chars(&iter, 2);
+               gtk_text_buffer_get_end_iter(buffer, &iter_end);
+               gtk_text_buffer_apply_tag_by_name(buffer,"signature",&iter, &iter_end);
 
+               if (cur_pos > gtk_text_buffer_get_char_count (buffer))
+                       cur_pos = gtk_text_buffer_get_char_count (buffer);
+       }
        /* put the cursor where it should be 
         * either where the quote_fmt says, either before the signature */
        if (compose->set_cursor_pos < 0)
@@ -4481,10 +4479,19 @@ static gboolean compose_check_entries(Compose *compose, gboolean check_everythin
                if (*str == '\0' && check_everything == TRUE && 
                    compose->mode != COMPOSE_REDIRECT) {
                        AlertValue aval;
+                       gchar *button_label;
+                       gchar *message;
 
-                       aval = alertpanel(_("Send"),
-                                         _("Subject is empty. Send it anyway?"),
-                                         GTK_STOCK_CANCEL, _("+_Send"), NULL);
+                       if (compose->sending)
+                               button_label = _("+_Send");
+                       else
+                               button_label = _("+_Queue");
+                       message = g_strdup_printf(_("Subject is empty. %s it anyway?"),
+                                       compose->sending?_("Send"):_("Queue"));
+
+                       aval = alertpanel(compose->sending?_("Send"):_("Send later"), message,
+                                         GTK_STOCK_CANCEL, button_label, NULL);
+                       g_free(message);
                        if (aval != G_ALERTALTERNATE)
                                return FALSE;
                }
@@ -4508,7 +4515,7 @@ gint compose_send(Compose *compose)
        MainWindow *mainwin = mainwindow_get_mainwindow();
        gboolean queued_removed = FALSE;
 
-       if (!prefs_common.send_dialog_mode
+       if (prefs_common.send_dialog_invisible
                        || compose->batch == TRUE)
                discard_window = TRUE;
 
@@ -4615,11 +4622,9 @@ gint compose_send(Compose *compose)
                }
        } else {
                if (errstr) {
-                       gchar *tmp = g_strdup_printf(_("%s\nUse \"Send queued messages\" from "
+                       alertpanel_error_log(_("%s\nUse \"Send queued messages\" from "
                                   "the main window to retry."), errstr);
                        g_free(errstr);
-                       alertpanel_error_log(tmp);
-                       g_free(tmp);
                } else {
                        alertpanel_error_log(_("The message was queued but could not be "
                                   "sent.\nUse \"Send queued messages\" from "
@@ -7061,12 +7066,9 @@ static void compose_update_privacy_system_menu_item(Compose * compose, gboolean
                        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
                
                if (warn && !found && strlen(compose->privacy_system)) {
-                       gchar *tmp = g_strdup_printf(
-                               _("The privacy system '%s' cannot be loaded. You "
+                       alertpanel_warning(_("The privacy system '%s' cannot be loaded. You "
                                  "will not be able to sign or encrypt this message."),
                                  compose->privacy_system);
-                       alertpanel_warning(tmp);
-                       g_free(tmp);
                }
        } 
 
@@ -9695,6 +9697,7 @@ static void compose_show_first_last_header(Compose *compose, gboolean show_first
 
        vadj = gtk_viewport_get_vadjustment(GTK_VIEWPORT(compose->header_table->parent));
        gtk_adjustment_set_value(vadj, (show_first ? vadj->lower : vadj->upper));
+       gtk_adjustment_changed(vadj);
 }
 
 static void text_inserted(GtkTextBuffer *buffer, GtkTextIter *iter,
@@ -9712,6 +9715,8 @@ static void text_inserted(GtkTextBuffer *buffer, GtkTextIter *iter,
        if (paste_as_quotation) {
                gchar *new_text;
                const gchar *qmark;
+               guint pos = 0;
+               GtkTextIter start_iter;
 
                if (len < 0)
                        len = strlen(text);
@@ -9723,6 +9728,8 @@ static void text_inserted(GtkTextBuffer *buffer, GtkTextIter *iter,
                mark = gtk_text_buffer_create_mark(buffer, NULL, iter, FALSE);
                gtk_text_buffer_place_cursor(buffer, iter);
 
+               pos = gtk_text_iter_get_offset(iter);
+
                compose_quote_fmt(compose, NULL, "%Q", qmark, new_text, TRUE, FALSE,
                                                  _("Quote format error at line %d."));
                quote_fmt_reset_vartable();
@@ -9732,6 +9739,13 @@ static void text_inserted(GtkTextBuffer *buffer, GtkTextIter *iter,
                                  
                gtk_text_buffer_get_iter_at_mark(buffer, iter, mark);
                gtk_text_buffer_place_cursor(buffer, iter);
+               gtk_text_buffer_delete_mark(buffer, mark);
+
+               gtk_text_buffer_get_iter_at_offset(buffer, &start_iter, pos);
+               mark = gtk_text_buffer_create_mark(buffer, NULL, &start_iter, FALSE);
+               compose_beautify_paragraph(compose, &start_iter, FALSE);
+               gtk_text_buffer_get_iter_at_mark(buffer, &start_iter, mark);
+               gtk_text_buffer_delete_mark(buffer, mark);
        } else {
                if (strcmp(text, "\n") || compose->automatic_break
                || gtk_text_iter_starts_line(iter))
@@ -9743,12 +9757,12 @@ static void text_inserted(GtkTextBuffer *buffer, GtkTextIter *iter,
                }
        }
        
-       mark = gtk_text_buffer_create_mark(buffer, NULL, iter, FALSE);
-       
-       compose_beautify_paragraph(compose, iter, FALSE);
-
-       gtk_text_buffer_get_iter_at_mark(buffer, iter, mark);
-       gtk_text_buffer_delete_mark(buffer, mark);
+       if (!paste_as_quotation) {
+               mark = gtk_text_buffer_create_mark(buffer, NULL, iter, FALSE);
+               compose_beautify_paragraph(compose, iter, FALSE);
+               gtk_text_buffer_get_iter_at_mark(buffer, iter, mark);
+               gtk_text_buffer_delete_mark(buffer, mark);
+       }
 
        g_signal_handlers_unblock_by_func(G_OBJECT(buffer),
                                          G_CALLBACK(text_inserted),