]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/DEVEL/mathml_editor/test/guiGTK.c
ocaml 3.09 transition
[helm.git] / helm / DEVEL / mathml_editor / test / guiGTK.c
index 7b58ffbe895522c9d95b0d12ba74e0cce69066fc..ce6c31ef227b078c4d9eec664879372115727999 100644 (file)
@@ -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 <lpadovan@cs.unibo.it>,
+ *                    2003 Paolo Marinelli <pmarinel@cs.unibo.it>.
+ *
+ * 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 <lpadovan@cs.unibo.it>
+ */
+
+#include <config.h>
 #include <stdio.h>
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
 
-#include <gtkmathview/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 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, "<Branch>" },
+  { "/File/_Open...",                  "<control>O", file_open,     0, NULL },
+  { "/File/_Reopen",                   NULL,         file_re_open,  0, NULL },
+  { "/File/_Close",                    "<control>W", file_close,    0, NULL },
+  { "/File/Output _TeX",               NULL,         file_output_tex, 0, NULL },
+  { "/File/sep1",                      NULL,         NULL,          0, "<Separator>" },
   { "/File/_Quit",                     "<control>Q", gtk_main_quit, 0, NULL },
 
   { "/_Edit",                          NULL, NULL,                  0,  "<Branch>" },
-  { "/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, "<Separator>" },
+  { "/Edit/_Reset",                    NULL, edit_reset,            0, NULL },
+  { "/Edit/Insert...",                 "<control>I", edit_insert,   0, NULL },
 
   { "/_Options",                       NULL, NULL,                  0,  "<Branch>" },
-  { "/Options/_Selection Mode",        NULL, NULL,                  0,  "<Branch>" },
-  { "/Options/Selection Mode/_Structure", NULL, options_selection_mode, 0, "<RadioItem>" },
-  { "/Options/Selection Mode/_Linear",  NULL, options_selection_mode, 1, "/Options/Selection Mode/Structure" },
   { "/Options/Default _Font Size",     NULL, NULL,                  0,  "<Branch>" },
-  { "/Options/Default Font Size/8pt",  NULL, options_font_size,     8,  "<RadioItem>" },
-  { "/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,  "<Separator>" },
+  { "/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,  "<Branch>" },
   { "/Options/Verbosity/_Errors",      NULL, options_verbosity,     0,  "<RadioItem>" },
   { "/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,  "<Separator>" },
-  { "/Options/_Anti Aliasing",         NULL, options_anti_aliasing, 0,  "<ToggleItem>" },
-  { "/Options/_Transparency",          NULL, options_transparency,  0,  "<ToggleItem>" },
 
   { "/_Help" ,        NULL,         NULL,          0, "<LastBranch>" },
   { "/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, "<main>");
 }