diff --git a/src/client/ui/main-window.vala b/src/client/ui/main-window.vala index abccf574..48a39172 100644 --- a/src/client/ui/main-window.vala +++ b/src/client/ui/main-window.vala @@ -237,13 +237,10 @@ public class MainWindow : Gtk.Window { } private void on_message_selected(Geary.Email? email) { - if (email == null) { - message_buffer.set_text(""); - - return; - } + message_buffer.clear(); - do_select_message.begin(email, on_select_message_completed); + if (email != null) + do_select_message.begin(email, on_select_message_completed); } private async void do_select_message(Geary.Email email) throws Error { @@ -253,13 +250,10 @@ public class MainWindow : Gtk.Window { return; } - Geary.Email full = yield current_folder.fetch_email_async(email.location.position, - Geary.Email.Field.HEADER | Geary.Email.Field.BODY); + Geary.Email for_buffer = yield current_folder.fetch_email_async(email.location.position, + MessageBuffer.REQUIRED_FIELDS); - Geary.Memory.AbstractBuffer buffer = full.get_message().get_first_mime_part_of_content_type( - "text/plain"); - - message_buffer.set_text(buffer.to_utf8()); + message_buffer.display_email(for_buffer); } private void on_select_message_completed(Object? source, AsyncResult result) { diff --git a/src/client/ui/message-buffer.vala b/src/client/ui/message-buffer.vala index d2757c56..4f204c13 100644 --- a/src/client/ui/message-buffer.vala +++ b/src/client/ui/message-buffer.vala @@ -5,7 +5,54 @@ */ public class MessageBuffer : Gtk.TextBuffer { + public const Geary.Email.Field REQUIRED_FIELDS = + Geary.Email.Field.HEADER + | Geary.Email.Field.BODY + | Geary.Email.Field.ORIGINATORS + | Geary.Email.Field.RECEIVERS + | Geary.Email.Field.SUBJECT; + public MessageBuffer() { } + + public void clear() { + set_text(""); + } + + // Would very much like to use Pango markup to format the text, however, it's not supported + // in Gtk.TextBuffer/Gtk.TextView by default, meaning the implementor has to devise their own + // markup language, parse the buffer, and so on. See: + // https://bugzilla.gnome.org/show_bug.cgi?id=59390 + public void display_email(Geary.Email email) throws Error { + StringBuilder builder = new StringBuilder(); + + // From: + if (email.from != null && email.from.size > 0) + builder.append_printf(_("From: %s\n"), email.from.to_string()); + else if (email.sender != null && email.sender.size > 0) + builder.append_printf(_("Sender: %s\n"), email.sender.to_string()); + + // To: + if (email.to != null && email.to.size > 0) + builder.append_printf(_("To: %s\n"), email.to.to_string()); + + if (email.cc != null && email.cc.size > 0) + builder.append_printf(_("Cc: %s\n"), email.cc.to_string()); + + if (email.bcc != null && email.bcc.size > 0) + builder.append_printf(_("Bcc: %s"), email.bcc.to_string()); + + // Subject: + if (email.subject != null) + builder.append_printf(_("Subject: %s\n"), email.subject.value); + + // Message body + Geary.Memory.AbstractBuffer buffer = email.get_message().get_first_mime_part_of_content_type( + "text/plain"); + builder.append("\n"); + builder.append(buffer.to_utf8()); + + set_text(builder.str); + } } diff --git a/src/engine/api/geary-email.vala b/src/engine/api/geary-email.vala index 1a24e923..779b792d 100644 --- a/src/engine/api/geary-email.vala +++ b/src/engine/api/geary-email.vala @@ -153,6 +153,10 @@ public class Geary.Email : Object { fields |= Field.PROPERTIES; } + /** + * This method requires Geary.Email.Field.HEADER and Geary.Email.Field.BODY be present. + * If not, EngineError.INCOMPLETE_MESSAGE is thrown. + */ public Geary.RFC822.Message get_message() throws EngineError, RFC822.Error { if (message != null) return message; diff --git a/src/engine/sqlite/api/sqlite-folder.vala b/src/engine/sqlite/api/sqlite-folder.vala index 797bbdc1..c7067931 100644 --- a/src/engine/sqlite/api/sqlite-folder.vala +++ b/src/engine/sqlite/api/sqlite-folder.vala @@ -178,7 +178,7 @@ public class Geary.Sqlite.Folder : Geary.AbstractFolder, Geary.LocalFolder { to_string()); } - if (!message_row.fields.is_set(required_fields)) { + if (!message_row.fields.fulfills(required_fields)) { throw new EngineError.INCOMPLETE_MESSAGE( "Message at position %d in folder %s only fulfills %Xh fields", position, to_string(), message_row.fields);