]> www.fi.muni.cz Git - evince.git/blobdiff - pdf/xpdf/gpdf.cc
Fixed spelling of componet in IID.
[evince.git] / pdf / xpdf / gpdf.cc
index ea3d34078b5a3cccf2736ed8e73e3273a5d2a25d..a06d604717461c1a67026f8cb3651ff62bb5ad02 100644 (file)
 extern "C" {
 #define GString G_String
 #include <gnome.h>
+
+#if USING_OAF
+#include <liboaf/liboaf.h>
+#else
 #include <libgnorba/gnorba.h>
+#endif
+
 #include <gdk/gdkprivate.h>
 #include <gdk/gdkx.h>
-#include <bonobo/gnome-bonobo.h>
+#include <bonobo.h>
 #undef  GString 
 }
-#include <sys/stat.h>
-#include <unistd.h>
-#include "gtypes.h"
-#include "GString.h"
-#include "parseargs.h"
-#include "gfile.h"
-#include "gmem.h"
-#include "Object.h"
-#include "Stream.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Catalog.h"
-#include "Page.h"
-#include "Link.h"
-#include "PDFDoc.h"
-#include "GOutputDev.h"
-#include "PSOutputDev.h"
-#include "TextOutputDev.h"
-#include "Params.h"
-#include "Error.h"
 #include "config.h"
+#include "bonobo-application-x-pdf.h"
 
 poptContext ctx;
 gint  gpdf_debug=0;
@@ -55,24 +41,21 @@ typedef struct _Container Container;
 /* NB. there is a 1 to 1 Container -> Component mapping, this
    is due to how much MDI sucks; unutterably */
 struct _Container {
-  GnomeContainer    *container;
-  GnomeUIHandler    *uih;
-  
-  GnomeViewFrame    *active_view_frame;
+  BonoboContainer    *container;
+  BonoboUIHandler    *uih;
   
   GtkWidget        *app;
-  GtkScrolledWindow *scroll;
+  GtkWidget        *slot;
   GtkWidget        *view_widget;
   Component         *component;
-  gdouble zoom;
 };
 
 struct  _Component {
        Container         *container;
 
-       GnomeClientSite   *client_site;
-       GnomeViewFrame    *view_frame;
-       GnomeObjectClient *server;
+       BonoboClientSite   *client_site;
+       BonoboViewFrame   *view_frame;
+       BonoboObjectClient *server;
 };
 
 GList *containers = NULL;
@@ -87,9 +70,6 @@ extern "C" {
   static void       container_exit_cmd  (void);
   static void       container_about_cmd (GtkWidget *widget, Container *container);
   static Component *container_activate_component (Container *container, char *component_goad_id);
-  static void       zoom_in_cmd         (GtkWidget *widget, Container *container);
-  static void       zoom_out_cmd        (GtkWidget *widget, Container *container);
-  static void       zoom_set            (Container *container);
 }
 
 /*
@@ -104,16 +84,6 @@ static GnomeUIInfo container_file_menu [] = {
        GNOMEUIINFO_END
 };
 
-static GnomeUIInfo container_menu_zoom [] = {
-       { GNOME_APP_UI_ITEM, N_("_Zoom in"),
-         N_("Increase the size of objects in the PDF"),
-         zoom_in_cmd },
-       { GNOME_APP_UI_ITEM, N_("_Zoom out"),
-         N_("Decrease the size of objects in the PDF"),
-         zoom_out_cmd },
-       GNOMEUIINFO_END
-};
-
 static GnomeUIInfo container_help_menu [] = {
         GNOMEUIINFO_MENU_ABOUT_ITEM(container_about_cmd, NULL),
        GNOMEUIINFO_END
@@ -121,7 +91,6 @@ static GnomeUIInfo container_help_menu [] = {
 
 static GnomeUIInfo container_main_menu [] = {
        GNOMEUIINFO_MENU_FILE_TREE (container_file_menu),
-       { GNOME_APP_UI_SUBTREE, N_("_Zoom"), NULL, container_menu_zoom },
        GNOMEUIINFO_MENU_HELP_TREE (container_help_menu),
        GNOMEUIINFO_END
 };
@@ -139,33 +108,38 @@ extern "C" {
   static gboolean
   open_pdf (Container *container, const char *name)
   {
-    GnomeObjectClient *object;
-    GnomeStream *stream;
-    GNOME_PersistStream persist;
+    BonoboObjectClient *object;
+    BonoboStream *stream;
+    Bonobo_PersistStream persist;
     Component *comp;
     CORBA_Environment ev;
 
     g_return_val_if_fail (container != NULL, FALSE);
     g_return_val_if_fail (container->view_widget == NULL, FALSE);
 
+#if USING_OAF
+    comp = container_activate_component (container, "OAFIID:gpdf_component:892f2727-e2ec-423c-91ad-6f7b75fec6c8");
+
+#else
     comp = container_activate_component (container, "bonobo-object:application-x-pdf");
+#endif
     if (!comp || !(object = comp->server)) {
       gnome_error_dialog (_("Could not launch bonobo object."));
       return FALSE;
     }
     
     CORBA_exception_init (&ev);
-    persist = GNOME_Unknown_query_interface (
-      gnome_object_corba_objref (GNOME_OBJECT (object)),
-      "IDL:GNOME/PersistStream:1.0", &ev);
+    persist = Bonobo_Unknown_query_interface (
+      bonobo_object_corba_objref (BONOBO_OBJECT (object)),
+      "IDL:Bonobo/PersistStream:1.0", &ev);
     
     if (ev._major != CORBA_NO_EXCEPTION ||
        persist == CORBA_OBJECT_NIL) {
-      gnome_error_dialog ("Panic: component is well broken.");
+      gnome_error_dialog ("Panic: component doesn't implement PersistStream.");
       return FALSE;
     }
     
-    stream = gnome_stream_fs_open (name, GNOME_Storage_READ);
+    stream = bonobo_stream_fs_open (name, Bonobo_Storage_READ);
     
     if (stream == NULL) {
       char *err = g_strconcat (_("Could not open "), name, NULL);
@@ -174,14 +148,16 @@ extern "C" {
       return FALSE;
     }
     
-    GNOME_PersistStream_load (persist,
-                             (GNOME_Stream) gnome_object_corba_objref (GNOME_OBJECT (stream)), &ev);
+    Bonobo_PersistStream_load (persist,
+                             (Bonobo_Stream) bonobo_object_corba_objref (BONOBO_OBJECT (stream)),
+                              "application/pdf",
+                              &ev);
 
-    zoom_set (container);
-        
-    GNOME_Unknown_unref (persist, &ev);
+    Bonobo_Unknown_unref (persist, &ev);
     CORBA_Object_release (persist, &ev);
     CORBA_exception_free (&ev);
+
+/*    bonobo_view_frame_view_do_verb (comp->view_frame, "ZoomFit"); */
     return TRUE;
   }
   
@@ -255,24 +231,76 @@ extern "C" {
     gtk_widget_destroy (GTK_WIDGET (fsel));
   }
 
+  static void 
+  component_destroy (Component *component)
+  {
+    CORBA_Environment ev;
+    Container *container;
+    g_return_if_fail (component != NULL);
+
+    CORBA_exception_init (&ev);
+
+    /* Kill merged menus et al. */
+    bonobo_view_frame_view_deactivate (component->view_frame);
+
+    container = component->container;
+    gtk_widget_destroy (container->view_widget);
+    container->view_widget = NULL;
+
+    if (component->server)
+      Bonobo_Unknown_unref (
+       bonobo_object_corba_objref (BONOBO_OBJECT (component->server)), &ev);
+    component->server = NULL;
+
+    CORBA_exception_free (&ev);
+
+    g_free (component);
+  }
+
   static void
   container_destroy (Container *cont)
   {
+    g_return_if_fail (g_list_find (containers, cont) != NULL);
+
     containers = g_list_remove (containers, cont);
     if (cont->app)
       gtk_widget_destroy (cont->app);
     cont->app = NULL;
-    /* FIXME: Some serious resource freeing needs to be here */
+    
+    if (cont->component)
+      component_destroy (cont->component);
+    cont->component = NULL;
     
     g_free (cont);
+
     if (!containers)
       gtk_main_quit ();
   }
+
+  static void
+  container_close (Container *cont)
+  {
+    g_return_if_fail (g_list_find (containers, cont) != NULL);
+    
+    if (cont->component) {
+      component_destroy (cont->component);
+      cont->component = NULL;
+    } else
+      container_destroy (cont);
+  }
+
   
   static void
   container_close_cmd (GtkWidget *widget, Container *cont)
+  {
+    container_close (cont);
+  }
+  
+  static int
+  container_destroy_cb (GtkWidget *widget, GdkEvent *event, Container *cont)
   {
     container_destroy (cont);
+    return 1;
   }
   
   static void
@@ -282,14 +310,13 @@ extern "C" {
       container_destroy ((Container *)containers->data);
   }
 
-
 static void
 container_about_cmd (GtkWidget *widget, Container *container)
 {
   GtkWidget *about;
-  int i;
 
   const gchar *authors[] = {
+    N_("Derek B. Noonburg, main author"),
     N_("Michael Meeks, GNOME port maintainer."),
     N_("Miguel de Icaza."),
     N_("Nat Friedman."),
@@ -297,11 +324,13 @@ container_about_cmd (GtkWidget *widget, Container *container)
   };
   
 #ifdef ENABLE_NLS
+  int i;
+
   for (i = 0; authors[i] != NULL; i++)
     authors [i] = _(authors [i]);
 #endif
   
-  about = gnome_about_new (_("GPDF"), VERSION,
+  about = gnome_about_new (_("GPDF"), xpdfVersion,
                           _("(C) 1996-1999 Derek B. Noonburg."),
                           authors, NULL, NULL);
   
@@ -309,162 +338,94 @@ container_about_cmd (GtkWidget *widget, Container *container)
   gnome_dialog_set_close (GNOME_DIALOG (about), TRUE);
   gtk_widget_show (about);
 }
-
-  /*
-   * Enforces the containers zoom factor.
-   */
-  static void
-  zoom_set (Container *container)
-  {
-    g_return_if_fail (container != NULL);
-    g_return_if_fail (container->component != NULL);
-
-    gnome_view_frame_set_zoom_factor (container->component->view_frame,
-                                     container->zoom);
-  }
-
-  static void
-  zoom_in_cmd (GtkWidget *widget, Container *container)
-  {
-    g_return_if_fail (container != NULL);
-    if (container->zoom < 180.0) {
-      container->zoom *= 1.4;
-      zoom_set (container);
-    }
-  }
-
-  static void
-  zoom_out_cmd (GtkWidget *widget, Container *container)
-  {
-    g_return_if_fail (container != NULL);
-    if (container->zoom > 10.0) {
-      container->zoom /= 1.4;
-      zoom_set (container);
-    }
-  }
 }
 
 static void
 container_set_view (Container *container, Component *component)
 {
-       GnomeViewFrame *view_frame;
+       BonoboViewFrame *view_frame;
        GtkWidget *view_widget;
 
        /*
         * Create the remote view and the local ViewFrame.
         */
-       view_frame = gnome_client_site_new_view (component->client_site);
+       view_frame = bonobo_client_site_new_view (component->client_site,
+                                                 bonobo_object_corba_objref (BONOBO_OBJECT (
+                                                         container->uih)));
        component->view_frame = view_frame;
 
-       /*
-        * Set the GnomeUIHandler for this ViewFrame.  That way, the
-        * embedded component can get access to our UIHandler server
-        * so that it can merge menu and toolbar items when it gets
-        * activated.
-        */
-       gnome_view_frame_set_ui_handler (view_frame, container->uih);
-
        /*
         * Embed the view frame into the application.
         */
-       view_widget = gnome_view_frame_get_wrapper (view_frame);
+       view_widget = bonobo_view_frame_get_wrapper (view_frame);
+       bonobo_wrapper_set_visibility (BONOBO_WRAPPER (view_widget), FALSE);
        container->view_widget = view_widget;
        container->component   = component;
 
-       /*
-        * Show the component.
-        */
-       gtk_scrolled_window_add_with_viewport (container->scroll, view_widget);
+       gtk_container_add (GTK_CONTAINER (container->slot), view_widget);
 
        /*
         * Activate it ( get it to merge menus etc. )
         */
-       gnome_view_frame_view_activate (view_frame);
+       bonobo_view_frame_view_activate (view_frame);
+       bonobo_view_frame_set_covered   (view_frame, FALSE);
 
-       gtk_widget_show_all (GTK_WIDGET (container->scroll));
+       gtk_widget_show_all (GTK_WIDGET (container->slot));
 }
 
-static GnomeObjectClient *
-container_launch_component (GnomeClientSite *client_site,
-                           GnomeContainer *container,
+static BonoboObjectClient *
+container_launch_component (BonoboClientSite *client_site,
+                           BonoboContainer *container,
                            char *component_goad_id)
 {
-       GnomeObjectClient *object_server;
+       BonoboObjectClient *object_server;
 
        /*
         * Launch the component.
         */
-       object_server = gnome_object_activate_with_goad_id (
-               NULL, component_goad_id, GOAD_ACTIVATE_SHLIB, NULL);
+       object_server = bonobo_object_activate (component_goad_id, 0);
 
        if (object_server == NULL)
                return NULL;
 
        /*
         * Bind it to the local ClientSite.  Every embedded component
-        * has a local GnomeClientSite object which serves as a
+        * has a local BonoboClientSite object which serves as a
         * container-side point of contact for the embeddable.  The
         * container talks to the embeddable through its ClientSite
         */
-       if (!gnome_client_site_bind_embeddable (client_site, object_server)) {
-               gnome_object_unref (GNOME_OBJECT (object_server));
+       if (!bonobo_client_site_bind_embeddable (client_site, object_server)) {
+               bonobo_object_unref (BONOBO_OBJECT (object_server));
                return NULL;
        }
 
        /*
-        * The GnomeContainer object maintains a list of the
+        * The BonoboContainer object maintains a list of the
         * ClientSites which it manages.  Here we add the new
         * ClientSite to that list.
         */
-       gnome_container_add (container, GNOME_OBJECT (client_site));
+       bonobo_container_add (container, BONOBO_OBJECT (client_site));
 
        return object_server;
 }
 
-/*
- * Use query_interface to see if `obj' has `interface'.
- */
-static gboolean
-gnome_object_has_interface (GnomeObject *obj, char *interface)
-{
-       CORBA_Environment ev;
-       CORBA_Object requested_interface;
-
-       CORBA_exception_init (&ev);
-
-       requested_interface = GNOME_Unknown_query_interface (
-               gnome_object_corba_objref (obj), interface, &ev);
-
-       CORBA_exception_free (&ev);
-
-       if (!CORBA_Object_is_nil(requested_interface, &ev) &&
-           ev._major == CORBA_NO_EXCEPTION)
-       {
-               /* Get rid of the interface we've been passed */
-               CORBA_Object_release (requested_interface, &ev);
-               return TRUE;
-       }
-
-       return FALSE;
-}
-
 extern "C" {
   static Component *
   container_activate_component (Container *container, char *component_goad_id)
   {
     Component *component;
-    GnomeClientSite *client_site;
-    GnomeObjectClient *server;
+    BonoboClientSite *client_site;
+    BonoboObjectClient *server;
     
     /*
      * The ClientSite is the container-side point of contact for
      * the Embeddable.  So there is a one-to-one correspondence
-     * between GnomeClientSites and GnomeEmbeddables.  */
-    client_site = gnome_client_site_new (container->container);
+     * between BonoboClientSites and BonoboEmbeddables.  */
+    client_site = bonobo_client_site_new (container->container);
     
     /*
-     * A GnomeObjectClient is a simple wrapper for a remote
-     * GnomeObject (a server supporting GNOME::Unknown).
+     * A BonoboObjectClient is a simple wrapper for a remote
+     * BonoboObject (a server supporting Bonobo::Unknown).
      */
     server = container_launch_component (client_site, container->container,
                                         component_goad_id);
@@ -521,32 +482,33 @@ extern "C" {
       tmp_list = g_list_next (tmp_list);
     }
   }
-}
+
+}  
 
 static void
 container_create_menus (Container *container)
 {
-       GnomeUIHandlerMenuItem *menu_list;
+       BonoboUIHandlerMenuItem *menu_list;
 
-       gnome_ui_handler_create_menubar (container->uih);
+       bonobo_ui_handler_create_menubar (container->uih);
 
        /*
         * Create the basic menus out of UIInfo structures.
         */
-       menu_list = gnome_ui_handler_menu_parse_uiinfo_list_with_data (container_main_menu, container);
-       gnome_ui_handler_menu_add_list (container->uih, "/", menu_list);
-       gnome_ui_handler_menu_free_list (menu_list);
+       menu_list = bonobo_ui_handler_menu_parse_uiinfo_list_with_data (container_main_menu, container);
+       bonobo_ui_handler_menu_add_list (container->uih, "/", menu_list);
+       bonobo_ui_handler_menu_free_list (menu_list);
 }
 
 static void
 container_create_toolbar (Container *container)
 {
-       GnomeUIHandlerToolbarItem *toolbar;
+       BonoboUIHandlerToolbarItem *toolbar;
 
-       gnome_ui_handler_create_toolbar (container->uih, "pdf");
-       toolbar = gnome_ui_handler_toolbar_parse_uiinfo_list_with_data (container_toolbar, container);
-       gnome_ui_handler_toolbar_add_list (container->uih, "/", toolbar);
-       gnome_ui_handler_toolbar_free_list (toolbar);
+       bonobo_ui_handler_create_toolbar (container->uih, "pdf");
+       toolbar = bonobo_ui_handler_toolbar_parse_uiinfo_list_with_data (container_toolbar, container);
+       bonobo_ui_handler_toolbar_add_list (container->uih, "/pdf/", toolbar);
+       bonobo_ui_handler_toolbar_free_list (toolbar);
 }
 
 static Container *
@@ -561,9 +523,8 @@ container_new (const char *fname)
        
        container = g_new0 (Container, 1);
 
-       container->app  = gnome_app_new ("pdf-viewer",
-                                        "GNOME PDF viewer");
-       container->zoom = 86.0;
+       container->app = gnome_app_new ("pdf-viewer",
+                                       "GNOME PDF viewer");
 
        gtk_drag_dest_set (container->app,
                           GTK_DEST_DEFAULT_ALL,
@@ -572,40 +533,45 @@ container_new (const char *fname)
 
        gtk_signal_connect (GTK_OBJECT(container->app),
                            "drag_data_received",
-                           GTK_SIGNAL_FUNC(filenames_dropped), (gpointer)container);
+                           GTK_SIGNAL_FUNC(filenames_dropped),
+                           (gpointer)container);
 
        gtk_window_set_default_size (GTK_WINDOW (container->app), 600, 600);
        gtk_window_set_policy (GTK_WINDOW (container->app), TRUE, TRUE, FALSE);
 
-       container->container   = gnome_container_new ();
+       container->container   = bonobo_container_new ();
        container->view_widget = NULL;
-       container->scroll = GTK_SCROLLED_WINDOW (gtk_scrolled_window_new (NULL, NULL));
-       gtk_scrolled_window_set_policy (container->scroll, GTK_POLICY_AUTOMATIC,
-                                       GTK_POLICY_AUTOMATIC);
-       gnome_app_set_contents (GNOME_APP (container->app), GTK_WIDGET (container->scroll));
+       container->slot = gtk_event_box_new ();
+       gtk_widget_show (container->slot);
+
+       gnome_app_set_contents (GNOME_APP (container->app), GTK_WIDGET (container->slot));
+
+       gtk_object_set_data (GTK_OBJECT (container->app), "container_data", container);
+       gtk_signal_connect  (GTK_OBJECT (container->app), "delete_event",
+                            GTK_SIGNAL_FUNC (container_destroy_cb), container);
 
        /*
-        * Create the GnomeUIHandler object which will be used to
+        * Create the BonoboUIHandler object which will be used to
         * create the container's menus and toolbars.  The UIHandler
         * also creates a CORBA server which embedded components use
         * to do menu/toolbar merging.
         */
-       container->uih = gnome_ui_handler_new ();
-       gnome_ui_handler_set_app (container->uih, GNOME_APP (container->app));
+       container->uih = bonobo_ui_handler_new ();
+       bonobo_ui_handler_set_app (container->uih, GNOME_APP (container->app));
 
        container_create_menus   (container);
        container_create_toolbar (container);
 
        gtk_widget_show_all (container->app);
 
+       containers = g_list_append (containers, container);
+
        if (fname)
          if (!open_pdf (container, fname)) {
            container_destroy (container);
            return NULL;
          }
 
-       containers = g_list_append (containers, container);
-
        gtk_widget_show_all (container->app);
 
        return container;
@@ -616,20 +582,29 @@ main (int argc, char **argv)
 {
   CORBA_Environment ev;
   CORBA_ORB         orb;
-  char            **view_files = NULL;
+  const char      **view_files = NULL;
   gboolean          loaded;
   int               i;
   
   CORBA_exception_init (&ev);
   
+
+#if USING_OAF
+  gnomelib_register_popt_table (oaf_popt_options, "OAF");
+  gnome_init_with_popt_table("PDFViewer", "0.0.1",
+                            argc, argv,
+                            gpdf_popt_options, 0, &ctx); 
+  orb = oaf_init (argc, argv);
+#else
   gnome_CORBA_init_with_popt_table ("PDFViewer", "0.0.1",
                                    &argc, argv,
                                    gpdf_popt_options, 0, &ctx,
                                    GNORBA_INIT_SERVER_FUNC, &ev);
 
-  CORBA_exception_free (&ev);
-
   orb = gnome_CORBA_ORB ();
+#endif
+
+  CORBA_exception_free (&ev);
 
   if (bonobo_init (orb, NULL, NULL) == FALSE)
     g_error (_("Could not initialize Bonobo!\n"));
@@ -642,8 +617,11 @@ main (int argc, char **argv)
   loaded = FALSE;
   if (view_files) {
     for (i = 0; view_files[i]; i++)
-      if (container_new (view_files[i]))
+      if (container_new (view_files[i])) {
        loaded = TRUE;
+       while (gtk_events_pending ())
+         gtk_main_iteration ();
+      }
   }
   if ((i == 0) || !loaded)
     container_new (NULL);