[evolution] EHTMLEditorView - Improve tables handling in composer



commit 203f96d8c5c1646822a0f6fd0743271e818b3520
Author: Tomas Popela <tpopela redhat com>
Date:   Sun Mar 15 19:46:27 2015 +0100

    EHTMLEditorView - Improve tables handling in composer
    
    When switching mode to plain text mode hide the borders, and set width
    according to word wrap width. When hovering over the cell show red
    outline around it.

 e-util/e-html-editor-view.c |   81 +++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 78 insertions(+), 3 deletions(-)
---
diff --git a/e-util/e-html-editor-view.c b/e-util/e-html-editor-view.c
index 0f919cc..d7902c5 100644
--- a/e-util/e-html-editor-view.c
+++ b/e-util/e-html-editor-view.c
@@ -2251,6 +2251,8 @@ surround_text_with_paragraph_if_needed (EHTMLEditorSelection *selection,
             WEBKIT_DOM_IS_HTML_TABLE_CELL_ELEMENT (parent))) {
                element = e_html_editor_selection_put_node_into_paragraph (
                        selection, document, node, TRUE);
+               if (WEBKIT_DOM_IS_HTML_TABLE_CELL_ELEMENT (parent))
+                       webkit_dom_element_remove_attribute (element, "style");
 
                if (WEBKIT_DOM_IS_HTMLBR_ELEMENT (next_sibling))
                        remove_node (next_sibling);
@@ -8091,7 +8093,7 @@ toggle_paragraphs_style_in_element (EHTMLEditorView *view,
        selection = e_html_editor_view_get_selection (view);
 
        paragraphs = webkit_dom_element_query_selector_all (
-               element, ".-x-evo-paragraph", NULL);
+               element, ":not(td) > .-x-evo-paragraph", NULL);
 
        length = webkit_dom_node_list_get_length (paragraphs);
 
@@ -8853,6 +8855,54 @@ remove_whole_event_history (EHTMLEditorView *view)
        g_object_notify (G_OBJECT (view), "can-redo");
 }
 
+static void
+rename_attribute (WebKitDOMElement *element,
+                  const gchar *from,
+                  const gchar *to)
+{
+       gchar *value;
+
+       value = webkit_dom_element_get_attribute (element, from);
+       if (value)
+               webkit_dom_element_set_attribute (element, to, value, NULL);
+       webkit_dom_element_remove_attribute (element, from);
+}
+
+static void
+toggle_tables (EHTMLEditorView *view)
+{
+       WebKitDOMDocument *document;
+       WebKitDOMNodeList *list;
+       gint ii, length;
+
+       document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view));
+       list = webkit_dom_document_query_selector_all (document, "table", NULL);
+       length = webkit_dom_node_list_get_length (list);
+
+       for (ii = 0; ii < length; ii++) {
+               WebKitDOMNode *table = webkit_dom_node_list_item (list, ii);
+
+               if (view->priv->html_mode) {
+                       element_remove_class (WEBKIT_DOM_ELEMENT (table), "-x-evo-plaintext-table");
+                       rename_attribute (WEBKIT_DOM_ELEMENT (table), "data-width", "width");
+                       rename_attribute (WEBKIT_DOM_ELEMENT (table), "data-cellspacing", "cellspacing");
+                       rename_attribute (WEBKIT_DOM_ELEMENT (table), "data-cellpadding", "cellpadding");
+                       rename_attribute (WEBKIT_DOM_ELEMENT (table), "data-border", "border");
+               } else {
+                       element_add_class (WEBKIT_DOM_ELEMENT (table), "-x-evo-plaintext-table");
+                       rename_attribute (WEBKIT_DOM_ELEMENT (table), "width", "data-width");
+                       rename_attribute (WEBKIT_DOM_ELEMENT (table), "cellspacing", "data-cellspacing");
+                       webkit_dom_element_set_attribute (WEBKIT_DOM_ELEMENT (table), "cellspacing", "0", 
NULL);
+                       rename_attribute (WEBKIT_DOM_ELEMENT (table), "cellpadding", "data-cellpadding");
+                       webkit_dom_element_set_attribute (WEBKIT_DOM_ELEMENT (table), "cellpadding", "0", 
NULL);
+                       rename_attribute (WEBKIT_DOM_ELEMENT (table), "border", "data-border");
+                       webkit_dom_element_set_attribute (WEBKIT_DOM_ELEMENT (table), "border", "0", NULL);
+               }
+               g_object_unref (table);
+       }
+       g_object_unref (list);
+}
+
 /**
  * e_html_editor_view_set_html_mode:
  * @view: an #EHTMLEditorView
@@ -8926,6 +8976,7 @@ e_html_editor_view_set_html_mode (EHTMLEditorView *view,
 
                toggle_paragraphs_style (view);
                toggle_smileys (view);
+               toggle_tables (view);
                remove_wrapping_from_view (view);
        } else {
                gchar *plain;
@@ -8940,6 +8991,7 @@ e_html_editor_view_set_html_mode (EHTMLEditorView *view,
 
                toggle_paragraphs_style (view);
                toggle_smileys (view);
+               toggle_tables (view);
                remove_images (view);
                remove_background_images_in_document (document);
 
@@ -9940,7 +9992,7 @@ e_html_editor_view_update_fonts (EHTMLEditorView *view)
         * unicode zero width space before each cell. */
        g_string_append (
                stylesheet,
-               "td::before {\n"
+               "td:before {\n"
                "  content: \"\xe2\x80\x8b\";"
                "}\n");
 
@@ -9964,7 +10016,30 @@ e_html_editor_view_update_fonts (EHTMLEditorView *view)
 
        g_string_append (
                stylesheet,
-               "td > *"
+               "td:hover "
+               "{\n"
+               "  outline: 1px dotted red;\n"
+               "}\n");
+
+       g_string_append_printf (
+               stylesheet,
+               ".-x-evo-plaintext-table "
+               "{\n"
+               "  border-collapse: collapse;\n"
+               "  width: %dch;\n"
+               "}\n",
+               e_html_editor_selection_get_word_wrap_length (view->priv->selection));
+
+       g_string_append (
+               stylesheet,
+               ".-x-evo-plaintext-table td"
+               "{\n"
+               "  vertical-align: top;\n"
+               "}\n");
+
+       g_string_append (
+               stylesheet,
+               "td > * "
                "{\n"
                "  display : inline-block;\n"
                "}\n");


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