[evolution] Add an extension to configure EWebView.
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Add an extension to configure EWebView.
- Date: Mon, 22 Mar 2010 16:05:17 +0000 (UTC)
commit 7094f32df13b8ddfe0e41c746481efb6d9f750fd
Author: Matthew Barnes <mbarnes redhat com>
Date: Mon Mar 22 12:03:46 2010 -0400
Add an extension to configure EWebView.
Make EWebView extensible and register an extension to automatically
bind every EWebView instance to the appropriate EShellSettings.
mail/e-mail-reader.c | 4 -
modules/mail/Makefile.am | 2 +
modules/mail/e-mail-config-web-view.c | 100 ++++++++++++++++
modules/mail/e-mail-config-web-view.h | 30 +++++
modules/mail/e-mail-shell-backend.c | 15 ---
modules/mail/evolution-module-mail.c | 2 +
widgets/misc/e-web-view.c | 211 ++++++++++++++++++++++++++-------
widgets/misc/e-web-view.h | 9 ++
8 files changed, 310 insertions(+), 63 deletions(-)
---
diff --git a/mail/e-mail-reader.c b/mail/e-mail-reader.c
index 7a8d7a9..6448f5b 100644
--- a/mail/e-mail-reader.c
+++ b/mail/e-mail-reader.c
@@ -2668,10 +2668,6 @@ e_mail_reader_init (EMailReader *reader)
/* Bind properties. */
- e_binding_new (
- shell_settings, "mail-show-animated-images",
- web_view, "animate");
-
action_name = "mail-caret-mode";
action = e_mail_reader_get_action (reader, action_name);
diff --git a/modules/mail/Makefile.am b/modules/mail/Makefile.am
index d08a686..3238202 100644
--- a/modules/mail/Makefile.am
+++ b/modules/mail/Makefile.am
@@ -21,6 +21,8 @@ libevolution_module_mail_la_SOURCES = \
e-mail-config-format-html.h \
e-mail-config-hook.c \
e-mail-config-hook.h \
+ e-mail-config-web-view.c \
+ e-mail-config-web-view.h \
e-mail-event-hook.c \
e-mail-event-hook.h \
e-mail-junk-hook.c \
diff --git a/modules/mail/e-mail-config-web-view.c b/modules/mail/e-mail-config-web-view.c
new file mode 100644
index 0000000..5cfb648
--- /dev/null
+++ b/modules/mail/e-mail-config-web-view.c
@@ -0,0 +1,100 @@
+/*
+ * e-mail-config-web-view.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-config-web-view.h"
+
+#include <shell/e-shell.h>
+#include <e-util/e-binding.h>
+#include <e-util/e-extension.h>
+#include <misc/e-web-view.h>
+
+static void
+mail_config_web_view_realize (GtkWidget *widget)
+{
+ EShell *shell;
+ EShellSettings *shell_settings;
+
+ shell = e_shell_get_default ();
+ shell_settings = e_shell_get_shell_settings (shell);
+
+ e_binding_new (
+ shell_settings, "mail-show-animated-images",
+ widget, "animate");
+
+ e_binding_new (
+ shell_settings, "composer-inline-spelling",
+ widget, "inline-spelling");
+
+ e_binding_new (
+ shell_settings, "composer-magic-links",
+ widget, "magic-links");
+
+ e_binding_new (
+ shell_settings, "composer-magic-smileys",
+ widget, "magic-smileys");
+}
+
+static void
+mail_config_web_view_constructed (GObject *object)
+{
+ EExtension *extension;
+ EExtensible *extensible;
+
+ extension = E_EXTENSION (object);
+ extensible = e_extension_get_extensible (extension);
+
+ /* Wait to bind shell settings until the EWebView is realized
+ * so GtkhtmlEditor has a chance to install a GtkHTMLEditorAPI.
+ * Otherwise our settings will have no effect. */
+
+ g_signal_connect (
+ extensible, "realize",
+ G_CALLBACK (mail_config_web_view_realize), NULL);
+}
+
+static void
+mail_config_web_view_class_init (EExtensionClass *class)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->constructed = mail_config_web_view_constructed;
+
+ class->extensible_type = E_TYPE_WEB_VIEW;
+}
+
+void
+e_mail_config_web_view_register_type (GTypeModule *type_module)
+{
+ static const GTypeInfo type_info = {
+ sizeof (EExtensionClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) mail_config_web_view_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+ sizeof (EExtension),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) NULL,
+ NULL /* value_table */
+ };
+
+ g_type_module_register_type (
+ type_module, E_TYPE_EXTENSION,
+ "EMailConfigWebView", &type_info, 0);
+}
diff --git a/modules/mail/e-mail-config-web-view.h b/modules/mail/e-mail-config-web-view.h
new file mode 100644
index 0000000..c2a8758
--- /dev/null
+++ b/modules/mail/e-mail-config-web-view.h
@@ -0,0 +1,30 @@
+/*
+ * e-mail-config-web-view.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_CONFIG_WEB_VIEW_H
+#define E_MAIL_CONFIG_WEB_VIEW_H
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+void e_mail_config_web_view_register_type (GTypeModule *type_module);
+
+G_END_DECLS
+
+#endif /* E_MAIL_CONFIG_WEB_VIEW_H */
diff --git a/modules/mail/e-mail-shell-backend.c b/modules/mail/e-mail-shell-backend.c
index de8d4f4..00b4a78 100644
--- a/modules/mail/e-mail-shell-backend.c
+++ b/modules/mail/e-mail-shell-backend.c
@@ -408,28 +408,13 @@ mail_shell_backend_window_created_cb (EShell *shell,
GtkWindow *window,
EShellBackend *shell_backend)
{
- EShellSettings *shell_settings;
static gboolean first_time = TRUE;
const gchar *backend_name;
- shell_settings = e_shell_get_shell_settings (shell);
-
/* This applies to both the composer and signature editor. */
if (GTKHTML_IS_EDITOR (window)) {
GList *spell_languages;
- e_binding_new (
- shell_settings, "composer-inline-spelling",
- window, "inline-spelling");
-
- e_binding_new (
- shell_settings, "composer-magic-links",
- window, "magic-links");
-
- e_binding_new (
- shell_settings, "composer-magic-smileys",
- window, "magic-smileys");
-
spell_languages = e_load_spell_languages ();
gtkhtml_editor_set_spell_languages (
GTKHTML_EDITOR (window), spell_languages);
diff --git a/modules/mail/evolution-module-mail.c b/modules/mail/evolution-module-mail.c
index f6661cd..9e97445 100644
--- a/modules/mail/evolution-module-mail.c
+++ b/modules/mail/evolution-module-mail.c
@@ -31,6 +31,7 @@
#include "e-mail-shell-view.h"
#include "e-mail-config-format-html.h"
+#include "e-mail-config-web-view.h"
/* Module Entry Points */
void e_module_load (GTypeModule *type_module);
@@ -54,6 +55,7 @@ e_module_load (GTypeModule *type_module)
e_mail_shell_view_register_type (type_module);
e_mail_config_format_html_register_type (type_module);
+ e_mail_config_web_view_register_type (type_module);
}
G_MODULE_EXPORT void
diff --git a/widgets/misc/e-web-view.c b/widgets/misc/e-web-view.c
index e9fc71d..c65f9cf 100644
--- a/widgets/misc/e-web-view.c
+++ b/widgets/misc/e-web-view.c
@@ -28,9 +28,10 @@
#include <camel/camel-internet-address.h>
#include <camel/camel-url.h>
-#include "e-util/e-util.h"
-#include "e-util/e-binding.h"
-#include "e-util/e-plugin-ui.h"
+#include <e-util/e-util.h>
+#include <e-util/e-binding.h>
+#include <e-util/e-extensible.h>
+#include <e-util/e-plugin-ui.h>
#include "e-popup-action.h"
#include "e-selectable.h"
@@ -75,6 +76,9 @@ enum {
PROP_DISABLE_PRINTING,
PROP_DISABLE_SAVE_TO_DISK,
PROP_EDITABLE,
+ PROP_INLINE_SPELLING,
+ PROP_MAGIC_LINKS,
+ PROP_MAGIC_SMILEYS,
PROP_OPEN_PROXY,
PROP_PASTE_TARGET_LIST,
PROP_PRINT_PROXY,
@@ -118,6 +122,14 @@ static const gchar *ui =
" </popup>"
"</ui>";
+/* Forward Declarations */
+static void e_web_view_selectable_init (ESelectableInterface *interface);
+
+G_DEFINE_TYPE_WITH_CODE (
+ EWebView, e_web_view, GTK_TYPE_HTML,
+ G_IMPLEMENT_INTERFACE (E_TYPE_EXTENSIBLE, NULL)
+ G_IMPLEMENT_INTERFACE (E_TYPE_SELECTABLE, e_web_view_selectable_init))
+
static EWebViewRequest *
web_view_request_new (EWebView *web_view,
const gchar *uri,
@@ -503,6 +515,24 @@ web_view_set_property (GObject *object,
g_value_get_boolean (value));
return;
+ case PROP_INLINE_SPELLING:
+ e_web_view_set_inline_spelling (
+ E_WEB_VIEW (object),
+ g_value_get_boolean (value));
+ return;
+
+ case PROP_MAGIC_LINKS:
+ e_web_view_set_magic_links (
+ E_WEB_VIEW (object),
+ g_value_get_boolean (value));
+ return;
+
+ case PROP_MAGIC_SMILEYS:
+ e_web_view_set_magic_smileys (
+ E_WEB_VIEW (object),
+ g_value_get_boolean (value));
+ return;
+
case PROP_OPEN_PROXY:
e_web_view_set_open_proxy (
E_WEB_VIEW (object),
@@ -574,6 +604,24 @@ web_view_get_property (GObject *object,
E_WEB_VIEW (object)));
return;
+ case PROP_INLINE_SPELLING:
+ g_value_set_boolean (
+ value, e_web_view_get_inline_spelling (
+ E_WEB_VIEW (object)));
+ return;
+
+ case PROP_MAGIC_LINKS:
+ g_value_set_boolean (
+ value, e_web_view_get_magic_links (
+ E_WEB_VIEW (object)));
+ return;
+
+ case PROP_MAGIC_SMILEYS:
+ g_value_set_boolean (
+ value, e_web_view_get_magic_smileys (
+ E_WEB_VIEW (object)));
+ return;
+
case PROP_OPEN_PROXY:
g_value_set_object (
value, e_web_view_get_open_proxy (
@@ -1004,7 +1052,7 @@ web_view_selectable_select_all (ESelectable *selectable)
}
static void
-web_view_class_init (EWebViewClass *class)
+e_web_view_class_init (EWebViewClass *class)
{
GObjectClass *object_class;
GtkWidgetClass *widget_class;
@@ -1063,7 +1111,6 @@ web_view_class_init (EWebViewClass *class)
PROP_COPY_TARGET_LIST,
"copy-target-list");
-#ifndef G_OS_WIN32
g_object_class_install_property (
object_class,
PROP_DISABLE_PRINTING,
@@ -1072,7 +1119,8 @@ web_view_class_init (EWebViewClass *class)
"Disable Printing",
NULL,
FALSE,
- G_PARAM_READWRITE));
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
g_object_class_install_property (
object_class,
@@ -1082,8 +1130,8 @@ web_view_class_init (EWebViewClass *class)
"Disable Save-to-Disk",
NULL,
FALSE,
- G_PARAM_READWRITE));
-#endif
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
g_object_class_install_property (
object_class,
@@ -1097,6 +1145,36 @@ web_view_class_init (EWebViewClass *class)
g_object_class_install_property (
object_class,
+ PROP_INLINE_SPELLING,
+ g_param_spec_boolean (
+ "inline-spelling",
+ "Inline Spelling",
+ NULL,
+ FALSE,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_MAGIC_LINKS,
+ g_param_spec_boolean (
+ "magic-links",
+ "Magic Links",
+ NULL,
+ FALSE,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_MAGIC_SMILEYS,
+ g_param_spec_boolean (
+ "magic-smileys",
+ "Magic Smileys",
+ NULL,
+ FALSE,
+ G_PARAM_READWRITE));
+
+ g_object_class_install_property (
+ object_class,
PROP_OPEN_PROXY,
g_param_spec_object (
"open-proxy",
@@ -1209,7 +1287,7 @@ web_view_class_init (EWebViewClass *class)
}
static void
-web_view_selectable_init (ESelectableInterface *interface)
+e_web_view_selectable_init (ESelectableInterface *interface)
{
interface->update_actions = web_view_selectable_update_actions;
interface->cut_clipboard = web_view_selectable_cut_clipboard;
@@ -1219,7 +1297,7 @@ web_view_selectable_init (ESelectableInterface *interface)
}
static void
-web_view_init (EWebView *web_view)
+e_web_view_init (EWebView *web_view)
{
GtkUIManager *ui_manager;
GtkActionGroup *action_group;
@@ -1335,41 +1413,8 @@ web_view_init (EWebView *web_view)
id = "org.gnome.evolution.webview";
e_plugin_ui_register_manager (ui_manager, id, web_view);
e_plugin_ui_enable_manager (ui_manager, id);
-}
-
-GType
-e_web_view_get_type (void)
-{
- static GType type = 0;
-
- if (G_UNLIKELY (type == 0)) {
- static const GTypeInfo type_info = {
- sizeof (EWebViewClass),
- (GBaseInitFunc) NULL,
- (GBaseFinalizeFunc) NULL,
- (GClassInitFunc) web_view_class_init,
- (GClassFinalizeFunc) NULL,
- NULL, /* class_data */
- sizeof (EWebView),
- 0, /* n_preallocs */
- (GInstanceInitFunc) web_view_init,
- NULL /* value_table */
- };
-
- static const GInterfaceInfo selectable_info = {
- (GInterfaceInitFunc) web_view_selectable_init,
- (GInterfaceFinalizeFunc) NULL,
- NULL /* interface_data */
- };
-
- type = g_type_register_static (
- GTK_TYPE_HTML, "EWebView", &type_info, 0);
-
- g_type_add_interface_static (
- type, E_TYPE_SELECTABLE, &selectable_info);
- }
- return type;
+ e_extensible_load_extensions (E_EXTENSIBLE (web_view));
}
GtkWidget *
@@ -1522,6 +1567,84 @@ e_web_view_set_editable (EWebView *web_view,
g_object_notify (G_OBJECT (web_view), "editable");
}
+gboolean
+e_web_view_get_inline_spelling (EWebView *web_view)
+{
+ /* XXX This is just here to maintain symmetry
+ * with e_web_view_set_inline_spelling(). */
+
+ g_return_val_if_fail (E_IS_WEB_VIEW (web_view), FALSE);
+
+ return gtk_html_get_inline_spelling (GTK_HTML (web_view));
+}
+
+void
+e_web_view_set_inline_spelling (EWebView *web_view,
+ gboolean inline_spelling)
+{
+ /* XXX GtkHTML does not utilize GObject properties as well
+ * as it could. This just wraps gtk_html_set_inline_spelling()
+ * so we get a "notify::inline-spelling" signal. */
+
+ g_return_if_fail (E_IS_WEB_VIEW (web_view));
+
+ gtk_html_set_inline_spelling (GTK_HTML (web_view), inline_spelling);
+
+ g_object_notify (G_OBJECT (web_view), "inline-spelling");
+}
+
+gboolean
+e_web_view_get_magic_links (EWebView *web_view)
+{
+ /* XXX This is just here to maintain symmetry
+ * with e_web_view_set_magic_links(). */
+
+ g_return_val_if_fail (E_IS_WEB_VIEW (web_view), FALSE);
+
+ return gtk_html_get_magic_links (GTK_HTML (web_view));
+}
+
+void
+e_web_view_set_magic_links (EWebView *web_view,
+ gboolean magic_links)
+{
+ /* XXX GtkHTML does not utilize GObject properties as well
+ * as it could. This just wraps gtk_html_set_magic_links()
+ * so we can get a "notify::magic-links" signal. */
+
+ g_return_if_fail (E_IS_WEB_VIEW (web_view));
+
+ gtk_html_set_magic_links (GTK_HTML (web_view), magic_links);
+
+ g_object_notify (G_OBJECT (web_view), "magic-links");
+}
+
+gboolean
+e_web_view_get_magic_smileys (EWebView *web_view)
+{
+ /* XXX This is just here to maintain symmetry
+ * with e_web_view_set_magic_smileys(). */
+
+ g_return_val_if_fail (E_IS_WEB_VIEW (web_view), FALSE);
+
+ return gtk_html_get_magic_smileys (GTK_HTML (web_view));
+}
+
+void
+e_web_view_set_magic_smileys (EWebView *web_view,
+ gboolean magic_smileys)
+{
+ /* XXX GtkHTML does not utilize GObject properties as well
+ * as it could. This just wraps gtk_html_set_magic_smileys()
+ * so we can get a "notify::magic-smileys" signal. */
+
+ g_return_if_fail (E_IS_WEB_VIEW (web_view));
+
+ gtk_html_set_magic_smileys (GTK_HTML (web_view), magic_smileys);
+
+ g_object_notify (G_OBJECT (web_view), "magic-smileys");
+}
+
const gchar *
e_web_view_get_selected_uri (EWebView *web_view)
{
diff --git a/widgets/misc/e-web-view.h b/widgets/misc/e-web-view.h
index 788eadb..0fea6eb 100644
--- a/widgets/misc/e-web-view.h
+++ b/widgets/misc/e-web-view.h
@@ -106,6 +106,15 @@ void e_web_view_set_disable_save_to_disk
gboolean e_web_view_get_editable (EWebView *web_view);
void e_web_view_set_editable (EWebView *web_view,
gboolean editable);
+gboolean e_web_view_get_inline_spelling (EWebView *web_view);
+void e_web_view_set_inline_spelling (EWebView *web_view,
+ gboolean inline_spelling);
+gboolean e_web_view_get_magic_links (EWebView *web_view);
+void e_web_view_set_magic_links (EWebView *web_view,
+ gboolean magic_links);
+gboolean e_web_view_get_magic_smileys (EWebView *web_view);
+void e_web_view_set_magic_smileys (EWebView *web_view,
+ gboolean magic_smileys);
const gchar * e_web_view_get_selected_uri (EWebView *web_view);
void e_web_view_set_selected_uri (EWebView *web_view,
const gchar *selected_uri);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]