X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-mail-header-view.c;h=7a9ad29b79afa1b08f19132cb9797bfa23963ebc;hp=d3dc53b2b59f90373547457fd126240d405518c4;hb=f6d386ff93e929092ba105385a29d760aeba9ff7;hpb=9c0bcdf0943f38153f13821aa6d7c51cfc5d9634 diff --git a/src/widgets/modest-mail-header-view.c b/src/widgets/modest-mail-header-view.c index d3dc53b..7a9ad29 100644 --- a/src/widgets/modest-mail-header-view.c +++ b/src/widgets/modest-mail-header-view.c @@ -53,9 +53,13 @@ struct _ModestMailHeaderViewPriv GtkWidget *main_vbox; GtkWidget *expander; GtkWidget *headers_vbox; + GtkWidget *subject_box; + GtkWidget *priority_icon; GtkSizeGroup *labels_size_group; gboolean is_outgoing; + gboolean is_draft; TnyHeader *header; + TnyHeaderFlags priority_flags; }; #define MODEST_MAIL_HEADER_VIEW_GET_PRIVATE(o) \ @@ -64,6 +68,51 @@ struct _ModestMailHeaderViewPriv static guint signals[LAST_SIGNAL] = {0}; static void +add_date_time_header (ModestMailHeaderView *mail_header, const gchar *name, time_t date) +{ + const guint BUF_SIZE = 64; + gchar date_buf [BUF_SIZE]; + gchar time_buf [BUF_SIZE]; + + ModestMailHeaderViewPriv *priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (mail_header); + GtkWidget *hbox, *date_hbox, *time_hbox; + GtkWidget *label; + + modest_text_utils_strftime (date_buf, BUF_SIZE, "%x", date); + modest_text_utils_strftime (time_buf, BUF_SIZE, "%X", date); + + hbox = gtk_hbox_new (FALSE, 48); + date_hbox = gtk_hbox_new (FALSE, 12); + time_hbox = gtk_hbox_new (FALSE, 12); + + label = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label), name); + gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.0); + gtk_box_pack_start (GTK_BOX (date_hbox), label, FALSE, FALSE, 0); + gtk_size_group_add_widget (priv->labels_size_group, label); + + label = gtk_label_new(date_buf); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); + gtk_box_pack_start (GTK_BOX (date_hbox), label, TRUE, TRUE, 0); + + gtk_box_pack_start (GTK_BOX (hbox), date_hbox, FALSE, FALSE, 0); + + label = gtk_label_new(NULL); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); + gtk_label_set_markup (GTK_LABEL (label), _("mail_va_time")); + gtk_box_pack_start (GTK_BOX (time_hbox), label, FALSE, FALSE, 0); + + label = gtk_label_new(time_buf); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0); + gtk_box_pack_start (GTK_BOX (time_hbox), label, TRUE, TRUE, 0); + + gtk_box_pack_start (GTK_BOX (hbox), time_hbox, TRUE, TRUE, 0); + + gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show (hbox); +} + +static void activate_recpt (GtkWidget *recpt_view, const gchar *address, gpointer user_data) { ModestMailHeaderView * view = MODEST_MAIL_HEADER_VIEW (user_data); @@ -71,6 +120,7 @@ activate_recpt (GtkWidget *recpt_view, const gchar *address, gpointer user_data) g_signal_emit (G_OBJECT (view), signals[RECPT_ACTIVATED_SIGNAL], 0, address); } +#if 0 /* This function is not used. murrayc. */ static void add_header (ModestMailHeaderView *widget, const gchar *field, const gchar *value) { @@ -83,7 +133,7 @@ add_header (ModestMailHeaderView *widget, const gchar *field, const gchar *value hbox = gtk_hbox_new (FALSE, 12); label_field = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label_field), field); - gtk_misc_set_alignment (GTK_MISC (label_field), 0.0, 0.0); + gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0); scroll_text = modest_scroll_text_new (NULL, 2); label_value = (GtkWidget *) modest_scroll_text_get_text_view (MODEST_SCROLL_TEXT (scroll_text)); text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (label_value)); @@ -97,6 +147,8 @@ add_header (ModestMailHeaderView *widget, const gchar *field, const gchar *value gtk_widget_show (hbox); } +#endif + static void add_recpt_header (ModestMailHeaderView *widget, const gchar *field, const gchar *value) @@ -108,7 +160,7 @@ add_recpt_header (ModestMailHeaderView *widget, const gchar *field, const gchar hbox = gtk_hbox_new (FALSE, 12); label_field = gtk_label_new (NULL); gtk_label_set_markup (GTK_LABEL (label_field), field); - gtk_misc_set_alignment (GTK_MISC (label_field), 0.0, 0.0); + gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0); label_value = modest_recpt_view_new (); modest_recpt_view_set_recipients (MODEST_RECPT_VIEW(label_value), value); g_signal_connect (G_OBJECT (label_value), "activate", G_CALLBACK (activate_recpt), widget); @@ -118,6 +170,7 @@ add_recpt_header (ModestMailHeaderView *widget, const gchar *field, const gchar gtk_size_group_add_widget (priv->labels_size_group, label_field); gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0); + gtk_widget_show (hbox); } @@ -155,22 +208,18 @@ modest_mail_header_view_update_is_outgoing (TnyHeaderView *self) folder = tny_header_get_folder (priv->header); if (folder) { - TnyFolderType folder_type; - folder_type = tny_folder_get_folder_type (folder); - if (folder_type == TNY_FOLDER_TYPE_NORMAL || folder_type == TNY_FOLDER_TYPE_UNKNOWN) { - const gchar *fname = tny_folder_get_name (folder); - folder_type = modest_tny_folder_guess_folder_type_from_name (fname); - } + TnyFolderType folder_type = tny_folder_get_folder_type (folder); switch (folder_type) { + case TNY_FOLDER_TYPE_DRAFTS: case TNY_FOLDER_TYPE_OUTBOX: case TNY_FOLDER_TYPE_SENT: - case TNY_FOLDER_TYPE_DRAFTS: priv->is_outgoing = TRUE; break; default: priv->is_outgoing = FALSE; } + priv->is_draft = (folder_type == TNY_FOLDER_TYPE_DRAFTS); g_object_unref (folder); } @@ -192,7 +241,8 @@ modest_mail_header_view_set_header_default (TnyHeaderView *self, TnyHeader *head if (header && G_IS_OBJECT (header)) { - const gchar *to, *from, *subject, *bcc, *cc; + gchar *to, *from, *subject, *bcc, *cc; + GtkWidget *subject_label; g_object_ref (G_OBJECT (header)); priv->header = header; @@ -200,33 +250,68 @@ modest_mail_header_view_set_header_default (TnyHeaderView *self, TnyHeader *head modest_mail_header_view_update_is_outgoing (self); - to = tny_header_get_to (header); - from = tny_header_get_from (header); - subject = tny_header_get_subject (header); - cc = tny_header_get_cc (header); - bcc = tny_header_get_bcc (header); - - if (subject) - add_header (MODEST_MAIL_HEADER_VIEW (self), _("Subject:"), subject); + to = tny_header_dup_to (header); + from = tny_header_dup_from (header); + subject = tny_header_dup_subject (header); + cc = tny_header_dup_cc (header); + bcc = tny_header_dup_bcc (header); + + priv->subject_box = gtk_hbox_new (FALSE, 0); + subject_label = gtk_label_new (NULL); + if (subject && (subject[0] != '\0')) + gtk_label_set_text (GTK_LABEL (subject_label), subject); + else + gtk_label_set_text (GTK_LABEL (subject_label), _("mail_va_no_subject")); + gtk_label_set_single_line_mode (GTK_LABEL (subject_label), TRUE); + gtk_label_set_ellipsize (GTK_LABEL (subject_label), PANGO_ELLIPSIZE_END); + gtk_label_set_selectable (GTK_LABEL (subject_label), TRUE); + gtk_misc_set_alignment (GTK_MISC (subject_label), 0.0, 0.0); + + /* TODO: code disabled until we can get real priority information from message */ +/* if (tny_header_get_priority (header)) { */ +/* GtkWidget *priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_high", GTK_ICON_SIZE_MENU); */ +/* gtk_box_pack_start (GTK_BOX (subject_box), priority_icon, FALSE, FALSE, 0); */ +/* } */ + priv->priority_icon = NULL; + gtk_box_pack_end (GTK_BOX (priv->subject_box), subject_label, TRUE, TRUE, 0); if (priv->is_outgoing) { - gchar *sent = modest_text_utils_get_display_date (tny_header_get_date_sent (header)); - gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("To:")); + gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("mail_va_to")); if (to) modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), to); - add_header (MODEST_MAIL_HEADER_VIEW (self), _("Sent:"), sent); - g_free (sent); + if (cc) + add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc); + if (bcc) + add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc); + if (priv->is_draft&& from) + add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_from"), from); + modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"), + priv->subject_box, TRUE, TRUE); + if (priv->is_draft) + add_date_time_header (MODEST_MAIL_HEADER_VIEW (self), _("mcen_fi_message_properties_created"), + tny_header_get_date_sent (header)); + else + add_date_time_header (MODEST_MAIL_HEADER_VIEW (self), _("mcen_fi_message_properties_sent"), + tny_header_get_date_sent (header)); } else { - gchar *received = modest_text_utils_get_display_date (tny_header_get_date_received (header)); - gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("From:")); + gtk_label_set_markup (GTK_LABEL (priv->fromto_label), _("mail_va_from")); if (from) modest_recpt_view_set_recipients (MODEST_RECPT_VIEW (priv->fromto_contents), from); - add_header (MODEST_MAIL_HEADER_VIEW (self), _("Received:"), received); - g_free (received); + if (to) + add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_to"), to); + if (cc) + add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_cc"), cc); + if (bcc) + add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_hotfix1"), bcc); + modest_mail_header_view_add_custom_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_subject"), + priv->subject_box, TRUE, TRUE); + add_date_time_header (MODEST_MAIL_HEADER_VIEW (self), _("mail_va_date"), + tny_header_get_date_received (header)); } - if (cc) - add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("Cc:"), cc); - if (bcc) - add_recpt_header (MODEST_MAIL_HEADER_VIEW (self), _("Bcc:"), bcc); + g_free (subject); + g_free (to); + g_free (from); + g_free (cc); + g_free (bcc); } gtk_widget_show_all (GTK_WIDGET (self)); @@ -282,16 +367,57 @@ expander_activate (GtkWidget *expander, ModestMailHeaderView *header_view) gtk_widget_queue_draw (GTK_WIDGET (priv->expander)); } +const GtkWidget * +modest_mail_header_view_add_custom_header (ModestMailHeaderView *header_view, + const gchar *label, + GtkWidget *custom_widget, + gboolean with_expander, + gboolean start) +{ + ModestMailHeaderViewPriv *priv; + g_return_val_if_fail (MODEST_IS_MAIL_HEADER_VIEW (header_view), NULL); + GtkWidget *hbox; + GtkWidget *label_field; + + priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (header_view); + hbox = gtk_hbox_new (FALSE, 12); + label_field = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (label_field), label); + gtk_misc_set_alignment (GTK_MISC (label_field), 1.0, 0.0); + gtk_box_pack_start (GTK_BOX (hbox), label_field, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (hbox), custom_widget, TRUE, TRUE, 0); + gtk_size_group_add_widget (priv->labels_size_group, label_field); + + if (with_expander) { + if (start) + gtk_box_pack_start (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0); + else + gtk_box_pack_end (GTK_BOX (priv->headers_vbox), hbox, FALSE, FALSE, 0); + } else { + if (start) + gtk_box_pack_start (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0); + else + gtk_box_pack_end (GTK_BOX (priv->main_vbox), hbox, FALSE, FALSE, 0); + } + + return hbox; +} + /** * modest_mail_header_view_new: * * Return value: a new #ModestHeaderView instance implemented for Gtk+ **/ TnyHeaderView* -modest_mail_header_view_new (void) +modest_mail_header_view_new (gboolean expanded) { + ModestMailHeaderViewPriv *priv; ModestMailHeaderView *self = g_object_new (MODEST_TYPE_MAIL_HEADER_VIEW, NULL); + priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (self); + gtk_expander_set_expanded (GTK_EXPANDER (priv->expander), expanded); + expander_activate (priv->expander, self); + return TNY_HEADER_VIEW (self); } @@ -313,7 +439,7 @@ modest_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class fromto_hbox = gtk_hbox_new (FALSE, 12); priv->fromto_label = gtk_label_new (NULL); - gtk_misc_set_alignment (GTK_MISC (priv->fromto_label), 0.0, 0.0); + gtk_misc_set_alignment (GTK_MISC (priv->fromto_label), 1.0, 0.0); priv->fromto_contents = modest_recpt_view_new (); g_signal_connect (G_OBJECT (priv->fromto_contents), "activate", G_CALLBACK (activate_recpt), instance); @@ -325,6 +451,7 @@ modest_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class gtk_size_group_add_widget (priv->labels_size_group, priv->fromto_label); priv->headers_vbox = gtk_vbox_new (FALSE, 0); + gtk_container_set_focus_chain (GTK_CONTAINER (priv->headers_vbox), NULL); g_object_ref (priv->headers_vbox); expander_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL); @@ -335,6 +462,7 @@ modest_mail_header_view_instance_init (GTypeInstance *instance, gpointer g_class gtk_container_set_reallocate_redraws (GTK_CONTAINER (instance), TRUE); priv->is_outgoing = FALSE; + priv->is_draft = FALSE; return; } @@ -366,8 +494,8 @@ tny_header_view_init (gpointer g, gpointer iface_data) { TnyHeaderViewIface *klass = (TnyHeaderViewIface *)g; - klass->set_header_func = modest_mail_header_view_set_header; - klass->clear_func = modest_mail_header_view_clear; + klass->set_header = modest_mail_header_view_set_header; + klass->clear = modest_mail_header_view_clear; return; } @@ -390,7 +518,7 @@ modest_mail_header_view_class_init (ModestMailHeaderViewClass *klass) g_type_class_add_private (object_class, sizeof (ModestMailHeaderViewPriv)); signals[RECPT_ACTIVATED_SIGNAL] = - g_signal_new ("recpt-activated", + g_signal_new ("recpt_activated", G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(ModestMailHeaderViewClass, recpt_activated), @@ -441,3 +569,41 @@ modest_mail_header_view_get_type (void) return type; } + +TnyHeaderFlags +modest_mail_header_view_get_priority (ModestMailHeaderView *headers_view) +{ + ModestMailHeaderViewPriv *priv; + + g_return_val_if_fail (MODEST_IS_MAIL_HEADER_VIEW (headers_view), 0); + priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view); + + return priv->priority_flags; +} + +void +modest_mail_header_view_set_priority (ModestMailHeaderView *headers_view, + TnyHeaderFlags flags) +{ + ModestMailHeaderViewPriv *priv; + + g_return_if_fail (MODEST_IS_MAIL_HEADER_VIEW (headers_view)); + priv = MODEST_MAIL_HEADER_VIEW_GET_PRIVATE (headers_view); + + priv->priority_flags = flags & TNY_HEADER_FLAG_PRIORITY_MASK ; + + if (priv->priority_flags == TNY_HEADER_FLAG_NORMAL_PRIORITY) { + if (priv->priority_icon != NULL) { + gtk_widget_destroy (priv->priority_icon); + priv->priority_icon = NULL; + } + } else if (priv->priority_flags == TNY_HEADER_FLAG_HIGH_PRIORITY) { + priv->priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_high", GTK_ICON_SIZE_MENU); + gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0); + gtk_widget_show (priv->priority_icon); + } else if (priv->priority_flags == TNY_HEADER_FLAG_LOW_PRIORITY) { + priv->priority_icon = gtk_image_new_from_icon_name ("qgn_list_messaging_low", GTK_ICON_SIZE_MENU); + gtk_box_pack_start (GTK_BOX (priv->subject_box), priv->priority_icon, FALSE, FALSE, 0); + gtk_widget_show (priv->priority_icon); + } +}