[gtkhtml] Allow overriding the HTML widget in GtkhtmlEditor.
- From: Matthew Barnes <mbarnes src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gtkhtml] Allow overriding the HTML widget in GtkhtmlEditor.
- Date: Sat, 26 Dec 2009 01:30:09 +0000 (UTC)
commit 9e7db9dc82e707161e3ee7141646cb0c7cf8b723
Author: Matthew Barnes <mbarnes redhat com>
Date: Fri Dec 25 13:15:57 2009 -0500
Allow overriding the HTML widget in GtkhtmlEditor.
This adds a construct-only "html" property which allows a custom GtkHTML
(or subclass) to be used in a GtkhtmlEditor instance.
Evolution uses this to provide an EWebView instance, which implements
more policies than a plain GtkHTML instance.
Also remove some obsolete initialization logic from the core GtkHTML
widget which was meant for the old Bonobo-based editor component.
components/editor/gtkhtml-editor-private.c | 23 +++--
components/editor/gtkhtml-editor-private.h | 58 ++++++------
components/editor/gtkhtml-editor.c | 140 ++++++++++++++++++----------
gtkhtml/gtkhtml-properties.c | 2 +-
gtkhtml/gtkhtml-properties.h | 2 +-
gtkhtml/gtkhtml.c | 46 +--------
6 files changed, 143 insertions(+), 128 deletions(-)
---
diff --git a/components/editor/gtkhtml-editor-private.c b/components/editor/gtkhtml-editor-private.c
index 087e383..49aa011 100644
--- a/components/editor/gtkhtml-editor-private.c
+++ b/components/editor/gtkhtml-editor-private.c
@@ -318,10 +318,6 @@ gtkhtml_editor_private_init (GtkhtmlEditor *editor)
{
GtkhtmlEditorPrivate *priv = editor->priv;
- GtkHTML *html;
- GtkWidget *widget;
- GtkToolbar *toolbar;
- GtkToolItem *tool_item;
gchar *filename;
GError *error = NULL;
@@ -371,6 +367,20 @@ gtkhtml_editor_private_init (GtkhtmlEditor *editor)
gtk_builder_connect_signals (priv->builder, NULL);
+ /* Wait to construct the main window widgets
+ * until the 'html' property is initialized. */
+}
+
+void
+gtkhtml_editor_private_constructed (GtkhtmlEditor *editor)
+{
+ GtkhtmlEditorPrivate *priv = editor->priv;
+
+ GtkHTML *html;
+ GtkWidget *widget;
+ GtkToolbar *toolbar;
+ GtkToolItem *tool_item;
+
/* Construct main window widgets. */
widget = gtkhtml_editor_get_managed_widget (editor, "/main-menu");
@@ -405,11 +415,8 @@ gtkhtml_editor_private_init (GtkhtmlEditor *editor)
priv->scrolled_window = g_object_ref (widget);
gtk_widget_show (widget);
- widget = gtk_html_new ();
- gtk_html_load_empty (GTK_HTML (widget));
- gtk_html_set_editable (GTK_HTML (widget), TRUE);
+ widget = GTK_WIDGET (gtkhtml_editor_get_html (editor));
gtk_container_add (GTK_CONTAINER (priv->scrolled_window), widget);
- priv->edit_area = g_object_ref (widget);
gtk_widget_show (widget);
/* Add some combo boxes to the "edit" toolbar. */
diff --git a/components/editor/gtkhtml-editor-private.h b/components/editor/gtkhtml-editor-private.h
index 7e07851..60d34b0 100644
--- a/components/editor/gtkhtml-editor-private.h
+++ b/components/editor/gtkhtml-editor-private.h
@@ -192,37 +192,39 @@ struct _GtkhtmlEditorRequest {
gchar buffer[4096];
};
-void gtkhtml_editor_private_init (GtkhtmlEditor *editor);
-void gtkhtml_editor_private_dispose (GtkhtmlEditor *editor);
-void gtkhtml_editor_private_finalize (GtkhtmlEditor *editor);
+void gtkhtml_editor_private_init (GtkhtmlEditor *editor);
+void gtkhtml_editor_private_constructed
+ (GtkhtmlEditor *editor);
+void gtkhtml_editor_private_dispose (GtkhtmlEditor *editor);
+void gtkhtml_editor_private_finalize (GtkhtmlEditor *editor);
/* Private Utilities */
-void gtkhtml_editor_actions_init (GtkhtmlEditor *editor);
-gchar * gtkhtml_editor_find_data_file (const gchar *basename);
-gint gtkhtml_editor_insert_file (GtkhtmlEditor *editor,
- const gchar *title,
- GCallback response_cb);
-void gtkhtml_editor_request_async (GtkhtmlEditor *editor,
- const gchar *uri,
- GtkHTMLStream *stream,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-gboolean gtkhtml_editor_request_finish (GtkhtmlEditor *editor,
- GAsyncResult *result,
- GError **error);
-GFile * gtkhtml_editor_run_open_dialog (GtkhtmlEditor *editor,
- const gchar *title,
- GtkCallback customize_func,
- gpointer customize_data);
-void gtkhtml_editor_show_uri (GtkWindow *parent,
- const gchar *uri);
-void gtkhtml_editor_spell_check (GtkhtmlEditor *editor,
- gboolean whole_document);
-gboolean gtkhtml_editor_next_spell_error (GtkhtmlEditor *editor);
-gboolean gtkhtml_editor_prev_spell_error (GtkhtmlEditor *editor);
-void gtkhtml_editor_update_context (GtkhtmlEditor *editor);
+void gtkhtml_editor_actions_init (GtkhtmlEditor *editor);
+gchar * gtkhtml_editor_find_data_file (const gchar *basename);
+gint gtkhtml_editor_insert_file (GtkhtmlEditor *editor,
+ const gchar *title,
+ GCallback response_cb);
+void gtkhtml_editor_request_async (GtkhtmlEditor *editor,
+ const gchar *uri,
+ GtkHTMLStream *stream,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gboolean gtkhtml_editor_request_finish (GtkhtmlEditor *editor,
+ GAsyncResult *result,
+ GError **error);
+GFile * gtkhtml_editor_run_open_dialog (GtkhtmlEditor *editor,
+ const gchar *title,
+ GtkCallback customize_func,
+ gpointer customize_data);
+void gtkhtml_editor_show_uri (GtkWindow *parent,
+ const gchar *uri);
+void gtkhtml_editor_spell_check (GtkhtmlEditor *editor,
+ gboolean whole_document);
+gboolean gtkhtml_editor_next_spell_error (GtkhtmlEditor *editor);
+gboolean gtkhtml_editor_prev_spell_error (GtkhtmlEditor *editor);
+void gtkhtml_editor_update_context (GtkhtmlEditor *editor);
G_END_DECLS
diff --git a/components/editor/gtkhtml-editor.c b/components/editor/gtkhtml-editor.c
index c7fdbf5..cbfc4f0 100644
--- a/components/editor/gtkhtml-editor.c
+++ b/components/editor/gtkhtml-editor.c
@@ -28,6 +28,7 @@ enum {
PROP_0,
PROP_CURRENT_FOLDER,
PROP_FILENAME,
+ PROP_HTML,
PROP_HTML_MODE,
PROP_INLINE_SPELLING,
PROP_MAGIC_LINKS,
@@ -113,7 +114,7 @@ editor_button_press_event_cb (GtkhtmlEditor *editor,
editor_show_popup_menu (editor, event, object, offset);
- return FALSE;
+ return TRUE;
}
static void
@@ -473,11 +474,29 @@ static GtkHTMLEditorAPI editor_api = {
editor_method_set_language
};
+static void
+editor_set_html (GtkhtmlEditor *editor,
+ GtkHTML *html)
+{
+ g_return_if_fail (editor->priv->edit_area == NULL);
+
+ if (html == NULL)
+ html = (GtkHTML *) gtk_html_new ();
+ else
+ g_return_if_fail (GTK_IS_HTML (html));
+
+ gtk_html_load_empty (html);
+ gtk_html_set_editable (html, TRUE);
+
+ editor->priv->edit_area = g_object_ref_sink (html);
+}
+
static GObject *
editor_constructor (GType type,
guint n_construct_properties,
GObjectConstructParam *construct_properties)
{
+ GtkHTML *html;
GtkhtmlEditor *editor;
GObject *object;
@@ -487,9 +506,46 @@ editor_constructor (GType type,
editor = GTKHTML_EDITOR (object);
+ gtkhtml_editor_private_constructed (editor);
+
+ html = gtkhtml_editor_get_html (editor);
+ gtk_html_set_editor_api (html, &editor_api, editor);
+
gtk_container_add (GTK_CONTAINER (object), editor->vbox);
gtk_window_set_default_size (GTK_WINDOW (object), 600, 440);
+ /* Listen for events from core and update the UI accordingly. */
+
+ g_signal_connect_swapped (
+ html, "button_press_event",
+ G_CALLBACK (editor_button_press_event_cb), editor);
+
+ g_signal_connect_swapped (
+ html, "current_paragraph_alignment_changed",
+ G_CALLBACK (editor_alignment_changed_cb), editor);
+
+ g_signal_connect_swapped (
+ html, "current_paragraph_indentation_changed",
+ G_CALLBACK (editor_indentation_changed_cb), editor);
+
+ g_signal_connect_swapped (
+ html, "current_paragraph_style_changed",
+ G_CALLBACK (editor_paragraph_style_changed_cb), editor);
+
+ g_signal_connect_swapped (
+ html, "insertion_font_style_changed",
+ G_CALLBACK (editor_font_style_changed_cb), editor);
+
+ g_signal_connect_swapped (
+ html, "popup-menu",
+ G_CALLBACK (editor_popup_menu_cb), editor);
+
+ g_signal_connect_swapped (
+ html, "url_requested",
+ G_CALLBACK (editor_url_requested_cb), editor);
+
+ /* Connect property dialog widgets to actions. */
+
gtk_activatable_set_related_action (
GTK_ACTIVATABLE (WIDGET (TEXT_PROPERTIES_BOLD_BUTTON)),
ACTION (BOLD));
@@ -603,6 +659,12 @@ editor_set_property (GObject *object,
g_value_get_string (value));
return;
+ case PROP_HTML:
+ editor_set_html (
+ GTKHTML_EDITOR (object),
+ g_value_get_object (value));
+ return;
+
case PROP_HTML_MODE:
gtkhtml_editor_set_html_mode (
GTKHTML_EDITOR (object),
@@ -650,6 +712,12 @@ editor_get_property (GObject *object,
GTKHTML_EDITOR (object)));
return;
+ case PROP_HTML:
+ g_value_set_object (
+ value, gtkhtml_editor_get_html (
+ GTKHTML_EDITOR (object)));
+ return;
+
case PROP_HTML_MODE:
g_value_set_boolean (
value, gtkhtml_editor_get_html_mode (
@@ -774,8 +842,8 @@ editor_class_init (GtkhtmlEditorClass *class)
_("Current Folder"),
_("The initial folder for file chooser dialogs"),
g_get_home_dir (),
- G_PARAM_CONSTRUCT |
- G_PARAM_READWRITE));
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
g_object_class_install_property (
object_class,
@@ -785,8 +853,19 @@ editor_class_init (GtkhtmlEditorClass *class)
_("Filename"),
_("The filename to use when saving"),
NULL,
- G_PARAM_CONSTRUCT |
- G_PARAM_READWRITE));
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
+
+ g_object_class_install_property (
+ object_class,
+ PROP_HTML,
+ g_param_spec_object (
+ "html",
+ _("HTML Editing Widget"),
+ _("The main HTML editing widget"),
+ GTK_TYPE_HTML,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (
object_class,
@@ -796,8 +875,8 @@ editor_class_init (GtkhtmlEditorClass *class)
_("HTML Mode"),
_("Edit HTML or plain text"),
TRUE,
- G_PARAM_CONSTRUCT |
- G_PARAM_READWRITE));
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
g_object_class_install_property (
object_class,
@@ -807,8 +886,8 @@ editor_class_init (GtkhtmlEditorClass *class)
_("Inline Spelling"),
_("Check your spelling as you type"),
TRUE,
- G_PARAM_CONSTRUCT |
- G_PARAM_READWRITE));
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
g_object_class_install_property (
object_class,
@@ -818,8 +897,8 @@ editor_class_init (GtkhtmlEditorClass *class)
_("Magic Links"),
_("Make URIs clickable as you type"),
TRUE,
- G_PARAM_CONSTRUCT |
- G_PARAM_READWRITE));
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
g_object_class_install_property (
object_class,
@@ -829,8 +908,8 @@ editor_class_init (GtkhtmlEditorClass *class)
_("Magic Smileys"),
_("Convert emoticons to images as you type"),
TRUE,
- G_PARAM_CONSTRUCT |
- G_PARAM_READWRITE));
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT));
signals[COMMAND_AFTER] = g_signal_new (
"command-after",
@@ -896,8 +975,6 @@ editor_class_init (GtkhtmlEditorClass *class)
static void
editor_init (GtkhtmlEditor *editor)
{
- GtkHTML *html;
-
editor->priv = GTKHTML_EDITOR_GET_PRIVATE (editor);
editor->vbox = g_object_ref_sink (gtk_vbox_new (FALSE, 0));
gtk_widget_show (editor->vbox);
@@ -906,39 +983,6 @@ editor_init (GtkhtmlEditor *editor)
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
gtkhtml_editor_private_init (editor);
-
- html = gtkhtml_editor_get_html (editor);
- gtk_html_set_editor_api (html, &editor_api, editor);
-
- /* Listen for events from core and update the UI accordingly. */
-
- g_signal_connect_swapped (
- html, "button_press_event",
- G_CALLBACK (editor_button_press_event_cb), editor);
-
- g_signal_connect_swapped (
- html, "current_paragraph_alignment_changed",
- G_CALLBACK (editor_alignment_changed_cb), editor);
-
- g_signal_connect_swapped (
- html, "current_paragraph_indentation_changed",
- G_CALLBACK (editor_indentation_changed_cb), editor);
-
- g_signal_connect_swapped (
- html, "current_paragraph_style_changed",
- G_CALLBACK (editor_paragraph_style_changed_cb), editor);
-
- g_signal_connect_swapped (
- html, "insertion_font_style_changed",
- G_CALLBACK (editor_font_style_changed_cb), editor);
-
- g_signal_connect_swapped (
- html, "popup-menu",
- G_CALLBACK (editor_popup_menu_cb), editor);
-
- g_signal_connect_swapped (
- html, "url_requested",
- G_CALLBACK (editor_url_requested_cb), editor);
}
GType
diff --git a/gtkhtml/gtkhtml-properties.c b/gtkhtml/gtkhtml-properties.c
index e5dd39c..1d56485 100644
--- a/gtkhtml/gtkhtml-properties.c
+++ b/gtkhtml/gtkhtml-properties.c
@@ -86,7 +86,7 @@ get_locale_language (void)
}
GtkHTMLClassProperties *
-gtk_html_class_properties_new (GtkWidget *widget)
+gtk_html_class_properties_new (void)
{
GtkHTMLClassProperties *p = g_new0 (GtkHTMLClassProperties, 1);
diff --git a/gtkhtml/gtkhtml-properties.h b/gtkhtml/gtkhtml-properties.h
index ebfacf2..ac462a5 100644
--- a/gtkhtml/gtkhtml-properties.h
+++ b/gtkhtml/gtkhtml-properties.h
@@ -47,7 +47,7 @@ struct _GtkHTMLClassProperties {
gchar *language; /* unused */
};
-GtkHTMLClassProperties * gtk_html_class_properties_new (GtkWidget *widget);
+GtkHTMLClassProperties * gtk_html_class_properties_new (void);
void gtk_html_class_properties_destroy (GtkHTMLClassProperties *p);
void gtk_html_class_properties_copy (GtkHTMLClassProperties *p1,
GtkHTMLClassProperties *p2);
diff --git a/gtkhtml/gtkhtml.c b/gtkhtml/gtkhtml.c
index 35b3a53..06199ea 100644
--- a/gtkhtml/gtkhtml.c
+++ b/gtkhtml/gtkhtml.c
@@ -128,7 +128,6 @@ struct _ClipboardContents {
static GtkLayoutClass *parent_class = NULL;
-static GConfClient *gconf_client = NULL;
static GError *gconf_error = NULL;
enum {
@@ -791,7 +790,9 @@ destroy (GtkObject *object)
}
if (html->priv->notify_monospace_font_id) {
- gconf_client_notify_remove (gconf_client, html->priv->notify_monospace_font_id);
+ gconf_client_notify_remove (
+ gconf_client_get_default (),
+ html->priv->notify_monospace_font_id);
html->priv->notify_monospace_font_id = 0;
}
@@ -2357,34 +2358,6 @@ set_adjustments (GtkLayout *layout,
/* Initialization. */
static void
-setup_class_properties (GtkHTML *html)
-{
- GtkHTMLClass *klass;
-
- klass = GTK_HTML_CLASS (GTK_WIDGET_GET_CLASS (html));
- if (!klass->properties) {
- klass->properties = gtk_html_class_properties_new (GTK_WIDGET (html));
-
- if (!gconf_is_initialized ()) {
- gchar *argv[] = { (gchar *) "gtkhtml", NULL };
-
- g_warning ("gconf is not initialized, please call gconf_init before using GtkHTML library. "
- "Meanwhile it's initialized by gtkhtml itself.");
- gconf_init (1, argv, &gconf_error);
- if (gconf_error)
- g_error ("gconf error: %s\n", gconf_error->message);
- }
-
- gconf_client = gconf_client_get_default ();
- if (!gconf_client)
- g_error ("cannot create gconf_client\n");
- gconf_client_add_dir (gconf_client, GTK_HTML_GCONF_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, &gconf_error);
- if (gconf_error)
- g_error ("gconf error: %s\n", gconf_error->message);
- }
-}
-
-static void
set_focus_child (GtkContainer *containter, GtkWidget *w)
{
HTMLObject *o = NULL;
@@ -3174,6 +3147,7 @@ gtk_html_class_init (GtkHTMLClass *klass)
html_class->scroll = scroll;
html_class->cursor_move = cursor_move;
html_class->command = command;
+ html_class->properties = gtk_html_class_properties_new ();
add_bindings (klass);
gtk_html_accessibility_init ();
@@ -3196,16 +3170,6 @@ gtk_html_class_init (GtkHTMLClass *klass)
g_object_unref (client);
}
-static void
-init_properties_widget (GtkHTML *html)
-{
- setup_class_properties (html);
-
- if (!gconf_client)
- gconf_client = gconf_client_get_default ();
-
-}
-
void
gtk_html_im_reset (GtkHTML *html)
{
@@ -3589,8 +3553,6 @@ gtk_html_construct (GtkHTML *html)
G_CALLBACK (html_engine_submit_cb), html);
g_signal_connect (G_OBJECT (html->engine), "object_requested",
G_CALLBACK (html_engine_object_requested_cb), html);
-
- init_properties_widget (html);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]