diff options
author | Tomas Popela <tpopela@redhat.com> | 2014-06-09 22:32:25 +0800 |
---|---|---|
committer | Tomas Popela <tpopela@redhat.com> | 2014-06-09 22:32:25 +0800 |
commit | 8650fb139a9143f04615de74ff569bce3e0c4ce3 (patch) | |
tree | 89a41d08f179a5359b8eaee0c9344b8a5bf07cb3 /e-util/e-html-editor-cell-dialog.c | |
parent | 04b7c97275ae420dca43f3e65c2ef54d02f01bdd (diff) | |
download | gsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.tar gsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.tar.gz gsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.tar.bz2 gsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.tar.lz gsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.tar.xz gsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.tar.zst gsoc2013-evolution-8650fb139a9143f04615de74ff569bce3e0c4ce3.zip |
Bug 540362: [webkit-composer] Use webkit for composer
Merge wip/webkit-composer branch into master.
Diffstat (limited to 'e-util/e-html-editor-cell-dialog.c')
-rw-r--r-- | e-util/e-html-editor-cell-dialog.c | 872 |
1 files changed, 872 insertions, 0 deletions
diff --git a/e-util/e-html-editor-cell-dialog.c b/e-util/e-html-editor-cell-dialog.c new file mode 100644 index 0000000000..2b487288ae --- /dev/null +++ b/e-util/e-html-editor-cell-dialog.c @@ -0,0 +1,872 @@ +/* + * e-html-editor-cell-dialog.c + * + * Copyright (C) 2012 Dan Vrátil <dvratil@redhat.com> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with the program; if not, see <http://www.gnu.org/licenses/> + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "e-html-editor-cell-dialog.h" + +#include <glib/gi18n-lib.h> +#include <stdlib.h> + +#include "e-color-combo.h" +#include "e-html-editor-utils.h" +#include "e-image-chooser-dialog.h" +#include "e-misc-utils.h" + +#define E_HTML_EDITOR_CELL_DIALOG_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE \ + ((obj), E_TYPE_HTML_EDITOR_CELL_DIALOG, EHTMLEditorCellDialogPrivate)) + +struct _EHTMLEditorCellDialogPrivate { + GtkWidget *scope_cell_button; + GtkWidget *scope_table_button; + GtkWidget *scope_row_button; + GtkWidget *scope_column_button; + + GtkWidget *halign_combo; + GtkWidget *valign_combo; + + GtkWidget *wrap_text_check; + GtkWidget *header_style_check; + + GtkWidget *width_check; + GtkWidget *width_edit; + GtkWidget *width_units; + + GtkWidget *row_span_edit; + GtkWidget *col_span_edit; + + GtkWidget *background_color_picker; + GtkWidget *background_image_chooser; + + WebKitDOMElement *cell; + guint scope; +}; + +enum { + SCOPE_CELL, + SCOPE_ROW, + SCOPE_COLUMN, + SCOPE_TABLE +} DialogScope; + +static GdkRGBA white = { 1, 1, 1, 1 }; + +typedef void (*DOMStrFunc) (WebKitDOMHTMLTableCellElement *cell, const gchar *val, gpointer user_data); +typedef void (*DOMUlongFunc) (WebKitDOMHTMLTableCellElement *cell, gulong val, gpointer user_data); +typedef void (*DOMBoolFunc) (WebKitDOMHTMLTableCellElement *cell, gboolean val, gpointer user_data); + +G_DEFINE_TYPE ( + EHTMLEditorCellDialog, + e_html_editor_cell_dialog, + E_TYPE_HTML_EDITOR_DIALOG); + +static void +call_cell_dom_func (WebKitDOMHTMLTableCellElement *cell, + gpointer func, + GValue *value, + gpointer user_data) +{ + if (G_VALUE_HOLDS_STRING (value)) { + DOMStrFunc f = func; + f (cell, g_value_get_string (value), user_data); + } else if (G_VALUE_HOLDS_ULONG (value)) { + DOMUlongFunc f = func; + f (cell, g_value_get_ulong (value), user_data); + } else if (G_VALUE_HOLDS_BOOLEAN (value)) { + DOMBoolFunc f = func; + f (cell, g_value_get_boolean (value), user_data); + } +} + +static void +for_each_cell_do (WebKitDOMElement *row, + gpointer func, + GValue *value, + gpointer user_data) +{ + WebKitDOMHTMLCollection *cells; + gulong ii, length; + cells = webkit_dom_html_table_row_element_get_cells ( + WEBKIT_DOM_HTML_TABLE_ROW_ELEMENT (row)); + length = webkit_dom_html_collection_get_length (cells); + for (ii = 0; ii < length; ii++) { + WebKitDOMNode *cell; + cell = webkit_dom_html_collection_item (cells, ii); + if (!cell) { + continue; + } + + call_cell_dom_func ( + WEBKIT_DOM_HTML_TABLE_CELL_ELEMENT (cell), func, value, user_data); + } +} + +static void +html_editor_cell_dialog_set_attribute (EHTMLEditorCellDialog *dialog, + gpointer func, + GValue *value, + gpointer user_data) +{ + if (dialog->priv->scope == SCOPE_CELL) { + + call_cell_dom_func ( + WEBKIT_DOM_HTML_TABLE_CELL_ELEMENT (dialog->priv->cell), + func, value, user_data); + + } else if (dialog->priv->scope == SCOPE_COLUMN) { + gulong index, ii, length; + WebKitDOMElement *table; + WebKitDOMHTMLCollection *rows; + + index = webkit_dom_html_table_cell_element_get_cell_index ( + WEBKIT_DOM_HTML_TABLE_CELL_ELEMENT (dialog->priv->cell)); + table = e_html_editor_dom_node_find_parent_element ( + WEBKIT_DOM_NODE (dialog->priv->cell), "TABLE"); + if (!table) { + return; + } + + rows = webkit_dom_html_table_element_get_rows ( + WEBKIT_DOM_HTML_TABLE_ELEMENT (table)); + length = webkit_dom_html_collection_get_length (rows); + for (ii = 0; ii < length; ii++) { + WebKitDOMNode *row, *cell; + WebKitDOMHTMLCollection *cells; + + row = webkit_dom_html_collection_item (rows, ii); + cells = webkit_dom_html_table_row_element_get_cells ( + WEBKIT_DOM_HTML_TABLE_ROW_ELEMENT (row)); + cell = webkit_dom_html_collection_item (cells, index); + if (!cell) { + continue; + } + + call_cell_dom_func ( + WEBKIT_DOM_HTML_TABLE_CELL_ELEMENT (cell), + func, value, user_data); + } + + } else if (dialog->priv->scope == SCOPE_ROW) { + WebKitDOMElement *row; + + row = e_html_editor_dom_node_find_parent_element ( + WEBKIT_DOM_NODE (dialog->priv->cell), "TR"); + if (!row) { + return; + } + + for_each_cell_do (row, func, value, user_data); + + } else if (dialog->priv->scope == SCOPE_TABLE) { + gulong ii, length; + WebKitDOMElement *table; + WebKitDOMHTMLCollection *rows; + + table = e_html_editor_dom_node_find_parent_element ( + WEBKIT_DOM_NODE (dialog->priv->cell), "TABLE"); + if (!table) { + return; + } + + rows = webkit_dom_html_table_element_get_rows ( + WEBKIT_DOM_HTML_TABLE_ELEMENT (table)); + length = webkit_dom_html_collection_get_length (rows); + for (ii = 0; ii < length; ii++) { + WebKitDOMNode *row; + + row = webkit_dom_html_collection_item (rows, ii); + if (!row) { + continue; + } + + for_each_cell_do ( + WEBKIT_DOM_ELEMENT (row), func, value, user_data); + } + } +} + +static void +html_editor_cell_dialog_set_scope (EHTMLEditorCellDialog *dialog) +{ + if (gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON (dialog->priv->scope_cell_button))) { + + dialog->priv->scope = SCOPE_CELL; + + } else if (gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON (dialog->priv->scope_row_button))) { + + dialog->priv->scope = SCOPE_ROW; + + } else if (gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON (dialog->priv->scope_column_button))) { + + dialog->priv->scope = SCOPE_COLUMN; + + } else if (gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON (dialog->priv->scope_table_button))) { + + dialog->priv->scope = SCOPE_TABLE; + + } +} + +static void +html_editor_cell_dialog_set_valign (EHTMLEditorCellDialog *dialog) +{ + GValue val = { 0 }; + + g_value_init (&val, G_TYPE_STRING); + g_value_set_string ( + &val, + gtk_combo_box_get_active_id ( + GTK_COMBO_BOX (dialog->priv->valign_combo))); + + html_editor_cell_dialog_set_attribute ( + dialog, webkit_dom_html_table_cell_element_set_v_align, &val, NULL); + + g_value_unset (&val); +} + +static void +html_editor_cell_dialog_set_halign (EHTMLEditorCellDialog *dialog) +{ + GValue val = { 0 }; + + g_value_init (&val, G_TYPE_STRING); + g_value_set_string ( + &val, + gtk_combo_box_get_active_id ( + GTK_COMBO_BOX (dialog->priv->halign_combo))); + + html_editor_cell_dialog_set_attribute ( + dialog, webkit_dom_html_table_cell_element_set_align, &val, NULL); + + g_value_unset (&val); +} + +static void +html_editor_cell_dialog_set_wrap_text (EHTMLEditorCellDialog *dialog) +{ + GValue val = { 0 }; + + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean ( + &val, + !gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON (dialog->priv->wrap_text_check))); + + html_editor_cell_dialog_set_attribute ( + dialog, webkit_dom_html_table_cell_element_set_no_wrap, &val, NULL); +} + +static void +cell_set_header_style (WebKitDOMHTMLTableCellElement *cell, + gboolean header_style, + gpointer user_data) +{ + EHTMLEditorCellDialog *dialog = user_data; + WebKitDOMDocument *document; + WebKitDOMNodeList *nodes; + WebKitDOMElement *new_cell; + gulong length, ii; + gchar *tagname; + + document = webkit_dom_node_get_owner_document (WEBKIT_DOM_NODE (cell)); + tagname = webkit_dom_element_get_tag_name (WEBKIT_DOM_ELEMENT (cell)); + + if (header_style && (g_ascii_strncasecmp (tagname, "TD", 2) == 0)) { + + new_cell = webkit_dom_document_create_element (document, "TH", NULL); + + } else if (!header_style && (g_ascii_strncasecmp (tagname, "TH", 2) == 0)) { + + new_cell = webkit_dom_document_create_element (document, "TD", NULL); + + } else { + g_free (tagname); + return; + } + + /* Move all child nodes from cell to new_cell */ + nodes = webkit_dom_node_get_child_nodes (WEBKIT_DOM_NODE (cell)); + length = webkit_dom_node_list_get_length (nodes); + for (ii = 0; ii < length; ii++) { + WebKitDOMNode *node; + + node = webkit_dom_node_list_item (nodes, ii); + webkit_dom_node_append_child ( + WEBKIT_DOM_NODE (new_cell), node, NULL); + } + + /* Insert new_cell before cell and remove cell */ + webkit_dom_node_insert_before ( + webkit_dom_node_get_parent_node ( + WEBKIT_DOM_NODE (cell)), + WEBKIT_DOM_NODE (new_cell), + WEBKIT_DOM_NODE (cell), NULL); + + webkit_dom_node_remove_child ( + webkit_dom_node_get_parent_node (WEBKIT_DOM_NODE (cell)), + WEBKIT_DOM_NODE (cell), NULL); + + dialog->priv->cell = new_cell; + + g_free (tagname); +} + +static void +html_editor_cell_dialog_set_header_style (EHTMLEditorCellDialog *dialog) +{ + GValue val = { 0 }; + + g_value_init (&val, G_TYPE_BOOLEAN); + g_value_set_boolean ( + &val, + gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON (dialog->priv->header_style_check))); + + html_editor_cell_dialog_set_attribute ( + dialog, cell_set_header_style, &val, dialog); +} + +static void +html_editor_cell_dialog_set_width (EHTMLEditorCellDialog *dialog) +{ + GValue val = { 0 }; + gchar *width; + + if (!gtk_toggle_button_get_active ( + GTK_TOGGLE_BUTTON (dialog->priv->width_check))) { + + width = g_strdup ("auto"); + } else { + + width = g_strdup_printf ( + "%d%s", + gtk_spin_button_get_value_as_int ( + GTK_SPIN_BUTTON (dialog->priv->width_edit)), + ((gtk_combo_box_get_active ( + GTK_COMBO_BOX (dialog->priv->width_units)) == 0) ? + "px" : "%")); + } + + g_value_init (&val, G_TYPE_STRING); + g_value_take_string (&val, width); + html_editor_cell_dialog_set_attribute ( + dialog, webkit_dom_html_table_cell_element_set_width, &val, NULL); + + g_free (width); +} + +static void +html_editor_cell_dialog_set_column_span (EHTMLEditorCellDialog *dialog) +{ + GValue val = { 0 }; + + g_value_init (&val, G_TYPE_ULONG); + g_value_set_ulong ( + &val, + gtk_spin_button_get_value_as_int ( + GTK_SPIN_BUTTON (dialog->priv->col_span_edit))); + + html_editor_cell_dialog_set_attribute ( + dialog, webkit_dom_html_table_cell_element_set_col_span, &val, NULL); +} + +static void +html_editor_cell_dialog_set_row_span (EHTMLEditorCellDialog *dialog) +{ + GValue val = { 0 }; + + g_value_init (&val, G_TYPE_ULONG); + g_value_set_ulong ( + &val, + gtk_spin_button_get_value_as_int ( + GTK_SPIN_BUTTON (dialog->priv->row_span_edit))); + + html_editor_cell_dialog_set_attribute ( + dialog, webkit_dom_html_table_cell_element_set_row_span, &val, NULL); +} + +static void +html_editor_cell_dialog_set_background_color (EHTMLEditorCellDialog *dialog) +{ + gchar *color; + GdkRGBA rgba; + GValue val = { 0 }; + + e_color_combo_get_current_color ( + E_COLOR_COMBO (dialog->priv->background_color_picker), &rgba); + color = g_strdup_printf ("#%06x", e_rgba_to_value (&rgba)); + + g_value_init (&val, G_TYPE_STRING); + g_value_take_string (&val, color); + + html_editor_cell_dialog_set_attribute ( + dialog, webkit_dom_html_table_cell_element_set_bg_color, &val, NULL); + + g_free (color); +} + +static void +cell_set_background_image (WebKitDOMHTMLTableCellElement *cell, + const gchar *uri, + gpointer user_data) +{ + if (!uri || !*uri) { + webkit_dom_element_remove_attribute ( + WEBKIT_DOM_ELEMENT (cell), "background"); + } else { + webkit_dom_element_set_attribute ( + WEBKIT_DOM_ELEMENT (cell), "background", uri, NULL); + } +} + +static void +html_editor_cell_dialog_set_background_image (EHTMLEditorCellDialog *dialog) +{ + const gchar *uri; + GValue val = { 0 }; + + uri = gtk_file_chooser_get_uri ( + GTK_FILE_CHOOSER (dialog->priv->background_image_chooser)); + + g_value_init (&val, G_TYPE_STRING); + g_value_take_string (&val, (gchar *) uri); + + html_editor_cell_dialog_set_attribute ( + dialog, cell_set_background_image, &val, NULL); +} + +static void +html_editor_cell_dialog_show (GtkWidget *widget) +{ + EHTMLEditorCellDialog *dialog; + gchar *tmp; + GdkRGBA color; + + dialog = E_HTML_EDITOR_CELL_DIALOG (widget); + + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (dialog->priv->scope_cell_button), TRUE); + + tmp = webkit_dom_html_table_cell_element_get_align ( + WEBKIT_DOM_HTML_TABLE_CELL_ELEMENT (dialog->priv->cell)); + gtk_combo_box_set_active_id ( + GTK_COMBO_BOX (dialog->priv->halign_combo), + (tmp && *tmp) ? tmp : "left"); + g_free (tmp); + + tmp = webkit_dom_html_table_cell_element_get_v_align ( + WEBKIT_DOM_HTML_TABLE_CELL_ELEMENT (dialog->priv->cell)); + gtk_combo_box_set_active_id ( + GTK_COMBO_BOX (dialog->priv->valign_combo), + (tmp && *tmp) ? tmp : "middle"); + g_free (tmp); + + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (dialog->priv->wrap_text_check), + !webkit_dom_html_table_cell_element_get_no_wrap ( + WEBKIT_DOM_HTML_TABLE_CELL_ELEMENT (dialog->priv->cell))); + + tmp = webkit_dom_element_get_tag_name ( + WEBKIT_DOM_ELEMENT (dialog->priv->cell)); + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (dialog->priv->header_style_check), + (g_ascii_strncasecmp (tmp, "TH", 2) == 0)); + g_free (tmp); + + tmp = webkit_dom_html_table_cell_element_get_width ( + WEBKIT_DOM_HTML_TABLE_CELL_ELEMENT (dialog->priv->cell)); + if (tmp && *tmp) { + gint val = atoi (tmp); + gtk_spin_button_set_value ( + GTK_SPIN_BUTTON (dialog->priv->width_edit), val); + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (dialog->priv->width_check), TRUE); + } else { + gtk_spin_button_set_value ( + GTK_SPIN_BUTTON (dialog->priv->width_edit), 0); + gtk_toggle_button_set_active ( + GTK_TOGGLE_BUTTON (dialog->priv->width_check), FALSE); + } + gtk_combo_box_set_active_id ( + GTK_COMBO_BOX (dialog->priv->width_units), "units-px"); + g_free (tmp); + + gtk_spin_button_set_value ( + GTK_SPIN_BUTTON (dialog->priv->row_span_edit), + webkit_dom_html_table_cell_element_get_row_span ( + WEBKIT_DOM_HTML_TABLE_CELL_ELEMENT (dialog->priv->cell))); + gtk_spin_button_set_value ( + GTK_SPIN_BUTTON (dialog->priv->col_span_edit), + webkit_dom_html_table_cell_element_get_col_span ( + WEBKIT_DOM_HTML_TABLE_CELL_ELEMENT (dialog->priv->cell))); + + if (webkit_dom_element_has_attribute ( + WEBKIT_DOM_ELEMENT (dialog->priv->cell), "background")) { + tmp = webkit_dom_element_get_attribute ( + WEBKIT_DOM_ELEMENT (dialog->priv->cell), "background"); + + gtk_file_chooser_set_uri ( + GTK_FILE_CHOOSER (dialog->priv->background_image_chooser), + tmp); + + g_free (tmp); + } else { + gtk_file_chooser_unselect_all ( + GTK_FILE_CHOOSER (dialog->priv->background_image_chooser)); + } + + tmp = webkit_dom_html_table_cell_element_get_bg_color ( + WEBKIT_DOM_HTML_TABLE_CELL_ELEMENT (dialog->priv->cell)); + if (!tmp || *tmp) { + color = white; + } + if (gdk_rgba_parse (&color, tmp)) { + e_color_combo_set_current_color ( + E_COLOR_COMBO (dialog->priv->background_color_picker), + &color); + } else { + e_color_combo_set_current_color ( + E_COLOR_COMBO (dialog->priv->background_color_picker), + &white); + } + g_free (tmp); + + GTK_WIDGET_CLASS (e_html_editor_cell_dialog_parent_class)->show (widget); +} + +static void +e_html_editor_cell_dialog_class_init (EHTMLEditorCellDialogClass *class) +{ + GtkWidgetClass *widget_class; + + g_type_class_add_private (class, sizeof (EHTMLEditorCellDialogPrivate)); + + widget_class = GTK_WIDGET_CLASS (class); + widget_class->show = html_editor_cell_dialog_show; +} + +static void +e_html_editor_cell_dialog_init (EHTMLEditorCellDialog *dialog) +{ + GtkGrid *main_layout, *grid; + GtkWidget *widget; + GtkFileFilter *file_filter; + + dialog->priv = E_HTML_EDITOR_CELL_DIALOG_GET_PRIVATE (dialog); + + main_layout = e_html_editor_dialog_get_container (E_HTML_EDITOR_DIALOG (dialog)); + + /* == Scope == */ + widget = gtk_label_new (""); + gtk_label_set_markup (GTK_LABEL (widget), _("<b>Scope</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); + + /* Scope: cell */ + widget = gtk_image_new_from_icon_name ("stock_select-cell", GTK_ICON_SIZE_BUTTON); + gtk_grid_attach (grid, widget, 0, 0, 1, 1); + + widget = gtk_radio_button_new_with_mnemonic (NULL, _("C_ell")); + gtk_grid_attach (grid, widget, 1, 0, 1, 1); + dialog->priv->scope_cell_button = widget; + + g_signal_connect_swapped ( + widget, "toggled", + G_CALLBACK (html_editor_cell_dialog_set_scope), dialog); + + /* Scope: row */ + widget = gtk_image_new_from_icon_name ("stock_select-row", GTK_ICON_SIZE_BUTTON); + gtk_grid_attach (grid, widget, 2, 0, 1, 1); + + widget = gtk_radio_button_new_with_mnemonic_from_widget ( + GTK_RADIO_BUTTON (dialog->priv->scope_cell_button), _("_Row")); + gtk_grid_attach (grid, widget, 3, 0, 1, 1); + dialog->priv->scope_row_button = widget; + + g_signal_connect_swapped ( + widget, "toggled", + G_CALLBACK (html_editor_cell_dialog_set_scope), dialog); + + /* Scope: table */ + widget = gtk_image_new_from_icon_name ("stock_select-table", GTK_ICON_SIZE_BUTTON); + gtk_grid_attach (grid, widget, 0, 1, 1, 1); + + widget = gtk_radio_button_new_with_mnemonic_from_widget ( + GTK_RADIO_BUTTON (dialog->priv->scope_cell_button), _("_Table")); + gtk_grid_attach (grid, widget, 1, 1, 1, 1); + dialog->priv->scope_table_button = widget; + + g_signal_connect_swapped ( + widget, "toggled", + G_CALLBACK (html_editor_cell_dialog_set_scope), dialog); + + /* Scope: column */ + widget = gtk_image_new_from_icon_name ("stock_select-column", GTK_ICON_SIZE_BUTTON); + gtk_grid_attach (grid, widget, 2, 1, 1, 1); + + widget = gtk_radio_button_new_with_mnemonic_from_widget ( + GTK_RADIO_BUTTON (dialog->priv->scope_cell_button), _("Col_umn")); + gtk_grid_attach (grid, widget, 3, 1, 1, 1); + dialog->priv->scope_column_button = widget; + + g_signal_connect_swapped ( + widget, "toggled", + G_CALLBACK (html_editor_cell_dialog_set_scope), dialog); + + /* == Alignment & Behavior == */ + widget = gtk_label_new (""); + gtk_label_set_markup (GTK_LABEL (widget), _("<b>Alignment & Behavior</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); + + /* Horizontal */ + widget = gtk_combo_box_text_new (); + gtk_widget_set_hexpand (widget, TRUE); + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (widget), "left", _("Left")); + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (widget), "center", _("Center")); + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (widget), "right", _("Right")); + gtk_grid_attach (grid, widget, 1, 0, 1, 1); + dialog->priv->halign_combo = widget; + + g_signal_connect_swapped ( + widget, "changed", + G_CALLBACK (html_editor_cell_dialog_set_halign), dialog); + + widget = gtk_label_new_with_mnemonic (_("_Horizontal:")); + gtk_label_set_justify (GTK_LABEL (widget), GTK_JUSTIFY_RIGHT); + gtk_label_set_mnemonic_widget (GTK_LABEL (widget), dialog->priv->halign_combo); + gtk_grid_attach (grid, widget, 0, 0, 1, 1); + + /* Vertical */ + widget = gtk_combo_box_text_new (); + gtk_widget_set_hexpand (widget, TRUE); + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (widget), "top", _("Top")); + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (widget), "middle", _("Middle")); + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (widget), "bottom", _("Bottom")); + gtk_grid_attach (grid, widget, 3, 0, 1, 1); + dialog->priv->valign_combo = widget; + + g_signal_connect_swapped ( + widget, "changed", + G_CALLBACK (html_editor_cell_dialog_set_valign), dialog); + + widget = gtk_label_new_with_mnemonic (_("_Vertical:")); + gtk_label_set_justify (GTK_LABEL (widget), GTK_JUSTIFY_RIGHT); + gtk_label_set_mnemonic_widget (GTK_LABEL (widget), dialog->priv->valign_combo); + gtk_grid_attach (grid, widget, 2, 0, 1, 1); + + /* Wrap Text */ + widget = gtk_check_button_new_with_mnemonic (_("_Wrap Text")); + dialog->priv->wrap_text_check = widget; + + g_signal_connect_swapped ( + widget, "toggled", + G_CALLBACK (html_editor_cell_dialog_set_wrap_text), dialog); + + /* Header Style */ + widget = gtk_check_button_new_with_mnemonic (_("_Header Style")); + dialog->priv->header_style_check = widget; + + g_signal_connect_swapped ( + widget, "toggled", + G_CALLBACK (html_editor_cell_dialog_set_header_style), dialog); + + widget = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5); + gtk_box_pack_start (GTK_BOX (widget), dialog->priv->wrap_text_check, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (widget), dialog->priv->header_style_check, FALSE, FALSE, 0); + gtk_grid_attach (grid, widget, 0, 1, 4, 1); + + /* == Layout == */ + widget = gtk_label_new (""); + gtk_label_set_markup (GTK_LABEL (widget), _("<b>Layout</b>")); + gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5); + gtk_grid_attach (main_layout, widget, 0, 4, 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, 5, 1, 1); + gtk_widget_set_margin_left (GTK_WIDGET (grid), 10); + + /* Width */ + widget = gtk_check_button_new_with_mnemonic (_("_Width")); + gtk_grid_attach (grid, widget, 0, 0, 1, 1); + dialog->priv->width_check = widget; + + widget = gtk_spin_button_new_with_range (0, G_MAXUINT, 1); + gtk_grid_attach (grid, widget, 1, 0, 1, 1); + dialog->priv->width_edit = widget; + + g_signal_connect_swapped ( + widget, "value-changed", + G_CALLBACK (html_editor_cell_dialog_set_width), dialog); + g_object_bind_property ( + dialog->priv->width_check, "active", + widget, "sensitive", + G_BINDING_SYNC_CREATE); + + widget = gtk_combo_box_text_new (); + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (widget), "unit-px", "px"); + gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (widget), "unit-percent", "%"); + gtk_grid_attach (grid, widget, 2, 0, 1, 1); + dialog->priv->width_units = widget; + + g_signal_connect_swapped ( + widget, "changed", + G_CALLBACK (html_editor_cell_dialog_set_width), dialog); + g_object_bind_property ( + dialog->priv->width_check, "active", + widget, "sensitive", + G_BINDING_SYNC_CREATE); + + /* Row Span */ + widget = gtk_spin_button_new_with_range (0, G_MAXUINT, 1); + gtk_grid_attach (grid, widget, 4, 0, 1, 1); + dialog->priv->row_span_edit = widget; + + g_signal_connect_swapped ( + widget, "value-changed", + G_CALLBACK (html_editor_cell_dialog_set_row_span), dialog); + + widget = gtk_label_new_with_mnemonic (_("Row S_pan:")); + gtk_label_set_justify (GTK_LABEL (widget), GTK_JUSTIFY_RIGHT); + gtk_label_set_mnemonic_widget (GTK_LABEL (widget), dialog->priv->row_span_edit); + gtk_grid_attach (grid, widget, 3, 0, 1, 1); + + /* Column Span */ + widget = gtk_spin_button_new_with_range (0, G_MAXUINT, 1); + gtk_grid_attach (grid, widget, 4, 1, 1, 1); + dialog->priv->col_span_edit = widget; + + g_signal_connect_swapped ( + widget, "value-changed", + G_CALLBACK (html_editor_cell_dialog_set_column_span), dialog); + + widget = gtk_label_new_with_mnemonic (_("Co_lumn Span:")); + gtk_label_set_justify (GTK_LABEL (widget), GTK_JUSTIFY_RIGHT); + gtk_label_set_mnemonic_widget (GTK_LABEL (widget), dialog->priv->col_span_edit); + gtk_grid_attach (grid, widget, 3, 1, 1, 1); + + /* == Background == */ + widget = gtk_label_new (""); + gtk_label_set_markup (GTK_LABEL (widget), _("<b>Background</b>")); + gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5); + gtk_grid_attach (main_layout, widget, 0, 6, 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, 7, 1, 1); + gtk_widget_set_margin_left (GTK_WIDGET (grid), 10); + + /* Color */ + widget = e_color_combo_new (); + e_color_combo_set_default_color (E_COLOR_COMBO (widget), &white); + gtk_widget_set_hexpand (widget, TRUE); + gtk_grid_attach (grid, widget, 1, 0, 1, 1); + g_signal_connect_swapped ( + widget, "notify::current-color", + G_CALLBACK (html_editor_cell_dialog_set_background_color), dialog); + dialog->priv->background_color_picker = widget; + + widget = gtk_label_new_with_mnemonic (_("C_olor:")); + gtk_label_set_justify (GTK_LABEL (widget), GTK_JUSTIFY_RIGHT); + gtk_label_set_mnemonic_widget ( + GTK_LABEL (widget), dialog->priv->background_color_picker); + gtk_grid_attach (grid, widget, 0, 0, 1, 1); + + /* Image */ + widget = e_image_chooser_dialog_new ( + _("Choose Background Image"), + GTK_WINDOW (dialog)); + dialog->priv->background_image_chooser = widget; + + file_filter = gtk_file_filter_new (); + gtk_file_filter_set_name (file_filter, _("Images")); + gtk_file_filter_add_mime_type (file_filter, "image/*"); + + widget = gtk_file_chooser_button_new_with_dialog ( + dialog->priv->background_image_chooser); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (widget), file_filter); + gtk_widget_set_hexpand (widget, TRUE); + gtk_grid_attach (grid, widget, 1, 1, 1, 1); + g_signal_connect_swapped ( + widget, "file-set", + G_CALLBACK (html_editor_cell_dialog_set_background_image), dialog); + dialog->priv->background_image_chooser = widget; + + widget =gtk_label_new_with_mnemonic (_("_Image:")); + gtk_label_set_justify (GTK_LABEL (widget), GTK_JUSTIFY_RIGHT); + gtk_label_set_mnemonic_widget ( + GTK_LABEL (widget), dialog->priv->background_image_chooser); + gtk_grid_attach (grid, widget, 0, 1, 1, 1); + + gtk_widget_show_all (GTK_WIDGET (main_layout)); +} + +GtkWidget * +e_html_editor_cell_dialog_new (EHTMLEditor *editor) +{ + return GTK_WIDGET ( + g_object_new ( + E_TYPE_HTML_EDITOR_CELL_DIALOG, + "editor", editor, + "title", N_("Cell Properties"), + NULL)); +} + +void +e_html_editor_cell_dialog_show (EHTMLEditorCellDialog *dialog, + WebKitDOMNode *cell) +{ + EHTMLEditorCellDialogClass *class; + + g_return_if_fail (E_IS_HTML_EDITOR_CELL_DIALOG (dialog)); + g_return_if_fail (cell != NULL); + + dialog->priv->cell = e_html_editor_dom_node_find_parent_element (cell, "TD"); + if (dialog->priv->cell == NULL) { + dialog->priv->cell = + e_html_editor_dom_node_find_parent_element (cell, "TH"); + } + + class = E_HTML_EDITOR_CELL_DIALOG_GET_CLASS (dialog); + GTK_WIDGET_CLASS (class)->show (GTK_WIDGET (dialog)); +} + |