Right-align mail header names.

We used to do this before WebKit and it looked better.

Also fix up the header section for right-to-left locales:
put the collapse button on the right, and images on the left.
This commit is contained in:
Matthew Barnes
2013-05-08 21:09:52 -04:00
parent 26ca1f2c56
commit 448aa307c3
4 changed files with 166 additions and 74 deletions

View File

@ -72,6 +72,50 @@ object { /* GtkWidgets */
font-weight: bold;
}
/**** HEADERS ****/
table.header {
border-spacing: 0px;
border-top-width: 0px;
border-right-width: 0px;
border-bottom-width: 0px;
border-left-width: 0px;
width: 100%;
}
tr.header {
vertical-align: top;
width: 100%;
}
th.header {
white-space: nowrap;
}
td.header {
width: inherit;
}
.ltr {
text-align: left;
}
th.ltr {
padding-right: 6px;
text-align: right;
width: auto;
}
.rtl {
text-align: right;
}
th.rtl {
padding-left: 6px;
text-align: left;
width: auto;
}
/***** PRINTING *******/
.printing-header {

View File

@ -54,6 +54,7 @@ format_short_headers (EMailFormatter *formatter,
guint32 flags,
GCancellable *cancellable)
{
GtkTextDirection direction;
const gchar *charset;
CamelContentType *ct;
gchar *hdr_charset;
@ -62,11 +63,12 @@ format_short_headers (EMailFormatter *formatter,
struct _camel_header_address *addrs = NULL;
struct _camel_header_raw *header;
GString *from;
gboolean is_rtl;
if (g_cancellable_is_cancelled (cancellable))
return;
direction = gtk_widget_get_default_direction ();
ct = camel_mime_part_get_content_type ((CamelMimePart *) part);
charset = camel_content_type_param (ct, "charset");
charset = camel_iconv_charset_name (charset);
@ -79,9 +81,9 @@ format_short_headers (EMailFormatter *formatter,
g_string_append_printf (
buffer,
"<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" "
"<table class=\"header\" "
"id=\"__evo-short-headers\" style=\"display: %s\">",
flags & E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSED ? "block" : "none");
flags & E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSED ? "table" : "none");
header = ((CamelMimePart *) part)->headers;
while (header) {
@ -96,8 +98,10 @@ format_short_headers (EMailFormatter *formatter,
formatter, tmp, addrs, header->name, FALSE,
!(flags & E_MAIL_FORMATTER_HEADER_FLAG_NOELIPSIZE));
if (tmp->len)
g_string_printf (from, _("From: %s"), tmp->str);
if (tmp->len > 0)
g_string_printf (
from, "%s: %s",
_("From"), tmp->str);
g_string_free (tmp, TRUE);
} else if (!g_ascii_strcasecmp (header->name, "Subject")) {
@ -114,32 +118,20 @@ format_short_headers (EMailFormatter *formatter,
g_free (hdr_charset);
is_rtl = gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL;
if (is_rtl) {
g_string_append (
buffer, "<tr><td width=\"100%%\" align=\"right\">");
if (from->len > 0)
g_string_append_printf (buffer, "(%s) ", from->str);
g_string_append (buffer, "<strong>");
if (subject != NULL && *subject != '\0')
g_string_append (buffer, subject);
else
g_string_append (buffer, _("(no subject)"));
g_string_append (buffer, "</strong>");
g_string_append (buffer, "</td></tr>");
} else {
g_string_append (
buffer, "<tr><td width=\"100%%\" align=\"left\">");
g_string_append (buffer, "<strong>");
if (subject != NULL && *subject != '\0')
g_string_append (buffer, subject);
else
g_string_append (buffer, _("(no subject)"));
g_string_append (buffer, "</strong>");
if (from->len > 0)
g_string_append_printf (buffer, " (%s)", from->str);
g_string_append (buffer, "</td></tr>");
}
g_string_append (buffer, "<tr class=\"header\">");
if (direction == GTK_TEXT_DIR_RTL)
g_string_append (buffer, "<td class=\"header rtl\">");
else
g_string_append (buffer, "<td class=\"header ltr\">");
g_string_append (buffer, "<strong>");
if (subject != NULL && *subject != '\0')
g_string_append (buffer, subject);
else
g_string_append (buffer, _("(no subject)"));
g_string_append (buffer, "</strong>");
if (from->len > 0)
g_string_append_printf (buffer, " (%s)", from->str);
g_string_append (buffer, "</td></tr>");
g_string_append (buffer, "</table>");
@ -257,10 +249,23 @@ format_full_headers (EMailFormatter *formatter,
gboolean mail_from_delegate = FALSE;
gchar *hdr_charset;
gchar *evolution_imagesdir;
const gchar *direction;
if (g_cancellable_is_cancelled (cancellable))
return;
switch (gtk_widget_get_default_direction ()) {
case GTK_TEXT_DIR_RTL:
direction = "rtl";
break;
case GTK_TEXT_DIR_LTR:
direction = "ltr";
break;
default:
direction = "inherit";
break;
}
ct = camel_mime_part_get_content_type ((CamelMimePart *) part);
charset = camel_content_type_param (ct, "charset");
charset = camel_iconv_charset_name (charset);
@ -272,9 +277,12 @@ format_full_headers (EMailFormatter *formatter,
g_string_append_printf (
buffer,
"<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" "
"id=\"__evo-full-headers\" style=\"display: %s\" width=\"100%%\">",
flags & E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSED ? "none" : "block");
"<table cellspacing=\"0\" cellpadding=\"0\" "
"border=\"0\" width=\"100%%\" "
"id=\"__evo-full-headers\" "
"style=\"display: %s; direction: %s;\">",
flags & E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSED ? "none" : "table",
direction);
header = ((CamelMimePart *) part)->headers;
while (header != NULL) {
@ -356,7 +364,7 @@ format_full_headers (EMailFormatter *formatter,
g_string_append (
buffer,
"<tr valign=\"top\"><td width=\"100%\">"
"<table border=0 cellpadding=\"0\">\n");
"<table class=\"header\">\n");
g_free (evolution_imagesdir);
@ -456,8 +464,9 @@ format_full_headers (EMailFormatter *formatter,
gchar *name;
name = g_uri_escape_string (photo_name, NULL, FALSE);
g_string_append (buffer, "<td align=\"right\" valign=\"top\">");
g_string_append (
buffer,
"<td align=\"right\" valign=\"top\">");
g_string_append_printf (
buffer,
"<img src=\"mail://contact-photo?mailaddr=\" "
@ -477,7 +486,9 @@ format_full_headers (EMailFormatter *formatter,
(const gchar *) face_header_value,
face_header_len, "image/png");
g_string_append (buffer, "<td align=\"right\" valign=\"top\">");
g_string_append (
buffer,
"<td align=\"right\" valign=\"top\">");
write_contact_picture (part, 48, buffer);
g_string_append (buffer, "</td>");
@ -490,16 +501,19 @@ format_full_headers (EMailFormatter *formatter,
CamelMimePart *iconpart = NULL;
icon_info = gtk_icon_theme_lookup_icon (
gtk_icon_theme_get_default (),
"evolution", 16, GTK_ICON_LOOKUP_NO_SVG);
gtk_icon_theme_get_default (),
"evolution", 16, GTK_ICON_LOOKUP_NO_SVG);
if (icon_info != NULL) {
iconpart = load_picture_from_file (
"image/png", gtk_icon_info_get_filename (icon_info),
"image/png",
gtk_icon_info_get_filename (icon_info),
cancellable);
gtk_icon_info_free (icon_info);
}
if (iconpart) {
g_string_append (buffer, "<td align=\"right\" valign=\"top\">");
if (iconpart != NULL) {
g_string_append (
buffer,
"<td align=\"right\" valign=\"top\">");
write_contact_picture (iconpart, 16, buffer);
g_string_append (buffer, "</td>");
@ -522,6 +536,9 @@ emfe_headers_format (EMailFormatterExtension *extension,
const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
const GdkRGBA *body_rgba = &white;
const GdkRGBA *header_rgba;
const gchar *direction;
gboolean is_collapsable;
gboolean is_collapsed;
if (g_cancellable_is_cancelled (cancellable))
return FALSE;
@ -529,6 +546,24 @@ emfe_headers_format (EMailFormatterExtension *extension,
if (!part->part)
return FALSE;
switch (gtk_widget_get_default_direction ()) {
case GTK_TEXT_DIR_RTL:
direction = "rtl";
break;
case GTK_TEXT_DIR_LTR:
direction = "ltr";
break;
default:
direction = "inherit";
break;
}
is_collapsable =
(context->flags & E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSABLE);
is_collapsed =
(context->flags & E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSED);
buffer = g_string_new ("");
if (context->mode != E_MAIL_FORMATTER_MODE_PRINTING)
@ -541,28 +576,32 @@ emfe_headers_format (EMailFormatterExtension *extension,
g_string_append_printf (
buffer,
"<div class=\"headers\" style=\"background: #%06x;\" id=\"%s\">"
"<table border=\"0\" width=\"100%%\" style=\"color: #%06x;\">\n"
"<tr><td valign=\"top\" width=\"16\">\n",
"<table border=\"0\" width=\"100%%\" "
"style=\"color: #%06x; direction: %s\">"
"<tr>",
e_rgba_to_value (body_rgba),
part->id,
e_rgba_to_value (header_rgba));
e_rgba_to_value (header_rgba),
direction);
if (context->flags & E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSABLE) {
if (is_collapsable)
g_string_append_printf (
buffer,
"<td valign=\"top\" width=\"16\">"
"<img src=\"evo-file://%s/%s\" class=\"navigable\" "
"id=\"__evo-collapse-headers-img\" />"
"</td><td>",
" id=\"__evo-collapse-headers-img\" />"
"</td>",
EVOLUTION_IMAGESDIR,
(context->flags & E_MAIL_FORMATTER_HEADER_FLAG_COLLAPSED) ?
"plus.png" : "minus.png");
is_collapsed ? "plus.png" : "minus.png");
g_string_append (buffer, "<td>");
if (is_collapsable)
format_short_headers (
formatter, buffer,
CAMEL_MEDIUM (part->part),
context->flags,
cancellable);
}
format_full_headers (
formatter, buffer,
@ -571,7 +610,9 @@ emfe_headers_format (EMailFormatterExtension *extension,
context->flags,
cancellable);
g_string_append (buffer, "</td></tr></table></div>");
g_string_append (buffer, "</td>");
g_string_append (buffer, "</tr></table></div>");
camel_stream_write_string (stream, buffer->str, cancellable, NULL);

View File

@ -45,9 +45,9 @@ e_mail_formatter_format_text_header (EMailFormatter *formatter,
const gchar *value,
guint32 flags)
{
GtkTextDirection direction;
const gchar *fmt, *html;
gchar *mhtml = NULL;
gboolean is_rtl;
g_return_if_fail (E_IS_MAIL_FORMATTER (formatter));
g_return_if_fail (buffer != NULL);
@ -70,31 +70,38 @@ e_mail_formatter_format_text_header (EMailFormatter *formatter,
html = value;
}
is_rtl = gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL;
direction = gtk_widget_get_default_direction ();
if (flags & E_MAIL_FORMATTER_HEADER_FLAG_NOCOLUMNS) {
if (flags & E_MAIL_FORMATTER_HEADER_FLAG_BOLD) {
fmt = "<tr class=\"header-item\" style=\"display: %s\"><td><b>%s:</b> %s</td></tr>";
fmt = "<tr style=\"display: %s\">"
"<td><b>%s:</b> %s</td></tr>";
} else {
fmt = "<tr class=\"header-item\" style=\"display: %s\"><td>%s: %s</td></tr>";
fmt = "<tr style=\"display: %s\">"
"<td>%s: %s</td></tr>";
}
} else if (flags & E_MAIL_FORMATTER_HEADER_FLAG_NODEC) {
if (is_rtl)
fmt = "<tr class=\"header-item rtl\" style=\"display: %s\"><td align=\"right\" valign=\"top\" width=\"100%%\">%2$s</td><th valign=top align=\"left\" nowrap>%1$s<b>&nbsp;</b></th></tr>";
if (direction == GTK_TEXT_DIR_RTL)
fmt = "<tr class=\"header\" style=\"display: %s\">"
"<th class=\"header rtl\">%s</th>"
"<td class=\"header rtl\">%s</td>"
"</tr>";
else
fmt = "<tr class=\"header-item\" style=\"display: %s\"><th align=\"right\" valign=\"top\" nowrap>%s<b>&nbsp;</b></th><td valign=top>%s</td></tr>";
fmt = "<tr class=\"header\" style=\"display: %s\">"
"<th class=\"header ltr\">%s</th>"
"<td class=\"header ltr\">%s</td>"
"</tr>";
} else {
if (flags & E_MAIL_FORMATTER_HEADER_FLAG_BOLD) {
if (is_rtl)
fmt = "<tr class=\"header-item rtl\" style=\"display: %s\"><td align=\"right\" valign=\"top\" width=\"100%%\">%2$s</td><th align=\"left\" nowrap>%1$s:<b>&nbsp;</b></th></tr>";
else
fmt = "<tr class=\"header-item\" style=\"display: %s\"><th align=\"right\" valign=\"top\" nowrap>%s:<b>&nbsp;</b></th><td>%s</td></tr>";
} else {
if (is_rtl)
fmt = "<tr class=\"header-item rtl\" style=\"display: %s\"><td align=\"right\" valign=\"top\" width=\"100%\">%2$s</td><td align=\"left\" nowrap>%1$s:<b>&nbsp;</b></td></tr>";
else
fmt = "<tr class=\"header-item\" style=\"display: %s\"><td align=\"right\" valign=\"top\" nowrap>%s:<b>&nbsp;</b></td><td>%s</td></tr>";
}
if (direction == GTK_TEXT_DIR_RTL)
fmt = "<tr class=\"header\" style=\"display: %s\">"
"<th class=\"header rtl\">%s:</th>"
"<td class=\"header rtl\">%s</td>"
"</tr>";
else
fmt = "<tr class=\"header\" style=\"display: %s\">"
"<th class=\"header ltr\">%s:</th>"
"<td class=\"header ltr\">%s</td>"
"</tr>";
}
g_string_append_printf (

View File

@ -1007,15 +1007,15 @@ toggle_headers_visibility (WebKitDOMElement *button,
css_full = webkit_dom_element_get_style (full_headers);
css_value = webkit_dom_css_style_declaration_get_property_value (
css_full, "display");
expanded = (g_strcmp0 (css_value, "block") == 0);
expanded = (g_strcmp0 (css_value, "table") == 0);
g_free (css_value);
webkit_dom_css_style_declaration_set_property (
css_full, "display",
expanded ? "none" : "block", "", NULL);
expanded ? "none" : "table", "", NULL);
webkit_dom_css_style_declaration_set_property (
css_short, "display",
expanded ? "block" : "none", "", NULL);
expanded ? "table" : "none", "", NULL);
if (expanded)
path = "evo-file://" EVOLUTION_IMAGESDIR "/plus.png";