[evolution/webkit-composer: 16/30] Fix block formatting



commit ed9e4ff254812185c565f9c2f96f61e4f8d7d434
Author: Dan VrÃtil <dvratil redhat com>
Date:   Thu Aug 23 14:46:18 2012 +0200

    Fix block formatting

 widgets/editor/e-editor-actions.c   |   19 +----
 widgets/editor/e-editor-selection.c |  141 +++++++++++++++++++++++++++-------
 widgets/editor/e-editor-selection.h |    2 +-
 3 files changed, 118 insertions(+), 44 deletions(-)
---
diff --git a/widgets/editor/e-editor-actions.c b/widgets/editor/e-editor-actions.c
index 3eb1630..5e6e6e7 100644
--- a/widgets/editor/e-editor-actions.c
+++ b/widgets/editor/e-editor-actions.c
@@ -844,19 +844,6 @@ action_properties_text_cb (GtkAction *action,
 }
 
 static void
-action_style_cb (GtkRadioAction *action,
-                 GtkRadioAction *current,
-                 EEditor *editor)
-{
-	EEditorSelection *selection;
-
-	selection = e_editor_widget_get_selection (
-			e_editor_get_editor_widget (editor));
-	e_editor_selection_set_block_format (
-		selection, gtk_radio_action_get_current_value (current));
-}
-
-static void
 action_redo_cb (GtkAction *action,
                 EEditor *editor)
 {
@@ -1848,7 +1835,7 @@ editor_actions_init (EEditor *editor)
 		action_group, core_style_entries,
 		G_N_ELEMENTS (core_style_entries),
 		E_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH,
-		G_CALLBACK (action_style_cb), editor);
+		NULL, NULL);
 	gtk_ui_manager_insert_action_group (manager, action_group, 0);
 
 	/* Synchronize wiget mode with the button */
@@ -1976,6 +1963,10 @@ editor_actions_init (EEditor *editor)
 		ACTION (FONT_SIZE_GROUP), "current-value",
 		G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
 	g_object_bind_property (
+		editor->priv->selection, "block-format",
+		ACTION (STYLE_NORMAL), "current-value",
+		G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
+	g_object_bind_property (
 		editor->priv->selection, "indented",
 		ACTION (UNINDENT), "sensitive",
 		G_BINDING_SYNC_CREATE);
diff --git a/widgets/editor/e-editor-selection.c b/widgets/editor/e-editor-selection.c
index 4a09baa..131336c 100644
--- a/widgets/editor/e-editor-selection.c
+++ b/widgets/editor/e-editor-selection.c
@@ -339,6 +339,11 @@ e_editor_selection_set_property (GObject *object,
 				selection, g_value_get_boxed (value));
 			return;
 
+		case PROP_BLOCK_FORMAT:
+			e_editor_selection_set_block_format (
+				selection, g_value_get_int (value));
+			return;
+
 		case PROP_FONT_NAME:
 			e_editor_selection_set_font_name (
 				selection, g_value_get_string (value));
@@ -483,12 +488,12 @@ e_editor_selection_class_init (EEditorSelectionClass *klass)
 	g_object_class_install_property (
 		object_class,
 		PROP_BLOCK_FORMAT,
-		g_param_spec_uint (
+		g_param_spec_int (
 			"block-format",
 			NULL,
 			NULL,
 			0,
-			G_MAXUINT,
+			G_MAXINT,
 			0,
 			G_PARAM_READWRITE));
 
@@ -829,43 +834,62 @@ e_editor_selection_get_block_format (EEditorSelection *selection)
 {
 	WebKitDOMNode *node;
 	WebKitDOMRange *range;
-	gchar *tmp, *node_name;
+	WebKitDOMElement *element;
 	EEditorSelectionBlockFormat result;
 
 	g_return_val_if_fail (E_IS_EDITOR_SELECTION (selection),
-			      E_EDITOR_SELECTION_BLOCK_FORMAT_NONE);
+			      E_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH);
 
 	range = editor_selection_get_current_range (selection);
-	node = webkit_dom_range_get_common_ancestor_container (range, NULL);
+	if (!range) {
+		return E_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH;
+	}
+
+	node = webkit_dom_range_get_start_container (range, NULL);
 
-	tmp = webkit_dom_node_get_node_name (node);
-	node_name = g_ascii_strdown (tmp, -1);
-	g_free (tmp);
+	if (e_editor_dom_node_find_parent_element (node, "UL")) {
+		result = E_EDITOR_SELECTION_BLOCK_FORMAT_UNORDERED_LIST;
+	} else if ((element = e_editor_dom_node_find_parent_element (node, "OL")) != NULL) {
+		if (webkit_dom_element_has_attribute (element, "type")) {
+			gchar *type;
+
+			type = webkit_dom_element_get_attribute(element, "type");
+			if (type && ((*type == 'a') || (*type == 'A'))) {
+				result = E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST_ALPHA;
+			} else if (type && ((*type == 'i') || (*type == 'I'))) {
+				result = E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST_ROMAN;
+			} else {
+				result = E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST;
+			}
 
-	if (g_strcmp0 (node_name, "blockquote") == 0)
+			g_free (type);
+		} else {
+			result = E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST;
+		}
+	} else if (e_editor_dom_node_find_parent_element (node, "BLOCKQUOTE")) {
 		result = E_EDITOR_SELECTION_BLOCK_FORMAT_BLOCKQUOTE;
-	else if (g_strcmp0 (node_name, "h1") == 0)
+	} else if (e_editor_dom_node_find_parent_element (node, "PRE")) {
+		result = E_EDITOR_SELECTION_BLOCK_FORMAT_PRE;
+	} else if (e_editor_dom_node_find_parent_element (node, "ADDRESS")) {
+		result = E_EDITOR_SELECTION_BLOCK_FORMAT_ADDRESS;
+	} else if (e_editor_dom_node_find_parent_element (node, "H1")) {
 		result = E_EDITOR_SELECTION_BLOCK_FORMAT_H1;
-	else if (g_strcmp0 (node_name, "h2") == 0)
+	} else if (e_editor_dom_node_find_parent_element (node, "H2")) {
 		result = E_EDITOR_SELECTION_BLOCK_FORMAT_H2;
-	else if (g_strcmp0 (node_name, "h3") == 0)
+	} else if (e_editor_dom_node_find_parent_element (node, "H3")) {
 		result = E_EDITOR_SELECTION_BLOCK_FORMAT_H3;
-	else if (g_strcmp0 (node_name, "h4") == 0)
+	} else if (e_editor_dom_node_find_parent_element (node, "H4")) {
 		result = E_EDITOR_SELECTION_BLOCK_FORMAT_H4;
-	else if (g_strcmp0 (node_name, "h5") == 0)
+	} else if (e_editor_dom_node_find_parent_element (node, "H5")) {
 		result = E_EDITOR_SELECTION_BLOCK_FORMAT_H5;
-	else if (g_strcmp0 (node_name, "h6") == 0)
+	} else if (e_editor_dom_node_find_parent_element (node, "H6")) {
 		result = E_EDITOR_SELECTION_BLOCK_FORMAT_H6;
-	else if (g_strcmp0 (node_name, "p") == 0)
+	} else if (e_editor_dom_node_find_parent_element (node, "P")) {
 		result = E_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH;
-	else if (g_strcmp0 (node_name, "pre") == 0)
-		result = E_EDITOR_SELECTION_BLOCK_FORMAT_PRE;
-	else if (g_strcmp0 (node_name, "address") == 0)
-		result = E_EDITOR_SELECTION_BLOCK_FORMAT_ADDRESS;
-	else
-		result = E_EDITOR_SELECTION_BLOCK_FORMAT_NONE;
+	} else {
+		result = E_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH;
+	}
 
-	g_free (node_name);
 	return result;
 }
 
@@ -873,55 +897,114 @@ void
 e_editor_selection_set_block_format (EEditorSelection *selection,
 				     EEditorSelectionBlockFormat format)
 {
+	EEditorSelectionBlockFormat current_format;
 	WebKitDOMDocument *document;
+	const gchar *command;
 	const gchar *value;
 
 	g_return_if_fail (E_IS_EDITOR_SELECTION (selection));
 
+	current_format = e_editor_selection_get_block_format (selection);
+	if (current_format == format) {
+		return;
+	}
+
+	document = webkit_web_view_get_dom_document (selection->priv->webview);
+
 	switch (format) {
 		case E_EDITOR_SELECTION_BLOCK_FORMAT_BLOCKQUOTE:
+			command = "formatBlock";
 			value = "BLOCKQUOTE";
 			break;
 		case E_EDITOR_SELECTION_BLOCK_FORMAT_H1:
+			command = "formatBlock";
 			value = "H1";
 			break;
 		case E_EDITOR_SELECTION_BLOCK_FORMAT_H2:
+			command = "formatBlock";
 			value = "H2";
 			break;
 		case E_EDITOR_SELECTION_BLOCK_FORMAT_H3:
+			command = "formatBlock";
 			value = "H3";
 			break;
 		case E_EDITOR_SELECTION_BLOCK_FORMAT_H4:
+			command = "formatBlock";
 			value = "H4";
 			break;
 		case E_EDITOR_SELECTION_BLOCK_FORMAT_H5:
+			command = "formatBlock";
 			value = "H5";
 			break;
 		case E_EDITOR_SELECTION_BLOCK_FORMAT_H6:
+			command = "formatBlock";
 			value = "H6";
 			break;
 		case E_EDITOR_SELECTION_BLOCK_FORMAT_PARAGRAPH:
+			command = "formatBlock";
 			value = "P";
 			break;
 		case E_EDITOR_SELECTION_BLOCK_FORMAT_PRE:
+			command = "formatBlock";
 			value = "PRE";
 			break;
 		case E_EDITOR_SELECTION_BLOCK_FORMAT_ADDRESS:
+			command = "formatBlock";
 			value = "ADDRESS";
 			break;
+		case E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST:
+		case E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST_ALPHA:
+		case E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST_ROMAN:
+			command = "insertOrderedList";
+			value = "";
+			break;
+		case E_EDITOR_SELECTION_BLOCK_FORMAT_UNORDERED_LIST:
+			command = "insertUnorderedList";
+			value = "";
+			break;
 		case E_EDITOR_SELECTION_BLOCK_FORMAT_NONE:
 		default:
-			value = NULL;
+			command = "removeFormat";
+			value = "";
 			break;
 	}
 
-	document = webkit_web_view_get_dom_document (selection->priv->webview);
-	if (value) {
+
+	/* First remove (un)ordered list before changing formatting */
+	if (current_format == E_EDITOR_SELECTION_BLOCK_FORMAT_UNORDERED_LIST) {
 		webkit_dom_document_exec_command (
-			document, "formatBlock", FALSE, value);
-	} else {
+			document, "insertUnorderedList", FALSE, "");
+		/*		    ^-- not a typo, "insert" toggles the formatting
+		 * 			if already present */
+	} else if (current_format >= E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST) {
 		webkit_dom_document_exec_command (
-			document, "removeFormat", FALSE, "");
+			document, "insertOrderedList", FALSE ,"");
+	}
+
+	webkit_dom_document_exec_command (
+		document, command, FALSE, value);
+
+	/* Fine tuning - set the specific marker type for ordered lists */
+	if ((format == E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST_ALPHA) ||
+	    (format == E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST_ROMAN)) {
+
+		WebKitDOMRange *range = editor_selection_get_current_range (selection);
+		WebKitDOMNode *node;
+		WebKitDOMElement *list;
+
+		node = webkit_dom_range_get_start_container (range, NULL);
+
+		list = e_editor_dom_node_find_child_element (node, "OL");
+		if (!list) {
+			list = e_editor_dom_node_find_parent_element (node, "OL");
+		}
+
+		if (list) {
+			webkit_dom_element_set_attribute (
+				list, "type",
+				(format == E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST_ALPHA) ?
+					"A" : "I", NULL);
+		}
 	}
 
 	g_object_notify (G_OBJECT (selection), "block-format");
diff --git a/widgets/editor/e-editor-selection.h b/widgets/editor/e-editor-selection.h
index a38a20a..10843f9 100644
--- a/widgets/editor/e-editor-selection.h
+++ b/widgets/editor/e-editor-selection.h
@@ -59,7 +59,7 @@ typedef enum {
 	E_EDITOR_SELECTION_BLOCK_FORMAT_BLOCKQUOTE,
 	E_EDITOR_SELECTION_BLOCK_FORMAT_PRE,
 	E_EDITOR_SELECTION_BLOCK_FORMAT_ADDRESS,
-	E_EDITOR_SELECTION_BLOCK_FORMAT_UNORDERED_LIST,	/* FIXME WEBKIT Not implemented VVVVV */
+	E_EDITOR_SELECTION_BLOCK_FORMAT_UNORDERED_LIST,
 	E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST,
 	E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST_ROMAN,
 	E_EDITOR_SELECTION_BLOCK_FORMAT_ORDERED_LIST_ALPHA,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]