*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#endif
#include <string.h>
+
#include <glib/gi18n.h>
#include <glib/gstdio.h>
#include <gtk/gtk.h>
+#include "ev-document-attachments.h"
+#include "ev-jobs.h"
+#include "ev-job-scheduler.h"
#include "ev-file-helpers.h"
#include "ev-sidebar-attachments.h"
#include "ev-sidebar-page.h"
N_SIGNALS
};
-static const GtkTargetEntry drag_targets[] = {
- { "text/uri-list", 0, 0 }
-};
-
static guint signals[N_SIGNALS];
struct _EvSidebarAttachmentsPrivate {
GHashTable *icon_cache;
};
-static void ev_sidebar_attachments_page_iface_init (EvSidebarPageIface *iface);
+static void ev_sidebar_attachments_page_iface_init (EvSidebarPageInterface *iface);
G_DEFINE_TYPE_EXTENDED (EvSidebarAttachments,
ev_sidebar_attachments,
GdkEventButton *event,
GtkWidget *icon_view)
{
- if (!GTK_WIDGET_HAS_FOCUS (icon_view)) {
+ if (!gtk_widget_has_focus (icon_view)) {
gtk_widget_grab_focus (icon_view);
}
if (!attachment)
return FALSE;
- ev_attachment_open (attachment, &error);
+ ev_attachment_open (attachment,
+ gtk_widget_get_screen (GTK_WIDGET (ev_attachbar)),
+ event->time,
+ &error);
if (error) {
g_warning ("%s", error->message);
gpointer user_data)
{
EvSidebarAttachments *ev_attachbar = EV_SIDEBAR_ATTACHMENTS (user_data);
- GString *uri_list;
- gchar *uris = NULL;
GList *selected = NULL, *l;
+ GPtrArray *uris;
+ char **uri_list;
selected = gtk_icon_view_get_selected_items (GTK_ICON_VIEW (ev_attachbar->priv->icon_view));
if (!selected)
return;
- uri_list = g_string_new (NULL);
+ uris = g_ptr_array_new ();
for (l = selected; l && l->data; l = g_list_next (l)) {
EvAttachment *attachment;
GtkTreePath *path;
GtkTreeIter iter;
GFile *file;
- gchar *filename;
+ gchar *template;
GError *error = NULL;
path = (GtkTreePath *) l->data;
COLUMN_ATTACHMENT, &attachment,
-1);
- filename = g_build_filename (ev_tmp_dir (),
- ev_attachment_get_name (attachment),
- NULL);
- file = g_file_new_for_path (filename);
- g_free (filename);
+ /* FIXMEchpe: convert to filename encoding first! */
+ template = g_strdup_printf ("%s.XXXXXX", ev_attachment_get_name (attachment));
+ file = ev_mkstemp_file (template, &error);
+ g_free (template);
- if (ev_attachment_save (attachment, file, &error)) {
+ if (file != NULL && ev_attachment_save (attachment, file, &error)) {
gchar *uri;
uri = g_file_get_uri (file);
- g_string_append (uri_list, uri);
- g_string_append_c (uri_list, '\n');
- g_free (uri);
+ g_ptr_array_add (uris, uri);
}
if (error) {
g_object_unref (attachment);
}
- uris = g_string_free (uri_list, FALSE);
-
- if (uris) {
- gtk_selection_data_set (data,
- data->target,
- 8,
- (guchar *)uris,
- strlen (uris));
- }
+ g_ptr_array_add (uris, NULL); /* NULL-terminate */
+ uri_list = (char **) g_ptr_array_free (uris, FALSE);
+ gtk_selection_data_set_uris (data, uri_list);
+ g_strfreev (uri_list);
g_list_free (selected);
}
"text-column", COLUMN_NAME,
"pixbuf-column", COLUMN_ICON,
NULL);
- g_signal_connect_swapped (G_OBJECT (ev_attachbar->priv->icon_view),
+ g_signal_connect_swapped (ev_attachbar->priv->icon_view,
"button-press-event",
G_CALLBACK (ev_sidebar_attachments_button_press),
(gpointer) ev_attachbar);
gtk_icon_view_enable_model_drag_source (
GTK_ICON_VIEW (ev_attachbar->priv->icon_view),
GDK_BUTTON1_MASK,
- drag_targets,
- G_N_ELEMENTS (drag_targets),
+ NULL, 0,
GDK_ACTION_COPY);
+ gtk_drag_source_add_uri_targets (ev_attachbar->priv->icon_view);
- g_signal_connect (G_OBJECT (ev_attachbar->priv->icon_view),
+ g_signal_connect (ev_attachbar->priv->icon_view,
"drag-data-get",
G_CALLBACK (ev_sidebar_attachments_drag_data_get),
(gpointer) ev_attachbar);
}
static void
-ev_sidebar_attachments_set_document (EvSidebarPage *page,
- EvDocument *document)
+job_finished_callback (EvJobAttachments *job,
+ EvSidebarAttachments *ev_attachbar)
{
- EvSidebarAttachments *ev_attachbar = EV_SIDEBAR_ATTACHMENTS (page);
- GList *attachments = NULL;
GList *l;
- if (!ev_document_has_attachments (document))
- return;
-
- if (!ev_attachbar->priv->icon_theme) {
- GdkScreen *screen;
-
- screen = gtk_widget_get_screen (GTK_WIDGET (ev_attachbar));
- ev_attachbar->priv->icon_theme = gtk_icon_theme_get_for_screen (screen);
- g_signal_connect_swapped (G_OBJECT (ev_attachbar->priv->icon_theme),
- "changed",
- G_CALLBACK (ev_sidebar_attachments_update_icons),
- (gpointer) ev_attachbar);
- }
-
- attachments = ev_document_get_attachments (document);
-
- gtk_list_store_clear (ev_attachbar->priv->model);
-
- for (l = attachments; l && l->data; l = g_list_next (l)) {
+ for (l = job->attachments; l && l->data; l = g_list_next (l)) {
EvAttachment *attachment;
GtkTreeIter iter;
GdkPixbuf *pixbuf = NULL;
COLUMN_ICON, pixbuf,
COLUMN_ATTACHMENT, attachment,
-1);
+ }
- g_object_unref (attachment);
+ g_object_unref (job);
+}
+
+
+static void
+ev_sidebar_attachments_document_changed_cb (EvDocumentModel *model,
+ GParamSpec *pspec,
+ EvSidebarAttachments *ev_attachbar)
+{
+ EvDocument *document = ev_document_model_get_document (model);
+ EvJob *job;
+
+ if (!EV_IS_DOCUMENT_ATTACHMENTS (document))
+ return;
+
+ if (!ev_document_attachments_has_attachments (EV_DOCUMENT_ATTACHMENTS (document)))
+ return;
+
+ if (!ev_attachbar->priv->icon_theme) {
+ GdkScreen *screen;
+
+ screen = gtk_widget_get_screen (GTK_WIDGET (ev_attachbar));
+ ev_attachbar->priv->icon_theme = gtk_icon_theme_get_for_screen (screen);
+ g_signal_connect_swapped (ev_attachbar->priv->icon_theme,
+ "changed",
+ G_CALLBACK (ev_sidebar_attachments_update_icons),
+ (gpointer) ev_attachbar);
}
+
+ gtk_list_store_clear (ev_attachbar->priv->model);
+
+ job = ev_job_attachments_new (document);
+ g_signal_connect (job, "finished",
+ G_CALLBACK (job_finished_callback),
+ ev_attachbar);
+ g_signal_connect (job, "cancelled",
+ G_CALLBACK (g_object_unref),
+ NULL);
+ /* The priority doesn't matter for this job */
+ ev_job_scheduler_push_job (job, EV_JOB_PRIORITY_NONE);
+}
- g_list_free (attachments);
+static void
+ev_sidebar_attachments_set_model (EvSidebarPage *page,
+ EvDocumentModel *model)
+{
+ g_signal_connect (model, "notify::document",
+ G_CALLBACK (ev_sidebar_attachments_document_changed_cb),
+ page);
}
static gboolean
ev_sidebar_attachments_support_document (EvSidebarPage *sidebar_page,
EvDocument *document)
{
- return ev_document_has_attachments (document);
+ return (EV_IS_DOCUMENT_ATTACHMENTS (document) &&
+ ev_document_attachments_has_attachments (EV_DOCUMENT_ATTACHMENTS (document)));
}
static const gchar*
}
static void
-ev_sidebar_attachments_page_iface_init (EvSidebarPageIface *iface)
+ev_sidebar_attachments_page_iface_init (EvSidebarPageInterface *iface)
{
iface->support_document = ev_sidebar_attachments_support_document;
- iface->set_document = ev_sidebar_attachments_set_document;
+ iface->set_model = ev_sidebar_attachments_set_model;
iface->get_label = ev_sidebar_attachments_get_label;
}