diff options
Diffstat (limited to 'mail')
-rw-r--r-- | mail/e-mail-reader.c | 83 | ||||
-rw-r--r-- | mail/message-list.c | 106 | ||||
-rw-r--r-- | mail/message-list.h | 111 |
3 files changed, 150 insertions, 150 deletions
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c index 6dae4ded13..9b7cc4d887 100644 --- a/mail/e-mail-reader.c +++ b/mail/e-mail-reader.c @@ -166,19 +166,6 @@ action_mail_check_for_junk_cb (GtkAction *action, } static void -action_mail_clipboard_copy_cb (GtkAction *action, - EMailReader *reader) -{ - EMFormatHTMLDisplay *html_display; - EWebView *web_view; - - html_display = e_mail_reader_get_html_display (reader); - web_view = E_WEB_VIEW (EM_FORMAT_HTML (html_display)->html); - - e_web_view_clipboard_copy (web_view); -} - -static void action_mail_copy_cb (GtkAction *action, EMailReader *reader) { @@ -875,26 +862,6 @@ action_mail_search_folder_from_subject_cb (GtkAction *action, } static void -action_mail_select_all_cb (GtkAction *action, - EMailReader *reader) -{ - EMFormatHTMLDisplay *html_display; - EWebView *web_view; - const gchar *action_name; - gboolean selection_active; - - html_display = e_mail_reader_get_html_display (reader); - web_view = E_WEB_VIEW (EM_FORMAT_HTML (html_display)->html); - - e_web_view_select_all (web_view); - - action_name = "mail-clipboard-copy"; - action = e_mail_reader_get_action (reader, action_name); - selection_active = e_web_view_is_selection_active (web_view); - gtk_action_set_sensitive (action, selection_active); -} - -static void action_mail_show_all_headers_cb (GtkToggleAction *action, EMailReader *reader) { @@ -1112,13 +1079,6 @@ static GtkActionEntry mail_reader_entries[] = { N_("Filter the selected messages for junk status"), G_CALLBACK (action_mail_check_for_junk_cb) }, - { "mail-clipboard-copy", - GTK_STOCK_COPY, - NULL, - NULL, - N_("Copy selected messages to the clipboard"), - G_CALLBACK (action_mail_clipboard_copy_cb) }, - { "mail-copy", "mail-copy", N_("_Copy to Folder..."), @@ -1441,13 +1401,6 @@ static GtkActionEntry mail_reader_entries[] = { N_("Create a search folder for this subject"), G_CALLBACK (action_mail_search_folder_from_subject_cb) }, - { "mail-select-all", - NULL, - N_("Select _All Text"), - "<Shift><Control>x", - N_("Select all the text in a message"), - G_CALLBACK (action_mail_select_all_cb) }, - { "mail-show-source", NULL, N_("_Message Source"), @@ -1544,10 +1497,6 @@ static GtkActionEntry mail_reader_entries[] = { static EPopupActionEntry mail_reader_popup_entries[] = { - { "mail-popup-clipboard-copy", - NULL, - "mail-clipboard-copy" }, - { "mail-popup-copy", NULL, "mail-copy" }, @@ -1644,25 +1593,6 @@ static GtkToggleActionEntry mail_reader_toggle_entries[] = { FALSE } }; -static gboolean -mail_reader_button_release_event_cb (EMailReader *reader, - GdkEventButton *button, - GtkHTML *html) -{ - GtkAction *action; - EWebView *web_view; - const gchar *action_name; - gboolean selection_active; - - web_view = E_WEB_VIEW (html); - action_name = "mail-clipboard-copy"; - action = e_mail_reader_get_action (reader, action_name); - selection_active = e_web_view_is_selection_active (web_view); - gtk_action_set_sensitive (action, selection_active); - - return FALSE; -} - static void mail_reader_double_click_cb (EMailReader *reader, gint row, @@ -2377,11 +2307,6 @@ mail_reader_update_actions (EMailReader *reader) action = e_mail_reader_get_action (reader, action_name); gtk_action_set_sensitive (action, sensitive); - action_name = "mail-select-all"; - sensitive = single_message_selected; - action = e_mail_reader_get_action (reader, action_name); - gtk_action_set_sensitive (action, sensitive); - action_name = "mail-show-source"; sensitive = single_message_selected; action = e_mail_reader_get_action (reader, action_name); @@ -2585,10 +2510,6 @@ e_mail_reader_init (EMailReader *reader) /* Fine tuning. */ - action_name = "mail-clipboard-copy"; - action = e_mail_reader_get_action (reader, action_name); - gtk_action_set_sensitive (action, FALSE); - action_name = "mail-delete"; action = e_mail_reader_get_action (reader, action_name); g_object_set (action, "short-label", _("Delete"), NULL); @@ -2661,10 +2582,6 @@ e_mail_reader_init (EMailReader *reader) /* Connect signals. */ g_signal_connect_swapped ( - web_view, "button-release-event", - G_CALLBACK (mail_reader_button_release_event_cb), reader); - - g_signal_connect_swapped ( web_view, "key-press-event", G_CALLBACK (mail_reader_key_press_event_cb), reader); diff --git a/mail/message-list.c b/mail/message-list.c index dcf2e4fed1..49a839a7ba 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -52,6 +52,7 @@ #include "e-util/e-util.h" #include "misc/e-gui-utils.h" +#include "misc/e-selectable.h" #include "shell/e-shell.h" #include "shell/e-shell-settings.h" @@ -126,6 +127,8 @@ enum { PROP_SHELL_BACKEND }; +static gpointer parent_class; + static struct { const gchar *target; GdkAtom atom; @@ -197,8 +200,6 @@ struct _EMailAddress { typedef struct _EMailAddress EMailAddress; #endif /* SMART_ADDRESS_COMPARE */ -G_DEFINE_TYPE (MessageList, message_list, E_TREE_TYPE) - static void on_cursor_activated_cmd (ETree *tree, gint row, ETreePath path, gpointer user_data); static void on_selection_changed_cmd(ETree *tree, MessageList *ml); static gint on_click (ETree *tree, gint row, ETreePath path, gint col, GdkEvent *event, MessageList *list); @@ -718,6 +719,18 @@ message_list_select_next_thread (MessageList *ml) } } +static gboolean +message_list_select_all_timeout_cb (MessageList *message_list) +{ + ESelectionModel *etsm; + + etsm = e_tree_get_selection_model (E_TREE (message_list)); + + e_selection_model_select_all (etsm); + + return FALSE; +} + /** * message_list_select_all: * @message_list: Message List widget @@ -727,11 +740,21 @@ message_list_select_next_thread (MessageList *ml) void message_list_select_all (MessageList *message_list) { - ESelectionModel *etsm; - - etsm = e_tree_get_selection_model (E_TREE (message_list)); + g_return_if_fail (IS_MESSAGE_LIST (message_list)); - e_selection_model_select_all (etsm); + if (message_list->threaded) { + /* XXX The timeout below is added so that the execution + * thread to expand all conversation threads would + * have completed. The timeout 505 is just to ensure + * that the value is a small delta more than the + * timeout value in mail_regen_list(). */ + g_timeout_add ( + 505, (GSourceFunc) + message_list_select_all_timeout_cb, + message_list); + } else + /* If there is no threading, just select all immediately. */ + message_list_select_all_timeout_cb (message_list); } typedef struct thread_select_info { @@ -2295,9 +2318,6 @@ message_list_init (MessageList *message_list) message_list->priv = MESSAGE_LIST_GET_PRIVATE (message_list); -/* adjustment = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, G_MAXDOUBLE, 0.0, 0.0, 0.0); - gtk_scrolled_window_set_vadjustment ((GtkScrolledWindow *) message_list, adjustment);*/ - message_list->normalised_hash = g_hash_table_new_full ( g_str_hash, g_str_equal, (GDestroyNotify) NULL, @@ -2390,7 +2410,7 @@ message_list_destroy(GtkObject *object) } /* Chain up to parent's destroy() method. */ - GTK_OBJECT_CLASS (message_list_parent_class)->destroy(object); + GTK_OBJECT_CLASS (parent_class)->destroy(object); } static void @@ -2440,7 +2460,7 @@ message_list_dispose (GObject *object) } /* Chain up to parent's dispose() method. */ - G_OBJECT_CLASS (message_list_parent_class)->dispose (object); + G_OBJECT_CLASS (parent_class)->dispose (object); } static void @@ -2480,7 +2500,7 @@ message_list_finalize (GObject *object) clear_selection(message_list, &priv->clipboard); /* Chain up to parent's finalize() method. */ - G_OBJECT_CLASS (message_list_parent_class)->finalize (object); + G_OBJECT_CLASS (parent_class)->finalize (object); } static void @@ -2490,6 +2510,25 @@ message_list_built (MessageList *message_list) } static void +message_list_selectable_update_actions (ESelectable *selectable, + EFocusTracker *focus_tracker, + GdkAtom *clipboard_targets, + gint n_clipboard_targets) +{ + GtkAction *action; + + action = e_focus_tracker_get_select_all_action (focus_tracker); + gtk_action_set_tooltip (action, _("Select all visible messages")); + gtk_action_set_sensitive (action, TRUE); +} + +static void +message_list_selectable_select_all (ESelectable *selectable) +{ + message_list_select_all (MESSAGE_LIST (selectable)); +} + +static void message_list_class_init (MessageListClass *class) { GObjectClass *object_class; @@ -2499,6 +2538,7 @@ message_list_class_init (MessageListClass *class) for (i = 0; i < G_N_ELEMENTS (ml_drag_info); i++) ml_drag_info[i].atom = gdk_atom_intern(ml_drag_info[i].target, FALSE); + parent_class = g_type_class_peek_parent (class); g_type_class_add_private (class, sizeof (MessageListPrivate)); object_class = G_OBJECT_CLASS (class); @@ -2546,6 +2586,13 @@ message_list_class_init (MessageListClass *class) message_list_init_images (); } +static void +message_list_selectable_init (ESelectableInterface *interface) +{ + interface->update_actions = message_list_selectable_update_actions; + interface->select_all = message_list_selectable_select_all; +} + static gboolean read_boolean_with_default (GConfClient *gconf, const gchar *key, gboolean def_value) { @@ -2668,6 +2715,41 @@ message_list_construct (MessageList *message_list) G_CALLBACK (ml_tree_sorting_changed), message_list); } +GType +message_list_get_type (void) +{ + static GType type = 0; + + if (G_UNLIKELY (type == 0)) { + static const GTypeInfo type_info = { + sizeof (MessageListClass), + (GBaseInitFunc) NULL, + (GBaseFinalizeFunc) NULL, + (GClassInitFunc) message_list_class_init, + (GClassFinalizeFunc) NULL, + NULL, /* class_data */ + sizeof (MessageList), + 0, /* n_preallocs */ + (GInstanceInitFunc) message_list_init, + NULL /* value_table */ + }; + + static const GInterfaceInfo selectable_info = { + (GInterfaceInitFunc) message_list_selectable_init, + (GInterfaceFinalizeFunc) NULL, + NULL /* interface_data */ + }; + + type = g_type_register_static ( + E_TREE_TYPE, "MessageList", &type_info, 0); + + g_type_add_interface_static ( + type, E_TYPE_SELECTABLE, &selectable_info); + } + + return type; +} + /** * message_list_new: * diff --git a/mail/message-list.h b/mail/message-list.h index 72960babe1..e239944783 100644 --- a/mail/message-list.h +++ b/mail/message-list.h @@ -170,9 +170,9 @@ struct _MessageListClass { ETreeClass parent_class; /* signals - select a message */ - void (*message_selected) (MessageList *ml, const gchar *uid); - void (*message_list_built) (MessageList *ml); - void (*message_list_scrolled) (MessageList *ml); + void (*message_selected) (MessageList *message_list, const gchar *uid); + void (*message_list_built) (MessageList *message_list); + void (*message_list_scrolled) (MessageList *message_list); }; typedef enum { @@ -182,58 +182,59 @@ typedef enum { MESSAGE_LIST_SELECT_WRAP = 1<<1 /* option bit */ } MessageListSelectDirection; -GType message_list_get_type (void); -GtkWidget *message_list_new (EShellBackend *shell_backend); -EShellBackend *message_list_get_shell_backend (MessageList *message_list); -void message_list_set_folder (MessageList *message_list, CamelFolder *camel_folder, const gchar *uri, gboolean outgoing); - -void message_list_freeze(MessageList *ml); -void message_list_thaw(MessageList *ml); - -GPtrArray *message_list_get_uids(MessageList *message_list); -GPtrArray *message_list_get_selected(MessageList *ml); -void message_list_set_selected(MessageList *ml, GPtrArray *uids); - -/* select next/prev message helpers */ -gboolean message_list_select (MessageList *message_list, - MessageListSelectDirection direction, - guint32 flags, - guint32 mask); -gboolean message_list_can_select(MessageList *ml, MessageListSelectDirection direction, guint32 flags, guint32 mask); - -void message_list_select_uid (MessageList *message_list, - const gchar *uid); - -void message_list_select_next_thread (MessageList *ml); - -/* selection manipulation */ -void message_list_select_all (MessageList *ml); -void message_list_select_thread (MessageList *ml); -void message_list_select_subthread (MessageList *ml); -void message_list_invert_selection (MessageList *ml); - -/* clipboard stuff */ -void message_list_copy(MessageList *ml, gboolean cut); -void message_list_paste (MessageList *ml); - -/* info */ -guint message_list_length (MessageList *ml); -guint message_list_hidden (MessageList *ml); - -/* hide specific messages */ -void message_list_hide_add (MessageList *ml, const gchar *expr, guint lower, guint upper); -void message_list_hide_uids (MessageList *ml, GPtrArray *uids); -void message_list_hide_clear (MessageList *ml); - -void message_list_set_threaded (MessageList *ml, gboolean threaded); -void message_list_set_threaded_expand_all (MessageList *ml); -void message_list_set_threaded_collapse_all (MessageList *ml); - -void message_list_set_hidedeleted (MessageList *ml, gboolean hidedeleted); -void message_list_set_search (MessageList *ml, const gchar *search); -void message_list_ensure_message (MessageList *ml, const gchar *uid); - -void message_list_save_state (MessageList *ml); +GType message_list_get_type (void); +GtkWidget * message_list_new (EShellBackend *shell_backend); +EShellBackend * message_list_get_shell_backend (MessageList *message_list); +void message_list_set_folder (MessageList *message_list, + CamelFolder *camel_folder, + const gchar *uri, + gboolean outgoing); +void message_list_freeze (MessageList *message_list); +void message_list_thaw (MessageList *message_list); +GPtrArray * message_list_get_uids (MessageList *message_list); +GPtrArray * message_list_get_selected (MessageList *message_list); +void message_list_set_selected (MessageList *message_list, + GPtrArray *uids); +gboolean message_list_select (MessageList *message_list, + MessageListSelectDirection direction, + guint32 flags, + guint32 mask); +gboolean message_list_can_select (MessageList *message_list, + MessageListSelectDirection direction, + guint32 flags, + guint32 mask); +void message_list_select_uid (MessageList *message_list, + const gchar *uid); +void message_list_select_next_thread (MessageList *message_list); +void message_list_select_all (MessageList *message_list); +void message_list_select_thread (MessageList *message_list); +void message_list_select_subthread (MessageList *message_list); +void message_list_invert_selection (MessageList *message_list); +void message_list_copy (MessageList *message_list, + gboolean cut); +void message_list_paste (MessageList *message_list); +guint message_list_length (MessageList *message_list); +guint message_list_hidden (MessageList *message_list); +void message_list_hide_add (MessageList *message_list, + const gchar *expr, + guint lower, + guint upper); +void message_list_hide_uids (MessageList *message_list, + GPtrArray *uids); +void message_list_hide_clear (MessageList *message_list); +void message_list_set_threaded (MessageList *message_list, + gboolean threaded); +void message_list_set_threaded_expand_all + (MessageList *message_list); +void message_list_set_threaded_collapse_all + (MessageList *message_list); +void message_list_set_hidedeleted (MessageList *message_list, + gboolean hidedeleted); +void message_list_set_search (MessageList *message_list, + const gchar *search); +void message_list_ensure_message (MessageList *message_list, + const gchar *uid); +void message_list_save_state (MessageList *message_list); #define MESSAGE_LIST_LOCK(m, l) g_mutex_lock(((MessageList *)m)->l) #define MESSAGE_LIST_UNLOCK(m, l) g_mutex_unlock(((MessageList *)m)->l) |