/* * e-html-editor-test.c * * Copyright (C) 2012 Dan Vrátil * * 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 * */ #include #include #include static const gchar *file_ui = "\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" ""; static const gchar *view_ui = "\n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" " \n" ""; 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, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_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, _("_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", "document-print", N_("_Print..."), "p", NULL, G_CALLBACK (action_print_cb) }, { "print-preview", "document-print-preview", N_("Print Pre_view"), "p", NULL, G_CALLBACK (action_print_preview_cb) }, { "quit", "application-exit", N_("_Quit"), NULL, NULL, G_CALLBACK (action_quit_cb) }, { "save", "document-save", N_("_Save"), NULL, NULL, G_CALLBACK (action_save_cb) }, { "save-as", "document-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; }