Code

Split SPCanvasItem and SPCanvasGroup to individual .h files. Removed forward header.
[inkscape.git] / src / inkview.cpp
index 95af5b73432b4596d485d4ae6ab720978e05b965..448aa77f180e0be7c1679ff398cf90deadc8f758 100644 (file)
@@ -1,5 +1,3 @@
-#define __SPSVGVIEW_C__
-
 /*
  * Inkscape - an ambitious vector drawing program
  *
@@ -14,6 +12,7 @@
  *   Chema Celorio <chema@celorio.com>
  *   Pawel Palucha
  * ... and various people who have worked with various projects
+ *   Abhishek Sharma
  *
  * Copyright (C) 1999-2002 authors
  * Copyright (C) 2001-2002 Ximian, Inc.
@@ -52,6 +51,8 @@
 #include <gtk/gtktable.h>
 #include <gtk/gtkbutton.h>
 
+#include <gtkmm/main.h>
+
 #include "gc-core.h"
 #include "preferences.h"
 
@@ -61,7 +62,7 @@
 #include "svg-view-widget.h"
 
 #ifdef WITH_INKJAR
-#include "inkjar/jar.h"
+#include "io/inkjar.h"
 #endif
 
 #include "inkscape-private.h"
@@ -84,7 +85,7 @@ struct SPSlideShow {
     int current;
     SPDocument *doc;
     GtkWidget *view;
-    GtkWindow *window;
+    GtkWidget *window;
     bool fullscreen;
     int timer;
 };
@@ -111,29 +112,31 @@ int sp_main_gui (int, char const**) { return 0; }
 int sp_main_console (int, char const**) { return 0; }
 
 static int
-sp_svgview_main_delete (GtkWidget *widget, GdkEvent *event, struct SPSlideShow *ss)
+sp_svgview_main_delete (GtkWidget */*widget*/, GdkEvent */*event*/, struct SPSlideShow */*ss*/)
 {
     gtk_main_quit ();
     return FALSE;
 }
 
 static int
-sp_svgview_main_key_press (GtkWidget *widget, GdkEventKey *event, struct SPSlideShow *ss)
+sp_svgview_main_key_press (GtkWidget */*widget*/, GdkEventKey *event, struct SPSlideShow *ss)
 {
     switch (event->keyval) {
     case GDK_Up:
+    case GDK_Home:
        sp_svgview_goto_first(ss);
        break;
     case GDK_Down:
+    case GDK_End:
        sp_svgview_goto_last(ss);
        break;
     case GDK_F11:
 #ifdef HAVE_GTK_WINDOW_FULLSCREEN
        if (ss->fullscreen) {
-           gtk_window_unfullscreen ((GtkWindow *) widget);
+           gtk_window_unfullscreen (GTK_WINDOW(ss->window));
            ss->fullscreen = false;
        } else {
-           gtk_window_fullscreen ((GtkWindow *) widget);
+           gtk_window_fullscreen (GTK_WINDOW(ss->window));
            ss->fullscreen = true;
        }
 #else
@@ -152,6 +155,7 @@ sp_svgview_main_key_press (GtkWidget *widget, GdkEventKey *event, struct SPSlide
     case GDK_KP_Page_Up:
     case GDK_Page_Up:
     case GDK_Left:
+    case GDK_BackSpace:
        sp_svgview_show_prev (ss);
        break;
     case GDK_Escape:
@@ -162,8 +166,8 @@ sp_svgview_main_key_press (GtkWidget *widget, GdkEventKey *event, struct SPSlide
     default:
        break;
     }
-    gtk_window_set_title(GTK_WINDOW(widget), SP_DOCUMENT_NAME(ss->doc));
-    return FALSE;
+    gtk_window_set_title(GTK_WINDOW(ss->window), ss->doc->getName());
+    return TRUE;
 }
 
 int
@@ -173,26 +177,31 @@ main (int argc, const char **argv)
        usage();
     }
 
+    // Prevents errors like "Unable to wrap GdkPixbuf..." (in nr-filter-image.cpp for example)
+    Gtk::Main::init_gtkmm_internals();
+
+    Gtk::Main main_instance (&argc, const_cast<char ***>(&argv));
+
     struct SPSlideShow ss;
 
     int option,
         num_parsed_options = 0;
 
     // the list of arguments is in the net line
-    while ((option = getopt(argc, (char* const* )argv, "t:")) != -1) 
+    while ((option = getopt(argc, (char* const* )argv, "t:")) != -1)
     {
         switch(option) {
            case 't': // for timer
                 // fprintf(stderr, "set timer arg %s\n", optarg );
-               ss.timer = atoi(optarg);        
+               ss.timer = atoi(optarg);
                num_parsed_options += 2; // 2 because of flag + option
                 break;
             case '?':
             default:
                usage();
-        }      
+        }
     }
-   
+
     GtkWidget *w;
     int i;
 
@@ -203,7 +212,7 @@ main (int argc, const char **argv)
     LIBXML_TEST_VERSION
 
     Inkscape::GC::init();
-    Inkscape::Preferences::loadSkeleton();
+    Inkscape::Preferences::get(); // ensure preferences are initialized
 
     gtk_init (&argc, (char ***) &argv);
 
@@ -227,8 +236,7 @@ main (int argc, const char **argv)
     ss.fullscreen = false;
 
     inkscape = (Inkscape::Application *)g_object_new (SP_TYPE_INKSCAPE, NULL);
-    Inkscape::Preferences::load();
-    
+
     // starting at where the commandline options stopped parsing because
     // we want all the files to be in the list
     for (i = num_parsed_options + 1 ; i < argc; i++) {
@@ -264,13 +272,13 @@ main (int argc, const char **argv)
                            ss.slides = g_renew (char *, ss.slides, ss.size);
                        }
 
-                       ss.doc = sp_document_new_from_mem ((const gchar *)gba->data,
+                       ss.doc = SPDocument::createNewDocFromMem ((const gchar *)gba->data,
                                                           gba->len,
                                                           TRUE);
                        gchar *last_filename = jar_file_reader.get_last_filename();
                        if (ss.doc) {
                            ss.slides[ss.length++] = strdup (last_filename);
-                           sp_document_set_uri (ss.doc, strdup(last_filename));
+                           (ss.doc)->setUri (strdup(last_filename));
                        }
                        g_byte_array_free(gba, TRUE);
                        g_free(last_filename);
@@ -288,11 +296,11 @@ main (int argc, const char **argv)
                }
 
                ss.slides[ss.length++] = strdup (argv[i]);
-               ss.doc = sp_document_new (ss.slides[ss.current], TRUE, false);
 
-               if (!ss.doc && ++ss.current >= ss.length) {
-                   /* No loadable documents */
-                   return 1;
+                if (!ss.doc) {
+                    ss.doc = SPDocument::createNewDoc (ss.slides[ss.current], TRUE, false);
+                    if (!ss.doc)
+                        ++ss.current;
                }
 #ifdef WITH_INKJAR
            }
@@ -304,19 +312,20 @@ main (int argc, const char **argv)
        return 1; /* none of the slides loadable */
 
     w = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-    gtk_window_set_title (GTK_WINDOW (w), SP_DOCUMENT_NAME (ss.doc));
+    gtk_window_set_title( GTK_WINDOW(w), ss.doc->getName() );
     gtk_window_set_default_size (GTK_WINDOW (w),
-                                MIN ((int)sp_document_width (ss.doc), (int)gdk_screen_width () - 64),
-                                MIN ((int)sp_document_height (ss.doc), (int)gdk_screen_height () - 64));
+                                MIN ((int)(ss.doc)->getWidth (), (int)gdk_screen_width () - 64),
+                                MIN ((int)(ss.doc)->getHeight (), (int)gdk_screen_height () - 64));
     gtk_window_set_policy (GTK_WINDOW (w), TRUE, TRUE, FALSE);
+    ss.window = w;
 
     g_signal_connect (G_OBJECT (w), "delete_event", (GCallback) sp_svgview_main_delete, &ss);
     g_signal_connect (G_OBJECT (w), "key_press_event", (GCallback) sp_svgview_main_key_press, &ss);
 
+    (ss.doc)->ensureUpToDate();
     ss.view = sp_svg_view_widget_new (ss.doc);
-    sp_svg_view_widget_set_resize (SP_SVG_VIEW_WIDGET (ss.view), FALSE, sp_document_width (ss.doc), sp_document_height (ss.doc));
-    sp_document_ensure_up_to_date (ss.doc);
-    sp_document_unref (ss.doc);
+    (ss.doc)->doUnref ();
+    SP_SVG_VIEW_WIDGET(ss.view)->setResize( false, ss.doc->getWidth(), ss.doc->getHeight() );
     gtk_widget_show (ss.view);
     gtk_container_add (GTK_CONTAINER (w), ss.view);
 
@@ -328,7 +337,7 @@ main (int argc, const char **argv)
 }
 
 static int
-sp_svgview_ctrlwin_delete (GtkWidget *widget, GdkEvent *event, void *data)
+sp_svgview_ctrlwin_delete (GtkWidget */*widget*/, GdkEvent */*event*/, void */*data*/)
 {
     ctrlwin = NULL;
     return FALSE;
@@ -340,6 +349,8 @@ sp_svgview_control_show (struct SPSlideShow *ss)
     if (!ctrlwin) {
        GtkWidget *t, *b;
        ctrlwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_transient_for (GTK_WINDOW(ctrlwin), GTK_WINDOW(ss->window));
+    g_signal_connect (G_OBJECT (ctrlwin), "key_press_event", (GCallback) sp_svgview_main_key_press, ss);
        g_signal_connect (G_OBJECT (ctrlwin), "delete_event", (GCallback) sp_svgview_ctrlwin_delete, NULL);
        t = gtk_table_new (1, 4, TRUE);
        gtk_container_add ((GtkContainer *) ctrlwin, t);
@@ -376,99 +387,134 @@ sp_svgview_control_show (struct SPSlideShow *ss)
 }
 
 static int
-sp_svgview_show_next_cb (GtkWidget *widget, void *data)
+sp_svgview_show_next_cb (GtkWidget */*widget*/, void *data)
 {
     sp_svgview_show_next(static_cast<struct SPSlideShow *>(data));
     return FALSE;
 }
 
 static int
-sp_svgview_show_prev_cb (GtkWidget *widget, void *data)
+sp_svgview_show_prev_cb (GtkWidget */*widget*/, void *data)
 {
     sp_svgview_show_prev(static_cast<struct SPSlideShow *>(data));
     return FALSE;
 }
 
 static int
-sp_svgview_goto_first_cb (GtkWidget *widget, void *data)
+sp_svgview_goto_first_cb (GtkWidget */*widget*/, void *data)
 {
     sp_svgview_goto_first(static_cast<struct SPSlideShow *>(data));
     return FALSE;
 }
 
 static int
-sp_svgview_goto_last_cb (GtkWidget *widget, void *data)
+sp_svgview_goto_last_cb (GtkWidget */*widget*/, void *data)
 {
     sp_svgview_goto_last(static_cast<struct SPSlideShow *>(data));
     return FALSE;
 }
 
+static void
+sp_svgview_waiting_cursor(struct SPSlideShow *ss)
+{
+    GdkCursor *waiting = gdk_cursor_new(GDK_WATCH);
+    gdk_window_set_cursor(GTK_WIDGET(ss->window)->window, waiting);
+    gdk_cursor_unref(waiting);
+    if (ctrlwin) {
+        GdkCursor *waiting = gdk_cursor_new(GDK_WATCH);
+        gdk_window_set_cursor(GTK_WIDGET(ctrlwin)->window, waiting);
+        gdk_cursor_unref(waiting);
+    }
+    while(gtk_events_pending())
+       gtk_main_iteration();
+}
+
+static void
+sp_svgview_normal_cursor(struct SPSlideShow *ss)
+{
+   gdk_window_set_cursor(GTK_WIDGET(ss->window)->window, NULL);
+    if (ctrlwin) {
+        gdk_window_set_cursor(GTK_WIDGET(ctrlwin)->window, NULL);
+    }
+}
+
+static void
+sp_svgview_set_document(struct SPSlideShow *ss, SPDocument *doc, int current)
+{
+    if (doc && doc != ss->doc) {
+        doc->ensureUpToDate();
+        reinterpret_cast<SPSVGView*>(SP_VIEW_WIDGET_VIEW (ss->view))->setDocument (doc);
+        ss->doc = doc;
+        ss->current = current;
+    }
+}
+
 static void
 sp_svgview_show_next (struct SPSlideShow *ss)
 {
-    SPDocument *doc;
-    int current;
-    doc = NULL;
-    current = ss->current;
+    sp_svgview_waiting_cursor(ss);
+
+    SPDocument *doc = NULL;
+    int current = ss->current;
     while (!doc && (current < ss->length - 1)) {
-       doc = sp_document_new (ss->slides[++current], TRUE, false);
-    }
-    if (doc) {
-       reinterpret_cast<SPSVGView*>(SP_VIEW_WIDGET_VIEW (ss->view))->setDocument (doc);
-       sp_document_ensure_up_to_date (doc);
-       ss->doc = doc;
-       ss->current = current;
+        doc = SPDocument::createNewDoc (ss->slides[++current], TRUE, false);
     }
+
+    sp_svgview_set_document(ss, doc, current);
+
+    sp_svgview_normal_cursor(ss);
 }
 
 static void
 sp_svgview_show_prev (struct SPSlideShow *ss)
 {
-    SPDocument *doc;
-    int current;
-    doc = NULL;
-    current = ss->current;
+    sp_svgview_waiting_cursor(ss);
+
+    SPDocument *doc = NULL;
+    int current = ss->current;
     while (!doc && (current > 0)) {
-       doc = sp_document_new (ss->slides[--current], TRUE, false);
-    }
-    if (doc) {
-       reinterpret_cast<SPSVGView*>(SP_VIEW_WIDGET_VIEW (ss->view))->setDocument (doc);
-       sp_document_ensure_up_to_date (doc);
-       ss->doc = doc;
-       ss->current = current;
+        doc = SPDocument::createNewDoc (ss->slides[--current], TRUE, false);
     }
+
+    sp_svgview_set_document(ss, doc, current);
+
+    sp_svgview_normal_cursor(ss);
 }
 
 static void
 sp_svgview_goto_first (struct SPSlideShow *ss)
 {
+    sp_svgview_waiting_cursor(ss);
+
     SPDocument *doc = NULL;
     int current = 0;
-    for ( ; !doc && (current < ss->length); current++) {
-       doc = sp_document_new (ss->slides[current], TRUE, false);
-    }
-    if (doc) {
-       reinterpret_cast<SPSVGView*>(SP_VIEW_WIDGET_VIEW (ss->view))->setDocument (doc);
-       sp_document_ensure_up_to_date (doc);
-       ss->doc = doc;
-       ss->current = current;
+    while ( !doc && (current < ss->length - 1)) {
+        if (current == ss->current)
+            break;
+        doc = SPDocument::createNewDoc (ss->slides[current++], TRUE, false);
     }
+
+    sp_svgview_set_document(ss, doc, current - 1);
+
+    sp_svgview_normal_cursor(ss);
 }
 
 static void
 sp_svgview_goto_last (struct SPSlideShow *ss)
 {
+    sp_svgview_waiting_cursor(ss);
+
     SPDocument *doc = NULL;
     int current = ss->length - 1;
-    for ( ; !doc && (current >= 0); current--) {
-       doc = sp_document_new (ss->slides[current], TRUE, false);
-    }
-    if (doc) {
-       reinterpret_cast<SPSVGView*>(SP_VIEW_WIDGET_VIEW (ss->view))->setDocument (doc);
-       sp_document_ensure_up_to_date (doc);
-       ss->doc = doc;
-       ss->current = current;
+    while (!doc && (current >= 0)) {
+        if (current == ss->current)
+            break;
+        doc = SPDocument::createNewDoc (ss->slides[current--], TRUE, false);
     }
+
+    sp_svgview_set_document(ss, doc, current + 1);
+
+    sp_svgview_normal_cursor(ss);
 }
 
 #ifdef WITH_INKJAR
@@ -495,9 +541,6 @@ static void usage()
 #ifdef WITH_INKJAR
            " or archives of SVGs (.sxw, .jar)"
 #endif
-           "\n\n"
-           "Available options:\n"
-           "\t-t\t\tTimer for automatically changing slides in seconds.\n"
            "\n");
     exit(1);
 }
@@ -509,7 +552,6 @@ void inkscape_ref (void) {}
 void inkscape_unref (void) {}
 void inkscape_add_document (SPDocument *document) {}
 void inkscape_remove_document (SPDocument *document) {}
-Inkscape::XML::Node *inkscape_get_repr (Inkscape::Application *inkscape, const gchar *key) {return NULL;}
 #endif