]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/gtkmathview-bonobo/src/control-factory.c
ocaml 3.09 transition
[helm.git] / helm / gtkmathview-bonobo / src / control-factory.c
index 025e645e93ce3e057170659da926c42e2d65f6b0..6d90bef3d27d147300fb345c678034c1fe0f7795 100644 (file)
+/* This file is part of GtkMathView-Bonobo, a Bonobo wrapper for GtkMathView.
+ * Copyright (C) 2003 Luca Padovani <lpadovan@cs.unibo.it>
+ *                    Pouria Masoudi <pmasoudi@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/gtkmathview-bonobo
+ * or send an email to <lpadovan@cs.unibo.it>
+ */
+
+#include <config.h>
+
 #include <bonobo.h>
 #include <bonobo/bonobo-shlib-factory.h>
 #include <gtkmathview.h>
+
 #include "control-factory.h"
+#include "control-data.h"
+#include "persist-file.h"
+#include "persist-stream.h"
+#include "handlers.h"
+#include "view.h"
+
+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;
 
-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 char *
-make_reg_id(const char *iid)
+static void
+activate_maction(GtkMathViewControlData* control_data, guint action, GtkWidget* widget)
 {
-       char *id;
-       id = bonobo_activation_make_registration_id(iid,Display_String(gdk_display));
-       return id;
-}*/
+  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
-get_prop(BonoboPropertyBag     *bag,
-        BonoboArg      *arg,
-        guint          arg_id,
-        CORBA_Environment *ev,
-        gpointer       user_data)
+copy_link_address(GtkMathViewControlData* control_data, guint action, GtkWidget* widget)
+{
+}
+
+static void
+zoom_in(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
+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
+switch_semantic_selection(GtkMathViewControlData* control_data, guint action, GtkWidget* widget)
+{
+  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);
+    }
+}
+
+/*
+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);
+    }
+}
+*/
+
+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)
 {
-  GtkMathView *math_view;
+  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;
+    }
+}
 
-  g_return_if_fail(GTK_IS_MATH_VIEW(user_data));
+/* Our menu, an array of GtkItemFactoryEntry structures that defines each menu item */
+static GtkItemFactoryEntry menu_items[] = {
+  { "/Activate <maction>", NULL,    activate_maction, 0, "<StockItem>", GTK_STOCK_EXECUTE },
+  { "/Copy Link Address",  NULL,    copy_link_address, 0, "<StockItem>", GTK_STOCK_COPY },
+  /*  { "/Jump To",       NULL,         NULL,           0, "<StockItem>", GTK_STOCK_JUMP_TO }, */
+  { "/sep1",          NULL,         NULL,           0, "<Separator>" },
+  /* { "/Semantic Selection", NULL,    switch_semantic_selection, 0, "<CheckItem>" }, */
+  /* { "/Copy Selected Markup", NULL,  copy_selected_markup, 0, "<Item>" }, */
+  /* { "/Copy Id",       NULL,         copy_selected_id, 0, "<Item>" }, */
+  /*  { "/Show Selected", NULL,         NULL,           0, "<Item>" }, */
+  { "/Select Parent", NULL,         select_parent,  0, "<Item>" },
+  { "/De-Select",     NULL,         deselect, 0, "<StockItem>", GTK_STOCK_CLEAR },
+  { "/sep2",          NULL,         NULL,           0, "<Separator>" },
+  { "/Smaller",       NULL,         zoom_out,       0, "<StockItem>", GTK_STOCK_ZOOM_OUT },
+  { "/Bigger",        NULL,         zoom_in,        0, "<StockItem>", GTK_STOCK_ZOOM_IN },
+  /* { "/Properties...", NULL,         NULL,           0, "<StockItem>", GTK_STOCK_PROPERTIES }, */
+};
 
-  math_view = GTK_MATH_VIEW(user_data);
+static gint nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
 
-  switch(arg_id)
+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);
+
+  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(BonoboPropertyBagbag,
+        const BonoboArgarg,
+        guint arg_id,
+        CORBA_Environmentev,
+        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_WIDTH:
-       g_assert(arg->_type == BONOBO_ARG_INT);
-                       
-       guint i = gtk_math_view_set_width(math_view);
-       BONOBO_ARG_SET_INT(arg,i);
-       break;
-       case MATH_VIEW_HEIGHT:
-       g_assert(arg->_type == BONOBO_ARG_INT);
-                       
-       guint i = gtk_math_view_get_height(math_view);
-       BONOBO_ARG_SET_INT(arg,i);      
-       break;*/
     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);
@@ -204,19 +298,48 @@ set_prop(BonoboPropertyBag        *bag,
     }
 }
 
-static BonoboObject*
-gtk_math_view_control_factory(BonoboGenericFactory* factory, const gchar* component_id, gpointer closure)
+static void 
+control_destroy(BonoboObject *object, GtkMathViewControlData *cd)
 {
-  BonoboControl *control;
-  BonoboPropertyBag *prop_bag;
+  gtk_math_view_control_data_destroy(cd);
+}
+
+static void 
+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 = bonobo_control_new(math_view);
+  control_data = gtk_math_view_control_data_new(control, (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, "<main>", 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, "<main>"); */
+  /* 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(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));
   bonobo_object_add_interface(BONOBO_OBJECT(control), persist_file);
@@ -224,34 +347,85 @@ gtk_math_view_control_factory(BonoboGenericFactory* factory, const gchar* compon
   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));
-  //bonobo_object_unref(BONOBO_OBJECT(persist_file));
-  //bonobo_object_unref(BONOBO_OBJECT(persist_stream));
+  
+  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);
+}
 
-  return BONOBO_OBJECT(control);
+static BonoboObject*
+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_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);
+    }
+  else
+    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);