]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/DEVEL/mathml_editor/test/guiGTK.c
* this is a large commit
[helm.git] / helm / DEVEL / mathml_editor / test / guiGTK.c
index cd1c7c878c4f8b117d68aefcde16695dd6534c8f..7426e3f5db0da0ed6b629e8820fe46b0e192e9e3 100644 (file)
 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 GdkCursor* normal_cursor;
-static GdkCursor* link_cursor;  
 
+static gpointer context = NULL;
 static gchar* doc_name = NULL;
+static GdomeElement* first_selected = NULL;
 static GdomeElement* root_selected = NULL;
 
-static guint statusbar_context;
-
 static void create_widget_set(gpointer);
 static GtkWidget* get_main_menu(void);
 static void file_open(GtkWidget*, gpointer);
@@ -57,9 +54,10 @@ 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 selection_delete(GtkWidget*, gpointer);
-static void selection_parent(GtkWidget*, gpointer);
-static void selection_reset(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_insert(GtkWidget*, gpointer);
 static void help_about(GtkWidget*, gpointer);
 
 static GtkItemFactoryEntry menu_items[] = {
@@ -70,10 +68,12 @@ static GtkItemFactoryEntry menu_items[] = {
   { "/File/sep1",                      NULL,         NULL,          0, "<Separator>" },
   { "/File/_Quit",                     "<control>Q", gtk_main_quit, 0, NULL },
 
-  { "/_Selection",                     NULL, NULL,                  0,  "<Branch>" },
-  { "/Selection/Reset",                NULL, selection_reset,       0, NULL },
-  { "/Selection/Delete",               NULL, selection_delete,      0, NULL },
-  { "/Selection/Select Parent",        NULL, selection_parent,      0, NULL },
+  { "/_Edit",                          NULL, NULL,                  0,  "<Branch>" },
+  { "/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/Insert...",                 "<control>I", edit_insert,   0, NULL },
 
   { "/_Options",                       NULL, NULL,                  0,  "<Branch>" },
   { "/Options/Default _Font Size",     NULL, NULL,                  0,  "<Branch>" },
@@ -134,7 +134,7 @@ load_error_msg(const char* name)
 }
 
 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);
 
@@ -146,15 +146,30 @@ 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);
-
+  context = c;
   /*edit_timeout_id = gtk_timeout_add(400, edit_timeout, context);*/
 }
 
 void
 GUI_uninit()
 {
+  GdomeException exc = 0;
+
+  if (first_selected != NULL)
+    {
+      gdome_el_unref(first_selected, &exc);
+      g_assert(exc == 0);
+      first_selected = NULL;
+    }
+
+  if (root_selected != NULL)
+    {
+      gdome_el_unref(root_selected, &exc);
+      g_assert(exc == 0);
+      root_selected = NULL;
+    }
+
+  context = NULL;
 }
 
 int
@@ -199,9 +214,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
@@ -314,7 +326,7 @@ options_verbosity(GtkWidget* widget, guint level)
 }
 
 static void
-selection_delete(GtkWidget* widget, gpointer data)
+edit_delete_selection(GtkWidget* widget, gpointer data)
 {
   if (root_selected != NULL)
     {
@@ -330,7 +342,7 @@ selection_delete(GtkWidget* widget, gpointer data)
 }
 
 static void
-selection_parent(GtkWidget* widget, gpointer data)
+edit_select_parent(GtkWidget* widget, gpointer data)
 {
   if (root_selected != NULL)
     {
@@ -345,7 +357,7 @@ selection_parent(GtkWidget* widget, gpointer data)
 }
 
 static void
-selection_reset(GtkWidget* widget, gpointer data)
+edit_reset_selection(GtkWidget* widget, gpointer data)
 {
   if (root_selected != NULL)
     {
@@ -357,6 +369,51 @@ selection_reset(GtkWidget* widget, gpointer data)
     }
 }
 
+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* entry;
+  GtkWidget* ok;
+  GtkWidget* cancel;
+
+  dialog = gtk_dialog_new();
+  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_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);
+}
+
 static void
 help_about(GtkWidget* widget, gpointer data)
 {
@@ -365,7 +422,7 @@ help_about(GtkWidget* widget, gpointer data)
   GtkWidget* ok;
 
   dialog = gtk_dialog_new();
-  label = gtk_label_new("\n    MathML Viewer    \n    Copyright (C) 2000-2003 Luca Padovani    \n");
+  label = gtk_label_new("\n    MathML Editor    \n    Copyright (C) 2003 Luca Padovani    \n");
   ok = gtk_button_new_with_label("Close");
 
   gtk_signal_connect_object (GTK_OBJECT (ok), "clicked",
@@ -379,7 +436,7 @@ help_about(GtkWidget* widget, gpointer data)
 }
 
 static void
-change_default_font_size(GtkSpinButton* widget, GtkSpinButton* spin)
+change_default_font_size(GtkWidget* widget, GtkSpinButton* spin)
 {
   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));
@@ -436,97 +493,75 @@ options_set_font_size(GtkWidget* widget, gpointer data)
   gtk_widget_show_all (dialog);
 }
 
-#if 0
-#if defined(HAVE_GMETADOM)
 static void
-element_changed(GtkMathView* math_view, GdomeElement* elem)
+select_begin(GtkMathView* math_view, GdomeElement* first, gint state)
 {
-  GdomeDOMString* link = NULL;
-
-  g_return_if_fail(math_view != NULL);
-  g_return_if_fail(GTK_IS_MATH_VIEW(math_view));
-
-/*   printf("pointer is on %p\n", elem); */
+  GdomeException exc = 0;
 
-  link = find_hyperlink(elem, XLINK_NS_URI, "href");
-  if (link != NULL)
-    gdk_window_set_cursor(GTK_WIDGET(math_view)->window, link_cursor);
-  else
-    gdk_window_set_cursor(GTK_WIDGET(math_view)->window, normal_cursor);
-
-  if (link != NULL)
-    gdome_str_unref(link);
-}
-#endif
-#endif
-
-static void
-selection_changed(GtkMathView* math_view, GdomeElement* first, GdomeElement* last)
-{
   g_return_if_fail(math_view != NULL);
   g_return_if_fail(GTK_IS_MATH_VIEW(math_view));
   g_return_if_fail(first != NULL);
 
-/*   printf("selection changed %p %p\n", first, last); */
+  gtk_math_view_freeze(math_view);
 
-  if (last != NULL)
+  if (root_selected != NULL)
     {
-      GdomeException exc = 0;
+      gtk_math_view_unselect(math_view, root_selected);
+      gdome_el_unref(root_selected, &exc);
+      g_assert(exc == 0);
+    }
 
-      if (root_selected != NULL)
-       {
-         gdome_el_unref(root_selected, &exc);
-         g_assert(exc == 0);
-       }
+  root_selected = first_selected = find_element_with_ref(first);
 
-      root_selected = find_common_ancestor(first, last);
-/*       printf("selecting root %p\n", first, last, root_selected); */
-      /* gtk_math_view_set_selection(math_view, root_selected); */
+  if (root_selected != NULL)
+    {
+      gtk_math_view_select(math_view, root_selected);
+      gdome_el_ref(root_selected, &exc);
       g_assert(exc == 0);
     }
+
+  gtk_math_view_thaw(math_view);
 }
 
-#if 0
-#if defined(HAVE_GMETADOM)
 static void
-clicked(GtkMathView* math_view, GdomeElement* elem)
+select_over(GtkMathView* math_view, GdomeElement* elem, gint state)
 {
-  GdomeException exc;
-  GdomeDOMString* name;
-  GdomeDOMString* ns_uri;
-  GdomeElement* p;
+  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);
 
-  /* printf("clicked on %p\n", elem); */
+  if (first_selected == NULL || elem == NULL)
+    new_selected = NULL;
+  else
+    new_selected = find_common_ancestor_with_ref(first_selected, elem);
 
-  if (elem != NULL)
+  if (new_selected != root_selected)
     {
-      GdomeElement* action;
-      GdomeDOMString* href = find_hyperlink(elem, XLINK_NS_URI, "href");
-      if (href != NULL)
-       {
-/*       printf("hyperlink %s\n", href->str); */
-         gdome_str_unref(href);
-       }
-
-      action = find_self_or_ancestor(elem, MATHML_NS_URI, "maction");
-/*       printf("action? %p\n", action); */
-      if (action != NULL)
+      gtk_math_view_freeze(math_view);
+      if (root_selected != NULL)
        {
-         gtk_math_view_freeze(math_view);
-         action_toggle(action);
-         gtk_math_view_thaw(math_view);
-         gdome_el_unref(action, &exc);
+         gtk_math_view_unselect(math_view, root_selected);
+         gdome_el_unref(root_selected, &exc);
          g_assert(exc == 0);
        }
+      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);
     }
+
 }
-#endif
-#endif
 
 static gboolean
-key_press_event(gpointer context,
+key_press_event(gpointer c,
                GdkEventKey* event,
                GtkWidget* widget)
 {
@@ -536,36 +571,16 @@ 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;
-  case GDK_BackSpace: push_char(context, event->keyval); 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);
+      break;
+    default:
+      if ((event->state & (~GDK_SHIFT_MASK)) == 0 && event->keyval < 0x80)
+       edit_push_char(context, event->keyval);
+      return FALSE;
+    }
 
   return TRUE;
 }
@@ -590,33 +605,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),
+                            "select_begin", GTK_SIGNAL_FUNC (select_begin),
                             (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),
+                            "select_over", GTK_SIGNAL_FUNC (select_over),
                             (gpointer) main_area);
-#endif
 
   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),
@@ -626,71 +627,11 @@ 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);
-}
-
-#if 0
-static void
-create_widget_set()
-{
-  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_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), 
-                            "clicked", GTK_SIGNAL_FUNC(clicked),
-                            (gpointer) main_area);
-
-  gtk_widget_add_events(GTK_WIDGET(main_area),
-                       GDK_BUTTON_PRESS_MASK
-                       | GDK_BUTTON_RELEASE_MASK
-                       | GDK_POINTER_MOTION_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);
 }
-#endif
 
 GtkWidget*
 get_main_menu()