aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2012-07-25 09:19:12 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2012-07-25 09:19:12 +0000
commit41b460724c6455eae000ab3dfbfa5553a597e030 (patch)
tree1a4968f09ab7ccbb38241fce3d4f848d2c558c16 /src
parent16066c7301977f08f712e349ee950c31ebd0eeda (diff)
improved the new attachmemts interface.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@3134 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src')
-rw-r--r--src/mainwindow.c2
-rw-r--r--src/messageview.c16
-rw-r--r--src/messageview.h1
-rw-r--r--src/prefs_common_dialog.c42
-rw-r--r--src/textview.c76
5 files changed, 131 insertions, 6 deletions
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)
{