[evolution/wip/webkit2] EHTMLEditorView - Move between the table cells with tabulator



commit 725c9308bdc447fa0a5c3fbed6efe3b0521f3b5f
Author: Tomas Popela <tpopela redhat com>
Date:   Mon Mar 30 10:41:50 2015 +0200

    EHTMLEditorView - Move between the table cells with tabulator
    
    Also don't jump around UI when pressing Shift + Tab outside of table.

 composer/e-msg-composer.c                         |    5 -
 web-extensions/e-html-editor-view-dom-functions.c |  118 ++++++++++++++++++++-
 2 files changed, 114 insertions(+), 9 deletions(-)
---
diff --git a/composer/e-msg-composer.c b/composer/e-msg-composer.c
index 6132618..42fe447 100644
--- a/composer/e-msg-composer.c
+++ b/composer/e-msg-composer.c
@@ -2538,11 +2538,6 @@ msg_composer_key_press_event (GtkWidget *widget,
        }
 
        if (gtk_widget_is_focus (GTK_WIDGET (view))) {
-               if (event->keyval == GDK_KEY_ISO_Left_Tab) {
-                       gtk_widget_grab_focus (input_widget);
-                       return TRUE;
-               }
-
                if ((((event)->state & GDK_SHIFT_MASK) &&
                    ((event)->keyval == GDK_KEY_Insert)) ||
                    (((event)->state & GDK_CONTROL_MASK) &&
diff --git a/web-extensions/e-html-editor-view-dom-functions.c 
b/web-extensions/e-html-editor-view-dom-functions.c
index 66059d0..2f6be06 100644
--- a/web-extensions/e-html-editor-view-dom-functions.c
+++ b/web-extensions/e-html-editor-view-dom-functions.c
@@ -6359,6 +6359,110 @@ fix_structure_after_delete_before_quoted_content (WebKitDOMDocument *document)
 }
 
 static gboolean
+selection_is_in_table (WebKitDOMDocument *document)
+{
+       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMSelection *selection;
+       WebKitDOMNode *node, *parent;
+       WebKitDOMRange *range;
+
+       window = webkit_dom_document_get_default_view (document);
+       selection = webkit_dom_dom_window_get_selection (window);
+
+       if (webkit_dom_dom_selection_get_range_count (selection) < 1)
+               return FALSE;
+
+       range = webkit_dom_dom_selection_get_range_at (selection, 0, NULL);
+       node = webkit_dom_range_get_start_container (range, NULL);
+
+       parent = node;
+       while (parent && !WEBKIT_DOM_IS_HTML_BODY_ELEMENT (parent)) {
+               if (WEBKIT_DOM_IS_HTML_TABLE_ROW_ELEMENT (parent))
+                       return TRUE;
+               if (WEBKIT_DOM_IS_HTML_TABLE_CELL_ELEMENT (parent))
+                       return TRUE;
+               if (WEBKIT_DOM_IS_HTML_TABLE_ELEMENT (parent))
+                       return TRUE;
+               parent = webkit_dom_node_get_parent_node (parent);
+       }
+
+       return FALSE;
+}
+
+static void
+jump_to_next_table_cell (WebKitDOMDocument *document,
+                         gboolean jump_back)
+{
+       WebKitDOMDOMWindow *window;
+       WebKitDOMDOMSelection *selection;
+       WebKitDOMNode *node, *cell;
+       WebKitDOMRange *range;
+
+       window = webkit_dom_document_get_default_view (document);
+       selection = webkit_dom_dom_window_get_selection (window);
+
+       if (webkit_dom_dom_selection_get_range_count (selection) < 1)
+               return;
+
+       range = webkit_dom_dom_selection_get_range_at (selection, 0, NULL);
+       node = webkit_dom_range_get_start_container (range, NULL);
+
+       cell = node;
+       while (cell && !WEBKIT_DOM_IS_HTML_TABLE_CELL_ELEMENT (cell)) {
+               cell = webkit_dom_node_get_parent_node (cell);
+       }
+
+       if (!WEBKIT_DOM_IS_HTML_TABLE_CELL_ELEMENT (cell))
+               return;
+
+       if (jump_back) {
+               /* Get previous cell */
+               node = webkit_dom_node_get_previous_sibling (cell);
+               if (!node || !WEBKIT_DOM_IS_HTML_TABLE_CELL_ELEMENT (node)) {
+                       /* No cell, go one row up. */
+                       node = webkit_dom_node_get_parent_node (cell);
+                       node = webkit_dom_node_get_previous_sibling (node);
+                       if (node && WEBKIT_DOM_IS_HTML_TABLE_ROW_ELEMENT (node)) {
+                               node = webkit_dom_node_get_last_child (node);
+                       } else {
+                               /* No row above, move to the block before table. */
+                               node = webkit_dom_node_get_parent_node (cell);
+                               while (!WEBKIT_DOM_IS_HTML_BODY_ELEMENT (webkit_dom_node_get_parent_node 
(node)))
+                                       node = webkit_dom_node_get_parent_node (node);
+
+                               node = webkit_dom_node_get_previous_sibling (node);
+                       }
+               }
+       } else {
+               /* Get next cell */
+               node = webkit_dom_node_get_next_sibling (cell);
+               if (!node || !WEBKIT_DOM_IS_HTML_TABLE_CELL_ELEMENT (node)) {
+                       /* No cell, go one row below. */
+                       node = webkit_dom_node_get_parent_node (cell);
+                       node = webkit_dom_node_get_next_sibling (node);
+                       if (node && WEBKIT_DOM_IS_HTML_TABLE_ROW_ELEMENT (node)) {
+                               node = webkit_dom_node_get_first_child (node);
+                       } else {
+                               /* No row below, move to the block after table. */
+                               node = webkit_dom_node_get_parent_node (cell);
+                               while (!WEBKIT_DOM_IS_HTML_BODY_ELEMENT (webkit_dom_node_get_parent_node 
(node)))
+                                       node = webkit_dom_node_get_parent_node (node);
+
+                               node = webkit_dom_node_get_next_sibling (node);
+                       }
+               }
+       }
+
+       if (!node)
+               return;
+
+       webkit_dom_range_select_node_contents (range, node, NULL);
+       webkit_dom_range_collapse (range, TRUE, NULL);
+       webkit_dom_dom_selection_remove_all_ranges (selection);
+       webkit_dom_dom_selection_add_range (selection, range);
+}
+
+static gboolean
 is_return_key (guint key_val)
 {
        return (
@@ -6372,10 +6476,16 @@ dom_process_on_key_press (WebKitDOMDocument *document,
                           EHTMLEditorWebExtension *extension,
                           guint key_val)
 {
-
-       if (key_val == GDK_KEY_Tab)
-               return dom_exec_command (
-                       document, E_HTML_EDITOR_VIEW_COMMAND_INSERT_TEXT, "\t");
+       if (key_val == GDK_KEY_Tab || key_val == GDK_KEY_ISO_Left_Tab) {
+               if (selection_is_in_table (document)) {
+                       jump_to_next_table_cell (document, key_val == GDK_KEY_ISO_Left_Tab);
+                       return TRUE;
+               } else if (key_val == GDK_KEY_Tab)
+                       return dom_exec_command (
+                               document, E_HTML_EDITOR_VIEW_COMMAND_INSERT_TEXT, "\t");
+               else
+                       return TRUE;
+       }
 
        if (is_return_key (key_val)) {
                EHTMLEditorSelectionBlockFormat format;


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