aboutsummaryrefslogtreecommitdiffstats
path: root/e-util/test-html-editor.c
diff options
context:
space:
mode:
Diffstat (limited to 'e-util/test-html-editor.c')
-rw-r--r--e-util/test-html-editor.c497
1 files changed, 497 insertions, 0 deletions
diff --git a/e-util/test-html-editor.c b/e-util/test-html-editor.c
new file mode 100644
index 0000000000..488eb44bf1
--- /dev/null
+++ b/e-util/test-html-editor.c
@@ -0,0 +1,497 @@
+/*
+ * e-html-editor-test.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/>
+ *
+ */
+
+#include <gtk/gtk.h>
+#include <e-util/e-util.h>
+
+#include <glib/gi18n-lib.h>
+
+static const gchar *file_ui =
+"<ui>\n"
+" <menubar name='main-menu'>\n"
+" <menu action='file-menu'>\n"
+" <menuitem action='save'/>\n"
+" <menuitem action='save-as'/>\n"
+" <separator/>\n"
+" <menuitem action='print-preview'/>\n"
+" <menuitem action='print'/>\n"
+" <separator/>\n"
+" <menuitem action='disable-editor'/>\n"
+" <separator/>\n"
+" <menuitem action='quit'/>\n"
+" </menu>\n"
+" </menubar>\n"
+"</ui>";
+
+static const gchar *view_ui =
+"<ui>\n"
+" <menubar name='main-menu'>\n"
+" <menu action='view-menu'>\n"
+" <menuitem action='view-html-output'/>\n"
+" <menuitem action='view-html-source'/>\n"
+" <menuitem action='view-plain-source'/>\n"
+" <menuitem action='view-inspector'/>\n"
+" </menu>\n"
+" </menubar>\n"
+"</ui>";
+
+static void
+handle_error (GError **error)
+{
+ if (*error != NULL) {
+ g_warning ("%s", (*error)->message);
+ g_clear_error (error);
+ }
+}
+
+static GtkPrintOperationResult
+print (EHTMLEditor *editor,
+ GtkPrintOperationAction action)
+{
+ WebKitWebFrame *frame;
+ GtkPrintOperation *operation;
+ GtkPrintOperationResult result;
+ GError *error = NULL;
+
+ operation = gtk_print_operation_new ();
+
+ frame = webkit_web_view_get_main_frame (
+ WEBKIT_WEB_VIEW (e_html_editor_get_view (editor)));
+ result = webkit_web_frame_print_full (frame, operation, action, NULL);
+
+ g_object_unref (operation);
+ handle_error (&error);
+
+ return result;
+}
+
+static gint
+save_dialog (EHTMLEditor *editor)
+{
+ GtkWidget *dialog;
+ const gchar *filename;
+ gint response;
+
+ dialog = gtk_file_chooser_dialog_new (
+ _("Save As"),
+ GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (editor))),
+ GTK_FILE_CHOOSER_ACTION_SAVE,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+ NULL);
+
+ gtk_file_chooser_set_do_overwrite_confirmation (
+ GTK_FILE_CHOOSER (dialog), TRUE);
+
+ filename = e_html_editor_get_filename (editor);
+
+ if (filename != NULL)
+ gtk_file_chooser_set_filename (
+ GTK_FILE_CHOOSER (dialog), filename);
+ else
+ gtk_file_chooser_set_current_name (
+ GTK_FILE_CHOOSER (dialog), _("Untitled document"));
+
+ response = gtk_dialog_run (GTK_DIALOG (dialog));
+
+ if (response == GTK_RESPONSE_ACCEPT) {
+ gchar *new_filename;
+
+ new_filename = gtk_file_chooser_get_filename (
+ GTK_FILE_CHOOSER (dialog));
+ e_html_editor_set_filename (editor, new_filename);
+ g_free (new_filename);
+ }
+
+ gtk_widget_destroy (dialog);
+
+ return response;
+}
+
+static void
+view_source_dialog (EHTMLEditor *editor,
+ const gchar *title,
+ gboolean plain_text,
+ gboolean show_source)
+{
+ GtkWidget *dialog;
+ GtkWidget *content;
+ GtkWidget *content_area;
+ GtkWidget *scrolled_window;
+ gchar * html;
+
+ dialog = gtk_dialog_new_with_buttons (
+ title,
+ GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (editor))),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
+ NULL);
+
+ content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
+
+ scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (
+ GTK_SCROLLED_WINDOW (scrolled_window),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type (
+ GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);
+ gtk_box_pack_start (
+ GTK_BOX (content_area),
+ scrolled_window, TRUE, TRUE, 0);
+
+ gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
+ gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 6);
+ gtk_window_set_default_size (GTK_WINDOW (dialog), 400, 300);
+
+ if (plain_text) {
+ html = e_html_editor_view_get_text_plain (
+ e_html_editor_get_view (editor));
+ } else {
+ html = e_html_editor_view_get_text_html (
+ e_html_editor_get_view (editor));
+ }
+
+ if (show_source || plain_text) {
+ GtkTextBuffer *buffer;
+
+ content = gtk_text_view_new ();
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (content));
+ gtk_text_buffer_set_text (buffer, html, -1);
+ gtk_text_view_set_editable (GTK_TEXT_VIEW (content), FALSE);
+ } else {
+ content = webkit_web_view_new ();
+ webkit_web_view_load_string (
+ WEBKIT_WEB_VIEW (content), html, NULL, NULL, NULL);
+ }
+ g_free (html);
+
+ gtk_container_add (GTK_CONTAINER (scrolled_window), content);
+ gtk_widget_show_all (scrolled_window);
+
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+}
+
+static void
+action_print_cb (GtkAction *action,
+ EHTMLEditor *editor)
+{
+ print (editor, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
+}
+
+static void
+action_print_preview_cb (GtkAction *action,
+ EHTMLEditor *editor)
+{
+ print (editor, GTK_PRINT_OPERATION_ACTION_PREVIEW);
+}
+
+static void
+action_quit_cb (GtkAction *action,
+ EHTMLEditor *editor)
+{
+ gtk_main_quit ();
+}
+
+static void
+action_save_cb (GtkAction *action,
+ EHTMLEditor *editor)
+{
+ const gchar *filename;
+ gboolean as_html;
+ GError *error = NULL;
+
+ if (e_html_editor_get_filename (editor) == NULL)
+ if (save_dialog (editor) == GTK_RESPONSE_CANCEL)
+ return;
+
+ filename = e_html_editor_get_filename (editor);
+ as_html = (e_html_editor_view_get_html_mode (e_html_editor_get_view (editor)));
+
+ e_html_editor_save (editor, filename, as_html, &error);
+ handle_error (&error);
+}
+
+static void
+action_save_as_cb (GtkAction *action,
+ EHTMLEditor *editor)
+{
+ const gchar *filename;
+ gboolean as_html;
+ GError *error = NULL;
+
+ if (save_dialog (editor) == GTK_RESPONSE_CANCEL)
+ return;
+
+ filename = e_html_editor_get_filename (editor);
+ as_html = (e_html_editor_view_get_html_mode (e_html_editor_get_view (editor)));
+
+ e_html_editor_save (editor, filename, as_html, &error);
+ handle_error (&error);
+}
+
+static void
+action_toggle_editor (GtkAction *action,
+ EHTMLEditor *editor)
+{
+ EHTMLEditorView *view;
+
+ view = e_html_editor_get_view (editor);
+ webkit_web_view_set_editable (
+ WEBKIT_WEB_VIEW (view),
+ ! webkit_web_view_get_editable (WEBKIT_WEB_VIEW (view)));
+}
+
+static void
+action_view_html_output (GtkAction *action,
+ EHTMLEditor *editor)
+{
+ view_source_dialog (editor, _("HTML Output"), FALSE, FALSE);
+}
+
+static void
+action_view_html_source (GtkAction *action,
+ EHTMLEditor *editor)
+{
+ view_source_dialog (editor, _("HTML Source"), FALSE, TRUE);
+}
+
+static void
+action_view_plain_source (GtkAction *action,
+ EHTMLEditor *editor)
+{
+ view_source_dialog (editor, _("Plain Source"), TRUE, FALSE);
+}
+
+static void
+action_view_inspector (GtkAction *action,
+ EHTMLEditor *editor)
+{
+ WebKitWebInspector *inspector;
+ EHTMLEditorView *view;
+
+ view = e_html_editor_get_view (editor);
+ inspector = webkit_web_view_get_inspector (WEBKIT_WEB_VIEW (view));
+
+ webkit_web_inspector_show (inspector);
+}
+
+static GtkActionEntry file_entries[] = {
+
+ { "print",
+ GTK_STOCK_PRINT,
+ N_("_Print..."),
+ NULL,
+ NULL,
+ G_CALLBACK (action_print_cb) },
+
+ { "print-preview",
+ GTK_STOCK_PRINT_PREVIEW,
+ N_("Print Pre_view"),
+ NULL,
+ NULL,
+ G_CALLBACK (action_print_preview_cb) },
+
+ { "quit",
+ GTK_STOCK_QUIT,
+ N_("_Quit"),
+ NULL,
+ NULL,
+ G_CALLBACK (action_quit_cb) },
+
+ { "save",
+ GTK_STOCK_SAVE,
+ N_("_Save"),
+ NULL,
+ NULL,
+ G_CALLBACK (action_save_cb) },
+
+ { "save-as",
+ GTK_STOCK_SAVE_AS,
+ N_("Save _As..."),
+ NULL,
+ NULL,
+ G_CALLBACK (action_save_as_cb) },
+
+ { "disable-editor",
+ NULL,
+ N_("Disable/Enable Editor"),
+ NULL,
+ NULL,
+ G_CALLBACK (action_toggle_editor) },
+
+ { "file-menu",
+ NULL,
+ N_("_File"),
+ NULL,
+ NULL,
+ NULL }
+};
+
+static GtkActionEntry view_entries[] = {
+
+ { "view-html-output",
+ NULL,
+ N_("HTML _Output"),
+ NULL,
+ NULL,
+ G_CALLBACK (action_view_html_output) },
+
+ { "view-html-source",
+ NULL,
+ N_("_HTML Source"),
+ NULL,
+ NULL,
+ G_CALLBACK (action_view_html_source) },
+
+ { "view-plain-source",
+ NULL,
+ N_("_Plain Source"),
+ NULL,
+ NULL,
+ G_CALLBACK (action_view_plain_source) },
+
+ { "view-inspector",
+ NULL,
+ N_("Inspector"),
+ NULL,
+ NULL,
+ G_CALLBACK (action_view_inspector) },
+
+ { "view-menu",
+ NULL,
+ N_("_View"),
+ NULL,
+ NULL,
+ NULL }
+};
+
+static WebKitWebView *
+open_inspector (WebKitWebInspector *inspector,
+ WebKitWebView *webview,
+ gpointer user_data)
+{
+ GtkWidget *window;
+ GtkWidget *inspector_view;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ inspector_view = webkit_web_view_new ();
+
+ gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (inspector_view));
+
+ gtk_widget_set_size_request (window, 600, 480);
+ gtk_widget_show (window);
+
+ return WEBKIT_WEB_VIEW (inspector_view);
+}
+
+gint
+main (gint argc,
+ gchar **argv)
+{
+ GtkActionGroup *action_group;
+ GtkUIManager *manager;
+ GtkWidget *container;
+ GtkWidget *widget;
+ EHTMLEditor *editor;
+ EHTMLEditorView *view;
+ WebKitWebInspector *inspector;
+
+ GError *error = NULL;
+
+ bindtextdomain (GETTEXT_PACKAGE, EVOLUTION_LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+
+ gtk_init (&argc, &argv);
+
+ editor = g_object_ref_sink (e_html_editor_new ());
+ view = e_html_editor_get_view (editor);
+
+ inspector = webkit_web_view_get_inspector (
+ WEBKIT_WEB_VIEW (view));
+ g_signal_connect (
+ inspector, "inspect-web-view",
+ G_CALLBACK (open_inspector), NULL);
+
+ widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_widget_set_size_request (widget, 600, 400);
+ gtk_widget_show (widget);
+
+ g_signal_connect_swapped (
+ widget, "destroy",
+ G_CALLBACK (gtk_main_quit), NULL);
+
+ container = widget;
+
+ widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+ gtk_container_add (GTK_CONTAINER (container), widget);
+ gtk_widget_show (widget);
+
+ container = widget;
+
+ widget = e_html_editor_get_managed_widget (editor, "/main-menu");
+ gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+ gtk_widget_show (widget);
+
+ widget = e_html_editor_get_managed_widget (editor, "/main-toolbar");
+ gtk_box_pack_start (GTK_BOX (container), widget, FALSE, FALSE, 0);
+ gtk_widget_show (widget);
+
+ widget = GTK_WIDGET (editor);
+ gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0);
+ gtk_widget_show (widget);
+
+ manager = e_html_editor_get_ui_manager (editor);
+
+ gtk_ui_manager_add_ui_from_string (manager, file_ui, -1, &error);
+ handle_error (&error);
+
+ gtk_ui_manager_add_ui_from_string (manager, view_ui, -1, &error);
+ handle_error (&error);
+
+ action_group = gtk_action_group_new ("file");
+ gtk_action_group_set_translation_domain (
+ action_group, GETTEXT_PACKAGE);
+ gtk_action_group_add_actions (
+ action_group, file_entries,
+ G_N_ELEMENTS (file_entries), editor);
+ gtk_ui_manager_insert_action_group (manager, action_group, 0);
+
+ action_group = gtk_action_group_new ("view");
+ gtk_action_group_set_translation_domain (
+ action_group, GETTEXT_PACKAGE);
+ gtk_action_group_add_actions (
+ action_group, view_entries,
+ G_N_ELEMENTS (view_entries), editor);
+ gtk_ui_manager_insert_action_group (manager, action_group, 0);
+
+ gtk_ui_manager_ensure_update (manager);
+
+ g_signal_connect (
+ editor, "destroy",
+ G_CALLBACK (gtk_main_quit), NULL);
+
+ gtk_main ();
+
+ g_object_unref (editor);
+
+ return 0;
+}