-/*
- * Copyright (C) 2000, Luca Padovani <luca.padovani@cs.unibo.it>.
+/* This file is part of EdiTeX, an editor of mathematical
+ * expressions based on TeX syntax.
*
- * This file is part of GtkMathView, a Gtk widget for MathML.
- *
- * GtkMathView is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * GtkMathView is distributed in the hope that it will be useful,
+ * 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GtkMathView; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * For details, see the GtkMathView World-Wide-Web page,
- * http://cs.unibo.it/~lpadovan/mml-widget, or send a mail to
- * <luca.padovani@cs.unibo.it>
+ * 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>
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);
static void file_re_open(GtkWidget*, gpointer);
static void file_close(GtkWidget*, gpointer);
+static void file_output_tex(GtkWidget*, gpointer);
static void options_font_manager(GtkWidget*, FontManagerId);
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 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_reset(GtkWidget*, gpointer);
+static void edit_insert(GtkWidget*, gpointer);
static void help_about(GtkWidget*, gpointer);
static GtkItemFactoryEntry menu_items[] = {
{ "/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 },
- { "/_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/_Reset", NULL, edit_reset, 0, NULL },
+ { "/Edit/Insert...", "<control>I", edit_insert, 0, NULL },
{ "/_Options", NULL, NULL, 0, "<Branch>" },
{ "/Options/Default _Font Size", NULL, NULL, 0, "<Branch>" },
g_free(msg);
}
+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);
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()
{
+ 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
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
gtk_widget_show (fs);
}
+static void
+file_output_tex(GtkWidget* widget, gpointer data)
+{
+ g_assert(context != NULL);
+ edit_output_tex(context);
+}
+
static void
options_font_manager(GtkWidget* widget, FontManagerId id)
{
}
static void
-selection_delete(GtkWidget* widget, gpointer data)
+edit_delete_selection(GtkWidget* widget, gpointer data)
{
if (root_selected != NULL)
{
}
static void
-selection_parent(GtkWidget* widget, gpointer data)
+edit_select_parent(GtkWidget* widget, gpointer data)
{
if (root_selected != NULL)
{
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
-selection_reset(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);
+ /* 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* 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)
{
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",
}
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));
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));
+ GdomeException exc = 0;
-/* printf("pointer is on %p\n", elem); */
-
- 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)
{
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, 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;
}
//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),
+ "select_over", GTK_SIGNAL_FUNC (select_over),
(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(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),
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()