aboutsummaryrefslogtreecommitdiffstats
path: root/mail/e-mail-reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/e-mail-reader.c')
-rw-r--r--mail/e-mail-reader.c324
1 files changed, 314 insertions, 10 deletions
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index bdf9ec84b0..7260dcd47e 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -35,6 +35,7 @@
#include "shell/e-shell.h"
#include "widgets/misc/e-charset-picker.h"
+#include "mail/e-mail-browser.h"
#include "mail/e-mail-reader-utils.h"
#include "mail/e-mail-shell-module.h"
#include "mail/em-composer-utils.h"
@@ -45,9 +46,17 @@
#include "mail/mail-autofilter.h"
#include "mail/mail-ops.h"
+enum {
+ CHANGED,
+ FOLDER_LOADED,
+ LAST_SIGNAL
+};
+
/* Remembers the previously selected folder when transferring messages. */
static gchar *default_xfer_messages_uri;
+static guint signals[LAST_SIGNAL];
+
static void
action_mail_add_sender_cb (GtkAction *action,
EMailReader *reader)
@@ -862,7 +871,22 @@ static void
action_mail_select_all_cb (GtkAction *action,
EMailReader *reader)
{
- /* FIXME */
+ EMFormatHTMLDisplay *html_display;
+ GtkActionGroup *action_group;
+ GtkHTML *html;
+ const gchar *action_name;
+ gboolean selection_active;
+
+ html_display = e_mail_reader_get_html_display (reader);
+ html = ((EMFormatHTML *) html_display)->html;
+
+ gtk_html_select_all (html);
+
+ action_name = "mail-clipboard-copy";
+ action_group = e_mail_reader_get_action_group (reader);
+ action = gtk_action_group_get_action (action_group, action_name);
+ selection_active = gtk_html_command (html, "is-selection-active");
+ gtk_action_set_sensitive (action, selection_active);
}
static void
@@ -886,7 +910,32 @@ static void
action_mail_show_source_cb (GtkAction *action,
EMailReader *reader)
{
- /* FIXME */
+ EMFormatHTMLDisplay *html_display;
+ EShellModule *shell_module;
+ MessageList *message_list;
+ CamelFolder *folder;
+ GtkWidget *browser;
+ GPtrArray *uids;
+ const gchar *folder_uri;
+
+ message_list = e_mail_reader_get_message_list (reader);
+ shell_module = e_mail_reader_get_shell_module (reader);
+
+ folder = message_list->folder;
+ folder_uri = message_list->folder_uri;
+ uids = message_list_get_selected (message_list);
+ g_return_if_fail (uids->len > 0);
+
+ /* FIXME Set session. */
+ browser = e_mail_browser_new (shell_module);
+ reader = E_MAIL_READER (browser);
+ html_display = e_mail_reader_get_html_display (reader);
+ em_format_set_mode ((EMFormat *) html_display, EM_FORMAT_SOURCE);
+ e_mail_reader_set_folder (reader, folder, folder_uri);
+ e_mail_reader_set_message (reader, uids->pdata[0], FALSE);
+ gtk_widget_show (browser);
+
+ message_list_free_uids (message_list, uids);
}
static void
@@ -934,6 +983,46 @@ action_mail_undelete_cb (GtkAction *action,
}
static void
+action_mail_uri_call_to_cb (GtkAction *action,
+ EMailReader *reader)
+{
+ /* FIXME */
+ g_print ("Action: %s\n", gtk_action_get_name (GTK_ACTION (action)));
+}
+
+static void
+action_mail_uri_copy_cb (GtkAction *action,
+ EMailReader *reader)
+{
+ /* FIXME */
+ g_print ("Action: %s\n", gtk_action_get_name (GTK_ACTION (action)));
+}
+
+static void
+action_mail_uri_copy_address_cb (GtkAction *action,
+ EMailReader *reader)
+{
+ /* FIXME */
+ g_print ("Action: %s\n", gtk_action_get_name (GTK_ACTION (action)));
+}
+
+static void
+action_mail_uri_to_search_folder_recipient_cb (GtkAction *action,
+ EMailReader *reader)
+{
+ /* FIXME */
+ g_print ("Action: %s\n", gtk_action_get_name (GTK_ACTION (action)));
+}
+
+static void
+action_mail_uri_to_search_folder_sender_cb (GtkAction *action,
+ EMailReader *reader)
+{
+ /* FIXME */
+ g_print ("Action: %s\n", gtk_action_get_name (GTK_ACTION (action)));
+}
+
+static void
action_mail_zoom_100_cb (GtkAction *action,
EMailReader *reader)
{
@@ -991,7 +1080,7 @@ static GtkActionEntry mail_reader_entries[] = {
{ "mail-copy",
"mail-copy",
- N_("_Copy to Folder"),
+ N_("_Copy to Folder..."),
"<Shift><Control>y",
N_("Copy selected messages to another folder"),
G_CALLBACK (action_mail_copy_cb) },
@@ -1173,7 +1262,7 @@ static GtkActionEntry mail_reader_entries[] = {
{ "mail-move",
"mail-move",
- N_("_Move to Folder"),
+ N_("_Move to Folder..."),
"<Shift><Control>v",
N_("Move selected messages to another folder"),
G_CALLBACK (action_mail_move_cb) },
@@ -1339,6 +1428,41 @@ static GtkActionEntry mail_reader_entries[] = {
N_("Undelete the selected messages"),
G_CALLBACK (action_mail_undelete_cb) },
+ { "mail-uri-call-to",
+ NULL,
+ N_("C_all To..."),
+ NULL,
+ NULL, /* XXX Add a tooltip! */
+ G_CALLBACK (action_mail_uri_call_to_cb) },
+
+ { "mail-uri-copy",
+ NULL,
+ N_("_Copy Link Location"),
+ NULL,
+ NULL, /* XXX Add a tooltip! */
+ G_CALLBACK (action_mail_uri_copy_cb) },
+
+ { "mail-uri-copy-address",
+ GTK_STOCK_COPY,
+ N_("Copy _Email Address"),
+ NULL,
+ NULL, /* XXX Add a tooltip! */
+ G_CALLBACK (action_mail_uri_copy_address_cb) },
+
+ { "mail-uri-to-search-folder-recipient",
+ NULL,
+ N_("_To This Address"),
+ NULL,
+ NULL, /* XXX Add a tooltip! */
+ G_CALLBACK (action_mail_uri_to_search_folder_recipient_cb) },
+
+ { "mail-uri-to-search-folder-sender",
+ NULL,
+ N_("_From This Address"),
+ NULL,
+ NULL, /* XXX Add a tooltip! */
+ G_CALLBACK (action_mail_uri_to_search_folder_sender_cb) },
+
{ "mail-zoom-100",
GTK_STOCK_ZOOM_100,
N_("_Normal Size"),
@@ -1360,6 +1484,57 @@ static GtkActionEntry mail_reader_entries[] = {
N_("Decrease the text size"),
G_CALLBACK (action_mail_zoom_out_cb) },
+ /*** Popup Menu Variations ***/
+
+ { "mail-popup-flag-for-followup",
+ "stock_mail-flag-for-followup",
+ N_("Mark for Follo_w Up..."),
+ NULL,
+ N_("Flag the selected messages for follow-up"),
+ G_CALLBACK (action_mail_flag_for_followup_cb) },
+
+ { "mail-popup-mark-important",
+ "mail-mark-important",
+ N_("Mark as _Important"),
+ NULL,
+ N_("Mark the selected messages as important"),
+ G_CALLBACK (action_mail_mark_important_cb) },
+
+ { "mail-popup-mark-junk",
+ "mail-mark-junk",
+ N_("Mark as _Junk"),
+ NULL,
+ N_("Mark the selected messages as junk"),
+ G_CALLBACK (action_mail_mark_junk_cb) },
+
+ { "mail-popup-mark-notjunk",
+ "mail-mark-notjunk",
+ N_("Mark as _Not Junk"),
+ NULL,
+ N_("Mark the selected messages as not being junk"),
+ G_CALLBACK (action_mail_mark_notjunk_cb) },
+
+ { "mail-popup-mark-read",
+ "mail-mark-read",
+ N_("Mark as _Read"),
+ NULL,
+ N_("Mark the selected messages as having been read"),
+ G_CALLBACK (action_mail_mark_read_cb) },
+
+ { "mail-popup-mark-unimportant",
+ NULL,
+ N_("Mark as Uni_mportant"),
+ NULL,
+ N_("Mark the selected message as unimportant"),
+ G_CALLBACK (action_mail_mark_unimportant_cb) },
+
+ { "mail-popup-mark-unread",
+ "mail-mark-unread",
+ N_("Mark as _Unread"),
+ NULL,
+ N_("Mark the selected messages as not having been read"),
+ G_CALLBACK (action_mail_mark_unread_cb) },
+
/*** Menus ***/
{ "mail-create-rule-menu",
@@ -1390,6 +1565,13 @@ static GtkActionEntry mail_reader_entries[] = {
NULL,
NULL },
+ { "mail-label-menu",
+ NULL,
+ N_("_Label"),
+ NULL,
+ NULL,
+ NULL },
+
{ "mail-mark-as-menu",
NULL,
N_("Mar_k As"),
@@ -1404,6 +1586,13 @@ static GtkActionEntry mail_reader_entries[] = {
NULL,
NULL },
+ { "mail-uri-to-search-folder-menu",
+ NULL,
+ N_("Create _Search Folder"),
+ NULL,
+ NULL,
+ NULL },
+
{ "mail-zoom-menu",
NULL,
N_("_Zoom"),
@@ -1432,6 +1621,59 @@ static GtkToggleActionEntry mail_reader_toggle_entries[] = {
};
static void
+mail_reader_link_clicked_cb (EMailReader *reader,
+ const gchar *uri,
+ EMFormatHTMLDisplay *html_display)
+{
+ GtkHTML *html;
+ GtkWindow *window;
+ MessageList *message_list;
+ const gchar *folder_uri;
+
+ html = ((EMFormatHTML *) html_display)->html;
+ message_list = e_mail_reader_get_message_list (reader);
+ window = e_mail_reader_get_window (reader);
+ folder_uri = message_list->folder_uri;
+
+ if (g_str_has_prefix (uri, "##"))
+ return;
+
+ if (g_ascii_strncasecmp (uri, "mailto:", 7) == 0)
+ em_utils_compose_new_message_with_mailto (uri, folder_uri);
+
+ else if (*uri == '#')
+ gtk_html_jump_to_anchor (html, uri + 1);
+
+ else if (g_ascii_strncasecmp (uri, "thismessage:", 12) == 0)
+ /* ignore */ ;
+
+ else if (g_ascii_strncasecmp (uri, "cid:", 4) == 0)
+ /* ignore */ ;
+
+ else
+ e_show_uri (window, uri);
+}
+
+static gboolean
+mail_reader_html_button_release_event_cb (EMailReader *reader,
+ GdkEventButton *button,
+ GtkHTML *html)
+{
+ GtkActionGroup *action_group;
+ GtkAction *action;
+ const gchar *action_name;
+ gboolean selection_active;
+
+ action_name = "mail-clipboard-copy";
+ action_group = e_mail_reader_get_action_group (reader);
+ action = gtk_action_group_get_action (action_group, action_name);
+ selection_active = gtk_html_command (html, "is-selection-active");
+ gtk_action_set_sensitive (action, selection_active);
+
+ return FALSE;
+}
+
+static void
mail_reader_double_click_cb (EMailReader *reader,
gint row,
ETreePath path,
@@ -1529,10 +1771,12 @@ mail_reader_message_read_cb (EMailReader *reader)
message_list = e_mail_reader_get_message_list (reader);
uid = g_object_get_data (G_OBJECT (reader), "mark-read-uid");
- g_return_if_fail (uid != NULL);
+ g_return_val_if_fail (uid != NULL, FALSE);
if (g_strcmp0 (message_list->cursor_uid, uid) == 0)
e_mail_reader_mark_as_read (reader, uid);
+
+ return FALSE;
}
static void
@@ -1675,6 +1919,14 @@ mail_reader_message_selected_cb (EMailReader *reader,
data = GUINT_TO_POINTER (source_id);
g_object_set_data (G_OBJECT (reader), key, data);
+
+ e_mail_reader_changed (reader);
+}
+
+static void
+mail_reader_emit_folder_loaded (EMailReader *reader)
+{
+ g_signal_emit (reader, signals[FOLDER_LOADED], 0);
}
static void
@@ -1698,6 +1950,8 @@ mail_reader_set_folder (EMailReader *reader,
em_format_format ((EMFormat *) html_display, NULL, NULL, NULL);
message_list_set_folder (message_list, folder, folder_uri, outgoing);
+
+ mail_reader_emit_folder_loaded (reader);
}
static void
@@ -1745,6 +1999,22 @@ mail_reader_class_init (EMailReaderIface *iface)
{
iface->set_folder = mail_reader_set_folder;
iface->set_message = mail_reader_set_message;
+
+ signals[CHANGED] = g_signal_new (
+ "changed",
+ G_OBJECT_CLASS_TYPE (iface),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ signals[FOLDER_LOADED] = g_signal_new (
+ "folder-loaded",
+ G_OBJECT_CLASS_TYPE (iface),
+ G_SIGNAL_RUN_FIRST,
+ 0, NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
}
GType
@@ -1778,8 +2048,9 @@ e_mail_reader_get_type (void)
void
e_mail_reader_init (EMailReader *reader)
{
- MessageList *message_list;
+ EMFormatHTMLDisplay *html_display;
GtkActionGroup *action_group;
+ MessageList *message_list;
GConfBridge *bridge;
GtkAction *action;
const gchar *action_name;
@@ -1788,6 +2059,7 @@ e_mail_reader_init (EMailReader *reader)
g_return_if_fail (E_IS_MAIL_READER (reader));
action_group = e_mail_reader_get_action_group (reader);
+ html_display = e_mail_reader_get_html_display (reader);
message_list = e_mail_reader_get_message_list (reader);
gtk_action_group_add_actions (
@@ -1815,31 +2087,63 @@ e_mail_reader_init (EMailReader *reader)
/* Fine tuning. */
- action = gtk_action_group_get_action (action_group, "mail-delete");
+ action_name = "mail-clipboard-copy";
+ action = gtk_action_group_get_action (action_group, action_name);
+ gtk_action_set_sensitive (action, FALSE);
+
+ action_name = "mail-delete";
+ action = gtk_action_group_get_action (action_group, action_name);
g_object_set (action, "short-label", _("Delete"), NULL);
- action = gtk_action_group_get_action (action_group, "mail-next");
+ action_name = "mail-next";
+ action = gtk_action_group_get_action (action_group, action_name);
g_object_set (action, "short-label", _("Next"), NULL);
- action = gtk_action_group_get_action (action_group, "mail-previous");
+ action_name = "mail-previous";
+ action = gtk_action_group_get_action (action_group, action_name);
g_object_set (action, "short-label", _("Previous"), NULL);
- action = gtk_action_group_get_action (action_group, "mail-reply-sender");
+ action_name = "mail-reply-sender";
+ action = gtk_action_group_get_action (action_group, action_name);
g_object_set (action, "short-label", _("Reply"), NULL);
/* Connect signals. */
g_signal_connect_swapped (
+ html_display, "link-clicked",
+ G_CALLBACK (mail_reader_link_clicked_cb), reader);
+
+ g_signal_connect_swapped (
+ ((EMFormatHTML *) html_display)->html, "button-release-event",
+ G_CALLBACK (mail_reader_html_button_release_event_cb), reader);
+
+ g_signal_connect_swapped (
message_list, "message-selected",
G_CALLBACK (mail_reader_message_selected_cb), reader);
g_signal_connect_swapped (
+ message_list, "message-list-built",
+ G_CALLBACK (mail_reader_emit_folder_loaded), reader);
+
+ g_signal_connect_swapped (
message_list->tree, "double-click",
G_CALLBACK (mail_reader_double_click_cb), reader);
g_signal_connect_swapped (
message_list->tree, "key-press",
G_CALLBACK (mail_reader_key_press_cb), reader);
+
+ g_signal_connect_swapped (
+ message_list->tree, "selection-change",
+ G_CALLBACK (e_mail_reader_changed), reader);
+}
+
+void
+e_mail_reader_changed (EMailReader *reader)
+{
+ g_return_if_fail (E_IS_MAIL_READER (reader));
+
+ g_signal_emit (reader, signals[CHANGED], 0);
}
GtkActionGroup *