#include <bonobo/gnome-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;
GnomeContainer *container;
GnomeUIHandler *uih;
- GnomeViewFrame *active_view_frame;
-
GtkWidget *app;
GtkScrolledWindow *scroll;
GtkWidget *view_widget;
Component *component;
- gdouble zoom;
};
struct _Component {
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);
}
/*
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
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
};
GNOME_PersistStream_load (persist,
(GNOME_Stream) gnome_object_corba_objref (GNOME_OBJECT (stream)), &ev);
- zoom_set (container);
-
GNOME_Unknown_unref (persist, &ev);
CORBA_Object_release (persist, &ev);
CORBA_exception_free (&ev);
+
+/* gnome_view_frame_view_do_verb (comp->view_frame, "ZoomFit"); */
return TRUE;
}
component_destroy (Component *component)
{
CORBA_Environment ev;
+ Container *container;
g_return_if_fail (component != NULL);
CORBA_exception_init (&ev);
-
+
+ /* Kill merged menus et al. */
+ gnome_view_frame_view_deactivate (component->view_frame);
+
+ container = component->container;
+ gtk_widget_destroy (container->view_widget);
+ container->view_widget = NULL;
+
if (component->server)
GNOME_Unknown_unref (
gnome_object_corba_objref (GNOME_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;
if (cont->component)
component_destroy (cont->component);
cont->component = NULL;
- cont->app = 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
container_destroy ((Container *)containers->data);
}
-
static void
container_about_cmd (GtkWidget *widget, Container *container)
{
int i;
const gchar *authors[] = {
+ N_("Derek B. Noonburg, main author"),
N_("Michael Meeks, GNOME port maintainer."),
N_("Miguel de Icaza."),
N_("Nat Friedman."),
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
* Activate it ( get it to merge menus etc. )
*/
gnome_view_frame_view_activate (view_frame);
+ gnome_view_frame_set_covered (view_frame, FALSE);
gtk_widget_show_all (GTK_WIDGET (container->scroll));
}
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)
tmp_list = g_list_next (tmp_list);
}
}
+
+ /*
+ * GtkWidget key_press method override
+ *
+ * Scrolls the window on keypress
+ */
+ static gint
+ key_press_event_cb (GtkWidget *widget, GdkEventKey *event)
+ {
+ Container *container = (Container *) gtk_object_get_data (GTK_OBJECT (widget), "container_data");
+ Component *component;
+ GtkScrolledWindow *win;
+ float delta;
+
+ g_return_val_if_fail (container != NULL, FALSE);
+
+ win = container->scroll;
+ component = container->component;
+ if (component == NULL || win == NULL)
+ return FALSE;
+
+ /*
+ * Scrolling the view.
+ */
+ if (event->keyval == GDK_Up) {
+ GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment (win);
+
+ if (event->state & GDK_CONTROL_MASK)
+ delta = adj->step_increment * 3;
+ else
+ delta = adj->step_increment;
+
+ adj->value = CLAMP (adj->value - delta,
+ adj->lower, adj->upper - adj->page_size);
+
+ gtk_adjustment_value_changed (adj);
+ return TRUE;
+ } else if (event->keyval == GDK_Down) {
+ GtkAdjustment *adj = gtk_scrolled_window_get_vadjustment (win);
+
+ if (event->state & GDK_CONTROL_MASK)
+ delta = adj->step_increment * 3;
+ else
+ delta = adj->step_increment;
+
+ adj->value = CLAMP (adj->value + delta,
+ adj->lower, adj->upper - adj->page_size);
+ gtk_adjustment_value_changed (adj);
+ return TRUE;
+ } else if (event->keyval == GDK_Left) {
+ GtkAdjustment *adj = gtk_scrolled_window_get_hadjustment (win);
+
+ if (event->state & GDK_CONTROL_MASK)
+ delta = adj->step_increment * 3;
+ else
+ delta = adj->step_increment;
+
+ adj->value = CLAMP (adj->value - delta,
+ adj->lower, adj->upper - adj->page_size);
+ gtk_adjustment_value_changed (adj);
+ return TRUE;
+ } else if (event->keyval == GDK_Right) {
+ GtkAdjustment *adj = gtk_scrolled_window_get_hadjustment (win);
+
+ if (event->state & GDK_CONTROL_MASK)
+ delta = adj->step_increment * 3;
+ else
+ delta = adj->step_increment;
+
+ adj->value = CLAMP (adj->value + delta,
+ adj->lower, adj->upper - adj->page_size);
+ gtk_adjustment_value_changed (adj);
+ return TRUE;
+
+ /*
+ * Various shortcuts mapped to verbs.
+ */
+
+ } else if (event->keyval == GDK_Home) {
+ gnome_view_frame_view_do_verb (component->view_frame, VERB_FIRST);
+ return TRUE;
+ } else if (event->keyval == GDK_End) {
+ gnome_view_frame_view_do_verb (component->view_frame, VERB_LAST);
+ return TRUE;
+ } else if (event->keyval == GDK_Page_Down ||
+ event->keyval == GDK_Next) {
+ gnome_view_frame_view_do_verb (component->view_frame, VERB_NEXT);
+ return TRUE;
+ } else if (event->keyval == GDK_Page_Up ||
+ event->keyval == GDK_Prior) {
+ gnome_view_frame_view_do_verb (component->view_frame, VERB_PREV);
+ return TRUE;
+ } else if (event->keyval == GDK_plus ||
+ event->keyval == GDK_equal) {
+ gnome_view_frame_view_do_verb (component->view_frame, VERB_Z_IN);
+ } else if (event->keyval == GDK_underscore ||
+ event->keyval == GDK_minus) {
+ gnome_view_frame_view_do_verb (component->view_frame, VERB_Z_OUT);
+ }
+ return FALSE;
+ }
}
static void
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_add_list (container->uih, "/pdf/", toolbar);
gnome_ui_handler_toolbar_free_list (toolbar);
}
container = g_new0 (Container, 1);
- container->app = gnome_app_new ("pdf-viewer",
+ container->app = gnome_app_new ("pdf-viewer",
"GNOME PDF viewer");
- container->zoom = 86.0;
gtk_drag_dest_set (container->app,
GTK_DEST_DEFAULT_ALL,
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->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);
+ gtk_scrolled_window_set_policy (container->scroll, GTK_POLICY_ALWAYS,
+ GTK_POLICY_ALWAYS);
gnome_app_set_contents (GNOME_APP (container->app), GTK_WIDGET (container->scroll));
+ gtk_object_set_data (GTK_OBJECT (container->app), "container_data", container);
+ gtk_signal_connect (GTK_OBJECT (container->app), "key_press_event",
+ GTK_SIGNAL_FUNC (key_press_event_cb), NULL);
+ 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 container's menus and toolbars. The UIHandler
{
CORBA_Environment ev;
CORBA_ORB orb;
- char **view_files = NULL;
+ const char **view_files = NULL;
gboolean loaded;
int i;
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);