]> www.fi.muni.cz Git - evince.git/blob - shell/ev-application.c
Initial history implementation. Needs work.
[evince.git] / shell / ev-application.c
1 /* this file is part of evince, a gnome document viewer
2  *
3  *  Copyright (C) 2004 Martin Kretzschmar
4  *
5  *  Author:
6  *    Martin Kretzschmar <martink@gnome.org>
7  *
8  * Evince is free software; you can redistribute it and/or modify it
9  * under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * Evince is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
21  */
22
23 #include "ev-application.h"
24
25 #include <glib.h>
26 #include <glib/gi18n.h>
27 #include <glib-object.h>
28 #include <gtk/gtkfilechooserdialog.h>
29 #include <gtk/gtkstock.h>
30 #include <gtk/gtkwidget.h>
31 #include <gtk/gtkmain.h>
32 #include <libgnomevfs/gnome-vfs-utils.h>
33
34 #include "ev-window.h"
35
36 struct _EvApplicationPrivate {
37         GList *windows;
38 };
39
40 G_DEFINE_TYPE (EvApplication, ev_application, G_TYPE_OBJECT);
41
42 #define EV_APPLICATION_GET_PRIVATE(object) \
43         (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_APPLICATION, EvApplicationPrivate))
44
45 EvApplication *
46 ev_application_get_instance (void)
47 {
48         static EvApplication *instance;
49
50         if (!instance)
51                 instance = EV_APPLICATION (
52                         g_object_new (EV_TYPE_APPLICATION, NULL));
53
54         return instance;
55 }
56
57 static void
58 window_destroy_cb (GtkObject *object, gpointer user_data)
59 {
60         EvApplication *application;
61         
62         g_return_if_fail (EV_IS_WINDOW (object));
63         g_return_if_fail (EV_IS_APPLICATION (user_data));
64
65         application = EV_APPLICATION (user_data);
66         application->priv->windows =
67                 g_list_remove (application->priv->windows, object);
68
69         if (application->priv->windows == NULL)
70                 gtk_main_quit ();
71 }
72
73 EvWindow *
74 ev_application_new_window (EvApplication *application)
75 {
76         EvWindow *ev_window;
77
78         ev_window = EV_WINDOW (g_object_new (EV_TYPE_WINDOW,
79                                              "type", GTK_WINDOW_TOPLEVEL,
80                                              "default-height", 600,
81                                              "default-width", 600,
82                                              NULL));
83         application->priv->windows =
84                 g_list_prepend (application->priv->windows, ev_window);
85         g_signal_connect (G_OBJECT (ev_window), "destroy",
86                           G_CALLBACK (window_destroy_cb), application);
87
88         return ev_window;
89 }
90
91 static int
92 is_window_empty (const EvWindow *ev_window, gconstpointer dummy)
93 {
94         g_return_val_if_fail (EV_IS_WINDOW (ev_window), 0);
95
96         return ev_window_is_empty (ev_window)
97                 ? 0
98                 : -1;
99 }
100
101 static EvWindow *
102 ev_application_get_empty_window (EvApplication *application)
103 {
104         GList *node;
105
106         node = g_list_find_custom (application->priv->windows, NULL,
107                                    (GCompareFunc)is_window_empty);
108
109         return node && node->data
110                 ? EV_WINDOW (node->data)
111                 : ev_application_new_window (application);
112 }
113
114 void
115 ev_application_open (EvApplication *application, GError *err)
116 {
117         EvWindow *ev_window;
118         GtkWidget *chooser;
119         GtkFileFilter *both_filter, *pdf_filter, *ps_filter, *pixbuf_filter, *all_filter;
120
121         ev_window = ev_application_get_empty_window (application);
122
123         chooser = gtk_file_chooser_dialog_new (_("Open document"),
124                                                GTK_WINDOW (ev_window),
125                                                GTK_FILE_CHOOSER_ACTION_OPEN,
126                                                GTK_STOCK_CANCEL,
127                                                GTK_RESPONSE_CANCEL,
128                                                GTK_STOCK_OPEN, GTK_RESPONSE_OK,
129                                                NULL);
130
131         both_filter = gtk_file_filter_new ();
132         gtk_file_filter_set_name (both_filter,
133                                   _("PostScript and PDF Documents"));
134         gtk_file_filter_add_mime_type (both_filter, "application/postscript");
135         gtk_file_filter_add_mime_type (both_filter, "application/pdf");
136         gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), both_filter);
137
138         ps_filter = gtk_file_filter_new ();
139         gtk_file_filter_set_name (ps_filter, _("PostScript Documents"));
140         gtk_file_filter_add_mime_type (ps_filter, "application/postscript");
141         gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), ps_filter);
142
143         pdf_filter = gtk_file_filter_new ();
144         gtk_file_filter_set_name (pdf_filter, _("PDF Documents"));
145         gtk_file_filter_add_mime_type (pdf_filter, "application/pdf");
146         gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), pdf_filter);
147
148         pixbuf_filter = gtk_file_filter_new ();
149         gtk_file_filter_set_name (pixbuf_filter, _("Images"));
150         gtk_file_filter_add_pixbuf_formats (pixbuf_filter);
151         gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), pixbuf_filter);
152         
153         all_filter = gtk_file_filter_new ();
154         gtk_file_filter_set_name (all_filter, _("All Files"));
155         gtk_file_filter_add_pattern (all_filter, "*");
156         gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_filter);
157         
158         gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), both_filter);
159
160         if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_OK) {
161                 char *uri;
162
163                 uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (chooser));
164                 ev_window_open (ev_window, uri);
165                 gtk_widget_show (GTK_WIDGET (ev_window));
166                 g_free (uri);
167         }
168
169         gtk_widget_destroy (GTK_WIDGET (chooser));
170 }
171
172 void
173 ev_application_open_bookmark (EvApplication *application,
174                               EvWindow      *window,
175                               EvBookmark    *bookmark,
176                               GError        *error)
177 {
178         EvBookmarkType type;
179         const char *uri;
180
181         type = ev_bookmark_get_bookmark_type (bookmark);
182         
183         switch (type) {
184                 case EV_BOOKMARK_TYPE_TITLE:
185                         break;
186                 case EV_BOOKMARK_TYPE_LINK:
187                         ev_window_open_bookmark (window, bookmark);
188                         break;
189                 case EV_BOOKMARK_TYPE_EXTERNAL_URI:
190                         uri = ev_bookmark_get_uri (bookmark);
191                         gnome_vfs_url_show (uri);
192                         break;
193         }
194 }
195
196 static void
197 ev_application_class_init (EvApplicationClass *ev_application_class)
198 {
199         GObjectClass *g_object_class;
200
201         g_object_class = G_OBJECT_CLASS (ev_application_class);
202
203         g_type_class_add_private (g_object_class,
204                                   sizeof (EvApplicationPrivate));
205 }
206
207 static void
208 ev_application_init (EvApplication *ev_application)
209 {
210         ev_application->priv = EV_APPLICATION_GET_PRIVATE (ev_application);
211 }
212