void e_editor_selection_set_monospaced (EEditorSelection *selection, gboolean monospaced) { WebKitDOMDocument *document; WebKitDOMRange *range; gboolean is_monospaced; g_return_if_fail (E_IS_EDITOR_SELECTION (selection)); is_monospaced = e_editor_selection_get_monospaced (selection) ? TRUE : FALSE; if ((is_monospaced ? TRUE : FALSE) == (monospaced ? TRUE : FALSE)) { return; } range = editor_selection_get_current_range (selection); if (!range) { return; } document = webkit_web_view_get_dom_document (selection->priv->webview); if (monospaced) { WebKitDOMElement *wrapper; gchar *html; wrapper = webkit_dom_document_create_element (document, "TT", NULL); webkit_dom_node_append_child ( WEBKIT_DOM_NODE (wrapper), WEBKIT_DOM_NODE (webkit_dom_range_clone_contents (range, NULL)), NULL); html = webkit_dom_html_element_get_outer_html ( WEBKIT_DOM_HTML_ELEMENT (wrapper)); e_editor_selection_insert_html (selection, html); } else { /* XXX This removes _all_ formatting that the selection has. * In theory it's possible to write a code that would remove * the <TT> from selection using advanced DOM manipulation, * but right now I don't really feel like writing it all... */ webkit_dom_document_exec_command ( document, "removeFormat", FALSE, ""); } g_object_notify (G_OBJECT (selection), "monospaced"); }
gboolean e_editor_selection_has_text (EEditorSelection *selection) { WebKitDOMRange *range; WebKitDOMNode *node; g_return_val_if_fail (E_IS_EDITOR_SELECTION (selection), FALSE); range = editor_selection_get_current_range (selection); node = webkit_dom_range_get_start_container (range, NULL); if (webkit_dom_node_get_node_type (node) == 3) { return TRUE; } node = webkit_dom_range_get_end_container (range, NULL); if (webkit_dom_node_get_node_type (node) == 3) { return TRUE; } node = WEBKIT_DOM_NODE (webkit_dom_range_clone_contents (range, NULL)); while (node) { if (webkit_dom_node_get_node_type (node) == 3) { return TRUE; } if (webkit_dom_node_has_child_nodes (node)) { node = webkit_dom_node_get_first_child (node); } else if (webkit_dom_node_get_next_sibling (node)) { node = webkit_dom_node_get_next_sibling (node); } else { node = webkit_dom_node_get_parent_node (node); if (node) { node = webkit_dom_node_get_next_sibling (node); } } } return FALSE; }
wxString wxWebViewWebKit::GetSelectedSource() const { WebKitDOMDocument* doc; WebKitDOMDOMWindow* win; WebKitDOMDOMSelection* sel; WebKitDOMRange* range; WebKitDOMElement* div; WebKitDOMDocumentFragment* clone; WebKitDOMHTMLElement* html; doc = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(web_view)); win = webkit_dom_document_get_default_view(WEBKIT_DOM_DOCUMENT(doc)); sel = webkit_dom_dom_window_get_selection(WEBKIT_DOM_DOM_WINDOW(win)); range = webkit_dom_dom_selection_get_range_at(WEBKIT_DOM_DOM_SELECTION(sel), 0, NULL); div = webkit_dom_document_create_element(WEBKIT_DOM_DOCUMENT(doc), "div", NULL); clone = webkit_dom_range_clone_contents(WEBKIT_DOM_RANGE(range), NULL); webkit_dom_node_append_child(&div->parent_instance, &clone->parent_instance, NULL); html = (WebKitDOMHTMLElement*)div; return wxString(webkit_dom_html_element_get_inner_html(WEBKIT_DOM_HTML_ELEMENT(html)), wxConvUTF8); }
void e_editor_selection_wrap_lines (EEditorSelection *selection) { WebKitDOMRange *range; WebKitDOMNode *node, *start_node; WebKitDOMDocument *document; WebKitDOMElement *element; WebKitDOMDocumentFragment *fragment; gint len; gchar *html; g_return_if_fail (E_IS_EDITOR_SELECTION (selection)); document = webkit_web_view_get_dom_document (selection->priv->webview); range = editor_selection_get_current_range (selection); /* Extend the range to include entire nodes */ webkit_dom_range_select_node_contents ( range, webkit_dom_range_get_common_ancestor_container (range, NULL), NULL); /* Copy the selection from DOM, wrap the lines and then paste it back * using the DOM command which will overwrite the selection, and * record it as an undoable action */ fragment = webkit_dom_range_clone_contents (range, NULL); node = WEBKIT_DOM_NODE (fragment); start_node = node; len = 0; while (node) { /* Find nearest text node */ if (webkit_dom_node_get_node_type (node) != 3) { if (webkit_dom_node_has_child_nodes (node)) { node = webkit_dom_node_get_first_child (node); } else if (webkit_dom_node_get_next_sibling (node)) { node = webkit_dom_node_get_next_sibling (node); } else { if (webkit_dom_node_is_equal_node (node, start_node)) { break; } node = webkit_dom_node_get_parent_node (node); if (node) { node = webkit_dom_node_get_next_sibling (node); } } continue; } /* If length of this node + what we already have is still less * then 71 characters, then just join it and continue to next * node */ if ((webkit_dom_character_data_get_length ( (WebKitDOMCharacterData *) node) + len) < WORD_WRAP_LENGTH) { len += webkit_dom_character_data_get_length ( (WebKitDOMCharacterData *) node); } else { gint offset; /* Find where we can line-break the node so that it * effectively fills the rest of current row */ offset = find_where_to_break_line (node, WORD_WRAP_LENGTH - len); if (offset > 0) { /* Split the node and append <BR> tag to it */ webkit_dom_text_split_text ( (WebKitDOMText *) node, len + offset, NULL); element = webkit_dom_document_create_element ( document, "BR", NULL); /* WebKit throws warning when ref_child is NULL */ if (webkit_dom_node_get_next_sibling (node)) { webkit_dom_node_insert_before ( webkit_dom_node_get_parent_node (node), WEBKIT_DOM_NODE (element), webkit_dom_node_get_next_sibling (node), NULL); } else { webkit_dom_node_append_child ( webkit_dom_node_get_parent_node (node), WEBKIT_DOM_NODE (element), NULL); } len = 0; } } /* Skip to next node */ if (webkit_dom_node_get_next_sibling (node)) { node = webkit_dom_node_get_next_sibling (node); } else { if (webkit_dom_node_is_equal_node (node, start_node)) { break; } node = webkit_dom_node_get_parent_node (node); if (node) { node = webkit_dom_node_get_next_sibling (node); } } } /* Create a wrapper DIV and put the processed content into it */ element = webkit_dom_document_create_element (document, "DIV", NULL); webkit_dom_node_append_child ( WEBKIT_DOM_NODE (element), WEBKIT_DOM_NODE (start_node), NULL); /* Get HTML code of the processed content */ html = webkit_dom_html_element_get_inner_html ( WEBKIT_DOM_HTML_ELEMENT (element)); /* Overwrite the current selection be the processed content, so that * "UNDO" and "REDO" buttons work as expected */ e_editor_selection_insert_html (selection, html); g_free (html); }
static void html_editor_link_dialog_show (GtkWidget *widget) { EHTMLEditor *editor; EHTMLEditorView *view; EHTMLEditorLinkDialog *dialog; WebKitDOMDocument *document; WebKitDOMDOMWindow *dom_window; WebKitDOMDOMSelection *dom_selection; WebKitDOMRange *range; WebKitDOMElement *link; dialog = E_HTML_EDITOR_LINK_DIALOG (widget); editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog)); view = e_html_editor_get_view (editor); document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view)); dom_window = webkit_dom_document_get_default_view (document); dom_selection = webkit_dom_dom_window_get_selection (dom_window); g_object_unref (dom_window); /* Reset to default values */ gtk_entry_set_text (GTK_ENTRY (dialog->priv->url_edit), "http://"); gtk_entry_set_text (GTK_ENTRY (dialog->priv->label_edit), ""); gtk_widget_set_sensitive (dialog->priv->label_edit, TRUE); gtk_widget_set_sensitive (dialog->priv->remove_link_button, TRUE); dialog->priv->label_autofill = TRUE; /* No selection at all */ if (!dom_selection || webkit_dom_dom_selection_get_range_count (dom_selection) < 1) { gtk_widget_set_sensitive (dialog->priv->remove_link_button, FALSE); goto chainup; } range = webkit_dom_dom_selection_get_range_at (dom_selection, 0, NULL); link = e_html_editor_dom_node_find_parent_element ( webkit_dom_range_get_start_container (range, NULL), "A"); if (!link) { if ((webkit_dom_range_get_start_container (range, NULL) != webkit_dom_range_get_end_container (range, NULL)) || (webkit_dom_range_get_start_offset (range, NULL) != webkit_dom_range_get_end_offset (range, NULL))) { WebKitDOMDocumentFragment *fragment; fragment = webkit_dom_range_clone_contents (range, NULL); link = e_html_editor_dom_node_find_child_element ( WEBKIT_DOM_NODE (fragment), "A"); } else { WebKitDOMNode *node; node = webkit_dom_range_get_common_ancestor_container (range, NULL); if (node && !WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (node)) { link = e_html_editor_dom_node_find_parent_element (node, "A"); if (link && !WEBKIT_DOM_IS_HTML_ANCHOR_ELEMENT (link)) link = NULL; } else link = WEBKIT_DOM_ELEMENT (node); } } if (link) { gchar *href, *text; href = webkit_dom_html_anchor_element_get_href ( WEBKIT_DOM_HTML_ANCHOR_ELEMENT (link)); text = webkit_dom_html_element_get_inner_text ( WEBKIT_DOM_HTML_ELEMENT (link)); gtk_entry_set_text ( GTK_ENTRY (dialog->priv->url_edit), href); gtk_entry_set_text ( GTK_ENTRY (dialog->priv->label_edit), text); g_free (text); g_free (href); } else { gchar *text; text = webkit_dom_range_get_text (range); if (text && *text) { gtk_entry_set_text ( GTK_ENTRY (dialog->priv->label_edit), text); gtk_widget_set_sensitive ( dialog->priv->label_edit, FALSE); gtk_widget_set_sensitive ( dialog->priv->remove_link_button, FALSE); } g_free (text); } g_object_unref (range); chainup: g_object_unref (dom_selection); /* Chain up to parent implementation */ GTK_WIDGET_CLASS (e_html_editor_link_dialog_parent_class)->show (widget); }