[gtkhtml] Allow overriding the HTML widget in GtkhtmlEditor.



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]