2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2012 Hiroyuki Yamamoto and the Claws Mail team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #include "claws-features.h"
28 #include <glib/gi18n.h>
35 # include <compface.h>
38 #include <gdk-pixbuf/gdk-pixbuf.h>
40 #include "headerview.h"
41 #include "prefs_common.h"
47 #include "addrindex.h"
50 static gint headerview_show_xface (HeaderView *headerview,
54 static gint headerview_show_face (HeaderView *headerview,
56 static gint headerview_show_contact_pic (HeaderView *headerview,
58 static void headerview_save_contact_pic (HeaderView *headerview,
61 HeaderView *headerview_create(void)
63 HeaderView *headerview;
69 GtkWidget *from_header_label;
70 GtkWidget *from_body_label;
71 GtkWidget *to_header_label;
72 GtkWidget *to_body_label;
73 GtkWidget *ng_header_label;
74 GtkWidget *ng_body_label;
75 GtkWidget *subject_header_label;
76 GtkWidget *subject_body_label;
77 GtkWidget *tags_header_label;
78 GtkWidget *tags_body_label;
80 debug_print("Creating header view...\n");
81 headerview = g_new0(HeaderView, 1);
83 hbox = gtk_hbox_new(FALSE, 0);
84 gtk_container_set_border_width(GTK_CONTAINER(hbox), 2);
85 vbox = gtk_vbox_new(FALSE, 2);
86 gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
88 hbox1 = gtk_hbox_new(FALSE, 4);
89 gtk_box_pack_start(GTK_BOX(vbox), hbox1, FALSE, FALSE, 0);
90 hbox2 = gtk_hbox_new(FALSE, 4);
91 gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, FALSE, 0);
92 hbox3 = gtk_hbox_new(FALSE, 4);
93 gtk_box_pack_start(GTK_BOX(vbox), hbox3, FALSE, FALSE, 0);
95 from_header_label = gtk_label_new(prefs_common_translated_header_name("From:"));
96 from_body_label = gtk_label_new("");
97 to_header_label = gtk_label_new(prefs_common_translated_header_name("To:"));
98 to_body_label = gtk_label_new("");
99 ng_header_label = gtk_label_new(prefs_common_translated_header_name("Newsgroups:"));
100 ng_body_label = gtk_label_new("");
101 subject_header_label = gtk_label_new(prefs_common_translated_header_name("Subject:"));
102 subject_body_label = gtk_label_new("");
103 tags_header_label = gtk_label_new(_("Tags:"));
104 tags_body_label = gtk_label_new("");
106 gtk_label_set_selectable(GTK_LABEL(from_body_label), TRUE);
107 gtk_label_set_selectable(GTK_LABEL(to_body_label), TRUE);
108 gtk_label_set_selectable(GTK_LABEL(ng_body_label), TRUE);
109 gtk_label_set_selectable(GTK_LABEL(subject_body_label), TRUE);
110 gtk_label_set_selectable(GTK_LABEL(tags_body_label), TRUE);
112 gtkut_widget_set_can_focus(from_body_label, FALSE);
113 gtkut_widget_set_can_focus(to_body_label, FALSE);
114 gtkut_widget_set_can_focus(ng_body_label, FALSE);
115 gtkut_widget_set_can_focus(subject_body_label, FALSE);
116 gtkut_widget_set_can_focus(tags_body_label, FALSE);
118 gtk_box_pack_start(GTK_BOX(hbox1), from_header_label, FALSE, FALSE, 0);
119 gtk_box_pack_start(GTK_BOX(hbox1), from_body_label, FALSE, FALSE, 0);
120 gtk_box_pack_start(GTK_BOX(hbox1), to_header_label, FALSE, FALSE, 0);
121 gtk_box_pack_start(GTK_BOX(hbox1), to_body_label, TRUE, TRUE, 0);
122 gtk_box_pack_start(GTK_BOX(hbox1), ng_header_label, FALSE, FALSE, 0);
123 gtk_box_pack_start(GTK_BOX(hbox1), ng_body_label, TRUE, TRUE, 0);
124 gtk_box_pack_start(GTK_BOX(hbox2), subject_header_label, FALSE, FALSE, 0);
125 gtk_box_pack_start(GTK_BOX(hbox2), subject_body_label, TRUE, TRUE, 0);
126 gtk_box_pack_start(GTK_BOX(hbox3), tags_header_label, FALSE, FALSE, 0);
127 gtk_box_pack_start(GTK_BOX(hbox3), tags_body_label, TRUE, TRUE, 0);
129 gtk_misc_set_alignment(GTK_MISC(to_body_label), 0, 0.5);
130 gtk_misc_set_alignment(GTK_MISC(ng_body_label), 0, 0.5);
131 gtk_misc_set_alignment(GTK_MISC(subject_body_label), 0, 0.5);
132 gtk_misc_set_alignment(GTK_MISC(tags_body_label), 0, 0.5);
133 gtk_label_set_ellipsize(GTK_LABEL(to_body_label), PANGO_ELLIPSIZE_END);
134 gtk_label_set_ellipsize(GTK_LABEL(ng_body_label), PANGO_ELLIPSIZE_END);
135 gtk_label_set_ellipsize(GTK_LABEL(subject_body_label), PANGO_ELLIPSIZE_END);
136 gtk_label_set_ellipsize(GTK_LABEL(tags_body_label), PANGO_ELLIPSIZE_END);
138 headerview->hbox = hbox;
139 headerview->from_header_label = from_header_label;
140 headerview->from_body_label = from_body_label;
141 headerview->to_header_label = to_header_label;
142 headerview->to_body_label = to_body_label;
143 headerview->ng_header_label = ng_header_label;
144 headerview->ng_body_label = ng_body_label;
145 headerview->subject_header_label = subject_header_label;
146 headerview->subject_body_label = subject_body_label;
147 headerview->tags_header_label = tags_header_label;
148 headerview->tags_body_label = tags_body_label;
149 headerview->image = NULL;
151 gtk_widget_show_all(hbox);
156 void headerview_set_font(HeaderView *headerview)
158 PangoFontDescription *boldfont = NULL;
159 PangoFontDescription *normalfont = NULL;
161 normalfont = pango_font_description_from_string(NORMAL_FONT);
163 gtk_widget_modify_font(headerview->from_body_label, normalfont);
164 gtk_widget_modify_font(headerview->to_body_label, normalfont);
165 gtk_widget_modify_font(headerview->ng_body_label, normalfont);
166 gtk_widget_modify_font(headerview->subject_body_label, normalfont);
167 gtk_widget_modify_font(headerview->tags_body_label, normalfont);
168 pango_font_description_free(normalfont);
171 if (prefs_common.derive_from_normal_font || !BOLD_FONT) {
172 boldfont = pango_font_description_from_string(NORMAL_FONT);
173 pango_font_description_set_weight(boldfont, PANGO_WEIGHT_BOLD);
175 boldfont = pango_font_description_from_string(BOLD_FONT);
178 gtk_widget_modify_font(headerview->from_header_label, boldfont);
179 gtk_widget_modify_font(headerview->to_header_label, boldfont);
180 gtk_widget_modify_font(headerview->ng_header_label, boldfont);
181 gtk_widget_modify_font(headerview->subject_header_label, boldfont);
182 gtk_widget_modify_font(headerview->tags_header_label, boldfont);
183 pango_font_description_free(boldfont);
187 void headerview_init(HeaderView *headerview)
189 headerview_set_font(headerview);
190 headerview_clear(headerview);
191 headerview_set_visibility(headerview, prefs_common.display_header_pane);
194 void headerview_show(HeaderView *headerview, MsgInfo *msginfo)
196 gchar *tags = procmsg_msginfo_get_tags_str(msginfo);
198 headerview_clear(headerview);
200 gtk_label_set_text(GTK_LABEL(headerview->from_body_label),
201 msginfo->from ? msginfo->from : _("(No From)"));
203 gtk_label_set_text(GTK_LABEL(headerview->to_body_label),
205 gtk_widget_show(headerview->to_header_label);
206 gtk_widget_show(headerview->to_body_label);
208 if (msginfo->newsgroups) {
209 gtk_label_set_text(GTK_LABEL(headerview->ng_body_label),
210 msginfo->newsgroups);
211 gtk_widget_show(headerview->ng_header_label);
212 gtk_widget_show(headerview->ng_body_label);
214 gtk_label_set_text(GTK_LABEL(headerview->subject_body_label),
215 msginfo->subject ? msginfo->subject :
218 gtk_label_set_text(GTK_LABEL(headerview->tags_body_label),
220 gtk_widget_show(headerview->tags_header_label);
221 gtk_widget_show(headerview->tags_body_label);
224 if (!headerview_show_face(headerview, msginfo))
228 if (!headerview_show_xface(headerview, msginfo))
232 if (!headerview_show_contact_pic(headerview, msginfo))
238 static gint headerview_show_xface(HeaderView *headerview, MsgInfo *msginfo)
240 GtkWidget *hbox = headerview->hbox;
242 gchar *xface = procmsg_msginfo_get_avatar(msginfo, AVATAR_XFACE);
244 if (!msginfo->extradata || !xface || strlen(xface) < 5) {
245 if (headerview->image &&
246 gtk_widget_get_visible(headerview->image)) {
247 gtk_widget_hide(headerview->image);
248 gtk_widget_queue_resize(hbox);
252 if (!gtk_widget_get_visible(headerview->hbox)) return -1;
254 if (headerview->image) {
255 gtk_widget_destroy(headerview->image);
256 headerview->image = NULL;
259 image = xface_get_from_header(xface);
262 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
263 gtk_widget_show(image);
266 headerview->image = image;
268 headerview_save_contact_pic(headerview, msginfo);
274 static gint headerview_show_face (HeaderView *headerview, MsgInfo *msginfo)
276 GtkWidget *hbox = headerview->hbox;
278 gchar *face = procmsg_msginfo_get_avatar(msginfo, AVATAR_FACE);
280 if (!msginfo->extradata || !face) {
281 if (headerview->image &&
282 gtk_widget_get_visible(headerview->image)) {
283 gtk_widget_hide(headerview->image);
284 gtk_widget_queue_resize(hbox);
288 if (!gtk_widget_get_visible(headerview->hbox)) return -1;
290 if (headerview->image) {
291 gtk_widget_destroy(headerview->image);
292 headerview->image = NULL;
295 image = face_get_from_header(face);
298 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
299 gtk_widget_show(image);
302 headerview->image = image;
306 headerview_save_contact_pic(headerview, msginfo);
311 static void headerview_save_contact_pic (HeaderView *headerview, MsgInfo *msginfo)
313 #ifndef USE_NEW_ADDRBOOK
314 gchar *filename = NULL;
315 GError *error = NULL;
316 GdkPixbuf *picture = NULL;
318 if (!gtk_widget_get_visible(headerview->hbox)) return;
320 if (headerview->image) {
321 picture = gtk_image_get_pixbuf(GTK_IMAGE(headerview->image));
324 filename = addrindex_get_picture_file(msginfo->from);
327 if (!is_file_exist(filename)) {
328 gdk_pixbuf_save(picture, filename, "png", &error, NULL);
330 g_warning(_("Failed to save image: \n%s"),
337 /* new address book */
341 static gint headerview_show_contact_pic (HeaderView *headerview, MsgInfo *msginfo)
343 #ifndef USE_NEW_ADDRBOOK
344 GtkWidget *hbox = headerview->hbox;
346 gchar *filename = NULL;
347 GError *error = NULL;
348 GdkPixbuf *picture = NULL;
351 if (!gtk_widget_get_visible(headerview->hbox)) return -1;
353 if (headerview->image) {
354 gtk_widget_destroy(headerview->image);
355 headerview->image = NULL;
358 filename = addrindex_get_picture_file(msginfo->from);
362 if (!is_file_exist(filename)) {
366 gdk_pixbuf_get_file_info(filename, &w, &h);
368 if (w > 48 || h > 48)
369 picture = gdk_pixbuf_new_from_file_at_scale(filename,
370 48, 48, TRUE, &error);
372 picture = gdk_pixbuf_new_from_file(filename, &error);
376 debug_print("Failed to import image: \n%s",
382 image = gtk_image_new_from_pixbuf(picture);
386 g_object_unref(picture);
388 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
389 gtk_widget_show(image);
392 headerview->image = image;
398 /* new address book */
403 void headerview_clear(HeaderView *headerview)
405 if (headerview == NULL)
408 gtk_label_set_text(GTK_LABEL(headerview->from_body_label), "");
409 gtk_label_set_text(GTK_LABEL(headerview->to_body_label), "");
410 gtk_label_set_text(GTK_LABEL(headerview->ng_body_label), "");
411 gtk_label_set_text(GTK_LABEL(headerview->subject_body_label), "");
412 gtk_label_set_text(GTK_LABEL(headerview->tags_body_label), "");
413 gtk_widget_hide(headerview->to_header_label);
414 gtk_widget_hide(headerview->to_body_label);
415 gtk_widget_hide(headerview->ng_header_label);
416 gtk_widget_hide(headerview->ng_body_label);
417 gtk_widget_hide(headerview->tags_header_label);
418 gtk_widget_hide(headerview->tags_body_label);
420 if (headerview->image && gtk_widget_get_visible(headerview->image)) {
421 gtk_widget_hide(headerview->image);
422 gtk_widget_queue_resize(headerview->hbox);
426 void headerview_set_visibility(HeaderView *headerview, gboolean visibility)
429 gtk_widget_show(headerview->hbox);
431 gtk_widget_hide(headerview->hbox);
434 void headerview_destroy(HeaderView *headerview)