static void html_editor_image_dialog_hide (GtkWidget *widget) { EHTMLEditorImageDialogPrivate *priv; EHTMLEditorViewHistoryEvent *ev; priv = E_HTML_EDITOR_IMAGE_DIALOG_GET_PRIVATE (widget); ev = priv->history_event; if (ev) { EHTMLEditorImageDialog *dialog; EHTMLEditor *editor; EHTMLEditorSelection *selection; EHTMLEditorView *view; dialog = E_HTML_EDITOR_IMAGE_DIALOG (widget); editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog)); view = e_html_editor_get_view (editor); selection = e_html_editor_view_get_selection (view); ev->data.dom.to = webkit_dom_node_clone_node ( WEBKIT_DOM_NODE (priv->image), FALSE); e_html_editor_selection_get_selection_coordinates ( selection, &ev->after.start.x, &ev->after.start.y, &ev->after.end.x, &ev->after.end.y); e_html_editor_view_insert_new_history_event (view, ev); } g_object_unref (priv->image); priv->image = NULL; GTK_WIDGET_CLASS (e_html_editor_image_dialog_parent_class)->hide (widget); }
static void html_editor_link_dialog_remove_link (EHTMLEditorLinkDialog *dialog) { EHTMLEditor *editor; EHTMLEditorView *view; EHTMLEditorSelection *selection; editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog)); view = e_html_editor_get_view (editor); selection = e_html_editor_view_get_selection (view); e_html_editor_selection_unlink (selection); gtk_widget_hide (GTK_WIDGET (dialog)); }
static void html_editor_image_dialog_set_src (EHTMLEditorImageDialog *dialog) { EHTMLEditor *editor; EHTMLEditorSelection *editor_selection; EHTMLEditorView *view; gchar *uri; editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog)); view = e_html_editor_get_view (editor); editor_selection = e_html_editor_view_get_selection (view); uri = gtk_file_chooser_get_uri ( GTK_FILE_CHOOSER (dialog->priv->file_chooser)); e_html_editor_selection_replace_image_src ( editor_selection, WEBKIT_DOM_ELEMENT (dialog->priv->image), uri); g_free (uri); }
static void html_editor_hrule_dialog_hide (GtkWidget *widget) { EHTMLEditorHRuleDialogPrivate *priv; EHTMLEditorViewHistoryEvent *ev; priv = E_HTML_EDITOR_HRULE_DIALOG_GET_PRIVATE (widget); ev = priv->history_event; if (ev) { EHTMLEditorHRuleDialog *dialog; EHTMLEditor *editor; EHTMLEditorSelection *selection; EHTMLEditorView *view; dialog = E_HTML_EDITOR_HRULE_DIALOG (widget); editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog)); view = e_html_editor_get_view (editor); selection = e_html_editor_view_get_selection (view); ev->data.dom.to = webkit_dom_node_clone_node ( WEBKIT_DOM_NODE (priv->hr_element), FALSE); if (!webkit_dom_node_is_equal_node (ev->data.dom.from, ev->data.dom.to)) { e_html_editor_selection_get_selection_coordinates ( selection, &ev->after.start.x, &ev->after.start.y, &ev->after.end.x, &ev->after.end.y); e_html_editor_view_insert_new_history_event (view, ev); if (!ev->data.dom.from) g_object_unref (priv->hr_element); } else { g_object_unref (ev->data.dom.from); g_object_unref (ev->data.dom.to); g_free (ev); } } priv->hr_element = NULL; GTK_WIDGET_CLASS (e_html_editor_hrule_dialog_parent_class)->hide (widget); }
static void html_editor_find_dialog_constructed (GObject *object) { EHTMLEditor *editor; EHTMLEditorFindDialog *dialog; EContentEditor *cnt_editor; dialog = E_HTML_EDITOR_FIND_DIALOG (object); dialog->priv = E_HTML_EDITOR_FIND_DIALOG_GET_PRIVATE (dialog); editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog)); cnt_editor = e_html_editor_get_content_editor (editor); dialog->priv->find_done_handler_id = g_signal_connect ( cnt_editor, "find-done", G_CALLBACK (content_editor_find_done_cb), dialog); dialog->priv->cnt_editor = cnt_editor; G_OBJECT_CLASS (e_html_editor_find_dialog_parent_class)->constructed (object); }
static void html_editor_find_dialog_find_cb (EHTMLEditorFindDialog *dialog) { gboolean found; EHTMLEditor *editor; EHTMLEditorView *view; editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog)); view = e_html_editor_get_view (editor); found = webkit_web_view_search_text ( WEBKIT_WEB_VIEW (view), gtk_entry_get_text ( GTK_ENTRY (dialog->priv->entry)), gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( dialog->priv->case_sensitive)), !gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( dialog->priv->backwards)), gtk_toggle_button_get_active ( GTK_TOGGLE_BUTTON ( dialog->priv->wrap_search))); gtk_widget_set_sensitive (dialog->priv->find_button, found); /* We give focus to WebKit so that the selection is highlited. * Without focus selection is not visible (at least with my default * color scheme). The focus in fact is not given to WebKit, because * this dialog is modal, but it satisfies it in a way that it paints * the selection :) */ gtk_widget_grab_focus (GTK_WIDGET (view)); if (!found) { gtk_label_set_label ( GTK_LABEL (dialog->priv->result_label), N_("No match found")); gtk_widget_show (dialog->priv->result_label); } }
static void html_editor_image_dialog_show (GtkWidget *widget) { EHTMLEditorImageDialog *dialog; EHTMLEditor *editor; EHTMLEditorSelection *selection; EHTMLEditorView *view; WebKitDOMElement *link; gchar *tmp; glong val; dialog = E_HTML_EDITOR_IMAGE_DIALOG (widget); if (!dialog->priv->image) { return; } editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog)); view = e_html_editor_get_view (editor); selection = e_html_editor_view_get_selection (view); if (!e_html_editor_view_is_undo_redo_in_progress (view)) { EHTMLEditorViewHistoryEvent *ev; ev = g_new0 (EHTMLEditorViewHistoryEvent, 1); ev->type = HISTORY_IMAGE_DIALOG; e_html_editor_selection_get_selection_coordinates ( selection, &ev->before.start.x, &ev->before.start.y, &ev->before.end.x, &ev->before.end.y); ev->data.dom.from = webkit_dom_node_clone_node ( WEBKIT_DOM_NODE (dialog->priv->image), FALSE); dialog->priv->history_event = ev; } tmp = webkit_dom_element_get_attribute ( WEBKIT_DOM_ELEMENT (dialog->priv->image), "data-uri"); if (tmp && *tmp) { gtk_file_chooser_set_uri ( GTK_FILE_CHOOSER (dialog->priv->file_chooser), tmp); gtk_widget_set_sensitive ( GTK_WIDGET (dialog->priv->file_chooser), TRUE); } else { gtk_file_chooser_set_uri ( GTK_FILE_CHOOSER (dialog->priv->file_chooser), ""); gtk_widget_set_sensitive ( GTK_WIDGET (dialog->priv->file_chooser), FALSE); } g_free (tmp); tmp = webkit_dom_html_image_element_get_alt (dialog->priv->image); gtk_entry_set_text (GTK_ENTRY (dialog->priv->description_edit), tmp ? tmp : ""); g_free (tmp); val = webkit_dom_html_image_element_get_width (dialog->priv->image); gtk_spin_button_set_value ( GTK_SPIN_BUTTON (dialog->priv->width_edit), val); gtk_combo_box_set_active_id ( GTK_COMBO_BOX (dialog->priv->width_units), "units-px"); val = webkit_dom_html_image_element_get_height (dialog->priv->image); gtk_spin_button_set_value ( GTK_SPIN_BUTTON (dialog->priv->height_edit), val); gtk_combo_box_set_active_id ( GTK_COMBO_BOX (dialog->priv->height_units), "units-px"); tmp = webkit_dom_html_image_element_get_border (dialog->priv->image); gtk_combo_box_set_active_id ( GTK_COMBO_BOX (dialog->priv->alignment), (tmp && *tmp) ? tmp : "bottom"); g_free (tmp); val = webkit_dom_html_image_element_get_hspace (dialog->priv->image); gtk_spin_button_set_value ( GTK_SPIN_BUTTON (dialog->priv->x_padding_edit), val); val = webkit_dom_html_image_element_get_vspace (dialog->priv->image); gtk_spin_button_set_value ( GTK_SPIN_BUTTON (dialog->priv->y_padding_edit), val); link = e_html_editor_dom_node_find_parent_element ( WEBKIT_DOM_NODE (dialog->priv->image), "A"); if (link) { tmp = webkit_dom_html_anchor_element_get_href ( WEBKIT_DOM_HTML_ANCHOR_ELEMENT (link)); gtk_entry_set_text (GTK_ENTRY (dialog->priv->url_edit), tmp); g_free (tmp); } /* Chain up to parent implementation */ GTK_WIDGET_CLASS (e_html_editor_image_dialog_parent_class)->show (widget); }
static void html_editor_hrule_dialog_show (GtkWidget *widget) { EHTMLEditorHRuleDialog *dialog; EHTMLEditor *editor; EHTMLEditorSelection *selection; EHTMLEditorView *view; WebKitDOMDocument *document; dialog = E_HTML_EDITOR_HRULE_DIALOG (widget); editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog)); view = e_html_editor_get_view (editor); selection = e_html_editor_view_get_selection (view); if (!e_html_editor_view_is_undo_redo_in_progress (view)) { EHTMLEditorViewHistoryEvent *ev; ev = g_new0 (EHTMLEditorViewHistoryEvent, 1); ev->type = HISTORY_HRULE_DIALOG; e_html_editor_selection_get_selection_coordinates ( selection, &ev->before.start.x, &ev->before.start.y, &ev->before.end.x, &ev->before.end.y); if (dialog->priv->hr_element) ev->data.dom.from = webkit_dom_node_clone_node ( WEBKIT_DOM_NODE (dialog->priv->hr_element), FALSE); else ev->data.dom.from = NULL; dialog->priv->history_event = ev; } if (!dialog->priv->hr_element) { WebKitDOMElement *selection_start, *parent, *rule; document = webkit_web_view_get_dom_document (WEBKIT_WEB_VIEW (view)); e_html_editor_selection_save (selection); selection_start = webkit_dom_document_get_element_by_id ( document, "-x-evo-selection-start-marker"); parent = get_parent_block_element (WEBKIT_DOM_NODE (selection_start)); rule = webkit_dom_document_create_element (document, "HR", NULL); /* Insert horizontal rule into body below the caret */ webkit_dom_node_insert_before ( webkit_dom_node_get_parent_node (WEBKIT_DOM_NODE (parent)), WEBKIT_DOM_NODE (rule), webkit_dom_node_get_next_sibling (WEBKIT_DOM_NODE (parent)), NULL); e_html_editor_selection_restore (selection); dialog->priv->hr_element = WEBKIT_DOM_HTMLHR_ELEMENT (rule); /* For new rule reset the values to default */ gtk_spin_button_set_value ( GTK_SPIN_BUTTON (dialog->priv->width_edit), 100.0); gtk_combo_box_set_active_id ( GTK_COMBO_BOX (dialog->priv->unit_combo), "units-percent"); gtk_spin_button_set_value ( GTK_SPIN_BUTTON (dialog->priv->size_edit), 2.0); gtk_combo_box_set_active_id ( GTK_COMBO_BOX (dialog->priv->alignment_combo), "left"); gtk_toggle_button_set_active ( GTK_TOGGLE_BUTTON (dialog->priv->shaded_check), FALSE); html_editor_hrule_dialog_set_alignment (dialog); html_editor_hrule_dialog_set_size (dialog); html_editor_hrule_dialog_set_alignment (dialog); html_editor_hrule_dialog_set_shading (dialog); e_html_editor_view_set_changed (view, TRUE); } else { html_editor_hrule_dialog_get_alignment (dialog); html_editor_hrule_dialog_get_size (dialog); html_editor_hrule_dialog_get_width (dialog); html_editor_hrule_dialog_get_shading (dialog); } /* Chain up to parent implementation */ GTK_WIDGET_CLASS (e_html_editor_hrule_dialog_parent_class)->show (widget); }
static void html_editor_paragraph_dialog_constructed (GObject *object) { GtkGrid *main_layout, *grid; GtkWidget *widget; EHTMLEditor *editor; EHTMLEditorParagraphDialog *dialog; /* Chain up to parent's method. */ G_OBJECT_CLASS (e_html_editor_paragraph_dialog_parent_class)->constructed (object); dialog = E_HTML_EDITOR_PARAGRAPH_DIALOG (object); editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog)); main_layout = e_html_editor_dialog_get_container (E_HTML_EDITOR_DIALOG (dialog)); /* == General == */ widget = gtk_label_new (""); gtk_label_set_markup (GTK_LABEL (widget), _("<b>General</b>")); gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5); gtk_grid_attach (main_layout, widget, 0, 0, 1, 1); grid = GTK_GRID (gtk_grid_new ()); gtk_grid_set_row_spacing (grid, 5); gtk_grid_set_column_spacing (grid, 5); gtk_grid_attach (main_layout, GTK_WIDGET (grid), 0, 1, 1, 1); gtk_widget_set_margin_left (GTK_WIDGET (grid), 10); /* Style */ widget = e_action_combo_box_new_with_action ( GTK_RADIO_ACTION (e_html_editor_get_action (editor, "style-normal"))); gtk_widget_set_hexpand (widget, TRUE); gtk_grid_attach (grid, widget, 1, 0, 1, 1); dialog->priv->style_combo = widget; widget = gtk_label_new_with_mnemonic (_("_Style:")); gtk_label_set_justify (GTK_LABEL (widget), GTK_JUSTIFY_RIGHT); gtk_label_set_mnemonic_widget (GTK_LABEL (widget), dialog->priv->style_combo); gtk_grid_attach (grid, widget, 0, 0, 1, 1); /* == Alignment == */ widget = gtk_label_new (""); gtk_label_set_markup (GTK_LABEL (widget), _("<b>Alignment</b>")); gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5); gtk_grid_attach (main_layout, widget, 0, 2, 1, 1); grid = GTK_GRID (gtk_grid_new ()); gtk_grid_set_row_spacing (grid, 5); gtk_grid_set_column_spacing (grid, 5); gtk_grid_attach (main_layout, GTK_WIDGET (grid), 0, 3, 1, 1); gtk_widget_set_margin_left (GTK_WIDGET (grid), 10); /* Left */ widget = gtk_toggle_button_new_with_label (_("_Left")); gtk_button_set_use_stock (GTK_BUTTON (widget), TRUE); gtk_activatable_set_related_action ( GTK_ACTIVATABLE (widget), e_html_editor_get_action (editor, "justify-left")); gtk_grid_attach (grid, widget, 0, 0, 1, 1); dialog->priv->left_button = widget; /* Center */ widget = gtk_toggle_button_new_with_label (_("_Center")); gtk_button_set_use_stock (GTK_BUTTON (widget), TRUE); gtk_grid_attach (grid, widget, 1, 0, 1, 1); gtk_activatable_set_related_action ( GTK_ACTIVATABLE (widget), e_html_editor_get_action (editor, "justify-center")); dialog->priv->center_button = widget; /* Right */ widget = gtk_toggle_button_new_with_label (_("_Right")); gtk_button_set_use_stock (GTK_BUTTON (widget), TRUE); gtk_grid_attach (grid, widget, 2, 0, 1, 1); gtk_activatable_set_related_action ( GTK_ACTIVATABLE (widget), e_html_editor_get_action (editor, "justify-right")); dialog->priv->right_button = widget; gtk_widget_show_all (GTK_WIDGET (main_layout)); }
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); }
static void html_editor_link_dialog_ok (EHTMLEditorLinkDialog *dialog) { EHTMLEditor *editor; EHTMLEditorView *view; EHTMLEditorSelection *selection; WebKitDOMDocument *document; WebKitDOMDOMWindow *dom_window; WebKitDOMDOMSelection *dom_selection; WebKitDOMRange *range; WebKitDOMElement *link; editor = e_html_editor_dialog_get_editor (E_HTML_EDITOR_DIALOG (dialog)); view = e_html_editor_get_view (editor); selection = e_html_editor_view_get_selection (view); 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); if (!dom_selection || (webkit_dom_dom_selection_get_range_count (dom_selection) == 0)) { gtk_widget_hide (GTK_WIDGET (dialog)); g_object_unref (dom_selection); return; } 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_extract_contents (range, NULL); link = e_html_editor_dom_node_find_child_element ( WEBKIT_DOM_NODE (fragment), "A"); webkit_dom_range_insert_node ( range, WEBKIT_DOM_NODE (fragment), NULL); webkit_dom_dom_selection_set_base_and_extent ( dom_selection, webkit_dom_range_get_start_container (range, NULL), webkit_dom_range_get_start_offset (range, NULL), webkit_dom_range_get_end_container (range, NULL), webkit_dom_range_get_end_offset (range, NULL), NULL); } else { WebKitDOMNode *node; /* get element that was clicked on */ 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) { webkit_dom_html_anchor_element_set_href ( WEBKIT_DOM_HTML_ANCHOR_ELEMENT (link), gtk_entry_get_text (GTK_ENTRY (dialog->priv->url_edit))); webkit_dom_html_element_set_inner_html ( WEBKIT_DOM_HTML_ELEMENT (link), gtk_entry_get_text (GTK_ENTRY (dialog->priv->label_edit)), NULL); } else { gchar *text; /* Check whether a text is selected or not */ text = webkit_dom_range_get_text (range); if (text && *text) { e_html_editor_selection_create_link ( selection, gtk_entry_get_text ( GTK_ENTRY (dialog->priv->url_edit))); } else { gchar *html = g_strdup_printf ( "<a href=\"%s\">%s</a>", gtk_entry_get_text ( GTK_ENTRY (dialog->priv->url_edit)), gtk_entry_get_text ( GTK_ENTRY (dialog->priv->label_edit))); e_html_editor_view_exec_command ( view, E_HTML_EDITOR_VIEW_COMMAND_INSERT_HTML, html); g_free (html); } g_free (text); } g_object_unref (range); g_object_unref (dom_selection); gtk_widget_hide (GTK_WIDGET (dialog)); }