X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2FDEVEL%2Fmathml_editor%2Ftest%2FguiGTK.c;h=ce6c31ef227b078c4d9eec664879372115727999;hb=4167cea65ca58897d1a3dbb81ff95de5074700cc;hp=7b58ffbe895522c9d95b0d12ba74e0cce69066fc;hpb=f761deff2f2f8c0cce674d2885b22a94a972ea85;p=helm.git diff --git a/helm/DEVEL/mathml_editor/test/guiGTK.c b/helm/DEVEL/mathml_editor/test/guiGTK.c index 7b58ffbe8..ce6c31ef2 100644 --- a/helm/DEVEL/mathml_editor/test/guiGTK.c +++ b/helm/DEVEL/mathml_editor/test/guiGTK.c @@ -1,9 +1,33 @@ - +/* This file is part of EdiTeX, an editor of mathematical + * expressions based on TeX syntax. + * + * Copyright (C) 2002-2003 Luca Padovani , + * 2003 Paolo Marinelli . + * + * This library 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.1 of the License, or (at your option) any later version. + * + * This library 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 this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * For more information, please visit the project's home page + * http://helm.cs.unibo.it/editex/ + * or send an email to + */ + +#include #include #include #include -#include #include "guiGTK.h" #define XLINK_NS_URI "http://www.w3.org/1999/xlink" @@ -11,70 +35,56 @@ 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 gpointer context = NULL; 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 GdomeElement* root_selected = NULL; 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 file_open(GtkWidget*, gpointer); +static void file_re_open(GtkWidget*, gpointer); +static void file_close(GtkWidget*, gpointer); +static void file_output_tex(GtkWidget*, gpointer); +static void options_set_font_size(GtkWidget*, gpointer); +static void options_change_font_size(GtkWidget*, gboolean); 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 edit_reset_selection(GtkWidget*, gpointer); +static void edit_reset(GtkWidget*, gpointer); +static void edit_insert(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/_Open...", "O", file_open, 0, NULL }, + { "/File/_Reopen", NULL, file_re_open, 0, NULL }, + { "/File/_Close", "W", file_close, 0, NULL }, + { "/File/Output _TeX", NULL, file_output_tex, 0, NULL }, + { "/File/sep1", 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 }, + { "/Edit/Reset Selection", NULL, edit_reset_selection, 0, NULL }, + { "/Edit/Delete Selection", NULL, edit_delete_selection, 0, NULL }, + { "/Edit/Select Parent", NULL, edit_select_parent, 0, NULL }, + { "/Edit/sep1", NULL, NULL, 0, "" }, + { "/Edit/_Reset", NULL, edit_reset, 0, NULL }, + { "/Edit/Insert...", "I", edit_insert, 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/Default Font Size/Set...", NULL, options_set_font_size, 0, NULL }, + { "/Options/Default Font Size/sep1", NULL, NULL, 0, "" }, + { "/Options/Default Font Size/Larger", NULL, options_change_font_size, TRUE, NULL }, + { "/Options/Default Font Size/Smaller", NULL, options_change_font_size, FALSE, NULL }, { "/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 } @@ -116,33 +126,11 @@ load_error_msg(const char* name) 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; - } -} +static guint edit_timeout_id; +extern void edit_timeout(gpointer); void -GUI_init(int* argc, char*** argv, char* title, guint width, guint height, gpointer context) +GUI_init(int* argc, char*** argv, char* title, guint width, guint height, gpointer c) { gtk_init(argc, argv); @@ -154,46 +142,44 @@ GUI_init(int* argc, char*** argv, char* title, guint width, guint height, gpoint 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);*/ + context = c; + /*edit_timeout_id = gtk_timeout_add(50, edit_timeout, context);*/ } void GUI_uninit() { - gtk_timeout_remove(edit_timeout_id); -} - -int -GUI_load_document(GdomeDocument* doc) -{ - GtkMathView* math_view; + GdomeException exc = 0; - 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 (first_selected != NULL) + { + gdome_el_unref(first_selected, &exc); + g_assert(exc == 0); + first_selected = NULL; + } - if (!gtk_math_view_load_doc(math_view, doc)) return -1; + if (root_selected != NULL) + { + gdome_el_unref(root_selected, &exc); + g_assert(exc == 0); + root_selected = NULL; + } - return 0; + context = NULL; } int -GUI_load_uri(const char* uri) +GUI_load_document(GdomeDocument* doc) { GtkMathView* math_view; - g_return_val_if_fail(uri != NULL, -1); + 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_uri(math_view, uri)) return -1; + if (!gtk_math_view_load_document(math_view, doc)) return -1; return 0; } @@ -224,9 +210,6 @@ GUI_unload_document() 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 @@ -235,37 +218,94 @@ GUI_run() gtk_main(); } +#if 0 +void +GUI_set_font_manager(FontManagerId id) +{ + gboolean t1; + GtkMathView* math_view; + + g_return_if_fail(id != FONT_MANAGER_UNKNOWN); + g_return_if_fail(main_area != NULL); + g_return_if_fail(GTK_IS_MATH_VIEW(main_area)); + + t1 = id == FONT_MANAGER_T1; + + math_view = GTK_MATH_VIEW(main_area); + + gtk_math_view_freeze(math_view); + + if (id != gtk_math_view_get_font_manager_type(math_view)) + gtk_math_view_set_font_manager_type(math_view, id); + + gtk_widget_set_sensitive(anti_aliasing(math_view, GTK_CHECK_MENU_ITEM(anti_aliasing_item)->active); + gtk_math_view_set_transparency(math_view, GTK_CHECK_MENU_ITEM(transparency_item)->active); + } + + gtk_math_view_thaw(math_view); +} +#endif + static void -options_selection_mode(GtkWidget* widget, guint mode) +store_filename(GtkFileSelection* selector, GtkWidget* user_data) { + gchar* selected_filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION(user_data)); + if (selected_filename != NULL) + GUI_load_document(selected_filename); } static void -options_font_size(GtkWidget* widget, guint size) +file_close(GtkWidget* widget, gpointer data) { - GtkMathView* math_view; + GUI_unload_document(); +} - g_return_if_fail(main_area != NULL); - g_return_if_fail(GTK_IS_MATH_VIEW(main_area)); +static void +file_re_open(GtkWidget* widget, gpointer data) +{ + if (doc_name != NULL) { + GUI_load_document(doc_name); + } +} - math_view = GTK_MATH_VIEW(main_area); +static void +file_open(GtkWidget* widget, gpointer data) +{ + GtkWidget* fs = gtk_file_selection_new("Open File"); + + gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(fs)->ok_button), + "clicked", GTK_SIGNAL_FUNC (store_filename), (gpointer) fs); + + /* Ensure that the dialog box is destroyed when the user clicks a button. */ + + gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION(fs)->ok_button), + "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), + (gpointer) fs); - gtk_math_view_set_font_size(math_view, size); + gtk_signal_connect_object (GTK_OBJECT (GTK_FILE_SELECTION(fs)->cancel_button), + "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), + (gpointer) fs); + + /* Display that dialog */ + + gtk_widget_show (fs); } static void -options_anti_aliasing(GtkWidget* widget, gpointer data) +file_output_tex(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); + g_assert(context != NULL); + edit_output_tex(context); } +#if 0 static void -options_transparency(GtkWidget* widget, gpointer data) +options_font_manager(GtkWidget* widget, FontManagerId id) { - gboolean t = gtk_math_view_get_transparency(GTK_MATH_VIEW(main_area)); - gtk_math_view_set_transparency(GTK_MATH_VIEW(main_area), !t); + g_return_if_fail(id != FONT_MANAGER_UNKNOWN); + GUI_set_font_manager(id); } +#endif static void options_verbosity(GtkWidget* widget, guint level) @@ -295,241 +335,228 @@ 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)); + GdomeElement* parent = 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); + /* gtk_math_view_set_selection(GTK_MATH_VIEW(main_area), root_selected); */ } } static void -help_about(GtkWidget* widget, gpointer data) +edit_reset_selection(GtkWidget* widget, gpointer data) +{ + if (root_selected != NULL) + { + GdomeException exc = 0; + /* gtk_math_view_reset_selection(GTK_MATH_VIEW(main_area), root_selected); */ + gdome_el_unref(root_selected, &exc); + g_assert(exc == 0); + root_selected = NULL; + } +} + +static void +edit_reset(GtkWidget* widget, gpointer data) +{ + g_assert(context != NULL); + edit_reset_tex(context); +} + +static void +insert_tex(GtkWidget* widget, GtkEntry* entry) +{ + gchar* text; + g_return_if_fail(entry != NULL); + + text = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1); + edit_push_string(context, text); + g_free(text); +} + +static void +edit_insert(GtkWidget* widget, gpointer data) { GtkWidget* dialog; - GtkWidget* label; + GtkWidget* entry; GtkWidget* ok; + GtkWidget* cancel; 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"); + entry = gtk_entry_new(); + ok = gtk_button_new_with_label("OK"); + cancel = gtk_button_new_with_label("Cancel"); + + gtk_signal_connect (GTK_OBJECT (ok), "clicked", + GTK_SIGNAL_FUNC (insert_tex), (gpointer) entry); 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_signal_connect_object (GTK_OBJECT (ok), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_destroy), (gpointer) dialog); + + gtk_signal_connect_object (GTK_OBJECT (cancel), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_destroy), (gpointer) dialog); + + gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), 5); + + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), entry); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), ok); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), cancel); gtk_widget_show_all (dialog); } -#if 0 -#if defined(HAVE_GMETADOM) static void -element_changed(GtkMathView* math_view, GdomeElement* node) +help_about(GtkWidget* widget, gpointer data) { - GdomeException exc; - GdomeDOMString* name; - GdomeDOMString* ns_uri; - - g_return_if_fail(math_view != NULL); - g_return_if_fail(GTK_IS_MATH_VIEW(math_view)); + GtkWidget* dialog; + GtkWidget* label; + GtkWidget* ok; - name = gdome_str_mkref("href"); - ns_uri = gdome_str_mkref(XLINK_NS_URI); + dialog = gtk_dialog_new(); + label = gtk_label_new("\n MathML Editor \n Copyright (C) 2003 Luca Padovani \n"); + ok = gtk_button_new_with_label("Close"); - while (node != NULL && !gdome_el_hasAttributeNS(node, ns_uri, name, &exc)) - node = gdome_cast_el(gdome_el_parentNode(node, &exc)); + 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); - 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); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), label); - gdome_str_unref(name); - gdome_str_unref(ns_uri); + gtk_widget_show_all (dialog); } -#endif static void -#if defined(HAVE_GMETADOM) -action_changed(GtkMathView* math_view, GdomeElement* node) -#endif +change_default_font_size(GtkWidget* widget, GtkSpinButton* spin) { - g_return_if_fail(math_view != NULL); - g_return_if_fail(GTK_IS_MATH_VIEW(math_view)); + g_return_if_fail(spin != NULL); + gtk_math_view_set_font_size( GTK_MATH_VIEW(main_area), gtk_spin_button_get_value_as_int(spin)); } static void -#if defined(HAVE_GMETADOM) -selection_changed(GtkMathView* math_view, GdomeElement* node) -#endif +options_change_font_size(GtkWidget* widget, gboolean larger) { - 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(); + gfloat size = gtk_math_view_get_font_size (GTK_MATH_VIEW(main_area)); + if (larger) size = size / 0.71; + else size = size * 0.71; + if (size < 1) size = 1; + gtk_math_view_set_font_size (GTK_MATH_VIEW(main_area), (gint) size + 0.5); } -#if defined(HAVE_GMETADOM) static void -clicked(GtkMathView* math_view, gpointer user_data) +options_set_font_size(GtkWidget* widget, gpointer 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)); + GtkWidget* dialog; + GtkWidget* label; + GtkWidget* ok; + GtkWidget* cancel; + GtkWidget* spin; + GtkObject* adj; - if (p != NULL) { - GdomeDOMString* href = gdome_el_getAttributeNS(p, ns_uri, name, &exc); - g_assert(href != NULL); + dialog = gtk_dialog_new(); + label = gtk_label_new("Default font size:"); + ok = gtk_button_new_with_label("OK"); + cancel = gtk_button_new_with_label("Cancel"); - 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 + adj = gtk_adjustment_new (gtk_math_view_get_font_size (GTK_MATH_VIEW(main_area)), 1, 200, 1, 1, 1); + spin = gtk_spin_button_new (GTK_ADJUSTMENT(adj), 1, 0); + gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spin), TRUE); -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; + gtk_signal_connect (GTK_OBJECT (ok), "clicked", + GTK_SIGNAL_FUNC (change_default_font_size), (gpointer) spin); - cursor_off(); + gtk_signal_connect_object (GTK_OBJECT (ok), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_destroy), (gpointer) dialog); - 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; - } + gtk_signal_connect_object (GTK_OBJECT (ok), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_destroy), (gpointer) dialog); - if (first_selected != NULL) - { - gdome_el_unref(first_selected, &exc); - g_assert(exc == 0); - } + gtk_signal_connect_object (GTK_OBJECT (cancel), "clicked", + GTK_SIGNAL_FUNC (gtk_widget_destroy), (gpointer) dialog); - if (last_selected != NULL) - { - gdome_el_unref(last_selected, &exc); - g_assert(exc == 0); - last_selected = NULL; - } + gtk_container_set_border_width (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), 5); - first_selected = gtk_math_view_get_element_at(math_view, event->x, event->y); - button_pressed = TRUE; - selecting = FALSE; - } + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), ok); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->action_area), cancel); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), label); + gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), spin); - return FALSE; + gtk_widget_show_all (dialog); } -static gint -motion_notify_event(GtkWidget* widget, - GdkEventMotion* event, - GtkMathView* math_view) +static void +select_begin(GtkMathView* math_view, GdomeElement* first, gint state) { - g_return_val_if_fail(event != NULL, FALSE); - g_return_val_if_fail(math_view != NULL, FALSE); + GdomeException exc = 0; - if (button_pressed && first_selected != NULL) - { - GdomeException exc; - GdomeElement* el = gtk_math_view_get_element_at(math_view, event->x, event->y); - GdomeElement* root; + g_return_if_fail(math_view != NULL); + g_return_if_fail(GTK_IS_MATH_VIEW(math_view)); + g_return_if_fail(first != NULL); - selecting = TRUE; + gtk_math_view_freeze(math_view); - if (el != NULL && el != last_selected) - { - if (last_selected != NULL) - { - gdome_el_unref(last_selected, &exc); - g_assert(exc == 0); - } + if (root_selected != NULL) + { + gtk_math_view_unselect(math_view, root_selected); + gdome_el_unref(root_selected, &exc); + g_assert(exc == 0); + } - last_selected = el; - } + root_selected = first_selected = find_element_with_ref(first); - 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); - } - } + if (root_selected != NULL) + { + gtk_math_view_select(math_view, root_selected); + gdome_el_ref(root_selected, &exc); + g_assert(exc == 0); } - return FALSE; + gtk_math_view_thaw(math_view); } -static gint -button_release_event(GtkWidget* widget, - GdkEventButton* event, - GtkMathView* math_view) +static void +select_over(GtkMathView* math_view, GdomeElement* elem, gint state) { - g_return_val_if_fail(event != NULL, FALSE); - g_return_val_if_fail(math_view != NULL, FALSE); - - if (event->button == 1) + GdomeElement* new_selected = NULL; + GdomeException exc = 0; + + g_return_if_fail(math_view != NULL); + g_return_if_fail(GTK_IS_MATH_VIEW(math_view)); + g_return_if_fail(elem != NULL); + + if (first_selected == NULL || elem == NULL) + new_selected = NULL; + else + new_selected = find_common_ancestor_with_ref(first_selected, elem); + + if (new_selected != root_selected) { - if (!selecting) + gtk_math_view_freeze(math_view); + if (root_selected != NULL) { - cursor_ptr = first_selected; - cursor_on(); + gtk_math_view_unselect(math_view, root_selected); + gdome_el_unref(root_selected, &exc); + g_assert(exc == 0); } - - button_pressed = FALSE; - selecting = FALSE; + root_selected = new_selected; + if (root_selected != NULL) + gtk_math_view_select(math_view, root_selected); + gtk_math_view_thaw(math_view); + } + else if (new_selected != NULL) + { + gdome_el_unref(new_selected, &exc); + g_assert(exc == 0); } - return FALSE; } static gboolean -key_press_event(gpointer context, +key_press_event(gpointer c, GdkEventKey* event, GtkWidget* widget) { @@ -539,35 +566,19 @@ key_press_event(gpointer context, 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; - } + switch (event->keyval) + { + case GDK_BackSpace: + edit_drop(context, event->state & GDK_MOD1_MASK, event->state & GDK_CONTROL_MASK); + break; + case GDK_Tab: + edit_complete(context); + break; + default: + if ((event->state & (GDK_CONTROL_MASK | GDK_MOD1_MASK)) == 0 && event->keyval < 0x80) + edit_push_char(context, event->keyval); + return FALSE; + } return TRUE; } @@ -592,45 +603,19 @@ create_widget_set(gpointer context) //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), + "select_begin", GTK_SIGNAL_FUNC (select_begin), (gpointer) main_area); gtk_signal_connect_object (GTK_OBJECT (main_area), - "motion_notify_event", GTK_SIGNAL_FUNC(motion_notify_event), + "select_over", GTK_SIGNAL_FUNC (select_over), (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); + gtk_widget_add_events(GTK_WIDGET(main_area), GDK_KEY_PRESS_MASK); scrolled_area = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_area), @@ -640,17 +625,7 @@ create_widget_set(gpointer context) 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* @@ -670,17 +645,5 @@ get_main_menu() 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, "
"); }