X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2FDEVEL%2Fmathml_editor%2Ftest%2FguiGTK.c;fp=helm%2FDEVEL%2Fmathml_editor%2Ftest%2FguiGTK.c;h=53bbd74101d9b5f7df2fc34a2a9b76cd243c0375;hb=30060cffed61b88fe53e4d6386b606050d6dfda0;hp=0000000000000000000000000000000000000000;hpb=e6927665462cbbace76cff1b17d4f8badcb44eda;p=helm.git diff --git a/helm/DEVEL/mathml_editor/test/guiGTK.c b/helm/DEVEL/mathml_editor/test/guiGTK.c new file mode 100644 index 000000000..53bbd7410 --- /dev/null +++ b/helm/DEVEL/mathml_editor/test/guiGTK.c @@ -0,0 +1,686 @@ + +#include +#include +#include + +#include "gtkmathview.h" +#include "guiGTK.h" + +#define XLINK_NS_URI "http://www.w3.org/1999/xlink" + +static GtkWidget* window; +static GtkWidget* main_area; +static GtkWidget* scrolled_area; +static GtkWidget* status_bar; +static GtkMenuItem* anti_aliasing_item; +static GtkMenuItem* transparency_item; +static GtkMenuItem* font_size_item; +static GdkCursor* normal_cursor; +static GdkCursor* link_cursor; + +static gchar* doc_name = NULL; +static GdomeElement* root_selected = NULL; +static GdomeElement* first_selected = NULL; +static GdomeElement* last_selected = NULL; +static GdomeElement* cursor = NULL; +static gboolean selecting = FALSE; +static gboolean button_pressed = FALSE; + +static guint statusbar_context; + +static guint edit_timeout_id; +static GdomeElement* cursor_ptr = NULL; +static gboolean cursor_active = FALSE; + +static void create_widget_set(gpointer); +static GtkWidget* get_main_menu(void); +static void options_selection_mode(GtkWidget*, guint); +static void options_font_size(GtkWidget*, guint); +static void options_verbosity(GtkWidget*, guint); +static void options_anti_aliasing(GtkWidget*, gpointer); +static void options_transparency(GtkWidget*, gpointer); +static void edit_delete_selection(GtkWidget*, gpointer); +static void edit_select_parent(GtkWidget*, gpointer); +static void help_about(GtkWidget*, gpointer); + +extern int edit_timeout(gpointer); +extern void push_char(gpointer, gchar); + +static GtkItemFactoryEntry menu_items[] = { + { "/_File", NULL, NULL, 0, "" }, + { "/File/_Quit", "Q", gtk_main_quit, 0, NULL }, + + { "/_Edit", NULL, NULL, 0, "" }, + { "/Edit/Delete Selection", NULL, edit_delete_selection, 0, NULL }, + { "/Edit/Select Parent", NULL, edit_select_parent, 0, NULL }, + + { "/_Options", NULL, NULL, 0, "" }, + { "/Options/_Selection Mode", NULL, NULL, 0, "" }, + { "/Options/Selection Mode/_Structure", NULL, options_selection_mode, 0, "" }, + { "/Options/Selection Mode/_Linear", NULL, options_selection_mode, 1, "/Options/Selection Mode/Structure" }, + { "/Options/Default _Font Size", NULL, NULL, 0, "" }, + { "/Options/Default Font Size/8pt", NULL, options_font_size, 8, "" }, + { "/Options/Default Font Size/10pt", NULL, options_font_size, 10, "/Options/Default Font Size/8pt" }, + { "/Options/Default Font Size/12pt", NULL, options_font_size, 12, "/Options/Default Font Size/8pt" }, + { "/Options/Default Font Size/14pt", NULL, options_font_size, 14, "/Options/Default Font Size/8pt" }, + { "/Options/Default Font Size/18pt", NULL, options_font_size, 18, "/Options/Default Font Size/8pt" }, + { "/Options/Default Font Size/24pt", NULL, options_font_size, 24, "/Options/Default Font Size/8pt" }, + { "/Options/Default Font Size/48pt", NULL, options_font_size, 48, "/Options/Default Font Size/8pt" }, + { "/Options/Default Font Size/72pt", NULL, options_font_size, 72, "/Options/Default Font Size/8pt" }, + { "/Options/Verbosity", NULL, NULL, 0, "" }, + { "/Options/Verbosity/_Errors", NULL, options_verbosity, 0, "" }, + { "/Options/Verbosity/_Warnings", NULL, options_verbosity, 1, "/Options/Verbosity/Errors" }, + { "/Options/Verbosity/_Info", NULL, options_verbosity, 2, "/Options/Verbosity/Errors" }, + { "/Options/Verbosity/_Debug", NULL, options_verbosity, 3, "/Options/Verbosity/Errors" }, + { "/Options/sep1", NULL, NULL, 0, "" }, + { "/Options/_Anti Aliasing", NULL, options_anti_aliasing, 0, "" }, + { "/Options/_Transparency", NULL, options_transparency, 0, "" }, + + { "/_Help" , NULL, NULL, 0, "" }, + { "/Help/About...", NULL, help_about, 0, NULL } +}; + +static void +quick_message(const char* msg) +{ + GtkWidget* dialog; + GtkWidget* label; + GtkWidget* okay_button; + + /* Create the widgets */ + + dialog = gtk_dialog_new(); + label = gtk_label_new (msg); + okay_button = gtk_button_new_with_label("OK"); + + gtk_widget_set_usize(dialog, 300, 100); + + /* Ensure that the dialog box is destroyed when the user clicks ok. */ + + gtk_signal_connect_object (GTK_OBJECT (okay_button), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_destroy), dialog); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), + okay_button); + + /* Add the label, and show everything we've added to the dialog. */ + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), label); + gtk_widget_show_all (dialog); +} + +static void +load_error_msg(const char* name) +{ + char* msg = g_strdup_printf("Could not load\n`%s'", name); + quick_message(msg); + g_free(msg); +} + +static void +cursor_off() +{ + if (cursor_active) + { + cursor_active = FALSE; + if (cursor_ptr != NULL && + gtk_math_view_is_selected(main_area, cursor_ptr)) + gtk_math_view_reset_selection(main_area, cursor_ptr); + } +} + +static void +cursor_on() +{ + if (!cursor_active) + { + cursor_active = FALSE; + if (cursor_ptr != NULL && + !gtk_math_view_is_selected(main_area, cursor_ptr)) + gtk_math_view_set_selection(main_area, cursor_ptr); + cursor_active = TRUE; + } +} + +void +GUI_init(int* argc, char*** argv, char* title, guint width, guint height, gpointer context) +{ + gtk_init(argc, argv); + + window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(window), title); + gtk_window_set_default_size(GTK_WINDOW(window), width, height); + gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc) gtk_main_quit, NULL); + create_widget_set(context); + + gtk_widget_show(window); + + normal_cursor = gdk_cursor_new(GDK_TOP_LEFT_ARROW); + link_cursor = gdk_cursor_new(GDK_HAND2); + + /*edit_timeout_id = gtk_timeout_add(400, edit_timeout, context);*/ +} + +void +GUI_uninit() +{ + gtk_timeout_remove(edit_timeout_id); +} + +int +GUI_load_document(GdomeDocument* doc) +{ + GtkMathView* math_view; + + g_return_val_if_fail(doc != NULL, -1); + g_return_val_if_fail(main_area != NULL, -1); + g_return_val_if_fail(GTK_IS_MATH_VIEW(main_area), -1); + + math_view = GTK_MATH_VIEW(main_area); + + if (!gtk_math_view_load_doc(math_view, doc)) return -1; + + return 0; +} + +int +GUI_load_uri(const char* uri) +{ + GtkMathView* math_view; + + g_return_val_if_fail(uri != NULL, -1); + g_return_val_if_fail(main_area != NULL, -1); + g_return_val_if_fail(GTK_IS_MATH_VIEW(main_area), -1); + + math_view = GTK_MATH_VIEW(main_area); + + if (!gtk_math_view_load_uri(math_view, uri)) return -1; + + return 0; +} + +void +GUI_freeze() +{ + gtk_math_view_freeze(GTK_MATH_VIEW(main_area)); +} + +void +GUI_thaw() +{ + gtk_math_view_thaw(GTK_MATH_VIEW(main_area)); +} + +void +GUI_unload_document() +{ + GtkMathView* math_view; + + g_return_if_fail(main_area != NULL); + g_return_if_fail(GTK_IS_MATH_VIEW(main_area)); + + math_view = GTK_MATH_VIEW(main_area); + + gtk_math_view_unload(math_view); + + if (doc_name != NULL) g_free(doc_name); + doc_name = NULL; + + gtk_statusbar_pop(GTK_STATUSBAR(status_bar), statusbar_context); + gtk_statusbar_push(GTK_STATUSBAR(status_bar), statusbar_context, ""); +} + +void +GUI_run() +{ + gtk_main(); +} + +static void +options_selection_mode(GtkWidget* widget, guint mode) +{ +} + +static void +options_font_size(GtkWidget* widget, guint size) +{ + GtkMathView* math_view; + + g_return_if_fail(main_area != NULL); + g_return_if_fail(GTK_IS_MATH_VIEW(main_area)); + + math_view = GTK_MATH_VIEW(main_area); + + gtk_math_view_set_font_size(math_view, size); +} + +static void +options_anti_aliasing(GtkWidget* widget, gpointer data) +{ + gboolean aa = gtk_math_view_get_anti_aliasing(GTK_MATH_VIEW(main_area)); + gtk_math_view_set_anti_aliasing(GTK_MATH_VIEW(main_area), !aa); +} + +static void +options_transparency(GtkWidget* widget, gpointer data) +{ + gboolean t = gtk_math_view_get_transparency(GTK_MATH_VIEW(main_area)); + gtk_math_view_set_transparency(GTK_MATH_VIEW(main_area), !t); +} + +static void +options_verbosity(GtkWidget* widget, guint level) +{ + gtk_math_view_set_log_verbosity(GTK_MATH_VIEW(main_area), level); +} + +static void +edit_delete_selection(GtkWidget* widget, gpointer data) +{ + if (root_selected != NULL) + { + GdomeException exc; + gtk_math_view_freeze(GTK_MATH_VIEW(main_area)); + printf("about to remove element %p\n", root_selected); + delete_element(root_selected); + gdome_el_unref(root_selected, &exc); + g_assert(exc == 0); + root_selected = NULL; + gtk_math_view_thaw(GTK_MATH_VIEW(main_area)); + } +} + +static void +edit_select_parent(GtkWidget* widget, gpointer data) +{ + if (root_selected != NULL) + { + GdomeException exc = 0; + GdomeElement* parent = gdome_cast_el(gdome_n_parentNode(root_selected, &exc)); + g_assert(exc == 0); + gdome_el_unref(root_selected, &exc); + g_assert(exc == 0); + root_selected = parent; + gtk_math_view_set_selection(GTK_MATH_VIEW(main_area), root_selected); + } +} + +static void +help_about(GtkWidget* widget, gpointer data) +{ + GtkWidget* dialog; + GtkWidget* label; + GtkWidget* ok; + + dialog = gtk_dialog_new(); + label = gtk_label_new("\n MathML Viewer \n Copyright (C) 2000-2002 Luca Padovani \n"); + ok = gtk_button_new_with_label("Close"); + + gtk_signal_connect_object (GTK_OBJECT (ok), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_destroy), (gpointer) dialog); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), + ok); + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), label); + + gtk_widget_show_all (dialog); +} + +#if 0 +#if defined(HAVE_GMETADOM) +static void +element_changed(GtkMathView* math_view, GdomeElement* node) +{ + GdomeException exc; + GdomeDOMString* name; + GdomeDOMString* ns_uri; + + g_return_if_fail(math_view != NULL); + g_return_if_fail(GTK_IS_MATH_VIEW(math_view)); + + name = gdome_str_mkref("href"); + ns_uri = gdome_str_mkref(XLINK_NS_URI); + + while (node != NULL && !gdome_el_hasAttributeNS(node, ns_uri, name, &exc)) + node = gdome_cast_el(gdome_el_parentNode(node, &exc)); + + if (node != NULL && gdome_el_hasAttributeNS(node, ns_uri, name, &exc)) + gdk_window_set_cursor(GTK_WIDGET(math_view)->window, link_cursor); + else + gdk_window_set_cursor(GTK_WIDGET(math_view)->window, normal_cursor); + + gdome_str_unref(name); + gdome_str_unref(ns_uri); +} +#endif + +static void +#if defined(HAVE_GMETADOM) +action_changed(GtkMathView* math_view, GdomeElement* node) +#endif +{ + g_return_if_fail(math_view != NULL); + g_return_if_fail(GTK_IS_MATH_VIEW(math_view)); +} + +static void +#if defined(HAVE_GMETADOM) +selection_changed(GtkMathView* math_view, GdomeElement* node) +#endif +{ + g_return_if_fail(math_view != NULL); + g_return_if_fail(GTK_IS_MATH_VIEW(math_view)); + gtk_math_view_set_selection(math_view, node); + + cursor_off(); + cursor_ptr = node; + cursor_on(); +} + +#if defined(HAVE_GMETADOM) +static void +clicked(GtkMathView* math_view, gpointer user_data) +{ + GdomeException exc; + GdomeDOMString* name; + GdomeDOMString* ns_uri; + GdomeElement* p; + + g_return_if_fail(math_view != NULL); + + name = gdome_str_mkref("href"); + ns_uri = gdome_str_mkref(XLINK_NS_URI); + + p = gtk_math_view_get_element(math_view); + while (p != NULL && !gdome_el_hasAttributeNS(p, ns_uri, name, &exc)) + p = gdome_cast_el(gdome_el_parentNode(p, &exc)); + + if (p != NULL) { + GdomeDOMString* href = gdome_el_getAttributeNS(p, ns_uri, name, &exc); + g_assert(href != NULL); + + GUI_load_document(href->str); + gdome_str_unref(href); + } else if (gtk_math_view_get_action(math_view) != NULL) + gtk_math_view_action_toggle(math_view); +} +#endif +#endif + +static gint +button_press_event(GtkWidget* widget, + GdkEventButton* event, + GtkMathView* math_view) +{ + g_return_val_if_fail(event != NULL, FALSE); + g_return_val_if_fail(math_view != NULL, FALSE); + + if (event->button == 1) + { + GdomeException exc; + + cursor_off(); + + if (root_selected != NULL) + { + gtk_math_view_reset_selection(math_view, root_selected); + gdome_el_unref(root_selected, &exc); + g_assert(exc == 0); + root_selected = NULL; + } + + if (first_selected != NULL) + { + gdome_el_unref(first_selected, &exc); + g_assert(exc == 0); + } + + if (last_selected != NULL) + { + gdome_el_unref(last_selected, &exc); + g_assert(exc == 0); + last_selected = NULL; + } + + first_selected = gtk_math_view_get_element_at(math_view, event->x, event->y); + button_pressed = TRUE; + selecting = FALSE; + } + + return FALSE; +} + +static gint +motion_notify_event(GtkWidget* widget, + GdkEventMotion* event, + GtkMathView* math_view) +{ + g_return_val_if_fail(event != NULL, FALSE); + g_return_val_if_fail(math_view != NULL, FALSE); + + if (button_pressed && first_selected != NULL) + { + GdomeException exc; + GdomeElement* el = gtk_math_view_get_element_at(math_view, event->x, event->y); + GdomeElement* root; + + selecting = TRUE; + + if (el != NULL && el != last_selected) + { + if (last_selected != NULL) + { + gdome_el_unref(last_selected, &exc); + g_assert(exc == 0); + } + + last_selected = el; + } + + if (last_selected != NULL) + { + root = find_common_ancestor(first_selected, last_selected); + g_assert(root != NULL); + + if (root != root_selected) + { + gtk_math_view_freeze(math_view); + if (root_selected != NULL) + { + gtk_math_view_reset_selection(math_view, root_selected); + gdome_el_unref(root_selected, &exc); + g_assert(exc == 0); + } + root_selected = root; + gtk_math_view_set_selection(math_view, root_selected); + gtk_math_view_thaw(math_view); + } + else + { + gdome_el_unref(root, &exc); + g_assert(exc == 0); + } + } + } + + return FALSE; +} + +static gint +button_release_event(GtkWidget* widget, + GdkEventButton* event, + GtkMathView* math_view) +{ + g_return_val_if_fail(event != NULL, FALSE); + g_return_val_if_fail(math_view != NULL, FALSE); + + if (event->button == 1) + { + if (!selecting) + { + cursor_ptr = first_selected; + cursor_on(); + } + + button_pressed = FALSE; + selecting = FALSE; + } + + return FALSE; +} + +static gboolean +key_press_event(gpointer context, + GdkEventKey* event, + GtkWidget* widget) +{ + g_return_val_if_fail(widget != NULL, FALSE); + g_return_val_if_fail(event != NULL, FALSE); + g_return_val_if_fail(context != NULL, FALSE); + + if (event->type != GDK_KEY_PRESS) return FALSE; + + switch (event->keyval) { + case GDK_Up: + case GDK_KP_Up: + break; + case GDK_Down: + case GDK_KP_Down: + break; + case GDK_Left: + case GDK_KP_Left: + break; + case GDK_Right: + case GDK_KP_Right: + break; + case GDK_Page_Up: + case GDK_KP_Page_Up: + break; + case GDK_Page_Down: + case GDK_KP_Page_Down: + break; + case GDK_Home: + case GDK_KP_Home: + break; + case GDK_End: + case GDK_KP_End: + break; + default: + if (event->keyval < 0x80) push_char(context, event->keyval); + return FALSE; + } + + return TRUE; +} + +static void +create_widget_set(gpointer context) +{ + GtkWidget* main_vbox; + GtkWidget* menu_bar; + + main_vbox = gtk_vbox_new(FALSE, 1); + gtk_container_border_width(GTK_CONTAINER(main_vbox), 1); + gtk_container_add(GTK_CONTAINER(window), main_vbox); + gtk_widget_show(main_vbox); + + menu_bar = get_main_menu(); + gtk_box_pack_start(GTK_BOX(main_vbox), menu_bar, FALSE, TRUE, 0); + gtk_widget_show(menu_bar); + + main_area = gtk_math_view_new(NULL, NULL); + gtk_widget_show(main_area); + + //gtk_math_view_set_log_verbosity(GTK_MATH_VIEW(main_area), 3); + +#if 0 + gtk_signal_connect_object (GTK_OBJECT (main_area), + "selection_changed", GTK_SIGNAL_FUNC (selection_changed), + (gpointer) main_area); + + gtk_signal_connect_object (GTK_OBJECT (main_area), + "element_changed", GTK_SIGNAL_FUNC (element_changed), + (gpointer) main_area); + + gtk_signal_connect_object (GTK_OBJECT (main_area), + "action_changed", GTK_SIGNAL_FUNC (action_changed), + (gpointer) main_area); + + gtk_signal_connect_object (GTK_OBJECT (main_area), + "clicked", GTK_SIGNAL_FUNC(clicked), + (gpointer) main_area); +#endif + + gtk_signal_connect_object (GTK_OBJECT (main_area), + "button_press_event", GTK_SIGNAL_FUNC(button_press_event), + (gpointer) main_area); + + gtk_signal_connect_object (GTK_OBJECT (main_area), + "button_release_event", GTK_SIGNAL_FUNC(button_release_event), + (gpointer) main_area); + + gtk_signal_connect_object (GTK_OBJECT (main_area), + "motion_notify_event", GTK_SIGNAL_FUNC(motion_notify_event), + (gpointer) main_area); + + gtk_signal_connect_object (GTK_OBJECT(window), + "key_press_event", GTK_SIGNAL_FUNC(key_press_event), + context); + + gtk_widget_add_events(GTK_WIDGET(main_area), + GDK_BUTTON_PRESS_MASK + | GDK_BUTTON_RELEASE_MASK + | GDK_POINTER_MOTION_MASK + | GDK_KEY_PRESS_MASK); + + scrolled_area = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_area), + GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + + gtk_widget_show(scrolled_area); + gtk_container_add(GTK_CONTAINER(scrolled_area), main_area); + gtk_box_pack_start(GTK_BOX(main_vbox), scrolled_area, TRUE, TRUE, 0); + + status_bar = gtk_statusbar_new(); + gtk_widget_show(status_bar); + gtk_box_pack_start(GTK_BOX(main_vbox), status_bar, FALSE, TRUE, 0); + statusbar_context = gtk_statusbar_get_context_id(GTK_STATUSBAR(status_bar), "filename"); + + gtk_widget_show(main_vbox); + + if (gtk_math_view_get_anti_aliasing(GTK_MATH_VIEW(main_area))) + gtk_menu_item_activate(anti_aliasing_item); + + gtk_menu_item_activate(font_size_item); +} + +GtkWidget* +get_main_menu() +{ + GtkItemFactory* item_factory; + GtkAccelGroup* accel_group; + GtkWidget* menu_item; + + gint nmenu_items = sizeof(menu_items) / sizeof(menu_items[0]); + + accel_group = gtk_accel_group_new(); + + item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "
", accel_group); + + gtk_item_factory_create_items(item_factory, nmenu_items, menu_items, NULL); + + gtk_window_add_accel_group(GTK_WINDOW(window), accel_group); + + menu_item = gtk_item_factory_get_widget(item_factory, "/Options/Anti Aliasing"); + anti_aliasing_item = GTK_MENU_ITEM(menu_item); + + menu_item = gtk_item_factory_get_widget(item_factory, "/Options/Transparency"); + transparency_item = GTK_MENU_ITEM(menu_item); + + /* !!!BEWARE!!! the default font size must be kept aligned with the definition + * in math-engine-configuration.xml + */ + menu_item = gtk_item_factory_get_widget(item_factory, "/Options/Default Font Size/12pt"); + font_size_item = GTK_MENU_ITEM(menu_item); + + return gtk_item_factory_get_widget(item_factory, "
"); +}