]> 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 847d9f4f6106358b2fa0848aba85fa3cef10f208..6d90bef3d27d147300fb345c678034c1fe0f7795 100644 (file)
@@ -46,6 +46,156 @@ enum
     MATH_VIEW_ID_NAME
   } math_args;
 
+static void
+activate_maction(GtkMathViewControlData* control_data, guint action, GtkWidget* widget)
+{
+  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)
+{
+}
+
+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)
+{
+  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 <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 }, */
+};
+
+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);
+
+  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,
@@ -159,21 +309,33 @@ 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((GtkMathView*)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);
@@ -224,6 +386,8 @@ gtk_math_view_control_init(BonoboControl *control, GtkWidget *scrolled_window)
   bonobo_object_unref(BONOBO_OBJECT(prop_bag));
   
   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),
@@ -244,8 +408,9 @@ gtk_math_view_control_factory(BonoboGenericFactory* factory, const gchar* compon
   GtkWidget *scrolled_window;
   
   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
-  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window),
-                                      GTK_SHADOW_IN);
+  /* 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);