]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/gtkmathview-bonobo/src/handlers.c
ocaml 3.09 transition
[helm.git] / helm / gtkmathview-bonobo / src / handlers.c
index c3bda4737d894bf25453922879fd31d9a924156c..4861b2f0b0ec6f7205d3be03e5a2c79ae80fc396 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 "aux.h"
 #include "handlers.h"
 
+static void
+set_clipboard(GdomeDOMString* data)
+{
+  GtkClipboard* clipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
+  gtk_clipboard_set_text(clipboard, data->str, gdome_str_length(data));
+}
+
 void
-set_frame(BonoboControl *control,gpointer data)
+set_frame(BonoboControl *control, gpointer data)
 {     
-    /*Bonobo_UIContainer remote_ui_container;
-    BonoboUIComponent *ui_component;
-    GtkMathViewControlData *control_data;
-    GtkWidget *scrolled_window;
-    Bonobo_ControlFrame frame;
-    control_data = (GtkMathViewControlData *) data;*/
+}
+
+static void
+notify_browser(GtkMathViewControlData* control_data, const char* url)
+{
+  BonoboObject* evs = bonobo_object_query_local_interface(BONOBO_OBJECT(control_data->control),
+                                                         "IDL:Bonobo/EventSource:1.0");
+  if (evs != NULL)
+    {
+      BonoboArg* arg = bonobo_arg_new(BONOBO_ARG_STRING);
+      BONOBO_ARG_SET_STRING(arg, url);
+      bonobo_event_source_notify_listeners (evs, "URL", arg, NULL);
+      /* bonobo_arg_release(arg); */
+      bonobo_object_unref(BONOBO_OBJECT(evs));
+    }
 }
 
 void
-click_cb(GtkMathView* math_view, GdomeElement* elem, gint state, GtkMathViewControlData* control_data)
+click_cb(GtkMathView* math_view, GdomeElement* elem, gint state,
+        GtkMathViewControlData* control_data)
 {
-  GdomeException exc;
-  GdomeDOMString* name;
-  GdomeDOMString* ns_uri;
-  //GdomeElement* p;
+  GdomeException exc = 0;
   
   g_return_if_fail(math_view != NULL);
-  
-  printf("*** click signal: %p %x %p\n", elem, state, control_data);
-  
+  g_return_if_fail(control_data != NULL);
+
   if (elem != NULL)
-  {
+    {
       GdomeElement* action;
       GdomeDOMString* href = find_hyperlink(elem);
+
       if (href != NULL)
-      {
-          /*    printf("hyperlink %s\n", href->str); */
-          gtk_math_view_load_uri(math_view,href->str);
+       {
+          /*gtk_math_view_load_uri(math_view,href->str);*/
+
+         notify_browser(control_data, href->str);
+
+         //set_clipboard(href);
           gdome_str_unref(href);
-      }
-      else
-      {
-          action = find_self_or_ancestor(elem, MATHML_NS_URI, "maction");
-          /*       printf("action? %p\n", action); */
-          if (action != NULL)
-          {
-               gtk_math_view_freeze(math_view);
-               action_toggle(action);
-               gtk_math_view_thaw(math_view);
-               gdome_el_unref(action, &exc);
-               g_assert(exc == 0);
-               return;
-          }
-      }
-      if (control_data->root_selected != NULL)
-      {
-        gtk_math_view_freeze(math_view);
-        gtk_math_view_unselect(math_view, control_data->root_selected);
-        gtk_math_view_thaw(math_view);
-        gdome_el_unref(control_data->root_selected, &exc);
-        g_assert(exc == 0);
-        control_data->root_selected = NULL;
-      }
-  }
+         return;
+       }
+
+      action = find_self_or_ancestor(elem, MATHML_NS_URI, "maction");
+      if (action != NULL)
+       {
+         gtk_math_view_freeze(math_view);
+         action_toggle(action);
+         gtk_math_view_thaw(math_view);
+         gdome_el_unref(action, &exc);
+         g_assert(exc == 0);
+         return;
+       }
+    }
+    
+  if (control_data->root_selected != NULL)
+    {
+      gtk_math_view_freeze(math_view);
+      gtk_math_view_unselect(math_view, control_data->root_selected);
+      gtk_math_view_thaw(math_view);
+      gdome_el_unref(control_data->root_selected, &exc);
+      g_assert(exc == 0);
+      control_data->root_selected = NULL;
+    }
 }
 
 void
-select_begin_cb(GtkMathView* math_view, GdomeElement* elem, gint state,GtkMathViewControlData* control_data)
+select_begin_cb(GtkMathView* math_view, GdomeElement* elem, gint state,
+               GtkMathViewControlData* control_data)
 {
   g_return_if_fail(math_view != NULL);
-  g_return_if_fail(GTK_IS_MATH_VIEW(math_view));
-  printf("*** select_begin signal: %p %x\n", elem, state);
+  g_return_if_fail(control_data != NULL);
+
   if (elem != NULL)
     {
       GdomeException exc = 0;
       gtk_math_view_freeze(math_view);
       if (control_data->root_selected != NULL)
-      {
-        gtk_math_view_unselect(math_view,control_data->root_selected);
-        gdome_el_unref(control_data->root_selected, &exc);
-        g_assert(exc == 0);
-        control_data->root_selected = NULL;
-      }
+       {
+         gtk_math_view_unselect(math_view, control_data->root_selected);
+         gdome_el_unref(control_data->root_selected, &exc);
+         g_assert(exc == 0);
+         control_data->root_selected = NULL;
+       }
       
       if (control_data->semantic_selection)
-      {
-        GdomeElement* new_elem = find_xref_element(elem);
-        if (new_elem != NULL)
-        {
-          gdome_el_ref(new_elem, &exc);
-          g_assert(exc == 0);
-        }
-        control_data->first_selected = control_data->root_selected = new_elem;
-      }
+       {
+         GdomeElement* new_elem = find_element_with_id(elem, control_data->id_ns_uri, control_data->id_name);
+         if (new_elem != NULL)
+           {
+             gdome_el_ref(new_elem, &exc);
+             g_assert(exc == 0);
+           }
+         control_data->first_selected = control_data->root_selected = new_elem;
+       }
       else
-      {
-        gdome_el_ref(elem, &exc);
-        g_assert(exc == 0);
-        gdome_el_ref(elem, &exc);
-        g_assert(exc == 0);
-        control_data->first_selected = control_data->root_selected = elem;
-      }
+       {
+         gdome_el_ref(elem, &exc);
+         g_assert(exc == 0);
+         gdome_el_ref(elem, &exc);
+         g_assert(exc == 0);
+         control_data->first_selected = control_data->root_selected = elem;
+       }
       
       if (control_data->root_selected != NULL)
-          gtk_math_view_select(math_view, control_data->root_selected);
+       gtk_math_view_select(math_view, control_data->root_selected);
       
       gtk_math_view_thaw(math_view);
     }
 }
 
 void
-select_over_cb(GtkMathView* math_view, GdomeElement* elem, gint state,GtkMathViewControlData* control_data)
+select_over_cb(GtkMathView* math_view, GdomeElement* elem, gint state,
+              GtkMathViewControlData* control_data)
 {
   g_return_if_fail(math_view != NULL);
-  g_return_if_fail(GTK_IS_MATH_VIEW(math_view));
-
-  printf("*** select_over signal: %p %x\n", elem, state);
+  g_return_if_fail(control_data != NULL);
 
   if (control_data->first_selected != NULL && elem != NULL)
     {
       GdomeException exc = 0;
 
       gtk_math_view_freeze(math_view);
-
+      
       if (control_data->root_selected != NULL)
-      {
+       {
           gtk_math_view_unselect(math_view, control_data->root_selected);
           gdome_el_unref(control_data->root_selected, &exc);
           g_assert(exc == 0);
           control_data->root_selected = NULL;
-      }
-
+       }
+      
       if (control_data->semantic_selection)
-      {
-        GdomeElement* new_root = find_common_ancestor(control_data->first_selected, elem);
-        if (new_root != NULL)
-        {
-          control_data->root_selected = find_xref_element(new_root);
-          gdome_el_unref(new_root, &exc);
-          g_assert(exc == 0);
-        }
-      else
-        control_data->root_selected = NULL;
-      }
+       {
+         GdomeElement* new_root = find_common_ancestor(control_data->first_selected, elem);
+         if (new_root != NULL)
+           {
+             control_data->root_selected = find_element_with_id(new_root, control_data->id_ns_uri, control_data->id_name);
+             gdome_el_unref(new_root, &exc);
+             g_assert(exc == 0);
+           }
+         else
+           control_data->root_selected = NULL;
+       }
       else
         control_data->root_selected = find_common_ancestor(control_data->first_selected, elem);
-
+      
       if (control_data->root_selected != NULL)
         gtk_math_view_select(math_view, control_data->root_selected);
-
+      
       gtk_math_view_thaw(math_view);
     }
 }
 
 void
-select_end_cb(GtkMathView* math_view, GdomeElement* elem, gint state,GtkMathViewControlData* control_data)
+select_end_cb(GtkMathView* math_view, GdomeElement* elem, gint state,
+             GtkMathViewControlData* control_data)
 {
   g_return_if_fail(math_view != NULL);
-  g_return_if_fail(GTK_IS_MATH_VIEW(math_view));
-  
-  printf("*** select_end signal: %p %x\n", elem, state);
+  g_return_if_fail(control_data != NULL);
   
   if (control_data->first_selected != NULL)
-  {
+    {
       GdomeException exc = 0;
       gdome_el_unref(control_data->first_selected, &exc);
       g_assert(exc == 0);
       control_data->first_selected = NULL;
-  }
+
+      if (control_data->root_selected != NULL && control_data->semantic_selection)
+       {
+         GdomeException exc = 0;
+         GdomeDOMString* id = gdome_el_getAttributeNS(control_data->root_selected,
+                                                      control_data->id_ns_uri,
+                                                      control_data->id_name, &exc);
+         g_assert(exc == 0);
+         g_assert(id != NULL);
+         set_clipboard(id);
+         gdome_str_unref(id);
+       }
+    }
 }
 
 void
-select_abort_cb(GtkMathView* math_view,GtkMathViewControlData* control_data)
+select_abort_cb(GtkMathView* math_view, GtkMathViewControlData* control_data)
 {
   GdomeException exc = 0;
   
   g_return_if_fail(math_view != NULL);
-  g_return_if_fail(GTK_IS_MATH_VIEW(math_view));
-  
-  printf("*** select_abort signal\n");
+  g_return_if_fail(control_data != NULL);
   
   if (control_data->first_selected != NULL)
-  {
+    {
       gdome_el_unref(control_data->first_selected, &exc);
       g_assert(exc == 0);
       control_data->first_selected = NULL;
-  }
+    }
+  
   if (control_data->root_selected != NULL)
     {
       gtk_math_view_freeze(math_view);