diff options
-rw-r--r-- | mail/ChangeLog | 38 | ||||
-rw-r--r-- | mail/em-folder-view.c | 239 | ||||
-rw-r--r-- | mail/em-folder-view.h | 8 | ||||
-rw-r--r-- | mail/em-popup.c | 2 | ||||
-rw-r--r-- | mail/mail-autofilter.c | 37 | ||||
-rw-r--r-- | mail/mail-vfolder.c | 11 | ||||
-rw-r--r-- | mail/mail-vfolder.h | 1 |
7 files changed, 247 insertions, 89 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index b4c9f43a27..557ca0aeed 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,41 @@ +2005-02-18 Rodney Dawes <dobey@novell.com> + + * mail/em-folder-view.c (emfv_popup_copy_text): New method to copy + the selected text in the mail display, to the clipboard + (emfv_popup_items): Restructure this list for the new context menus + layout that we are moving to, to improve the UI + (emfv_popup): Add a third argument for whether we are on the mail + display or not, so that we can pop up the correct portion of the menus + Pass the on_display argument on to create the popup target + Only generate the label items if we are on the list and not the display + (emp_uri_popup_vfolder_{sender,recipient}): New methods to create + vfolders to and from mailto: addresses from the context menu + (emfv_enable_menus): Create the target here for clicking on the list + (em_folder_view_get_popup_target): Add a third argument so that we + can tell whether we are on the display or not + Set the appropriate flags on the target for whether we are on the + message display,, and whether or not there is selected text in it + (emfv_list_right_click): We aren't rigt-clicking on the display here + (emfv_popup_menu): We aren't right-clicking on the mail display here + (emfv_uri_popups): Add the submenu for creating a vfolder from mailto: + (emfv_format_popup_event): We are right-clickingo nt he display here + + * mail/em-folder-view.h: Add the new flags we need for the mail + context menus popup target here + (em_folderiew_get_popup_target): Add the on_display argument + + * mail/em-popup.c (emp_standard_uri_popups): Fix the label and mnemonic + for the Send New Message popup item for mailto: addresses + + * mail/mail-autofilter.c (rule_from_address): + (em_vfolder_rule_from_address): New methods to create a vfolder based + on a CamelInternetAddress object that we get from the mailer + + * mail/mail-vfolder.[ch] (vfolder_gui_add_from_address): New method to + create a vfolder rule based on the mailto: addresses + + Fixes #23822 + 2005-02-15 Radek Doulik <rodo@novell.com> * em-junk-filter.c: use camel_debug diff --git a/mail/em-folder-view.c b/mail/em-folder-view.c index 8793aba3ea..1bcc13700a 100644 --- a/mail/em-folder-view.c +++ b/mail/em-folder-view.c @@ -87,6 +87,7 @@ #include <gtkhtml/htmlengine.h> #include <gtkhtml/htmlengine-save.h> #include <gtkhtml/htmlengine-edit-cut-and-paste.h> +#include <gtkhtml/htmlselection.h> #include "mail-mt.h" #include "mail-ops.h" @@ -680,6 +681,13 @@ emfv_popup_print(EPopup *ep, EPopupItem *pitem, void *data) } static void +emfv_popup_copy_text(EPopup *ep, EPopupItem *pitem, void *data) +{ + EMFolderView *emfv = data; + html_engine_copy (((EMFormatHTML *)emfv->preview)->html->engine); +} + +static void emfv_popup_reply_sender(EPopup *ep, EPopupItem *pitem, void *data) { EMFolderView *emfv = data; @@ -961,64 +969,55 @@ EMFV_POPUP_AUTO_TYPE(filter_type_current, emfv_popup_filter_mlist, AUTO_MLIST) /* TODO: Move some of these to be 'standard' menu's */ static EPopupItem emfv_popup_items[] = { - { E_POPUP_ITEM, "00.emfv.00", N_("_Open"), emfv_popup_open, NULL, NULL, 0 }, - { E_POPUP_ITEM, "00.emfv.01", N_("_Edit as New Message..."), emfv_popup_edit, NULL, NULL, EM_POPUP_SELECT_EDIT }, - { E_POPUP_ITEM, "00.emfv.02", N_("_Save As..."), emfv_popup_saveas, NULL, "stock_save-as", 0 }, - { E_POPUP_ITEM, "00.emfv.03", N_("_Print"), emfv_popup_print, NULL, "stock_print", 0 }, - - { E_POPUP_BAR, "10.emfv" }, - { E_POPUP_ITEM, "10.emfv.00", N_("_Reply to Sender"), emfv_popup_reply_sender, NULL, "stock_mail-reply", EM_POPUP_SELECT_ONE }, - { E_POPUP_ITEM, "10.emfv.01", N_("Reply to _List"), emfv_popup_reply_list, NULL, NULL, EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MAILING_LIST }, - { E_POPUP_ITEM, "10.emfv.02", N_("Reply to _All"), emfv_popup_reply_all, NULL, "stock_mail-reply-to-all", EM_POPUP_SELECT_ONE }, - { E_POPUP_ITEM, "10.emfv.03", N_("_Forward"), emfv_popup_forward, NULL, "stock_mail-forward", EM_POPUP_SELECT_MANY }, - - { E_POPUP_BAR, "20.emfv", NULL, NULL, NULL, NULL, EM_POPUP_SELECT_FLAG_FOLLOWUP|EM_POPUP_SELECT_FLAG_COMPLETED|EM_POPUP_SELECT_FLAG_CLEAR }, - { E_POPUP_ITEM, "20.emfv.00", N_("Follo_w Up..."), emfv_popup_flag_followup, NULL, "stock_mail-flag-for-followup", EM_POPUP_SELECT_FLAG_FOLLOWUP }, - { E_POPUP_ITEM, "20.emfv.01", N_("Fla_g Completed"), emfv_popup_flag_completed, NULL, NULL, EM_POPUP_SELECT_FLAG_COMPLETED }, - { E_POPUP_ITEM, "20.emfv.02", N_("Cl_ear Flag"), emfv_popup_flag_clear, NULL, NULL, EM_POPUP_SELECT_FLAG_CLEAR }, - - { E_POPUP_BAR, "30.emfv" }, - { E_POPUP_ITEM, "30.emfv.00", N_("Mar_k as Read"), emfv_popup_mark_read, NULL, "stock_mail-open", EM_POPUP_SELECT_MARK_READ }, - { E_POPUP_ITEM, "30.emfv.01", N_("Mark as _Unread"), emfv_popup_mark_unread, NULL, "stock_mail-unread", EM_POPUP_SELECT_MARK_UNREAD }, - { E_POPUP_ITEM, "30.emfv.02", N_("Mark as _Important"), emfv_popup_mark_important, NULL, "stock_mail-priority-high", EM_POPUP_SELECT_MARK_IMPORTANT }, - { E_POPUP_ITEM, "30.emfv.03", N_("_Mark as Unimportant"), emfv_popup_mark_unimportant, NULL, NULL, EM_POPUP_SELECT_MARK_UNIMPORTANT }, - { E_POPUP_ITEM, "30.emfv.04", N_("Mark as _Junk"), emfv_popup_mark_junk, NULL, "stock_spam", EM_POPUP_SELECT_MANY }, - { E_POPUP_ITEM, "30.emfv.05", N_("Mark as _Not Junk"), emfv_popup_mark_nojunk, NULL, "stock_not-spam", EM_POPUP_SELECT_MANY }, - - { E_POPUP_BAR, "40.emfv" }, - { E_POPUP_ITEM, "40.emfv.00", N_("_Delete"), emfv_popup_delete, NULL, "stock_delete", EM_POPUP_SELECT_DELETE }, - { E_POPUP_ITEM, "40.emfv.01", N_("U_ndelete"), emfv_popup_undelete, NULL, "stock_undelete", EM_POPUP_SELECT_UNDELETE }, - - { E_POPUP_BAR, "50.emfv" }, - { E_POPUP_ITEM, "50.emfv.00", N_("Mo_ve to Folder..."), emfv_popup_move }, - { E_POPUP_ITEM, "50.emfv.01", N_("_Copy to Folder..."), emfv_popup_copy }, - - { E_POPUP_BAR, "60.label" }, - { E_POPUP_SUBMENU, "60.label.00", N_("Label") }, - { E_POPUP_IMAGE, "60.label.00/00.label", N_("None"), emfv_popup_label_clear }, - { E_POPUP_BAR, "60.label.00/00.label.00" }, - - { E_POPUP_BAR, "70.emfv", NULL, NULL, NULL, NULL, EM_POPUP_SELECT_ADD_SENDER }, - { E_POPUP_ITEM, "70.emfv.00", N_("Add Sender to Address_book"), emfv_popup_add_sender, NULL, NULL, EM_POPUP_SELECT_ADD_SENDER }, - - { E_POPUP_BAR, "80.emfv" }, - { E_POPUP_ITEM, "80.emfv.00", N_("Appl_y Filters"), emfv_popup_apply_filters, NULL, "stock_mail-filters-apply" }, - { E_POPUP_ITEM, "80.emfv.01", N_("F_ilter Junk"), emfv_popup_filter_junk, NULL, "stock_spam" }, - - { E_POPUP_BAR, "90.filter", NULL, NULL, NULL, NULL, EM_POPUP_SELECT_ONE }, - { E_POPUP_SUBMENU, "90.filter.00", N_("Crea_te Rule From Message"), NULL, NULL, NULL, EM_POPUP_SELECT_ONE }, - { E_POPUP_ITEM, "90.filter.00/00.00", N_("vFolder on _Subject"), emfv_popup_vfolder_subject, NULL, NULL, EM_POPUP_SELECT_ONE }, - { E_POPUP_ITEM, "90.filter.00/00.01", N_("vFolder on Se_nder"), emfv_popup_vfolder_sender, NULL, NULL, EM_POPUP_SELECT_ONE }, - { E_POPUP_ITEM, "90.filter.00/00.02", N_("vFolder on _Recipients"), emfv_popup_vfolder_recipients, NULL, NULL, EM_POPUP_SELECT_ONE }, + { E_POPUP_ITEM, "00.emfv.00", N_("_Copy"), emfv_popup_copy_text, NULL, "stock_copy", EM_FOLDER_VIEW_SELECT_DISPLAY|EM_FOLDER_VIEW_SELECT_SELECTION }, + + { E_POPUP_BAR, "10.emfv", NULL, NULL, NULL, NULL }, + + {E_POPUP_ITEM, "10.emfv.00", N_("Reply to _All"), emfv_popup_reply_all, NULL, "stock_mail-reply-to-all", EM_POPUP_SELECT_ONE }, + { E_POPUP_ITEM, "10.emfv.01", N_("_Reply to Sender"), emfv_popup_reply_sender, NULL, "stock_mail-reply", EM_POPUP_SELECT_ONE }, + { E_POPUP_ITEM, "10.emfv.02", N_("_Forward"), emfv_popup_forward, NULL, "stock_mail-forward", EM_POPUP_SELECT_MANY }, + + { E_POPUP_BAR, "20.emfv", NULL, NULL, NULL, NULL }, + { E_POPUP_ITEM, "20.emfv.00", N_("_Edit as New Message..."), emfv_popup_edit, NULL, NULL, EM_POPUP_SELECT_EDIT }, + { E_POPUP_ITEM, "20.emfv.01", N_("_Save As..."), emfv_popup_saveas, NULL, "stock_save-as", EM_POPUP_SELECT_MANY }, + { E_POPUP_ITEM, "20.emfv.02", N_("_Print"), emfv_popup_print, NULL, "stock_print", EM_POPUP_SELECT_ONE }, + + { E_POPUP_BAR, "40.emfv", NULL, NULL, NULL, NULL }, + { E_POPUP_ITEM, "40.emfv.00", N_("_Delete"), emfv_popup_delete, NULL, "stock_delete", EM_POPUP_SELECT_DELETE|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "40.emfv.01", N_("U_ndelete"), emfv_popup_undelete, NULL, "stock_undelete", EM_POPUP_SELECT_UNDELETE|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "40.emfv.02", N_("Mo_ve to Folder..."), emfv_popup_move, NULL, "stock_mail-move", EM_POPUP_SELECT_MANY|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "40.emfv.03", N_("_Copy to Folder..."), emfv_popup_copy, NULL, "stock_mail-copy", EM_POPUP_SELECT_MANY|EM_FOLDER_VIEW_SELECT_LISTONLY }, + + { E_POPUP_BAR, "50.emfv", NULL, NULL, NULL, NULL }, + { E_POPUP_ITEM, "50.emfv.02", N_("Mark as _Important"), emfv_popup_mark_important, NULL, "stock_mail-priority-high", EM_POPUP_SELECT_MARK_IMPORTANT|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "50.emfv.03", N_("_Mark as Unimportant"), emfv_popup_mark_unimportant, NULL, NULL, EM_POPUP_SELECT_MARK_UNIMPORTANT|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "50.emfv.01", N_("Mark as _Junk"), emfv_popup_mark_junk, NULL, "stock_spam", EM_POPUP_SELECT_MANY|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "50.emfv.02", N_("Mark as _Not Junk"), emfv_popup_mark_nojunk, NULL, "stock_not-spam", EM_POPUP_SELECT_MANY|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "50.emfv.05", N_("Mark for Follo_w Up..."), emfv_popup_flag_followup, NULL, "stock_mail-flag-for-followup", EM_POPUP_SELECT_FLAG_FOLLOWUP|EM_FOLDER_VIEW_SELECT_LISTONLY }, + + { E_POPUP_SUBMENU, "60.label.00", N_("Label"), NULL, NULL, NULL, EM_POPUP_SELECT_MANY|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "60.label.00/00.label", N_("None"), emfv_popup_label_clear, NULL, NULL, EM_POPUP_SELECT_MANY|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_BAR, "60.label.00/00.label.00", NULL, NULL, NULL, NULL }, + + { E_POPUP_BAR, "70.emfv.06", NULL, NULL, NULL, NULL }, + + { E_POPUP_ITEM, "70.emfv.07", N_("Fla_g Completed"), emfv_popup_flag_completed, NULL, "stock_mail-flag-for-followup-done", EM_POPUP_SELECT_FLAG_COMPLETED|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "70.emfv.08", N_("Cl_ear Flag"), emfv_popup_flag_clear, NULL, NULL, EM_POPUP_SELECT_FLAG_CLEAR|EM_FOLDER_VIEW_SELECT_LISTONLY }, + + { E_POPUP_BAR, "90.filter", NULL, NULL, NULL, NULL }, + { E_POPUP_SUBMENU, "90.filter.00", N_("Crea_te Rule From Message"), NULL, NULL, NULL, EM_POPUP_SELECT_ONE|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "90.filter.00/00.00", N_("vFolder on _Subject"), emfv_popup_vfolder_subject, NULL, NULL, EM_POPUP_SELECT_ONE|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "90.filter.00/00.01", N_("vFolder on Se_nder"), emfv_popup_vfolder_sender, NULL, NULL, EM_POPUP_SELECT_ONE|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "90.filter.00/00.02", N_("vFolder on _Recipients"), emfv_popup_vfolder_recipients, NULL, NULL, EM_POPUP_SELECT_ONE|EM_FOLDER_VIEW_SELECT_LISTONLY }, { E_POPUP_ITEM, "90.filter.00/00.03", N_("vFolder on Mailing _List"), - emfv_popup_vfolder_mlist, NULL, NULL, EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MAILING_LIST }, + emfv_popup_vfolder_mlist, NULL, NULL, EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MAILING_LIST|EM_FOLDER_VIEW_SELECT_LISTONLY }, - { E_POPUP_BAR, "90.filter.00/10", NULL, NULL, NULL, NULL, EM_POPUP_SELECT_ONE }, - { E_POPUP_ITEM, "90.filter.00/10.00", N_("Filter on Sub_ject"), emfv_popup_filter_subject, NULL, NULL, EM_POPUP_SELECT_ONE }, - { E_POPUP_ITEM, "90.filter.00/10.01", N_("Filter on Sen_der"), emfv_popup_filter_sender, NULL, NULL, EM_POPUP_SELECT_ONE }, - { E_POPUP_ITEM, "90.filter.00/10.02", N_("Filter on Re_cipients"), emfv_popup_filter_recipients, NULL, NULL, EM_POPUP_SELECT_ONE }, + { E_POPUP_BAR, "90.filter.00/10", NULL, NULL, NULL, NULL }, + { E_POPUP_ITEM, "90.filter.00/10.00", N_("Filter on Sub_ject"), emfv_popup_filter_subject, NULL, NULL, EM_POPUP_SELECT_ONE|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "90.filter.00/10.01", N_("Filter on Sen_der"), emfv_popup_filter_sender, NULL, NULL, EM_POPUP_SELECT_ONE|EM_FOLDER_VIEW_SELECT_LISTONLY }, + { E_POPUP_ITEM, "90.filter.00/10.02", N_("Filter on Re_cipients"), emfv_popup_filter_recipients, NULL, NULL, EM_POPUP_SELECT_ONE|EM_FOLDER_VIEW_SELECT_LISTONLY }, { E_POPUP_ITEM, "90.filter.00/10.03", N_("Filter on _Mailing List"), - emfv_popup_filter_mlist, NULL, NULL, EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MAILING_LIST }, + emfv_popup_filter_mlist, NULL, NULL, EM_POPUP_SELECT_ONE|EM_POPUP_SELECT_MAILING_LIST|EM_FOLDER_VIEW_SELECT_LISTONLY }, }; static void @@ -1043,7 +1042,7 @@ emfv_popup_items_free(EPopup *ep, GSList *items, void *data) } static void -emfv_popup(EMFolderView *emfv, GdkEvent *event) +emfv_popup(EMFolderView *emfv, GdkEvent *event, int on_display) { GSList *menus = NULL, *l, *label_list = NULL; GtkMenu *menu; @@ -1059,7 +1058,7 @@ emfv_popup(EMFolderView *emfv, GdkEvent *event) * This is the context menu shown on the message list or over a message. */ emp = em_popup_new("org.gnome.evolution.mail.folderview.popup"); - target = em_folder_view_get_popup_target(emfv, emp); + target = em_folder_view_get_popup_target(emfv, emp, on_display); for (i=0;i<sizeof(emfv_popup_items)/sizeof(emfv_popup_items[0]);i++) menus = g_slist_prepend(menus, &emfv_popup_items[i]); @@ -1067,33 +1066,37 @@ emfv_popup(EMFolderView *emfv, GdkEvent *event) e_popup_add_items((EPopup *)emp, menus, NULL, emfv_popup_items_free, emfv); i = 1; - for (l = mail_config_get_labels(); l; l = l->next) { - EPopupItem *item; - MailConfigLabel *label = l->data; - GdkPixmap *pixmap; - GdkColor colour; - GdkGC *gc; + if (!on_display) { + for (l = mail_config_get_labels(); l; l = l->next) { + EPopupItem *item; + MailConfigLabel *label = l->data; + GdkPixmap *pixmap; + GdkColor colour; + GdkGC *gc; - item = g_malloc0(sizeof(*item)); - item->type = E_POPUP_IMAGE; - item->path = g_strdup_printf("60.label.00/00.label.%02d", i++); - item->label = label->name; - item->activate = emfv_popup_label_set; - item->user_data = label->tag; - - gdk_color_parse(label->colour, &colour); - gdk_color_alloc(gdk_colormap_get_system(), &colour); + item = g_malloc0(sizeof(*item)); + item->type = E_POPUP_IMAGE; + item->path = g_strdup_printf("60.label.00/00.label.%02d", i++); + item->label = label->name; + item->activate = emfv_popup_label_set; + item->user_data = label->tag; + + item->visible = EM_POPUP_SELECT_MANY|EM_FOLDER_VIEW_SELECT_LISTONLY; + + gdk_color_parse(label->colour, &colour); + gdk_color_alloc(gdk_colormap_get_system(), &colour); - pixmap = gdk_pixmap_new(((GtkWidget *)emfv)->window, 16, 16, -1); - gc = gdk_gc_new(((GtkWidget *)emfv)->window); - gdk_gc_set_foreground(gc, &colour); - gdk_draw_rectangle(pixmap, gc, TRUE, 0, 0, 16, 16); - gdk_gc_unref(gc); + pixmap = gdk_pixmap_new(((GtkWidget *)emfv)->window, 16, 16, -1); + gc = gdk_gc_new(((GtkWidget *)emfv)->window); + gdk_gc_set_foreground(gc, &colour); + gdk_draw_rectangle(pixmap, gc, TRUE, 0, 0, 16, 16); + gdk_gc_unref(gc); - item->image = gtk_image_new_from_pixmap(pixmap, NULL); - gtk_widget_show(item->image); + item->image = gtk_image_new_from_pixmap(pixmap, NULL); + gtk_widget_show(item->image); - label_list = g_slist_prepend(label_list, item); + label_list = g_slist_prepend(label_list, item); + } } e_popup_add_items((EPopup *)emp, label_list, NULL, emfv_popup_labels_free, emfv); @@ -1466,6 +1469,56 @@ vfolder_type_got_message (CamelFolder *folder, const char *uid, CamelMimeMessage } static void +emp_uri_popup_vfolder_sender(EPopup *ep, EPopupItem *pitem, void *data) +{ + EMFolderView *emfv = data; + EMPopupTargetURI *t = (EMPopupTargetURI *)ep->target; + CamelURL *url; + CamelInternetAddress *addr; + + url = camel_url_new(t->uri, NULL); + if (url == NULL) { + g_warning("cannot parse url '%s'", t->uri); + return; + } + + if (url->path && url->path[0]) { + addr = camel_internet_address_new (); + camel_address_decode (CAMEL_ADDRESS (addr), url->path); + vfolder_gui_add_from_address (addr, AUTO_FROM, emfv->folder_uri); + camel_object_unref (addr); + } + + camel_url_free(url); + +} + + +static void +emp_uri_popup_vfolder_recipient(EPopup *ep, EPopupItem *pitem, void *data) +{ + EMFolderView *emfv = data; + EMPopupTargetURI *t = (EMPopupTargetURI *)ep->target; + CamelURL *url; + CamelInternetAddress *addr; + + url = camel_url_new(t->uri, NULL); + if (url == NULL) { + g_warning("cannot parse url '%s'", t->uri); + return; + } + + if (url->path && url->path[0]) { + addr = camel_internet_address_new (); + camel_address_decode (CAMEL_ADDRESS (addr), url->path); + vfolder_gui_add_from_address (addr, AUTO_TO, emfv->folder_uri); + camel_object_unref (addr); + } + + camel_url_free(url); +} + +static void vfolder_type_uid (CamelFolder *folder, const char *uid, const char *uri, int type) { struct _filter_data *data; @@ -1710,7 +1763,7 @@ emfv_enable_menus(EMFolderView *emfv) EMPopup *emp = em_popup_new("dummy"); EMPopupTargetSelect *t; - t = em_folder_view_get_popup_target(emfv, emp); + t = em_folder_view_get_popup_target(emfv, emp, FALSE); disable_mask = t->target.mask; e_popup_target_free((EPopup *)emp, t); g_object_unref(emp); @@ -1949,7 +2002,7 @@ int em_folder_view_print(EMFolderView *emfv, int preview) } EMPopupTargetSelect * -em_folder_view_get_popup_target(EMFolderView *emfv, EMPopup *emp) +em_folder_view_get_popup_target(EMFolderView *emfv, EMPopup *emp, int on_display) { EMPopupTargetSelect *t; @@ -1968,6 +2021,16 @@ em_folder_view_get_popup_target(EMFolderView *emfv, EMPopup *emp) if (message_list_can_select(emfv->list, MESSAGE_LIST_SELECT_PREVIOUS, 0, 0)) t->target.mask &= ~EM_FOLDER_VIEW_SELECT_PREV_MSG; + if (on_display) + t->target.mask &= ~EM_FOLDER_VIEW_SELECT_DISPLAY; + else + t->target.mask &= ~EM_FOLDER_VIEW_SELECT_LISTONLY; + + if (html_engine_is_selection_active(((EMFormatHTML *)emfv->preview)->html->engine)) + t->target.mask &= ~EM_FOLDER_VIEW_SELECT_SELECTION; + else + t->target.mask &= ~EM_FOLDER_VIEW_SELECT_NOSELECTION; + /* See bug #54770 */ if (!emfv->hide_deleted) t->target.mask &= ~EM_POPUP_SELECT_DELETE; @@ -2118,7 +2181,7 @@ emfv_list_double_click(ETree *tree, gint row, ETreePath path, gint col, GdkEvent static int emfv_list_right_click(ETree *tree, gint row, ETreePath path, gint col, GdkEvent *event, EMFolderView *emfv) { - emfv_popup(emfv, event); + emfv_popup(emfv, event, FALSE); return TRUE; } @@ -2176,7 +2239,7 @@ emfv_popup_menu (GtkWidget *widget) ret = em_format_html_display_popup_menu (emfv->preview); if (!ret) - emfv_popup (emfv, NULL); + emfv_popup (emfv, NULL, FALSE); return TRUE; } @@ -2226,7 +2289,11 @@ emp_uri_popup_link_copy(EPopup *ep, EPopupItem *pitem, void *data) } static EPopupItem emfv_uri_popups[] = { - { E_POPUP_ITEM, "00.uri.01", N_("_Copy Link Location"), emp_uri_popup_link_copy, NULL, NULL, EM_POPUP_URI_NOT_MAILTO }, + { E_POPUP_ITEM, "00.uri.15", N_("_Copy Link Location"), emp_uri_popup_link_copy, NULL, NULL, EM_POPUP_URI_NOT_MAILTO }, + + { E_POPUP_SUBMENU, "99.uri.00", N_("Create _vFolder"), NULL, NULL, NULL, EM_POPUP_URI_MAILTO }, + { E_POPUP_ITEM, "99.uri.00/00.10", N_("_From this Address"), emp_uri_popup_vfolder_sender, NULL, NULL, EM_POPUP_URI_MAILTO }, + { E_POPUP_ITEM, "99.uri.00/00.00", N_("_To this Address"), emp_uri_popup_vfolder_recipient, NULL, NULL, EM_POPUP_URI_MAILTO }, }; static void @@ -2258,7 +2325,7 @@ emfv_format_popup_event(EMFormatHTMLDisplay *efhd, GdkEventButton *event, const message_list_free_uids(emfv->list, uids); if (doit) - emfv_popup(emfv, (GdkEvent *)event); + emfv_popup(emfv, (GdkEvent *)event, TRUE); return doit; } diff --git a/mail/em-folder-view.h b/mail/em-folder-view.h index a6ece9fcb1..7eb5ae7b31 100644 --- a/mail/em-folder-view.h +++ b/mail/em-folder-view.h @@ -49,7 +49,11 @@ enum { EM_FOLDER_VIEW_SELECT_HIDDEN = EM_POPUP_SELECT_LAST<<1, EM_FOLDER_VIEW_SELECT_NEXT_MSG = EM_POPUP_SELECT_LAST<<2, EM_FOLDER_VIEW_SELECT_PREV_MSG = EM_POPUP_SELECT_LAST<<3, - EM_FOLDER_VIEW_SELECT_LAST = EM_POPUP_SELECT_LAST<<4, + EM_FOLDER_VIEW_SELECT_LISTONLY = EM_POPUP_SELECT_LAST<<4, + EM_FOLDER_VIEW_SELECT_DISPLAY = EM_POPUP_SELECT_LAST<<5, + EM_FOLDER_VIEW_SELECT_SELECTION = EM_POPUP_SELECT_LAST<<6, + EM_FOLDER_VIEW_SELECT_NOSELECTION = EM_POPUP_SELECT_LAST<<7, + EM_FOLDER_VIEW_SELECT_LAST = EM_POPUP_SELECT_LAST<<8, }; struct _EMFolderViewEnable { @@ -122,7 +126,7 @@ GtkWidget *em_folder_view_new(void); #define em_folder_view_set_folder_uri(emfv, uri) EM_FOLDER_VIEW_GET_CLASS (emfv)->set_folder_uri((emfv), (uri)) #define em_folder_view_set_message(emfv, uid, nomarkseen) EM_FOLDER_VIEW_GET_CLASS (emfv)->set_message((emfv), (uid), (nomarkseen)) -EMPopupTargetSelect *em_folder_view_get_popup_target(EMFolderView *emfv, EMPopup *emp); +EMPopupTargetSelect *em_folder_view_get_popup_target(EMFolderView *emfv, EMPopup *emp, int on_display); int em_folder_view_mark_selected(EMFolderView *emfv, guint32 mask, guint32 set); int em_folder_view_open_selected(EMFolderView *emfv); diff --git a/mail/em-popup.c b/mail/em-popup.c index bf3a017097..9672b4b362 100644 --- a/mail/em-popup.c +++ b/mail/em-popup.c @@ -546,7 +546,7 @@ emp_uri_popup_address_add(EPopup *ep, EPopupItem *item, void *data) static EPopupItem emp_standard_uri_popups[] = { { E_POPUP_ITEM, "00.uri.00", N_("_Open Link in Browser"), emp_uri_popup_link_open, NULL, NULL, EM_POPUP_URI_NOT_MAILTO }, - { E_POPUP_ITEM, "00.uri.10", N_("Se_nd message to..."), emp_uri_popup_address_send, NULL, NULL, EM_POPUP_URI_MAILTO }, + { E_POPUP_ITEM, "00.uri.10", N_("_Send New Message To..."), emp_uri_popup_address_send, NULL, NULL, EM_POPUP_URI_MAILTO }, { E_POPUP_ITEM, "00.uri.20", N_("_Add to Addressbook"), emp_uri_popup_address_add, NULL, NULL, EM_POPUP_URI_MAILTO }, }; diff --git a/mail/mail-autofilter.c b/mail/mail-autofilter.c index fe48b1777a..8084b226f1 100644 --- a/mail/mail-autofilter.c +++ b/mail/mail-autofilter.c @@ -223,6 +223,29 @@ rule_match_mlist(RuleContext *context, FilterRule *rule, const char *mlist) } static void +rule_from_address (FilterRule *rule, RuleContext *context, CamelInternetAddress* addr, int flags) +{ + rule->grouping = FILTER_GROUP_ANY; + + if (flags & AUTO_FROM) { + const char *name, *address; + char *namestr; + + camel_internet_address_get (addr, 0, &name, &address); + rule_add_sender (context, rule, address); + if (name == NULL || name[0] == '\0') + name = address; + namestr = g_strdup_printf(_("Mail from %s"), name); + filter_rule_set_name (rule, namestr); + g_free (namestr); + } + if (flags & AUTO_TO) { + rule_match_recipients (context, rule, addr); + } + +} + +static void rule_from_message (FilterRule *rule, RuleContext *context, CamelMimeMessage *msg, int flags) { CamelInternetAddress *addr; @@ -293,6 +316,20 @@ em_vfolder_rule_from_message (EMVFolderContext *context, CamelMimeMessage *msg, } FilterRule * +em_vfolder_rule_from_address (EMVFolderContext *context, CamelInternetAddress *addr, int flags, const char *source) +{ + EMVFolderRule *rule; + char *euri = em_uri_from_camel(source); + + rule = em_vfolder_rule_new (); + em_vfolder_rule_add_source (rule, euri); + rule_from_address ((FilterRule *)rule, (RuleContext *)context, addr, flags); + g_free(euri); + + return (FilterRule *)rule; +} + +FilterRule * filter_rule_from_message (EMFilterContext *context, CamelMimeMessage *msg, int flags) { EMFilterRule *rule; diff --git a/mail/mail-vfolder.c b/mail/mail-vfolder.c index 8798ccba33..d575d5f793 100644 --- a/mail/mail-vfolder.c +++ b/mail/mail-vfolder.c @@ -1120,6 +1120,17 @@ vfolder_gui_add_from_message(CamelMimeMessage *msg, int flags, const char *sourc vfolder_gui_add_rule(rule); } +void +vfolder_gui_add_from_address(CamelInternetAddress *addr, int flags, const char *source) +{ + EMVFolderRule *rule; + + g_return_if_fail (addr != NULL); + + rule = (EMVFolderRule*)em_vfolder_rule_from_address(context, addr, flags, source); + vfolder_gui_add_rule(rule); +} + static void vfolder_foreach_cb (gpointer key, gpointer data, gpointer user_data) { diff --git a/mail/mail-vfolder.h b/mail/mail-vfolder.h index f2b8f25766..ca4fc4ad3d 100644 --- a/mail/mail-vfolder.h +++ b/mail/mail-vfolder.h @@ -18,6 +18,7 @@ FilterPart *vfolder_create_part (const char *name); FilterRule *vfolder_clone_rule (FilterRule *in); void vfolder_gui_add_rule (EMVFolderRule *rule); void vfolder_gui_add_from_message (CamelMimeMessage *msg, int flags, const char *source); +void vfolder_gui_add_from_address (CamelInternetAddress *addr, int flags, const char *source); /* add a uri that is now (un)available to vfolders in a transient manner */ void mail_vfolder_add_uri(CamelStore *store, const char *uri, int remove); |