From 41b460724c6455eae000ab3dfbfa5553a597e030 Mon Sep 17 00:00:00 2001 From: hiro Date: Wed, 25 Jul 2012 09:19:12 +0000 Subject: improved the new attachmemts interface. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@3134 ee746299-78ed-0310-b773-934348b2243d --- src/mainwindow.c | 2 ++ src/messageview.c | 16 ++++++++-- src/messageview.h | 1 + src/prefs_common_dialog.c | 42 ++++++++++++++++++++++++++ src/textview.c | 76 ++++++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 131 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/mainwindow.c b/src/mainwindow.c index f64677fe..faf0853e 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -1303,6 +1303,8 @@ void main_window_reflect_prefs_all(void) folderview_reflect_prefs(mainwin->folderview); + messageview_reflect_prefs(mainwin->messageview); + headerview_set_visibility(mainwin->messageview->headerview, prefs_common.display_header_pane); diff --git a/src/messageview.c b/src/messageview.c index bfae451a..530b8d92 100644 --- a/src/messageview.c +++ b/src/messageview.c @@ -377,7 +377,7 @@ MessageView *messageview_create(void) toolbar_hbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(toolbar_hbox); - gtk_box_pack_end(GTK_BOX(toolbar_vbox), toolbar_hbox, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(toolbar_vbox), toolbar_hbox, TRUE, FALSE, 0); mime_toggle_btn = gtk_toggle_button_new(); gtk_widget_show(mime_toggle_btn); @@ -419,8 +419,8 @@ MessageView *messageview_create(void) hbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(hbox); + gtk_box_pack_start(GTK_BOX(hbox), toolbar_vbox, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), GTK_WIDGET_PTR(headerview), TRUE, TRUE, 0); - gtk_box_pack_end(GTK_BOX(hbox), toolbar_vbox, FALSE, FALSE, 0); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); @@ -552,6 +552,18 @@ void messageview_init(MessageView *messageview) /* messageview_set_font(messageview); */ } +void messageview_reflect_prefs(MessageView *messageview) +{ + if (messageview->type == MVIEW_MIME) { + if (prefs_common.show_attach_tab) + gtk_widget_hide(messageview->toolbar_vbox); + else + gtk_widget_show(messageview->toolbar_vbox); + gtk_notebook_set_show_tabs(GTK_NOTEBOOK(messageview->notebook), + prefs_common.show_attach_tab); + } +} + GList *messageview_get_window_list(void) { return messageview_list; diff --git a/src/messageview.h b/src/messageview.h index e193d0d2..ef6abd12 100644 --- a/src/messageview.h +++ b/src/messageview.h @@ -79,6 +79,7 @@ struct _MessageView MessageView *messageview_create (void); MessageView *messageview_create_with_new_window (void); void messageview_init (MessageView *messageview); +void messageview_reflect_prefs (MessageView *messageview); gint messageview_show (MessageView *messageview, MsgInfo *msginfo, gboolean all_headers); diff --git a/src/prefs_common_dialog.c b/src/prefs_common_dialog.c index f9ca0f30..ea1a8c9f 100644 --- a/src/prefs_common_dialog.c +++ b/src/prefs_common_dialog.c @@ -173,6 +173,11 @@ static struct Message { GtkWidget *chkbtn_inline_image; } message; +static struct Attach { + GtkWidget *chkbtn_show_attach_tab; + GtkWidget *chkbtn_show_files_first; +} attach; + static struct ColorLabel { GtkWidget *entry_color[7]; } colorlabel; @@ -468,6 +473,12 @@ static PrefsUIData ui_data[] = { {"inline_image", &message.chkbtn_inline_image, prefs_set_data_from_toggle, prefs_set_toggle}, + /* Attachment */ + {"show_attach_tab", &attach.chkbtn_show_attach_tab, + prefs_set_data_from_toggle, prefs_set_toggle}, + {"show_attached_files_first", &attach.chkbtn_show_files_first, + prefs_set_data_from_toggle, prefs_set_toggle}, + /* Encoding */ {"default_encoding", &display.optmenu_dispencoding, prefs_common_charset_set_data_from_optmenu, @@ -631,6 +642,7 @@ static GtkWidget *prefs_spell_create (void); #endif static void prefs_display_create (void); static GtkWidget *prefs_message_create (void); +static GtkWidget *prefs_attach_create (void); static GtkWidget *prefs_colorlabel_create (void); static void prefs_common_colorlabel_set_dialog (void); @@ -1607,6 +1619,7 @@ static void prefs_display_create(void) GtkWidget *button_dispitem; GtkWidget *msg_wid; + GtkWidget *att_wid; GtkWidget *clabel_wid; GtkWidget *label_dispencoding; @@ -1751,6 +1764,10 @@ static void prefs_display_create(void) msg_wid = prefs_message_create(); gtk_box_pack_start(GTK_BOX(vbox_tab), msg_wid, FALSE, FALSE, 0); + APPEND_SUB_NOTEBOOK(notebook, vbox_tab, _("Attachment")); + att_wid = prefs_attach_create(); + gtk_box_pack_start(GTK_BOX(vbox_tab), att_wid, FALSE, FALSE, 0); + APPEND_SUB_NOTEBOOK(notebook, vbox_tab, _("Color label")); clabel_wid = prefs_colorlabel_create(); gtk_box_pack_start(GTK_BOX(vbox_tab), clabel_wid, FALSE, FALSE, 0); @@ -2008,6 +2025,31 @@ static GtkWidget *prefs_message_create(void) return vbox1; } +static GtkWidget *prefs_attach_create(void) +{ + GtkWidget *vbox1; + GtkWidget *vbox2; + GtkWidget *chkbtn_show_attach_tab; + GtkWidget *chkbtn_show_files_first; + + vbox1 = gtk_vbox_new (FALSE, VSPACING); + gtk_widget_show (vbox1); + + vbox2 = gtk_vbox_new (FALSE, 0); + gtk_widget_show (vbox2); + gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0); + + PACK_CHECK_BUTTON(vbox2, chkbtn_show_attach_tab, + _("Toggle attachment list with tab")); + PACK_CHECK_BUTTON(vbox2, chkbtn_show_files_first, + _("Show attached files first on message view")); + + attach.chkbtn_show_attach_tab = chkbtn_show_attach_tab; + attach.chkbtn_show_files_first = chkbtn_show_files_first; + + return vbox1; +} + static GtkWidget *prefs_colorlabel_create(void) { GtkWidget *vbox; diff --git a/src/textview.c b/src/textview.c index 260f7791..edb56f25 100644 --- a/src/textview.c +++ b/src/textview.c @@ -181,6 +181,9 @@ static void textview_show_header (TextView *textview, static void textview_insert_border (TextView *textview, GtkTextIter *iter, gint padding); +static void textview_insert_pad (TextView *textview, + GtkTextIter *iter, + gint padding); static gboolean textview_key_pressed (GtkWidget *widget, GdkEventKey *event, @@ -326,12 +329,18 @@ static void textview_create_tags(TextView *textview) GtkTextView *text = GTK_TEXT_VIEW(textview->text); GtkTextBuffer *buffer; static PangoFontDescription *font_desc; + GtkTextIter iter; + GtkTextMark *mark; if (!font_desc) font_desc = gtkut_get_default_font_desc(); buffer = gtk_text_view_get_buffer(text); + gtk_text_buffer_get_end_iter(buffer, &iter); + mark = gtk_text_buffer_create_mark(buffer, "attach-file-pos", + &iter, TRUE); + gtk_text_buffer_create_tag(buffer, "header", "pixels-above-lines", 1, "pixels-above-lines-set", TRUE, @@ -500,6 +509,11 @@ void textview_show_message(TextView *textview, MimeInfo *mimeinfo, gtk_text_buffer_get_end_iter(buffer, &iter); textview->body_pos = gtk_text_iter_get_offset(&iter); + } else { + gtk_text_buffer_get_end_iter(buffer, &iter); + mark = gtk_text_buffer_get_mark(buffer, "attach-file-pos"); + gtk_text_buffer_move_mark(buffer, mark, &iter); + g_object_set_data(G_OBJECT(mark), "attach-file-count", GINT_TO_POINTER(0)); } #if USE_GPGME @@ -615,6 +629,11 @@ void textview_show_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp) textview->body_pos = gtk_text_iter_get_offset(&iter); if (!mimeinfo->main) gtk_text_buffer_insert(buffer, &iter, "\n", 1); + } else { + gtk_text_buffer_get_end_iter(buffer, &iter); + mark = gtk_text_buffer_get_mark(buffer, "attach-file-pos"); + gtk_text_buffer_move_mark(buffer, mark, &iter); + g_object_set_data(G_OBJECT(mark), "attach-file-count", GINT_TO_POINTER(0)); } if (mimeinfo->mime_type == MIME_MULTIPART || is_rfc822_part) @@ -859,7 +878,6 @@ static void textview_add_part_widget(TextView *textview, GtkTextIter *iter, GdkColor fg2 = {0, 0x6000, 0x8000, 0xffff}; buffer = gtk_text_view_get_buffer(text); - gtk_text_buffer_insert(buffer, iter, "\n", 1); anchor = gtk_text_buffer_create_child_anchor(buffer, iter); ebox = gtk_event_box_new(); hbox = gtk_hbox_new(FALSE, 4); @@ -907,6 +925,7 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp) gint boundary_len = 0; const gchar *charset; GPtrArray *headers = NULL; + GtkTextMark *mark; g_return_if_fail(mimeinfo != NULL); g_return_if_fail(fp != NULL); @@ -935,12 +954,17 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp) g_snprintf(buf, sizeof(buf), "%s (%s)", mimeinfo->content_type, to_human_readable(mimeinfo->content_size)); + gtk_text_buffer_insert(buffer, &iter, "\n", 1); textview_add_part_widget(textview, &iter, mimeinfo, buf); gtk_text_buffer_get_end_iter(buffer, &iter); headers = textview_scan_header(textview, fp, charset); if (headers) { textview_show_header(textview, headers); procheader_header_array_destroy(headers); + } else { + mark = gtk_text_buffer_get_mark(buffer, "attach-file-pos"); + gtk_text_buffer_move_mark(buffer, mark, &iter); + g_object_set_data(G_OBJECT(mark), "attach-file-count", GINT_TO_POINTER(0)); } return; } @@ -965,7 +989,6 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp) if (mimeinfo->mime_type != MIME_TEXT && mimeinfo->mime_type != MIME_TEXT_HTML) { - textview_add_part_widget(textview, &iter, mimeinfo, buf); if (mimeinfo->mime_type == MIME_IMAGE && prefs_common.inline_image) { GdkPixbuf *pixbuf; @@ -974,6 +997,9 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp) RemoteURI *uri; gchar *uri_str; + gtk_text_buffer_insert(buffer, &iter, "\n", 1); + textview_add_part_widget(textview, &iter, mimeinfo, buf); + filename = procmime_get_tmp_file_name(mimeinfo); if (procmime_get_part_fp(filename, fp, mimeinfo) < 0) { g_warning("Can't get the image file."); @@ -1017,14 +1043,32 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp) g_object_unref(pixbuf); g_free(filename); + } else if (prefs_common.show_attached_files_first) { + gint count; + + mark = gtk_text_buffer_get_mark(buffer, "attach-file-pos"); + + gtk_text_buffer_get_iter_at_mark(buffer, &iter, mark); + count = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(mark), "attach-file-count")); + if (count == 0) { + textview_insert_pad(textview, &iter, 4); + gtk_text_buffer_move_mark(buffer, mark, &iter); + } + textview_add_part_widget(textview, &iter, mimeinfo, buf); + gtk_text_buffer_move_mark(buffer, mark, &iter); + g_object_set_data(G_OBJECT(mark), "attach-file-count", GINT_TO_POINTER(count + 1)); + gtk_text_buffer_get_end_iter(buffer, &iter); + } else { + gtk_text_buffer_insert(buffer, &iter, "\n", 1); + textview_add_part_widget(textview, &iter, mimeinfo, buf); } } else { + /* text part */ + gtk_text_buffer_insert(buffer, &iter, "\n", 1); if (!mimeinfo->main && mimeinfo->parent && mimeinfo->parent->children != mimeinfo) textview_add_part_widget(textview, &iter, mimeinfo, buf); - else - gtk_text_buffer_insert(buffer, &iter, "\n", 1); textview_write_body(textview, mimeinfo, fp, charset); } } @@ -1668,6 +1712,7 @@ static void textview_show_header(TextView *textview, GPtrArray *headers) GtkTextIter iter; Header *header; gint i; + GtkTextMark *mark; g_return_if_fail(headers != NULL); @@ -1710,6 +1755,10 @@ static void textview_show_header(TextView *textview, GPtrArray *headers) (buffer, &iter, "\n", 1, "header", NULL); } + mark = gtk_text_buffer_get_mark(buffer, "attach-file-pos"); + gtk_text_buffer_move_mark(buffer, mark, &iter); + g_object_set_data(G_OBJECT(mark), "attach-file-count", GINT_TO_POINTER(0)); + textview_insert_border(textview, &iter, 0); } @@ -1743,6 +1792,25 @@ static void textview_insert_border(TextView *textview, GtkTextIter *iter, G_CALLBACK(textview_size_allocate_cb), hline); } +static void textview_insert_pad(TextView *textview, GtkTextIter *iter, + gint padding) +{ + GtkTextView *text = GTK_TEXT_VIEW(textview->text); + GtkTextBuffer *buffer; + GtkTextChildAnchor *anchor; + GtkWidget *vbox; + + buffer = gtk_text_view_get_buffer(text); + + anchor = gtk_text_buffer_create_child_anchor(buffer, iter); + vbox = gtk_vbox_new(FALSE, 0); + gtk_widget_set_size_request(vbox, -1, padding); + gtk_widget_show_all(vbox); + gtk_text_view_add_child_at_anchor(text, vbox, anchor); + + gtk_text_buffer_insert(buffer, iter, "\n", 1); +} + gboolean textview_search_string(TextView *textview, const gchar *str, gboolean case_sens) { -- cgit v1.2.3