Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell
diff options
context:
space:
mode:
authorNickolay V. Shmyrev <nshmyrev@yandex.ru>2005-04-07 15:28:06 (GMT)
committer Nickolay V. Shmyrev <nshmyrev@src.gnome.org>2005-04-07 15:28:06 (GMT)
commitc3e1500a4815225f08e1b20dd066559e8c92c280 (patch)
tree7474fe16fce807cda4845df116fec07c60b161e6 /shell
parent52f67b9ce7a9f2282b2c85139d1d10f8c4df5786 (diff)
Recent files support.
2005-04-07 Nickolay V. Shmyrev <nshmyrev@yandex.ru> * cut-n-paste/recent-files/Makefile.am: * data/evince-ui.xml, shell/Makefile.am: * shell/ev-application.c, shell/ev-application.h: * shell/ev-window.c: Recent files support. * configure.ac: Added "ru" to ALL_LINGUAS. * dvju: new backend to support DJVU files. * dvi: new backend to support DVI. * configure.ac, Makefile.am, shell/Makefile.am, ev-window.c: * ev-application.c: Support for new backends. * help, ev-window.c, main.c shell/Makefile.am:
Diffstat (limited to 'shell')
-rw-r--r--shell/Makefile.am59
-rw-r--r--shell/ev-application.c59
-rw-r--r--shell/ev-application.h1
-rw-r--r--shell/ev-window.c103
-rw-r--r--shell/main.c2
5 files changed, 191 insertions, 33 deletions
diff --git a/shell/Makefile.am b/shell/Makefile.am
index a14f2a0..b03eed4 100644
--- a/shell/Makefile.am
+++ b/shell/Makefile.am
@@ -1,16 +1,20 @@
NULL=
-INCLUDES= \
- -DDATADIR=\"$(pkgdatadir)\" \
- -I$(top_srcdir)/lib \
- -I$(top_srcdir)/backend \
- -I$(top_srcdir)/pdf \
- -I$(top_srcdir)/pixbuf \
- -I$(top_srcdir)/ps \
- -DGNOMELOCALEDIR=\"$(datadir)/locale\" \
- -DGNOMEICONDIR=\""$(datadir)/pixmaps"\" \
- $(SHELL_CFLAGS) \
- $(EVINCE_DISABLE_DEPRECATED) \
+INCLUDES= \
+ -DDATADIR=\"$(pkgdatadir)\" \
+ -DGNOMEDATADIR=\"$(datadir)\" \
+ -I$(top_srcdir)/lib \
+ -I$(top_srcdir)/cut-n-paste/recent-files/ \
+ -I$(top_srcdir)/backend \
+ -I$(top_srcdir)/pdf \
+ -I$(top_srcdir)/pixbuf \
+ -I$(top_srcdir)/ps \
+ -I$(top_srcdir)/djvu \
+ -I$(top_srcdir)/dvi \
+ -DGNOMELOCALEDIR=\"$(datadir)/locale\" \
+ -DGNOMEICONDIR=\""$(datadir)/pixmaps"\" \
+ $(SHELL_CFLAGS) \
+ $(EVINCE_DISABLE_DEPRECATED) \
$(NULL)
bin_PROGRAMS=evince
@@ -50,15 +54,34 @@ evince_SOURCES= \
main.c \
$(NULL)
-evince_LDADD= \
- $(SHELL_LIBS) \
- $(top_builddir)/lib/libev.la \
- $(top_builddir)/pdf/libpdfdocument.la \
- $(top_builddir)/pixbuf/libpixbufdocument.la \
- $(top_builddir)/ps/libgtkgs.la \
- $(top_builddir)/backend/libevbackend.la \
+evince_LDADD= \
+ $(SHELL_LIBS) \
+ $(top_builddir)/cut-n-paste/recent-files/librecent.la \
+ $(top_builddir)/lib/libev.la \
+ $(top_builddir)/pdf/libpdfdocument.la \
+ $(top_builddir)/pixbuf/libpixbufdocument.la \
+ $(top_builddir)/ps/libgtkgs.la \
+ $(top_builddir)/backend/libevbackend.la \
$(NULL)
+if ENABLE_DJVU
+evince_LDADD += \
+ -ldjvulibre \
+ -lpthread \
+ $(top_builddir)/djvu/libgtkdjvu.la \
+ $(NULL)
+endif
+
+if ENABLE_DVI
+evince_LDADD += \
+ $(top_builddir)/dvi/libgtkdvi.la \
+ $(NULL)
+endif
+
+if WITH_TYPE1_FONTS
+evince_LDADD += -lt1lib
+endif
+
BUILT_SOURCES = ev-marshal.h ev-marshal.c
EXTRA_DIST = ev-marshal.list
diff --git a/shell/ev-application.c b/shell/ev-application.c
index a1dec92..e24e823 100644
--- a/shell/ev-application.c
+++ b/shell/ev-application.c
@@ -20,6 +20,10 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#include "ev-application.h"
#include <glib.h>
@@ -95,7 +99,7 @@ is_window_empty (const EvWindow *ev_window, gconstpointer dummy)
: -1;
}
-static EvWindow *
+EvWindow *
ev_application_get_empty_window (EvApplication *application)
{
GList *node;
@@ -113,7 +117,17 @@ ev_application_open (EvApplication *application, GError *err)
{
EvWindow *ev_window;
GtkWidget *chooser;
- GtkFileFilter *both_filter, *pdf_filter, *ps_filter, *pixbuf_filter, *all_filter;
+ GtkFileFilter *documents_filter;
+ GtkFileFilter *pdf_filter;
+ GtkFileFilter *ps_filter;
+ GtkFileFilter *pixbuf_filter;
+ GtkFileFilter *all_filter;
+#ifdef ENABLE_DJVU
+ GtkFileFilter *djvu_filter;
+#endif
+#ifdef ENABLE_DVI
+ GtkFileFilter *dvi_filter;
+#endif
ev_window = ev_application_get_empty_window (application);
@@ -125,19 +139,26 @@ ev_application_open (EvApplication *application, GError *err)
GTK_STOCK_OPEN, GTK_RESPONSE_OK,
NULL);
- both_filter = gtk_file_filter_new ();
- gtk_file_filter_set_name (both_filter,
- _("PostScript and PDF Documents"));
- gtk_file_filter_add_mime_type (both_filter, "application/postscript");
- gtk_file_filter_add_mime_type (both_filter, "application/x-gzpostscript");
- gtk_file_filter_add_mime_type (both_filter, "image/x-eps");
- gtk_file_filter_add_mime_type (both_filter, "application/pdf");
- gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), both_filter);
+ documents_filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (documents_filter,
+ _("All Documents"));
+ gtk_file_filter_add_mime_type (documents_filter, "application/postscript");
+ gtk_file_filter_add_mime_type (documents_filter, "application/x-gzpostscript");
+ gtk_file_filter_add_mime_type (documents_filter, "image/x-eps");
+ gtk_file_filter_add_mime_type (documents_filter, "application/pdf");
+#ifdef ENABLE_DVI
+ gtk_file_filter_add_mime_type (documents_filter, "application/x-dvi");
+#endif
+ gtk_file_filter_add_pixbuf_formats (documents_filter);
+#ifdef ENABLE_DJVU
+ gtk_file_filter_add_mime_type (documents_filter, "image/vnd.djvu");
+#endif
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), documents_filter);
ps_filter = gtk_file_filter_new ();
gtk_file_filter_set_name (ps_filter, _("PostScript Documents"));
gtk_file_filter_add_mime_type (ps_filter, "application/postscript");
- gtk_file_filter_add_mime_type (both_filter, "application/x-gzpostscript");
+ gtk_file_filter_add_mime_type (ps_filter, "application/x-gzpostscript");
gtk_file_filter_add_mime_type (ps_filter, "image/x-eps");
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), ps_filter);
@@ -146,17 +167,31 @@ ev_application_open (EvApplication *application, GError *err)
gtk_file_filter_add_mime_type (pdf_filter, "application/pdf");
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), pdf_filter);
+#ifdef ENABLE_DVI
+ dvi_filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (dvi_filter, _("DVI Documents"));
+ gtk_file_filter_add_mime_type (dvi_filter, "application/x-dvi");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), dvi_filter);
+#endif
+
pixbuf_filter = gtk_file_filter_new ();
gtk_file_filter_set_name (pixbuf_filter, _("Images"));
gtk_file_filter_add_pixbuf_formats (pixbuf_filter);
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), pixbuf_filter);
+
+#ifdef ENABLE_DJVU
+ djvu_filter = gtk_file_filter_new ();
+ gtk_file_filter_set_name (djvu_filter, _("Djvu Documents"));
+ gtk_file_filter_add_mime_type (djvu_filter, "image/vnd.djvu");
+ gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), djvu_filter);
+#endif
all_filter = gtk_file_filter_new ();
gtk_file_filter_set_name (all_filter, _("All Files"));
gtk_file_filter_add_pattern (all_filter, "*");
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_filter);
- gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), both_filter);
+ gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), documents_filter);
if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_OK) {
char *uri;
diff --git a/shell/ev-application.h b/shell/ev-application.h
index 7f30a92..e6a3cf5 100644
--- a/shell/ev-application.h
+++ b/shell/ev-application.h
@@ -57,6 +57,7 @@ EvApplication *ev_application_get_instance (void);
void ev_application_open (EvApplication *application,
GError *err);
EvWindow *ev_application_new_window (EvApplication *application);
+EvWindow * ev_application_get_empty_window (EvApplication *application);
G_END_DECLS
diff --git a/shell/ev-window.c b/shell/ev-window.c
index b3ab9ff..c351502 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -43,13 +43,23 @@
#include "ev-document-security.h"
#include "ev-job-queue.h"
#include "eggfindbar.h"
+#include "egg-recent-view-gtk.h"
+#include "egg-recent-view.h"
+#include "egg-recent-model.h"
#include "ev-poppler.h"
#include "pixbuf-document.h"
#include "ps-document.h"
+#ifdef ENABLE_DVI
+#include "dvi-document.h"
+#endif
+#ifdef ENABLE_DJVU
+#include "djvu-document.h"
+#endif
#include <glib/gi18n.h>
#include <gtk/gtk.h>
+#include <gnome.h>
#include <libgnomevfs/gnome-vfs-mime-utils.h>
#include <libgnomevfs/gnome-vfs-uri.h>
@@ -119,6 +129,10 @@ struct _EvWindowPrivate {
gboolean fullscreen_mode;
EvSizingMode sizing_mode;
GSource *fullscreen_timeout_source;
+
+ /* recent file stuff */
+ EggRecentModel *recent_model;
+ EggRecentViewGtk *recent_view;
};
static GtkTargetEntry ev_drop_types[] = {
@@ -149,6 +163,8 @@ static gboolean start_loading_document (EvWindow *ev_window,
static void ev_window_set_sizing_mode (EvWindow *ev_window,
EvSizingMode sizing_mode);
+static void ev_window_add_recent (EvWindow *window, const char *filename);
+
G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW)
static void
@@ -484,7 +500,7 @@ update_window_title (EvDocument *document, GParamSpec *pspec, EvWindow *ev_windo
static gboolean
document_supports_sidebar (EvDocument *document)
{
- return (EV_IS_DOCUMENT_THUMBNAILS (document) && (EV_IS_DOCUMENT_LINKS (document)));
+ return (EV_IS_DOCUMENT_THUMBNAILS (document) || (EV_IS_DOCUMENT_LINKS (document)));
}
static void
@@ -654,6 +670,8 @@ start_loading_document (EvWindow *ev_window,
g_object_unref (ev_window->priv->document);
ev_window->priv->document = g_object_ref (document);
ev_window_setup_document (ev_window);
+
+ ev_window_add_recent (ev_window, uri);
return TRUE;
}
@@ -689,6 +707,8 @@ is_file_supported (const gchar *mime_type)
static char *supported_types [] = {
"application/pdf",
"application/postscript",
+ "application/x-dvi",
+ "image/vnd.djvu",
"application/x-gzpostscript",
"image/x-eps",
NULL
@@ -727,8 +747,16 @@ ev_window_open (EvWindow *ev_window, const char *uri)
!strcmp (mime_type, "application/x-gzpostscript") ||
!strcmp (mime_type, "image/x-eps"))
document = g_object_new (PS_TYPE_DOCUMENT, NULL);
+#ifdef ENABLE_DJVU
+ else if (!strcmp (mime_type, "image/vnd.djvu"))
+ document = g_object_new (DJVU_TYPE_DOCUMENT, NULL);
+#endif
else if (mime_type_supported_by_gdk_pixbuf (mime_type))
document = g_object_new (PIXBUF_TYPE_DOCUMENT, NULL);
+#ifdef ENABLE_DVI
+ else if (!strcmp (mime_type, "application/x-dvi"))
+ document = g_object_new (DVI_TYPE_DOCUMENT, NULL);
+#endif
if (document) {
start_loading_document (ev_window, document, uri);
@@ -789,6 +817,69 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *ev_window)
ev_application_open (EV_APP, NULL);
}
+static void
+ev_window_cmd_recent_file_activate (EggRecentViewGtk *view, EggRecentItem *item,
+ EvWindow *ev_window)
+{
+ char *uri;
+ GtkWidget *window;
+
+ uri = egg_recent_item_get_uri (item);
+
+ window = GTK_WIDGET (ev_application_get_empty_window (EV_APP));
+ gtk_widget_show (window);
+ ev_window_open (EV_WINDOW (window), uri);
+
+ g_free (uri);
+}
+
+static void
+ev_window_add_recent (EvWindow *window, const char *filename)
+{
+ EggRecentItem *item;
+
+ if (strstr (filename, "file:///") == NULL)
+ return;
+
+ item = egg_recent_item_new_from_uri (filename);
+ egg_recent_item_add_group (item, "Evince");
+ egg_recent_model_add_full (window->priv->recent_model, item);
+}
+
+static void
+ev_window_setup_recent (EvWindow *ev_window)
+{
+ GtkWidget *menu_item;
+ GtkWidget *menu;
+
+ menu_item = gtk_ui_manager_get_widget (ev_window->priv->ui_manager, "/MainMenu/FileMenu");
+ menu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (menu_item));
+ menu_item = gtk_ui_manager_get_widget (ev_window->priv->ui_manager, "/MainMenu/FileMenu/RecentFilesMenu");
+
+ g_return_if_fail (menu != NULL);
+ g_return_if_fail (menu_item != NULL);
+
+ /* it would be better if we just filtered by mime-type, but there
+ * doesn't seem to be an easy way to figure out which mime-types we
+ * can handle */
+ ev_window->priv->recent_model = egg_recent_model_new (EGG_RECENT_MODEL_SORT_MRU);
+
+ ev_window->priv->recent_view = egg_recent_view_gtk_new (menu, menu_item);
+ egg_recent_view_gtk_show_icons (EGG_RECENT_VIEW_GTK (ev_window->priv->recent_view), FALSE);
+ egg_recent_model_set_limit (ev_window->priv->recent_model, 5);
+
+ egg_recent_view_set_model (EGG_RECENT_VIEW (ev_window->priv->recent_view),
+ ev_window->priv->recent_model);
+
+ egg_recent_model_set_filter_groups (ev_window->priv->recent_model,
+ "Evince", NULL);
+
+ egg_recent_view_gtk_set_trailing_sep (ev_window->priv->recent_view, TRUE);
+
+ g_signal_connect (ev_window->priv->recent_view, "activate",
+ G_CALLBACK (ev_window_cmd_recent_file_activate), ev_window);
+}
+
/* FIXME
static gboolean
overwrite_existing_file (GtkWindow *window, const gchar *file_name)
@@ -1530,9 +1621,16 @@ ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window)
static void
ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window)
{
+ GError *error = NULL;
+
g_return_if_fail (EV_IS_WINDOW (ev_window));
- /* FIXME */
+ gnome_help_display ("evince.xml", NULL, &error);
+
+ if(error != NULL) {
+ g_warning (error->message);
+ g_error_free (error);
+ }
}
static void
@@ -2369,6 +2467,7 @@ ev_window_init (EvWindow *ev_window)
ev_window->priv->find_bar,
FALSE, TRUE, 0);
+ ev_window_setup_recent (ev_window);
ev_window->priv->chrome = load_chrome ();
set_chrome_actions (ev_window);
update_chrome_visibility (ev_window);
diff --git a/shell/main.c b/shell/main.c
index 6cd14e8..5ed8f76 100644
--- a/shell/main.c
+++ b/shell/main.c
@@ -80,7 +80,7 @@ main (int argc, char *argv[])
LIBGNOMEUI_MODULE, argc, argv,
GNOME_PARAM_POPT_TABLE, popt_options,
GNOME_PARAM_HUMAN_READABLE_NAME, _("Evince"),
- GNOME_PARAM_APP_DATADIR, DATADIR,
+ GNOME_PARAM_APP_DATADIR, GNOMEDATADIR,
NULL);
ev_job_queue_init ();