untwist file selection logic - be explicit
[claws.git] / src / compose.c
index 210bb8e377f0e76c02897c5f1aa904d1e581a3b9..ffb44b70cba27377f7f889af04338964ad6f82b5 100644 (file)
@@ -48,8 +48,7 @@
 #include <gtk/gtklabel.h>
 #include <gtk/gtkscrolledwindow.h>
 #include <gtk/gtktreeview.h>
-#warning FIXME_GTK2
-/* #include <gtk/gtkthemes.h> */
+
 #include <gtk/gtkdnd.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -375,7 +374,9 @@ static void compose_allsel_cb               (Compose        *compose);
 static void compose_advanced_action_cb (Compose                   *compose,
                                         ComposeCallAdvancedAction  action);
 
-static void compose_grab_focus_cb      (GtkWidget      *widget,
+static gboolean compose_grab_focus_cb  (GtkWidget      *widget,
+                                        Compose        *compose);
+static gboolean compose_grab_focus_before_cb   (GtkWidget      *widget,
                                         Compose        *compose);
 
 static void compose_changed_cb         (GtkTextBuffer  *textbuf,
@@ -731,6 +732,7 @@ Compose *compose_generic_new(PrefsAccount *account, const gchar *mailto, FolderI
        textview = GTK_TEXT_VIEW(compose->text);
        textbuf = gtk_text_view_get_buffer(textview);
 
+       undo_block(compose->undostruct);
 #ifdef USE_ASPELL
        if (item && item->prefs && item->prefs->enable_default_dictionary &&
            compose->gtkaspell) 
@@ -989,6 +991,7 @@ static void compose_generic_reply(MsgInfo *msginfo, gboolean quote,
        textview = (GTK_TEXT_VIEW(compose->text));
        textbuf = gtk_text_view_get_buffer(textview);
        
+       undo_block(compose->undostruct);
 #ifdef USE_ASPELL
        if (msginfo->folder && msginfo->folder->prefs && 
            msginfo->folder->prefs && 
@@ -1809,17 +1812,24 @@ static gchar *compose_quote_fmt(Compose *compose, MsgInfo *msginfo,
                g_signal_handlers_block_by_func(G_OBJECT(buffer),
                                        G_CALLBACK(compose_changed_cb),
                                        compose);
+               g_signal_handlers_block_by_func(G_OBJECT(buffer),
+                                       G_CALLBACK(text_inserted),
+                                       compose);
                
                mark = gtk_text_buffer_get_insert(buffer);
                gtk_text_buffer_get_iter_at_mark(buffer, &iter, mark);
 
                lastp = strchr(p, '\n');
                len = lastp ? lastp - p + 1 : -1;
+
                gtk_text_buffer_insert(buffer, &iter, p, len);
 
                g_signal_handlers_unblock_by_func(G_OBJECT(buffer),
                                        G_CALLBACK(compose_changed_cb),
                                        compose);
+               g_signal_handlers_unblock_by_func(G_OBJECT(buffer),
+                                       G_CALLBACK(text_inserted),
+                                       compose);
                
                if (lastp)
                        p = lastp + 1;
@@ -2124,9 +2134,11 @@ static ComposeInsertResult compose_insert_file(Compose *compose, const gchar *fi
        mark = gtk_text_buffer_get_insert(buffer);
        gtk_text_buffer_get_iter_at_mark(buffer, &iter, mark);
 
+       g_signal_handlers_block_by_func(G_OBJECT(buffer),
+                                       G_CALLBACK(text_inserted),
+                                       compose);
+
        while (fgets(buf, sizeof(buf), fp) != NULL) {
-#warning FIXME_GTK2
-#if 1 /* FIXME_GTK2 */
                const gchar *cur_encoding = conv_get_current_charset_str();
                gchar *str = conv_codeset_strdup(buf, cur_encoding, CS_UTF_8);
 
@@ -2143,9 +2155,12 @@ static ComposeInsertResult compose_insert_file(Compose *compose, const gchar *fi
                gtk_text_buffer_insert(buffer, &iter, str, -1);
 
                g_free (str);
-#endif /* FIXME_GTK2 */
        }
 
+       g_signal_handlers_unblock_by_func(G_OBJECT(buffer),
+                                         G_CALLBACK(text_inserted),
+                                         compose);
+
        fclose(fp);
 
        if (badtxt)
@@ -2255,6 +2270,7 @@ static void compose_use_signing(Compose *compose, gboolean use_signing)
        ifactory = gtk_item_factory_from_widget(compose->menubar);
        menuitem = gtk_item_factory_get_item
                (ifactory, "/Message/Sign");
+
        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), 
                                       use_signing);
        compose_update_gnupg_mode_menu_item(compose);
@@ -2398,7 +2414,6 @@ static void compose_attach_parts(Compose *compose, MsgInfo *msginfo)
 
 #define SPACE_CHARS    " \t"
 
-#warning FIXME_GTK2
 static void compose_wrap_line(Compose *compose)
 {
        GtkTextView *text = GTK_TEXT_VIEW(compose->text);
@@ -2709,6 +2724,35 @@ static guint ins_quote(GtkTextBuffer *textbuf, GtkTextIter *iter,
        return ins_len;
 }
 
+static gboolean is_sig_separator(Compose *compose, GtkTextBuffer *textbuf, guint start_pos) 
+{
+       char *text = NULL;
+       GtkTextIter iter; 
+       GtkTextIter end_iter;
+       if (!compose->account->sig_sep)
+               return FALSE;
+       
+       gtk_text_buffer_get_iter_at_offset(textbuf, &iter, start_pos+1);
+       gtk_text_buffer_get_iter_at_offset(textbuf, &end_iter,
+               start_pos+strlen(compose->account->sig_sep)+1);
+
+       if (!strcmp(gtk_text_iter_get_text(&iter, &end_iter),
+                       compose->account->sig_sep)) {
+               /* check \n */
+               gtk_text_buffer_get_iter_at_offset(textbuf, &iter,
+                       start_pos+strlen(compose->account->sig_sep)+1);
+               gtk_text_buffer_get_iter_at_offset(textbuf, &end_iter,
+                       start_pos+strlen(compose->account->sig_sep)+2);
+
+               if (!strcmp(gtk_text_iter_get_text(&iter, &end_iter),"\n"));
+                       return TRUE;
+               
+
+       }
+
+       return FALSE;
+}
+
 /* check if we should join the next line */
 static gboolean join_next_line_is_needed(GtkTextBuffer *textbuf,
                                         guint start_pos, guint tlen,
@@ -2725,6 +2769,7 @@ static gboolean join_next_line_is_needed(GtkTextBuffer *textbuf,
                gtk_text_buffer_get_iter_at_offset(textbuf, &iter,
                                                   start_pos + indent_len);
                GET_CHAR(&iter, cbuf, ch_len);
+               
                if (ch_len > 0 && (cbuf[0] != '\n'))
                        do_join = TRUE;
        }
@@ -2772,15 +2817,11 @@ static void compose_wrap_line_all_full(Compose *compose, gboolean autowrap)
 
                /* fix line length for tabs */
                if (ch_len == 1 && *cbuf == '\t') {
-#warning FIXME_GTK2
-                       /* guint tab_width = text->default_tab_width; */
                        guint tab_width = 8;
                        guint tab_offset = line_len % tab_width;
 
-                       if (tab_offset) {
-                               line_len += tab_width - tab_offset - 1;
-                               cur_len = line_len;
-                       }
+                       line_len += tab_width - tab_offset - 1;
+                       cur_len = line_len;
                }
 
                /* we have encountered line break */
@@ -2790,10 +2831,11 @@ static void compose_wrap_line_all_full(Compose *compose, gboolean autowrap)
 
                        /* should we join the next line */
                        if ((autowrap || i_len != cur_len) && do_delete &&
+                       !is_sig_separator(compose, textbuf, cur_pos+i_len) &&
                            join_next_line_is_needed
-                               (textbuf, cur_pos + 1, tlen, i_len, autowrap))
+                               (textbuf, cur_pos + 1, tlen, i_len, autowrap)) {
                                do_delete = TRUE;
-                       else
+                       else
                                do_delete = FALSE;
 
                        /* skip delete if it is continuous URL */
@@ -2966,9 +3008,9 @@ static void compose_wrap_line_all_full(Compose *compose, gboolean autowrap)
                        /* start over with current line */
                        is_new_line = TRUE;
                        line_len = cur_len = 0;
-                       if (autowrap || i_len > 0)
+                       if (autowrap || i_len > 0) {
                                do_delete = TRUE;
-                       else
+                       else
                                do_delete = FALSE;
 #ifdef WRAP_DEBUG
                        g_print("after CR insert ");
@@ -3117,16 +3159,17 @@ static void compose_select_account(Compose *compose, PrefsAccount *account,
                                          COMPOSE_ENTRY_REPLY_TO);
        }
 
-       menuitem = gtk_item_factory_get_item(ifactory, "/View/Ruler");
-       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
-                                      prefs_common.show_ruler);
 #endif
 
 #if USE_GPGME
        if (account->default_sign)
                menu_set_active(ifactory, "/Message/Sign", TRUE);
+       else
+               menu_set_active(ifactory, "/Message/Sign", FALSE);
        if (account->default_encrypt)
                menu_set_active(ifactory, "/Message/Encrypt", TRUE);
+       else
+               menu_set_active(ifactory, "/Message/Encrypt", FALSE);
                                       
        activate_gnupg_mode(compose, account);          
 #endif /* USE_GPGME */
@@ -3438,7 +3481,7 @@ static gint compose_redirect_write_headers(Compose *compose, FILE *fp)
        /* Resent-Message-ID */
        if (compose->account->gen_msgid) {
                compose_generate_msgid(buf, sizeof(buf));
-               fprintf(fp, "Resent-Message-Id: <%s>\n", buf);
+               fprintf(fp, "Resent-Message-ID: <%s>\n", buf);
                compose->msgid = g_strdup(buf);
        }
 
@@ -3663,16 +3706,7 @@ static gint compose_write_to_file(Compose *compose, const gchar *file,
                        encoding = ENC_BASE64;
 #endif
 
-#warning FIXME_GTK2
-#if 0 /* FIXME_GTK2 */
-               src_codeset = conv_get_current_charset_str();
-               /* if current encoding is US-ASCII, set it the same as
-                  outgoing one to prevent code conversion failure */
-               if (!strcasecmp(src_codeset, CS_US_ASCII))
-                       src_codeset = out_codeset;
-#else /* FIXME_GTK2 */
                src_codeset = CS_UTF_8;
-#endif /* FIXME_GTK2 */
 
                debug_print("src encoding = %s, out encoding = %s, transfer encoding = %s\n",
                            src_codeset, out_codeset, procmime_get_encoding_str(encoding));
@@ -3858,14 +3892,11 @@ static gint compose_write_body_to_file(Compose *compose, const gchar *file)
        gtk_text_buffer_get_end_iter(buffer, &end);
        tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
 
-#warning FIXME_GTK2
-#if 1 /* FIXME_GTK2 */
        src_codeset = CS_UTF_8;
        dest_codeset = conv_get_current_charset_str();
        chars = conv_codeset_strdup(tmp, src_codeset, dest_codeset);
        g_free(tmp);
        if (!chars) return -1;
-#endif /* FIXME_GTK2 */
 
        /* write body */
        len = strlen(chars);
@@ -4281,12 +4312,7 @@ static gint compose_write_headers_from_headerlist(Compose *compose,
 
                if (!g_strcasecmp(trans_hdr, headerentryname)) {
                        const gchar *entstr = gtk_entry_get_text(GTK_ENTRY(headerentry->entry));
-#warning FIXME_GTK2
-#if 1
                        gchar *tmpstr = conv_codeset_strdup(entstr, CS_UTF_8, conv_get_current_charset_str());
-#else
-                       gchar *tmpstr = strdup(entstr);
-#endif
                        Xstrdup_a(str, tmpstr, return -1);
                        g_strstrip(str);
                        if (str[0] != '\0') {
@@ -4426,7 +4452,7 @@ static gint compose_write_headers(Compose *compose, FILE *fp,
        /* Message-ID */
        if (compose->account->gen_msgid) {
                compose_generate_msgid(buf, sizeof(buf));
-               fprintf(fp, "Message-Id: <%s>\n", buf);
+               fprintf(fp, "Message-ID: <%s>\n", buf);
                compose->msgid = g_strdup(buf);
        }
 
@@ -4635,12 +4661,7 @@ static void compose_convert_header(gchar *dest, gint len, gchar *src,
 
        if (len < 1) return;
 
-#warning FIXME_GTK2
-#if 1
-       tmpstr = conv_codeset_strdup(src, CS_UTF_8, conv_get_current_charset_str());
-#else
-       tmpstr = strdup(src);
-#endif
+       tmpstr = g_strdup(src);
 
        subst_char(tmpstr, '\n', ' ');
        subst_char(tmpstr, '\r', ' ');
@@ -4723,6 +4744,10 @@ static void compose_create_header_entry(Compose *compose)
        }
        if (header)
                gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), header);
+       g_signal_connect(G_OBJECT(GTK_COMBO(combo)->entry), "grab_focus",
+                        G_CALLBACK(compose_grab_focus_before_cb), compose);
+       g_signal_connect_after(G_OBJECT(GTK_COMBO(combo)->entry), "grab_focus",
+                        G_CALLBACK(compose_grab_focus_cb), compose);
 
        /* Entry field */
        entry = gtk_entry_new(); 
@@ -4738,6 +4763,8 @@ static void compose_create_header_entry(Compose *compose)
        g_signal_connect(G_OBJECT(entry), "activate", 
                         G_CALLBACK(text_activated), compose);
        g_signal_connect(G_OBJECT(entry), "grab_focus",
+                        G_CALLBACK(compose_grab_focus_before_cb), compose);
+       g_signal_connect_after(G_OBJECT(entry), "grab_focus",
                         G_CALLBACK(compose_grab_focus_cb), compose);
        g_signal_connect(G_OBJECT(entry), "button-press-event", 
                         G_CALLBACK(compose_headerentry_button_pressed),
@@ -4987,6 +5014,8 @@ static GtkWidget *compose_create_others(Compose *compose)
        gtk_table_attach_defaults(GTK_TABLE(table), savemsg_entry, 1, 2, rowcount, rowcount + 1);
        gtk_editable_set_editable(GTK_EDITABLE(savemsg_entry), prefs_common.savemsg);
        g_signal_connect(G_OBJECT(savemsg_entry), "grab_focus",
+                        G_CALLBACK(compose_grab_focus_before_cb), compose);
+       g_signal_connect_after(G_OBJECT(savemsg_entry), "grab_focus",
                         G_CALLBACK(compose_grab_focus_cb), compose);
        if (account_get_special_folder(compose->account, F_OUTBOX)) {
                folderidentifier = folder_item_get_identifier(account_get_special_folder
@@ -5163,6 +5192,8 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
        g_signal_connect(G_OBJECT(subject_entry), "activate", 
                         G_CALLBACK(text_activated), compose);
        g_signal_connect(G_OBJECT(subject_entry), "grab_focus",
+                        G_CALLBACK(compose_grab_focus_before_cb), compose);
+       g_signal_connect_after(G_OBJECT(subject_entry), "grab_focus",
                         G_CALLBACK(compose_grab_focus_cb), compose);
        gtk_widget_show(subject_entry);
        compose->subject_entry = subject_entry;
@@ -5197,36 +5228,9 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
        gtk_text_view_set_editable(GTK_TEXT_VIEW(text), TRUE);
        clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
        gtk_text_buffer_add_selection_clipboard(buffer, clipboard);
-#warning FIXME_GTK2
-       /* GTK_STEXT(text)->default_tab_width = 8; */
-
-#warning FIXME_GTK2
-#if 0
-       if (prefs_common.block_cursor) {
-               GTK_STEXT(text)->cursor_type = GTK_STEXT_CURSOR_BLOCK;
-       }
-#endif
        
-#warning FIXME_GTK2
-#if 0
-       if (prefs_common.smart_wrapping) {      
-               gtk_stext_set_word_wrap(GTK_STEXT(text), TRUE);
-               gtk_stext_set_wrap_rmargin(GTK_STEXT(text), prefs_common.linewrap_len);
-       }               
-#else
-       if (prefs_common.smart_wrapping) {      
-               gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(text), GTK_WRAP_WORD);
-       }               
-#endif
-
        gtk_container_add(GTK_CONTAINER(scrolledwin), text);
 
-#warning FIXME_GTK2
-#if 0 /* FIXME_GTK2 */
-       g_signal_connect(G_OBJECT(text), "activate",
-                        G_CALLBACK(text_activated), compose);
-#endif /* FIXME_GTK2 */
-
        g_signal_connect_after(G_OBJECT(text), "size_allocate",
                               G_CALLBACK(compose_edit_size_alloc),
                               ruler);
@@ -5255,19 +5259,7 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode)
 
        style = gtk_widget_get_style(text);
 
-       /* workaround for the slow down of GtkSText when using Pixmap theme */
-#warning FIXME_GTK2
-#if 0 /* FIXME_GTK2 */
-       if (style->engine) {
-               GtkThemeEngine *engine;
-
-               engine = style->engine;
-               style->engine = NULL;
-               new_style = gtk_style_copy(style);
-               style->engine = engine;
-       } else
-#endif /* FIXME_GTK2 */
-               new_style = gtk_style_copy(style);
+       new_style = gtk_style_copy(style);
 
        if (prefs_common.textfont) {
                PangoFontDescription *font_desc;
@@ -6630,6 +6622,8 @@ static void compose_draft_cb(gpointer data, guint action, GtkWidget *widget)
        if (newmsginfo) {
                procmsg_msginfo_unset_flags(newmsginfo, ~0, ~0);
                procmsg_msginfo_set_flags(newmsginfo, 0, MSG_DRAFT);
+               if (compose_use_attach(compose))
+                       procmsg_msginfo_set_flags(newmsginfo, 0, MSG_HAS_ATTACHMENT);
                procmsg_msginfo_free(newmsginfo);
        }
        
@@ -6676,7 +6670,7 @@ static void compose_attach_cb(gpointer data, guint action, GtkWidget *widget)
        if (compose->redirect_filename != NULL)
                return;
 
-       file_list = filesel_select_multiple_files(_("Select file"));
+       file_list = filesel_select_multiple_files_open(_("Select file"));
 
        if (file_list) {
                GList *tmp;
@@ -6697,7 +6691,7 @@ static void compose_insert_file_cb(gpointer data, guint action,
        Compose *compose = (Compose *)data;
        GList *file_list;
 
-       file_list = filesel_select_multiple_files(_("Select file"));
+       file_list = filesel_select_multiple_files_open(_("Select file"));
 
        if (file_list) {
                GList *tmp;
@@ -7216,10 +7210,38 @@ static void compose_advanced_action_cb(Compose *compose,
        }
 }
 
-static void compose_grab_focus_cb(GtkWidget *widget, Compose *compose)
+static gchar *cliptext = NULL;
+
+static gboolean compose_grab_focus_before_cb(GtkWidget *widget, Compose *compose)
+{
+       gchar *str = NULL;
+       GtkClipboard *clip = gtk_clipboard_get(gdk_atom_intern("PRIMARY", FALSE));
+       if (cliptext)
+               g_free(cliptext);
+       if (gtk_clipboard_wait_is_text_available(clip))
+               cliptext = gtk_clipboard_wait_for_text(clip);
+       
+       return FALSE;
+}
+
+static gboolean compose_grab_focus_cb(GtkWidget *widget, Compose *compose)
 {
+       gchar *str = NULL;
+       GtkClipboard *clip = gtk_clipboard_get(gdk_atom_intern("PRIMARY", FALSE));
+       
+       if (GTK_IS_EDITABLE(widget)) {
+               str = gtk_editable_get_chars(GTK_EDITABLE(widget), 0, -1);
+               gtk_editable_set_position(GTK_EDITABLE(widget), 
+                       strlen(str));
+               g_free(str);
+       }
+       if (cliptext)
+               gtk_clipboard_set_text(clip, cliptext, -1);
+
        if (GTK_IS_EDITABLE(widget) || GTK_IS_TEXT_VIEW(widget))
                compose->focused_editable = widget;
+       
+       return TRUE;
 }
 
 static void compose_changed_cb(GtkTextBuffer *textbuf, Compose *compose)
@@ -7234,7 +7256,6 @@ static void compose_toggle_autowrap_cb(gpointer data, guint action,
                                       GtkWidget *widget)
 {
        Compose *compose = (Compose *)data;
-
        compose->autowrap = GTK_CHECK_MENU_ITEM(widget)->active;
        if (compose->autowrap)
                compose_wrap_line_all_full(compose, TRUE);