X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;f=helm%2Fgtkmathview-bonobo%2Fsrc%2Fcontrol-factory.c;h=6d90bef3d27d147300fb345c678034c1fe0f7795;hb=4167cea65ca58897d1a3dbb81ff95de5074700cc;hp=8d4e9a12a1aefa6a74c3ed8e216e1aabf7639cc9;hpb=450d16b153ca65b088474c69e5d8972659735731;p=helm.git diff --git a/helm/gtkmathview-bonobo/src/control-factory.c b/helm/gtkmathview-bonobo/src/control-factory.c index 8d4e9a12a..6d90bef3d 100644 --- a/helm/gtkmathview-bonobo/src/control-factory.c +++ b/helm/gtkmathview-bonobo/src/control-factory.c @@ -1,206 +1,296 @@ +/* This file is part of GtkMathView-Bonobo, a Bonobo wrapper for GtkMathView. + * Copyright (C) 2003 Luca Padovani + * Pouria Masoudi + * + * 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/gtkmathview-bonobo + * or send an email to + */ + +#include #include #include #include + #include "control-factory.h" +#include "control-data.h" +#include "persist-file.h" +#include "persist-stream.h" +#include "handlers.h" #include "view.h" -typedef struct _GtkMathViewControlData +enum + { + MATH_VIEW_WIDTH, + MATH_VIEW_HEIGHT, + MATH_VIEW_TOP_X, + MATH_VIEW_TOP_Y, + MATH_VIEW_FONT_SIZE, + MATH_VIEW_VERBOSITY, + MATH_VIEW_ID_NS_URI, + MATH_VIEW_ID_NAME + } math_args; + +static void +activate_maction(GtkMathViewControlData* control_data, guint action, GtkWidget* widget) { - GtkMathView *math_view; -} GtkMathViewControlData; - -enum { - MATH_VIEW_WIDTH, - MATH_VIEW_HEIGHT, - MATH_VIEW_TOP_X, - MATH_VIEW_TOP_Y, - MATH_VIEW_FONT_SIZE, - MATH_VIEW_ANTI_ALIASING, - MATH_VIEW_TRANSPARENCY, - MATH_VIEW_VERBOSITY, - MATH_VIEW_FONT_MANAGER -} math_args; - - -static GtkMathViewControlData* -gtk_math_view_control_data_new(GtkMathView *math_view) + GdomeElement* elem; + + g_return_if_fail(control_data != NULL); + + elem = gtk_math_view_get_element_at(control_data->math_view, control_data->x, control_data->y); + if (elem != NULL) + { + GdomeException exc = 0; + GdomeElement* action = find_self_or_ancestor(elem, MATHML_NS_URI, "maction"); + if (action != NULL) + { + gtk_math_view_freeze(control_data->math_view); + action_toggle(action); + gtk_math_view_thaw(control_data->math_view); + gdome_el_unref(action, &exc); + g_assert(exc == 0); + } + gdome_el_unref(elem, &exc); + g_assert(exc == 0); + } +} + +static void +copy_link_address(GtkMathViewControlData* control_data, guint action, GtkWidget* widget) { - GtkMathViewControlData *cd = g_new(GtkMathViewControlData,1); - cd->math_view = math_view; - return cd; } static void -gtk_math_view_control_data_destroy(GtkMathViewControlData* cd) +zoom_in(GtkMathViewControlData* control_data, guint action, GtkWidget* widget) { - //gtk_object_unref(cd->math_view); - cd->math_view = NULL; + g_return_if_fail(control_data != NULL); + guint old_font_size = gtk_math_view_get_font_size(control_data->math_view); + gtk_math_view_set_font_size(control_data->math_view, old_font_size + 1); +} - g_free(cd); +static void +zoom_out(GtkMathViewControlData* control_data, guint action, GtkWidget* widget) +{ + g_return_if_fail(control_data != NULL); + guint old_font_size = gtk_math_view_get_font_size(control_data->math_view); + gtk_math_view_set_font_size(control_data->math_view, old_font_size - 1); } static void -get_prop(BonoboPropertyBag *bag, - BonoboArg *arg, - guint arg_id, - CORBA_Environment *ev, - gpointer user_data) +switch_semantic_selection(GtkMathViewControlData* control_data, guint action, GtkWidget* widget) { - GtkMathView *math_view; + g_return_if_fail(control_data != NULL); + control_data->semantic_selection = !control_data->semantic_selection; + if (control_data->semantic_selection) + { + GdomeElement* elem = find_element_with_id(control_data->root_selected, + control_data->id_ns_uri, + control_data->id_name); + } +} - g_return_if_fail(GTK_IS_MATH_VIEW(user_data)); +/* +static void +copy_selected_markup(GtkMathViewControlData* control_data, guint action, GtkWidget* widget) +{ + gchar* res = copy_markup(control_data->root_selected); + if (res != NULL) + { + set_clipboard(res); + g_free(res); + } +} +*/ - math_view = GTK_MATH_VIEW(user_data); +static void +copy_selected_id(GtkMathViewControlData* control_data, guint action, GtkWidget* widget) +{ +} + +static void +select_parent(GtkMathViewControlData* control_data, guint action, GtkWidget* widget) +{ + g_return_if_fail(control_data != NULL); + if (control_data->root_selected != NULL) + { + GdomeException exc = 0; + GdomeNode* parent_node = gdome_el_parentNode(control_data->root_selected, &exc); + g_assert(parent_node != NULL); + g_assert(exc == 0); + GdomeElement* parent = gdome_cast_el(parent_node); + gtk_math_view_control_data_set_root_selected(control_data, parent); + gdome_n_unref(parent_node, &exc); + g_assert(exc == 0); + } +} + +static void +deselect(GtkMathViewControlData* control_data, guint action, GtkWidget* widget) +{ + g_return_if_fail(control_data != NULL); + + if (control_data->root_selected != NULL) + { + gtk_math_view_unselect(control_data->math_view, control_data->root_selected); + control_data->root_selected = NULL; + } +} + +/* Our menu, an array of GtkItemFactoryEntry structures that defines each menu item */ +static GtkItemFactoryEntry menu_items[] = { + { "/Activate ", NULL, activate_maction, 0, "", GTK_STOCK_EXECUTE }, + { "/Copy Link Address", NULL, copy_link_address, 0, "", GTK_STOCK_COPY }, + /* { "/Jump To", NULL, NULL, 0, "", GTK_STOCK_JUMP_TO }, */ + { "/sep1", NULL, NULL, 0, "" }, + /* { "/Semantic Selection", NULL, switch_semantic_selection, 0, "" }, */ + /* { "/Copy Selected Markup", NULL, copy_selected_markup, 0, "" }, */ + /* { "/Copy Id", NULL, copy_selected_id, 0, "" }, */ + /* { "/Show Selected", NULL, NULL, 0, "" }, */ + { "/Select Parent", NULL, select_parent, 0, "" }, + { "/De-Select", NULL, deselect, 0, "", GTK_STOCK_CLEAR }, + { "/sep2", NULL, NULL, 0, "" }, + { "/Smaller", NULL, zoom_out, 0, "", GTK_STOCK_ZOOM_OUT }, + { "/Bigger", NULL, zoom_in, 0, "", GTK_STOCK_ZOOM_IN }, + /* { "/Properties...", NULL, NULL, 0, "", GTK_STOCK_PROPERTIES }, */ +}; + +static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]); + +void +button_pressed_cb(GtkMathView* math_view, GdkEventButton* event, GtkMathViewControlData* control_data) +{ + g_return_if_fail(math_view != NULL); + g_return_if_fail(event != NULL); + g_return_if_fail(control_data != NULL); - switch(arg_id) + if (event->button == 3) + { +#if 0 + gtk_menu_popup (GTK_MENU(control_data->popup_menu), NULL, NULL, + NULL, event, event->button, event->time); +#endif + control_data->x = (gint) event->x; + control_data->y = (gint) event->y; + printf("data %d %d\n", control_data->x, control_data->y); + + gtk_item_factory_popup_with_data(control_data->item_factory, + NULL, NULL, event->x_root, event->y_root, + event->button, gtk_get_current_event_time()); + } +} + + +static void +get_prop(BonoboPropertyBag* bag, + BonoboArg* arg, + guint arg_id, + CORBA_Environment *ev, + gpointer user_data) +{ + GtkMathViewControlData* control_data = user_data; + g_assert(control_data != NULL); + + switch (arg_id) { case MATH_VIEW_WIDTH: - { - gint i = gtk_math_view_get_width(math_view); - g_assert(arg->_type == BONOBO_ARG_INT); - BONOBO_ARG_SET_INT(arg,i); - } + BONOBO_ARG_SET_INT(arg, gtk_math_view_get_width(control_data->math_view)); break; case MATH_VIEW_HEIGHT: - { - guint i = gtk_math_view_get_height(math_view); - - g_assert(arg->_type == BONOBO_ARG_INT); - BONOBO_ARG_SET_INT(arg,i); - } + BONOBO_ARG_SET_INT(arg, gtk_math_view_get_height(control_data->math_view)); break; case MATH_VIEW_TOP_X: { - guint new_top_y,new_top_x; - - g_assert(arg->_type == BONOBO_ARG_INT); - gtk_math_view_get_top(math_view,&new_top_x, &new_top_y); - BONOBO_ARG_SET_INT(arg,new_top_x); + guint top_x; + gtk_math_view_get_top(control_data->math_view, &top_x, NULL); + BONOBO_ARG_SET_INT(arg, top_x); } break; case MATH_VIEW_TOP_Y: { - guint new_top_y,new_top_x; - - g_assert(arg->_type == BONOBO_ARG_INT); - gtk_math_view_get_top(math_view,&new_top_x,&new_top_y); - BONOBO_ARG_SET_INT(arg,new_top_y); + guint top_y; + gtk_math_view_get_top(control_data->math_view, NULL, &top_y); + BONOBO_ARG_SET_INT(arg, top_y); } break; case MATH_VIEW_FONT_SIZE: - { - guint i = gtk_math_view_get_font_size(math_view); - g_assert(arg->_type == BONOBO_ARG_INT); - - BONOBO_ARG_SET_INT(arg,i); - } - break; - case MATH_VIEW_ANTI_ALIASING: - { - gboolean i = gtk_math_view_get_anti_aliasing(math_view); - g_assert(arg->_type == BONOBO_ARG_BOOLEAN); - - BONOBO_ARG_SET_BOOLEAN(arg,i); - } - break; - case MATH_VIEW_TRANSPARENCY: - { - gboolean i = gtk_math_view_get_transparency(math_view); - g_assert(arg->_type == BONOBO_ARG_BOOLEAN); - - BONOBO_ARG_SET_BOOLEAN(arg,i); - } + BONOBO_ARG_SET_INT(arg, gtk_math_view_get_font_size(control_data->math_view)); break; case MATH_VIEW_VERBOSITY: + BONOBO_ARG_SET_INT(arg, gtk_math_view_get_log_verbosity(control_data->math_view)); + break; + case MATH_VIEW_ID_NS_URI: { - gint i = gtk_math_view_get_log_verbosity(math_view); - g_assert(arg->_type == BONOBO_ARG_INT); - - BONOBO_ARG_SET_INT(arg,i); + gchar* id_ns_uri = gtk_math_view_control_data_get_id_ns_uri(control_data); + BONOBO_ARG_SET_STRING(arg, id_ns_uri); + g_free(id_ns_uri); } break; - case MATH_VIEW_FONT_MANAGER: + case MATH_VIEW_ID_NAME: { - gint i = (gint) gtk_math_view_get_font_manager_type(math_view); - BONOBO_ARG_SET_INT(arg,i); + gchar* id_name = gtk_math_view_control_data_get_id_name(control_data); + BONOBO_ARG_SET_STRING(arg, id_name); + g_free(id_name); } break; default: - g_assert(FALSE); + bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound); + break; } } static void -set_prop(BonoboPropertyBag *bag, - const BonoboArg *arg, - guint arg_id, - CORBA_Environment *ev, - gpointer user_data) +set_prop(BonoboPropertyBag* bag, + const BonoboArg* arg, + guint arg_id, + CORBA_Environment* ev, + gpointer user_data) { - GtkMathView *math_view; + GtkMathViewControlData *control_data = user_data; + g_assert(control_data != NULL); - g_return_if_fail(GTK_IS_MATH_VIEW(user_data)); - - math_view = GTK_MATH_VIEW(user_data); - - switch(arg_id) + switch (arg_id) { case MATH_VIEW_TOP_X: { guint old_top_y; - g_assert(arg->_type == BONOBO_ARG_INT); - - gtk_math_view_get_top(math_view, NULL, &old_top_y); - gtk_math_view_set_top(math_view, BONOBO_ARG_GET_INT(arg), old_top_y); + gtk_math_view_get_top(control_data->math_view, NULL, &old_top_y); + gtk_math_view_set_top(control_data->math_view, BONOBO_ARG_GET_INT(arg), old_top_y); } break; case MATH_VIEW_TOP_Y: { guint old_top_x; - g_assert(arg->_type == BONOBO_ARG_INT); - - gtk_math_view_get_top(math_view, &old_top_x, NULL); - gtk_math_view_set_top(math_view, BONOBO_ARG_GET_INT(arg), old_top_x); + gtk_math_view_get_top(control_data->math_view, &old_top_x, NULL); + gtk_math_view_set_top(control_data->math_view, BONOBO_ARG_GET_INT(arg), old_top_x); } break; case MATH_VIEW_FONT_SIZE: - { - guint i = gtk_math_view_get_font_size(math_view); - g_assert(arg->_type == BONOBO_ARG_INT); - - BONOBO_ARG_SET_INT(arg,i); - } - break; - case MATH_VIEW_ANTI_ALIASING: - { - gboolean i = gtk_math_view_get_anti_aliasing(math_view); - g_assert(arg->_type == BONOBO_ARG_BOOLEAN); - - BONOBO_ARG_SET_BOOLEAN(arg,i); - } - break; - case MATH_VIEW_TRANSPARENCY: - { - gboolean i = gtk_math_view_get_transparency(math_view); - g_assert(arg->_type == BONOBO_ARG_BOOLEAN); - - BONOBO_ARG_SET_BOOLEAN(arg,i); - } + gtk_math_view_set_font_size(control_data->math_view, BONOBO_ARG_GET_INT(arg)); break; case MATH_VIEW_VERBOSITY: - { - gint i = gtk_math_view_get_log_verbosity(math_view); - g_assert(arg->_type == BONOBO_ARG_INT); - - BONOBO_ARG_SET_INT(arg,i); - } + gtk_math_view_set_log_verbosity(control_data->math_view, BONOBO_ARG_GET_INT(arg)); break; - case MATH_VIEW_FONT_MANAGER: - { - gint i = (gint) gtk_math_view_get_font_manager_type(math_view); - BONOBO_ARG_SET_INT(arg,i); - } + case MATH_VIEW_ID_NS_URI: + gtk_math_view_control_data_set_id_ns_uri(control_data, BONOBO_ARG_GET_STRING(arg)); + break; + case MATH_VIEW_ID_NAME: + gtk_math_view_control_data_set_id_name(control_data, BONOBO_ARG_GET_STRING(arg)); break; default: bonobo_exception_set (ev, ex_Bonobo_PropertyBag_NotFound); @@ -209,45 +299,46 @@ set_prop(BonoboPropertyBag *bag, } static void -control_destroy(BonoboObject *object,GtkMathViewControlData *cd) -{ - gtk_math_view_control_data_destroy(cd); -} - -static void -set_frame(BonoboControl *control,gpointer data) +control_destroy(BonoboObject *object, GtkMathViewControlData *cd) { - Bonobo_UIContainer remote_ui_container; - BonoboUIComponent *ui_component; - GtkMathViewControlData *control_data; - GtkWidget *scrolled_window; - Bonobo_ControlFrame frame; - - control_data = (GtkMathViewControlData *) data; + gtk_math_view_control_data_destroy(cd); } static void -gtk_math_view_control_init(BonoboControl *control,GtkWidget *scrolled_window) +gtk_math_view_control_init(BonoboControl *control, GtkWidget *scrolled_window) { GtkMathViewControlData *control_data; GtkWidget *math_view; + GtkItemFactory *item_factory; + Bonobo_UIContainer remote_ui_container; BonoboUIComponent *ui_component; BonoboPropertyBag *prop_bag; BonoboObject *persist_file; BonoboObject *persist_stream; + BonoboEventSource *evs; View* view; math_view = gtk_math_view_new(NULL,NULL); gtk_widget_show(math_view); + + control_data = gtk_math_view_control_data_new(control, (GtkMathView*)math_view); - control_data = gtk_math_view_control_data_new((GtkMathView*)math_view); g_signal_connect (control, "destroy", G_CALLBACK (control_destroy), control_data); + /* Same as before but don't bother with the accelerators */ + control_data->item_factory = gtk_item_factory_new (GTK_TYPE_MENU, "
", NULL); + gtk_item_factory_create_items (control_data->item_factory, nmenu_items, menu_items, control_data); + /* control_data->popup_menu = gtk_item_factory_get_widget (control_data->item_factory, "
"); */ + /* gtk_widget_ref(control_data->popup_menu); */ + + evs = bonobo_event_source_new(); + bonobo_object_add_interface(BONOBO_OBJECT(control), BONOBO_OBJECT(evs)); + gtk_container_add(GTK_CONTAINER (scrolled_window), GTK_WIDGET (control_data->math_view)); - view = view_new(); + view = view_new(control_data); bonobo_object_add_interface(BONOBO_OBJECT(control), BONOBO_OBJECT(view)); persist_file = gtk_math_view_persist_file_new(GTK_MATH_VIEW(math_view)); @@ -256,54 +347,85 @@ gtk_math_view_control_init(BonoboControl *control,GtkWidget *scrolled_window) persist_stream = gtk_math_view_persist_stream_new(GTK_MATH_VIEW(math_view)); bonobo_object_add_interface(BONOBO_OBJECT(control), persist_stream); - prop_bag = bonobo_property_bag_new(get_prop, set_prop, math_view); + prop_bag = bonobo_property_bag_new(get_prop, set_prop, control_data); bonobo_control_set_properties(control, BONOBO_OBJREF(prop_bag), NULL); - bonobo_property_bag_add(prop_bag,"width",MATH_VIEW_WIDTH,BONOBO_ARG_INT, - NULL,"width",0); - bonobo_property_bag_add(prop_bag,"height",MATH_VIEW_HEIGHT,BONOBO_ARG_INT, - NULL,"height",0); - bonobo_property_bag_add(prop_bag,"top_x",MATH_VIEW_TOP_X,BONOBO_ARG_INT, - NULL,"top_x",0); - bonobo_property_bag_add(prop_bag,"top_y",MATH_VIEW_TOP_Y,BONOBO_ARG_INT, - NULL,"top_y",0); - bonobo_property_bag_add(prop_bag,"font_size",MATH_VIEW_FONT_SIZE,BONOBO_ARG_INT, - NULL,"font_size",0); - bonobo_property_bag_add(prop_bag,"anti_aliasing",MATH_VIEW_ANTI_ALIASING,BONOBO_ARG_BOOLEAN, - NULL,"anti_aliasing",0); - bonobo_property_bag_add(prop_bag,"transparency",MATH_VIEW_TRANSPARENCY,BONOBO_ARG_BOOLEAN, - NULL,"transparency",0); - bonobo_property_bag_add(prop_bag,"verbosity",MATH_VIEW_VERBOSITY,BONOBO_ARG_INT, - NULL,"verbosity",0); - bonobo_property_bag_add(prop_bag,"font_manager",MATH_VIEW_FONT_MANAGER,BONOBO_ARG_INT, - NULL,"font_manager",0); + bonobo_property_bag_add(prop_bag, "width", + MATH_VIEW_WIDTH, BONOBO_ARG_INT, + NULL, + "Width of the view", 0); + bonobo_property_bag_add(prop_bag, "height", + MATH_VIEW_HEIGHT, BONOBO_ARG_INT, + NULL, + "Height of the view", 0); + bonobo_property_bag_add(prop_bag, "top-x", + MATH_VIEW_TOP_X, BONOBO_ARG_INT, + NULL, + "X coordinate of the top-left corner", 0); + bonobo_property_bag_add(prop_bag, "top-y", + MATH_VIEW_TOP_Y, BONOBO_ARG_INT, + NULL, + "Y coordinate of the top-left corner", 0); + bonobo_property_bag_add(prop_bag, "font-size", + MATH_VIEW_FONT_SIZE, BONOBO_ARG_INT, + NULL, + "Default font size", 0); + bonobo_property_bag_add(prop_bag,"verbosity", + MATH_VIEW_VERBOSITY, BONOBO_ARG_INT, + NULL, + "Verbosity level", 0); + bonobo_property_bag_add(prop_bag, "id-ns-uri", + MATH_VIEW_ID_NS_URI, BONOBO_ARG_STRING, + NULL, + "Namespace URI of ID attribute", 0); + bonobo_property_bag_add(prop_bag, "id-name", + MATH_VIEW_ID_NAME, BONOBO_ARG_STRING, + NULL, + "Name of ID attribute", 0); bonobo_object_unref(BONOBO_OBJECT(prop_bag)); - g_signal_connect(control,"set_frame",G_CALLBACK(set_frame),control_data); + g_signal_connect(control,"set_frame", G_CALLBACK(set_frame), control_data); + g_signal_connect(control_data->math_view, "button_press_event", G_CALLBACK (button_pressed_cb), + control_data); + g_signal_connect(control_data->math_view, "click", G_CALLBACK (click_cb), + control_data); + g_signal_connect(control_data->math_view, "select_begin", G_CALLBACK(select_begin_cb), + control_data); + g_signal_connect(control_data->math_view, "select_over", G_CALLBACK(select_over_cb), + control_data); + g_signal_connect(control_data->math_view, "select_end", G_CALLBACK(select_end_cb), + control_data); + g_signal_connect(control_data->math_view, "select_abort", G_CALLBACK(select_abort_cb), + control_data); } static BonoboObject* -gtk_math_view_control_factory(BonoboGenericFactory* factory, const gchar* component_id, gpointer closure) +gtk_math_view_control_factory(BonoboGenericFactory* factory, const gchar* component_id, + gpointer closure) { BonoboControl *control; GtkWidget *scrolled_window; scrolled_window = gtk_scrolled_window_new (NULL, NULL); + /* putting SHADOW_NONE screws the plugin window, how's that??? */ gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 0); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled_window), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_show_all (scrolled_window); control = bonobo_control_new(scrolled_window); if(control) - { - gtk_math_view_control_init(control,scrolled_window); - return BONOBO_OBJECT(control); - } + { + gtk_math_view_control_init(control,scrolled_window); + return BONOBO_OBJECT(control); + } else - return NULL; + return NULL; } -BONOBO_ACTIVATION_SHLIB_FACTORY (CONTROL_FACTORY_ID, "GtkMathView Factory", gtk_math_view_control_factory, NULL); +BONOBO_ACTIVATION_SHLIB_FACTORY (CONTROL_FACTORY_ID, "GtkMathView Factory", + gtk_math_view_control_factory, NULL);