From f84660311ba8807c6223178ab3f2515b209d1a57 Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Fri, 3 Jun 2005 17:57:18 +0000 Subject: [PATCH] Initial go at file properties. Patch by Emil Soleyman-Zomalan 2005-06-03 Marco Pesenti Gritti * backend/ev-document-info.h: * data/Makefile.am: * data/evince-ui.xml: * pdf/ev-poppler.cc: * shell/Makefile.am: * shell/ev-window.c: (update_action_sensitivity), (ev_window_cmd_file_properties): Initial go at file properties. Patch by Emil Soleyman-Zomalan . Needs love see #169583 --- ChangeLog | 14 + backend/ev-document-info.h | 18 +- data/Makefile.am | 1 + data/evince-properties.glade | 851 +++++++++++++++++++++++++++++++++++ data/evince-ui.xml | 2 + pdf/ev-poppler.cc | 13 +- shell/Makefile.am | 2 + shell/ev-properties.c | 140 ++++++ shell/ev-properties.h | 53 +++ shell/ev-window.c | 16 +- 10 files changed, 1102 insertions(+), 8 deletions(-) create mode 100644 data/evince-properties.glade create mode 100644 shell/ev-properties.c create mode 100644 shell/ev-properties.h diff --git a/ChangeLog b/ChangeLog index 7b87c94e..956e1d9f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2005-06-03 Marco Pesenti Gritti + + * backend/ev-document-info.h: + * data/Makefile.am: + * data/evince-ui.xml: + * pdf/ev-poppler.cc: + * shell/Makefile.am: + * shell/ev-window.c: (update_action_sensitivity), + (ev_window_cmd_file_properties): + + Initial go at file properties. Patch by + Emil Soleyman-Zomalan . + Needs love see #169583 + 2005-06-02 Marco Pesenti Gritti * ps/ps-document.c: (output): diff --git a/backend/ev-document-info.h b/backend/ev-document-info.h index 02ea5b11..299576c8 100644 --- a/backend/ev-document-info.h +++ b/backend/ev-document-info.h @@ -81,10 +81,14 @@ typedef enum EV_DOCUMENT_INFO_SUBJECT = 1 << 3, EV_DOCUMENT_INFO_KEYWORDS = 1 << 4, EV_DOCUMENT_INFO_LAYOUT = 1 << 5, - EV_DOCUMENT_INFO_START_MODE = 1 << 6, - EV_DOCUMENT_INFO_CREATION_DATE = 1 << 7, - EV_DOCUMENT_INFO_UI_HINTS = 1 << 8, - EV_DOCUMENT_INFO_PERMISSIONS = 1 << 9, + EV_DOCUMENT_INFO_CREATOR = 1 << 6, + EV_DOCUMENT_INFO_PRODUCER = 1 << 7, + EV_DOCUMENT_INFO_CREATION_DATE = 1 << 8, + EV_DOCUMENT_INFO_MOD_DATE = 1 << 9, + EV_DOCUMENT_INFO_LINEARIZED = 1 << 10, + EV_DOCUMENT_INFO_START_MODE = 1 << 11, + EV_DOCUMENT_INFO_UI_HINTS = 1 << 12, + EV_DOCUMENT_INFO_PERMISSIONS = 1 << 13 } EvDocumentInfoFields; struct _EvDocumentInfo @@ -94,9 +98,13 @@ struct _EvDocumentInfo char *author; char *subject; char *keywords; + char *creator; + char *producer; + char *linearized; + GTime *creation_date; + GTime *modified_date; EvDocumentLayout layout; EvDocumentMode mode; - GDate creation_date; guint ui_hints; guint permissions; diff --git a/data/Makefile.am b/data/Makefile.am index 183e455f..d7d6dafe 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -13,6 +13,7 @@ ui_DATA = \ gladedir = $(pkgdatadir) glade_DATA = \ evince-password.glade \ + evince-properties.glade \ $(NULL) DESKTOP_IN_FILES= evince.desktop.in.in diff --git a/data/evince-properties.glade b/data/evince-properties.glade new file mode 100644 index 00000000..837e8fb3 --- /dev/null +++ b/data/evince-properties.glade @@ -0,0 +1,851 @@ + + + + + + + True + Properties + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_CENTER_ON_PARENT + False + False + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_CENTER + True + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + True + -7 + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + True + True + True + GTK_POS_TOP + False + False + + + + 3 + True + 12 + 2 + False + 6 + 6 + + + + True + <b>Title:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 0 + 1 + fill + + + + + + + True + <b>Subject:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 1 + 2 + fill + + + + + + + True + <b>Author:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 2 + 3 + fill + + + + + + + True + <b>Keywords:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 3 + 4 + fill + + + + + + + True + <b>Creator:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 4 + 5 + fill + + + + + + + True + <b>Producer:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 5 + 6 + fill + + + + + + + True + <b>Created:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 6 + 7 + fill + + + + + + + True + <b>Modified:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 7 + 8 + fill + + + + + + + True + <b>Security:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 8 + 9 + fill + + + + + + + True + <b>PDF Version:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 9 + 10 + fill + + + + + + + True + <b>Number of Pages:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 10 + 11 + fill + + + + + + + True + <b>Optimized:</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + 1 + 11 + 12 + fill + + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 0 + 1 + fill + + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 1 + 2 + fill + + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 2 + 3 + fill + + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 3 + 4 + fill + + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 4 + 5 + fill + + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 5 + 6 + fill + + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 6 + 7 + fill + + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 7 + 8 + fill + + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 8 + 9 + fill + + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 9 + 10 + fill + + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 10 + 11 + fill + + + + + + + True + + False + True + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 11 + 12 + fill + + + + + + False + True + + + + + + True + PDF Properties + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + + True + 3 + 3 + False + 0 + 0 + + + + True + Not implemented + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 1 + 2 + 1 + 2 + fill + + + + + + False + True + + + + + + True + Font Properties + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + tab + + + + + 0 + True + True + + + + + + + diff --git a/data/evince-ui.xml b/data/evince-ui.xml index f2e6c32c..a670da4c 100644 --- a/data/evince-ui.xml +++ b/data/evince-ui.xml @@ -6,6 +6,8 @@ + + diff --git a/pdf/ev-poppler.cc b/pdf/ev-poppler.cc index 9cb15348..684812c3 100644 --- a/pdf/ev-poppler.cc +++ b/pdf/ev-poppler.cc @@ -329,9 +329,13 @@ pdf_document_get_info (EvDocument *document) EV_DOCUMENT_INFO_KEYWORDS | EV_DOCUMENT_INFO_LAYOUT | EV_DOCUMENT_INFO_START_MODE | - /* Missing EV_DOCUMENT_INFO_CREATION_DATE | */ EV_DOCUMENT_INFO_PERMISSIONS | - EV_DOCUMENT_INFO_UI_HINTS; + EV_DOCUMENT_INFO_UI_HINTS | + EV_DOCUMENT_INFO_CREATOR | + EV_DOCUMENT_INFO_PRODUCER | + EV_DOCUMENT_INFO_CREATION_DATE | + EV_DOCUMENT_INFO_MOD_DATE | + EV_DOCUMENT_INFO_LINEARIZED; g_object_get (PDF_DOCUMENT (document)->document, @@ -344,6 +348,11 @@ pdf_document_get_info (EvDocument *document) "page-layout", &layout, "viewer-preferences", &view_prefs, "permissions", &permissions, + "creator", &(info->creator), + "producer", &(info->producer), + "creation-date", &(info->creation_date), + "mod-date", &(info->modified_date), + "linearized", &(info->linearized), NULL); switch (layout) { diff --git a/shell/Makefile.am b/shell/Makefile.am index bd104e86..7668e977 100644 --- a/shell/Makefile.am +++ b/shell/Makefile.am @@ -70,6 +70,8 @@ evince_SOURCES= \ ev-pixbuf-cache.h \ ev-print-job.c \ ev-print-job.h \ + ev-properties.c \ + ev-properties.h \ ev-utils.c \ ev-utils.h \ ev-view.c \ diff --git a/shell/ev-properties.c b/shell/ev-properties.c new file mode 100644 index 00000000..995de60b --- /dev/null +++ b/shell/ev-properties.c @@ -0,0 +1,140 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */ +/* this file is part of evince, a gnome document viewer + * + * Copyright (C) 2005 Red Hat, Inc + * + * Evince is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Evince is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "ev-properties.h" + +#include +#include +#include + +GtkDialog * +ev_properties_new (EvDocument *document, + GtkWidget *toplevel) +{ + const char *glade_file = DATADIR "/evince-properties.glade"; + GladeXML *xml; + GtkWidget *dialog = NULL; + EvDocumentInfo *info; + GtkWidget *title, *subject, *author, *keywords, *producer, *creator; + GtkWidget *created, *modified, *security, *version, *pages, *optimized; + gchar *n_pages, **format_str, *pdf_version; + gchar *creation_date, *modified_date; + gchar *secured_document; + + /* Create a new GladeXML object from XML file glade_file */ + xml = glade_xml_new (glade_file, NULL, NULL); + g_return_val_if_fail (xml != NULL, NULL); + + /* Retrieve the document structure */ + info = ev_document_get_info (document); + + /* Assign variables to labels */ + dialog = glade_xml_get_widget (xml, "properties_dialog"); + title = glade_xml_get_widget (xml, "title"); + subject = glade_xml_get_widget (xml, "subject"); + author = glade_xml_get_widget (xml, "author"); + keywords = glade_xml_get_widget (xml, "keywords"); + producer = glade_xml_get_widget (xml, "producer"); + creator = glade_xml_get_widget (xml, "creator"); + created = glade_xml_get_widget (xml, "created"); + modified = glade_xml_get_widget (xml, "modified"); + security = glade_xml_get_widget (xml, "security"); + version = glade_xml_get_widget (xml, "version"); + pages = glade_xml_get_widget (xml, "pages"); + optimized = glade_xml_get_widget (xml, "optimized"); + + /* Number of pages */ + n_pages = g_strdup_printf (_("%d"), ev_document_get_n_pages (document)); + + /* PDF version */ + format_str = g_strsplit (info->format, "-", 2); + pdf_version = g_strdup_printf (_("%s"), format_str[1]); + + /* Creation and modified date */ + creation_date = ev_properties_format_date ((GTime) info->creation_date); + modified_date = ev_properties_format_date ((GTime) info->modified_date); + + /* Does the document have security? */ + if (ev_document_security_has_document_security (EV_DOCUMENT_SECURITY (document))) { + secured_document = "Yes"; + } else { + secured_document = "No"; + } + + /* Shorten label values to fit window size by ellipsizing */ + gtk_label_set_ellipsize (GTK_LABEL (title), PANGO_ELLIPSIZE_END); + gtk_label_set_ellipsize (GTK_LABEL (keywords), PANGO_ELLIPSIZE_END); + + /* Assign values to label fields */ + gtk_label_set_text (GTK_LABEL (title), info->title); + gtk_label_set_text (GTK_LABEL (subject), info->subject); + gtk_label_set_text (GTK_LABEL (author), info->author); + gtk_label_set_text (GTK_LABEL (keywords), info->keywords); + gtk_label_set_text (GTK_LABEL (producer), info->producer); + gtk_label_set_text (GTK_LABEL (creator), info->creator); + gtk_label_set_text (GTK_LABEL (created), creation_date); + gtk_label_set_text (GTK_LABEL (modified), modified_date); + gtk_label_set_text (GTK_LABEL (security), secured_document); + gtk_label_set_text (GTK_LABEL (version), pdf_version); + gtk_label_set_text (GTK_LABEL (pages), n_pages); + gtk_label_set_text (GTK_LABEL (optimized), info->linearized); + + /* Clean up */ + g_strfreev (format_str); + g_free (n_pages); + g_free (pdf_version); + g_free (creation_date); + g_free (modified_date); + + return GTK_DIALOG (dialog); +} + +/* Returns a locale specific date and time representation */ +gchar * +ev_properties_format_date (GTime utime) +{ + struct tm *time; + gchar *date_string; + + date_string = g_new0 (char, 101); + + time = localtime ((const time_t *) &utime); + my_strftime (date_string, 100, "%c", time); + + return date_string; +} + +/* Some buggy versions of gcc complain about the use of %c: + * warning: `%c' yields only last 2 digits of year in some locales. + * + * This is a relatively clean one is to add an intermediate + * function thanks to the strftime(3) manpage + */ +size_t +my_strftime (char *s, size_t max, + const char *fmt, + const struct tm *tm) +{ + return strftime (s, max, fmt, tm); +} diff --git a/shell/ev-properties.h b/shell/ev-properties.h new file mode 100644 index 00000000..0d0eaf8e --- /dev/null +++ b/shell/ev-properties.h @@ -0,0 +1,53 @@ +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */ +/* this file is part of evince, a gnome document viewer + * + * Copyright (C) 2005 Red Hat, Inc + * + * Evince is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * Evince is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * 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. + */ + +#ifndef __EV_PROPERTIES_H__ +#define __EV_PROPERTIES_H__ + +#include "ev-document.h" +#include "ev-document-security.h" +#include "ev-window.h" + +#include +#include +#include +#include +#include + +G_BEGIN_DECLS + +typedef struct _EvProperties EvProperties; + +struct _EvProperties { + GtkDialog parent; +}; + +GtkDialog *ev_properties_new (EvDocument *document, + GtkWidget *toplevel); + +gchar *ev_properties_format_date (GTime utime); + +size_t my_strftime (char *s, size_t max, + const char *fmt, + const struct tm *tm); + +G_END_DECLS + +#endif /* __EV_PROPERTIES_H__ */ diff --git a/shell/ev-window.c b/shell/ev-window.c index c5cfac68..b94871ba 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -37,6 +37,7 @@ #include "ev-password.h" #include "ev-password-view.h" #include "ev-print-job.h" +#include "ev-properties.h" #include "ev-document-thumbnails.h" #include "ev-document-links.h" #include "ev-document-types.h" @@ -218,10 +219,10 @@ update_action_sensitivity (EvWindow *ev_window) /* "FileOpen": always sensitive */ set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy); set_action_sensitive (ev_window, "FilePrint", has_pages && ok_to_print); + set_action_sensitive (ev_window, "FileProperties", has_document); /* "FileCloseWindow": always sensitive */ /* Edit menu */ - sensitive = has_pages && ev_document_can_get_text (document); set_action_sensitive (ev_window, "EditCopy", sensitive && ok_to_copy); set_action_sensitive (ev_window, "EditSelectAll", sensitive && ok_to_copy); @@ -1180,6 +1181,16 @@ ev_window_cmd_file_print (GtkAction *action, EvWindow *ev_window) ev_window_print (ev_window); } +static void +ev_window_cmd_file_properties (GtkAction *action, EvWindow *ev_window) +{ + GtkDialog *dialog; + + dialog = ev_properties_new (ev_window->priv->document, GTK_WIDGET (ev_window)); + gtk_dialog_run (dialog); + gtk_widget_destroy (GTK_WIDGET (dialog)); +} + static void ev_window_cmd_file_close_window (GtkAction *action, EvWindow *ev_window) { @@ -2351,6 +2362,9 @@ static const GtkActionEntry entries[] = { { "FilePrint", GTK_STOCK_PRINT, N_("Print..."), "P", N_("Print this document"), G_CALLBACK (ev_window_cmd_file_print) }, + { "FileProperties", GTK_STOCK_PROPERTIES, N_("Properties"), "Return", + N_("View the properties of this document"), + G_CALLBACK (ev_window_cmd_file_properties) }, { "FileCloseWindow", GTK_STOCK_CLOSE, NULL, "W", N_("Close this window"), G_CALLBACK (ev_window_cmd_file_close_window) }, -- 2.43.5