aboutsummaryrefslogtreecommitdiffstats
path: root/mail
diff options
context:
space:
mode:
Diffstat (limited to 'mail')
-rw-r--r--mail/Makefile.am2
-rw-r--r--mail/e-mail-display-popup-extension.c55
-rw-r--r--mail/e-mail-display-popup-extension.h64
-rw-r--r--mail/e-mail-display.c78
4 files changed, 176 insertions, 23 deletions
diff --git a/mail/Makefile.am b/mail/Makefile.am
index cd02ad6fdf..9dda24f16d 100644
--- a/mail/Makefile.am
+++ b/mail/Makefile.am
@@ -67,6 +67,7 @@ mailinclude_HEADERS = \
e-mail-config-welcome-page.h \
e-mail-config-window.h \
e-mail-display.h \
+ e-mail-display-popup-extension.h \
e-mail-folder-pane.h \
e-mail-junk-options.h \
e-mail-label-action.h \
@@ -146,6 +147,7 @@ libevolution_mail_la_SOURCES = \
e-mail-config-welcome-page.c \
e-mail-config-window.c \
e-mail-display.c \
+ e-mail-display-popup-extension.c \
e-mail-folder-pane.c \
e-mail-junk-options.c \
e-mail-label-action.c \
diff --git a/mail/e-mail-display-popup-extension.c b/mail/e-mail-display-popup-extension.c
new file mode 100644
index 0000000000..a4441797c3
--- /dev/null
+++ b/mail/e-mail-display-popup-extension.c
@@ -0,0 +1,55 @@
+/*
+ * e-mail-display-popup-extension.c
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#include "e-mail-display-popup-extension.h"
+#include "e-mail-display.h"
+
+G_DEFINE_INTERFACE (
+ EMailDisplayPopupExtension,
+ e_mail_display_popup_extension,
+ G_TYPE_OBJECT)
+
+
+static void
+e_mail_display_popup_extension_default_init (EMailDisplayPopupExtensionInterface *iface)
+{
+
+}
+
+/**
+ * e_mail_display_popup_extension_update_actions:
+ *
+ * @extension: An object derived from #EMailDisplayPopupExtension
+ * @context: A #WebKitHitTestResult describing context of the popup menu
+ *
+ * When #EMailDisplay is about to display a popup menu, it calls this function
+ * on every extension so that they can add their items to the menu.
+ */
+void
+e_mail_display_popup_extension_update_actions (EMailDisplayPopupExtension *extension,
+ WebKitHitTestResult *context)
+{
+ EMailDisplayPopupExtensionInterface *iface;
+
+ g_return_if_fail (E_IS_MAIL_DISPLAY_POPUP_EXTENSION (extension));
+
+ iface = E_MAIL_DISPLAY_POPUP_EXTENSION_GET_INTERFACE (extension);
+ g_return_if_fail (iface->update_actions != NULL);
+
+ iface->update_actions (extension, context);
+}
diff --git a/mail/e-mail-display-popup-extension.h b/mail/e-mail-display-popup-extension.h
new file mode 100644
index 0000000000..307071e56e
--- /dev/null
+++ b/mail/e-mail-display-popup-extension.h
@@ -0,0 +1,64 @@
+/*
+ * e-mail-dispaly-popup-extension.h
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+#ifndef E_MAIL_DISPLAY_POPUP_EXTENSION_H
+#define E_MAIL_DISPLAY_POPUP_EXTENSION_H
+
+#include <glib-object.h>
+#include <webkit/webkit.h>
+
+/* Standard GObject macros */
+#define E_TYPE_MAIL_DISPLAY_POPUP_EXTENSION \
+ (e_mail_display_popup_extension_get_type ())
+#define E_MAIL_DISPLAY_POPUP_EXTENSION(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST \
+ ((obj), E_TYPE_MAIL_DISPLAY_POPUP_EXTENSION, EMailDisplayPopupExtension))
+#define E_MAIL_DISPLAY_POPUP_EXTENSION_INTERFACE(cls) \
+ (G_TYPE_CHECK_CLASS_CAST \
+ ((cls), E_TYPE_MAIL_DISPLAY_POPUP_EXTENSION, EMailDisplayPopupExtensionInterface))
+#define E_IS_MAIL_DISPLAY_POPUP_EXTENSION(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE \
+ ((obj), E_TYPE_MAIL_DISPLAY_POPUP_EXTENSION))
+#define E_IS_MAIL_DISPLAY_POPUP_EXTENSION_INTERFACE(cls) \
+ (G_TYPE_CHECK_CLASS_TYPE \
+ ((cls), E_TYPE_MAIL_DISPLAY_POPUP_EXTENSION))
+#define E_MAIL_DISPLAY_POPUP_EXTENSION_GET_INTERFACE(obj) \
+ (G_TYPE_INSTANCE_GET_INTERFACE \
+ ((obj), E_TYPE_MAIL_DISPLAY_POPUP_EXTENSION, EMailDisplayPopupExtensionInterface))
+
+G_BEGIN_DECLS
+
+typedef struct _EMailDisplayPopupExtension EMailDisplayPopupExtension;
+typedef struct _EMailDisplayPopupExtensionInterface EMailDisplayPopupExtensionInterface;
+
+struct _EMailDisplayPopupExtensionInterface {
+ GTypeInterface parent_interface;
+
+ void (*update_actions) (EMailDisplayPopupExtension *extension,
+ WebKitHitTestResult *context);
+};
+
+GType e_mail_display_popup_extension_get_type (void);
+
+void e_mail_display_popup_extension_update_actions
+ (EMailDisplayPopupExtension *extension,
+ WebKitHitTestResult *context);
+
+G_END_DECLS
+
+#endif /* E_MAIL_DISPLAY_POPUP_EXTENSION_H */
diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c
index dab8c3be1c..6e0f0a32e5 100644
--- a/mail/e-mail-display.c
+++ b/mail/e-mail-display.c
@@ -24,6 +24,7 @@
#endif
#include "e-mail-display.h"
+#include "e-mail-display-popup-extension.h"
#include <glib/gi18n.h>
#include <gdk/gdk.h>
@@ -52,7 +53,10 @@
#define d(x)
-G_DEFINE_TYPE (EMailDisplay, e_mail_display, E_TYPE_WEB_VIEW)
+G_DEFINE_TYPE (
+ EMailDisplay,
+ e_mail_display,
+ E_TYPE_WEB_VIEW);
#define E_MAIL_DISPLAY_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE \
@@ -161,49 +165,67 @@ static GtkActionEntry image_entries[] = {
};
-static void
-mail_display_update_actions (EWebView *web_view,
- GdkEventButton *event)
+static gboolean
+mail_display_button_press_event (GtkWidget *widget,
+ GdkEventButton *event)
{
WebKitHitTestResult *hit_test;
WebKitHitTestResultContext context;
gchar *image_src;
gboolean visible;
GtkAction *action;
-
- /* Chain up first! */
- E_WEB_VIEW_CLASS (e_mail_display_parent_class)->
- update_actions (web_view, event);
+ GList *extensions, *iter;
+ EWebView *web_view = E_WEB_VIEW (widget);
hit_test = webkit_web_view_get_hit_test_result (
WEBKIT_WEB_VIEW (web_view), event);
+
g_object_get (
G_OBJECT (hit_test),
"context", &context,
"image-uri", &image_src,
NULL);
- if (!(context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE))
- return;
+ if ((context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE)) {
+ visible = image_src && g_str_has_prefix (image_src, "cid:");
+ if (!visible && image_src) {
+ CamelStream *image_stream;
- visible = image_src && g_str_has_prefix (image_src, "cid:");
- if (!visible && image_src) {
- CamelStream *image_stream;
+ image_stream = camel_data_cache_get (
+ emd_global_http_cache, "http",
+ image_src, NULL);
- image_stream = camel_data_cache_get (emd_global_http_cache, "http", image_src, NULL);
+ visible = image_stream != NULL;
- visible = image_stream != NULL;
+ if (image_stream)
+ g_object_unref (image_stream);
+ }
+
+ if (image_src)
+ g_free (image_src);
- if (image_stream)
- g_object_unref (image_stream);
+ action = e_web_view_get_action (web_view, "image-save");
+ if (action)
+ gtk_action_set_visible (action, visible);
}
- if (image_src)
- g_free (image_src);
+ extensions = e_extensible_list_extensions (
+ E_EXTENSIBLE (web_view), E_TYPE_EXTENSION);
+ for (iter = extensions; iter; iter = g_list_next (iter)) {
+ EExtension *extension = iter->data;
+
+ if (!E_IS_MAIL_DISPLAY_POPUP_EXTENSION (extension))
+ continue;
- action = e_web_view_get_action (web_view, "image-save");
- if (action)
- gtk_action_set_visible (action, visible);
+ e_mail_display_popup_extension_update_actions (
+ E_MAIL_DISPLAY_POPUP_EXTENSION (extension), hit_test);
+ }
+ g_list_free (extensions);
+
+ g_object_unref (hit_test);
+
+ /* Chain up to parent's button_press_event() method. */
+ return GTK_WIDGET_CLASS (e_mail_display_parent_class)->button_press_event (widget, event);
}
static void
@@ -231,6 +253,15 @@ mail_display_update_formatter_colors (EMailDisplay *display)
}
static void
+mail_display_constructed (GObject *object)
+{
+ e_extensible_load_extensions (E_EXTENSIBLE (object));
+
+ /* Chain up to parent's constructed() method. */
+ G_OBJECT_CLASS (e_mail_display_parent_class)->constructed (object);
+}
+
+static void
mail_display_set_property (GObject *object,
guint property_id,
const GValue *value,
@@ -1358,17 +1389,18 @@ e_mail_display_class_init (EMailDisplayClass *class)
g_type_class_add_private (class, sizeof (EMailDisplayPrivate));
object_class = G_OBJECT_CLASS (class);
+ object_class->constructed = mail_display_constructed;
object_class->set_property = mail_display_set_property;
object_class->get_property = mail_display_get_property;
object_class->dispose = mail_display_dispose;
web_view_class = E_WEB_VIEW_CLASS (class);
web_view_class->set_fonts = mail_display_set_fonts;
- web_view_class->update_actions = mail_display_update_actions;
widget_class = GTK_WIDGET_CLASS (class);
widget_class->realize = mail_display_realize;
widget_class->style_set = mail_display_style_set;
+ widget_class->button_press_event = mail_display_button_press_event;
g_object_class_install_property (
object_class,