X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-properties.c;h=b7c0bcc7f8f007ebb041edd4fddfcac27a7b5671;hb=4301d174db5623094cb313a467a2abab34a2b381;hp=a8c5a1ecc155810d500bb12a2db0acdeceea9a02;hpb=dbe438c1e95c6d2901c282a0c0e204c94114fb75;p=evince.git diff --git a/shell/ev-properties.c b/shell/ev-properties.c index a8c5a1ec..b7c0bcc7 100644 --- a/shell/ev-properties.c +++ b/shell/ev-properties.c @@ -24,6 +24,9 @@ #include "ev-properties.h" #include "ev-document-fonts.h" +#include "ev-jobs.h" +#include "ev-job-queue.h" +#include "ev-page-cache.h" #include #include @@ -31,6 +34,12 @@ #include #include +enum +{ + FONT_NAME_COL, + NUM_COLS +}; + typedef enum { TITLE_PROPERTY, @@ -68,6 +77,82 @@ static const PropertyInfo properties_info[] = { { SECURITY_PROPERTY, "security" } }; +struct _EvProperties { + GObject base_instance; + + GladeXML *xml; + + GtkWidget *dialog; + GtkWidget *fonts_treeview; + GtkWidget *fonts_progress_label; + GtkWidget *font_page; + + EvDocument *document; +}; + +struct _EvPropertiesClass { + GObjectClass base_class; +}; + +G_DEFINE_TYPE (EvProperties, ev_properties, G_TYPE_OBJECT) + +static void +ev_properties_dispose (GObject *object) +{ + EvProperties *properties = EV_PROPERTIES (object); + + if (properties->xml) { + g_object_unref (properties->xml); + properties->xml = NULL; + } +} + +static void +ev_properties_class_init (EvPropertiesClass *properties_class) +{ + GObjectClass *g_object_class = G_OBJECT_CLASS (properties_class); + + g_object_class->dispose = ev_properties_dispose; +} + +static void +dialog_destroy_cb (GtkWidget *dialog, EvProperties *properties) +{ + g_object_unref (properties); +} + +static void +ev_properties_init (EvProperties *properties) +{ + GladeXML *xml; + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + + /* Create a new GladeXML object from XML file glade_file */ + xml = glade_xml_new (DATADIR "/evince-properties.glade", NULL, NULL); + properties->xml = xml; + g_assert (xml != NULL); + + properties->dialog = glade_xml_get_widget (xml, "properties_dialog"); + properties->fonts_treeview = glade_xml_get_widget (xml, "fonts_treeview"); + properties->fonts_progress_label = glade_xml_get_widget (xml, "font_progress_label"); + properties->font_page = glade_xml_get_widget (xml, "fonts_page"); + + column = gtk_tree_view_column_new (); + gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE); + gtk_tree_view_append_column (GTK_TREE_VIEW (properties->fonts_treeview), column); + + renderer = gtk_cell_renderer_text_new (); + gtk_tree_view_column_pack_start (GTK_TREE_VIEW_COLUMN (column), renderer, FALSE); + gtk_tree_view_column_set_title (GTK_TREE_VIEW_COLUMN (column), _("Name")); + gtk_tree_view_column_set_attributes (GTK_TREE_VIEW_COLUMN (column), renderer, + "text", EV_DOCUMENT_FONTS_COLUMN_NAME, + NULL); + + g_signal_connect (properties->dialog, "destroy", + G_CALLBACK (dialog_destroy_cb), properties); +} + /* Returns a locale specific date and time representation */ static char * ev_properties_format_date (GTime utime) @@ -98,40 +183,76 @@ set_property (GladeXML *xml, Property property, const char *text) } static void -setup_fonts_view (GladeXML *xml, GtkTreeModel *fonts) +update_progress_label (GtkWidget *label, double progress) { - GtkWidget *widget; - GtkCellRenderer *renderer; - GtkTreeViewColumn *column; + if (progress > 0) { + char *progress_text; + progress_text = g_strdup_printf (_("Gathering font information... %3d%%"), + (int) (progress * 100)); + gtk_label_set_text (GTK_LABEL (label), progress_text); + g_free (progress_text); + } else { + gtk_label_set_text (GTK_LABEL (label), ""); + } +} - widget = glade_xml_get_widget (xml, "fonts_treeview"); - gtk_tree_view_set_model (GTK_TREE_VIEW (widget), fonts); +static void +job_fonts_finished_cb (EvJob *job, EvProperties *properties) +{ + EvDocumentFonts *document_fonts = EV_DOCUMENT_FONTS (job->document); + double progress; - column = gtk_tree_view_column_new (); - gtk_tree_view_column_set_expand (GTK_TREE_VIEW_COLUMN (column), TRUE); - gtk_tree_view_append_column (GTK_TREE_VIEW (widget), column); + progress = ev_document_fonts_get_progress (document_fonts); + update_progress_label (properties->fonts_progress_label, progress); - renderer = gtk_cell_renderer_text_new (); - gtk_tree_view_column_pack_start (GTK_TREE_VIEW_COLUMN (column), renderer, FALSE); - gtk_tree_view_column_set_attributes (GTK_TREE_VIEW_COLUMN (column), renderer, - "text", EV_DOCUMENT_FONTS_COLUMN_NAME, - NULL); + if (EV_JOB_FONTS (job)->scan_completed) { + g_signal_handlers_disconnect_by_func + (job, job_fonts_finished_cb, properties); + } else { + GtkTreeModel *model; + EvJob *new_job; + + model = gtk_tree_view_get_model + (GTK_TREE_VIEW (properties->fonts_treeview)); + ev_document_fonts_fill_model (document_fonts, model); + new_job = ev_job_fonts_new (job->document); + ev_job_queue_add_job (job, EV_JOB_PRIORITY_LOW); + g_object_unref (new_job); + } } -GtkDialog * -ev_properties_new (EvDocumentInfo *info, GtkTreeModel *fonts) +static void +setup_fonts_view (EvProperties *properties) { - GladeXML *xml; - GtkWidget *dialog; + GtkTreeView *tree_view = GTK_TREE_VIEW (properties->fonts_treeview); + GtkListStore *list_store; + EvJob *job; + + list_store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING); + gtk_tree_view_set_model (tree_view, GTK_TREE_MODEL (list_store)); + + job = ev_job_fonts_new (properties->document); + g_signal_connect_object (job, "finished", + G_CALLBACK (job_fonts_finished_cb), + properties, 0); + ev_job_queue_add_job (job, EV_JOB_PRIORITY_LOW); + g_object_unref (job); +} + +void +ev_properties_set_document (EvProperties *properties, + EvDocument *document) +{ + EvPageCache *page_cache; + GladeXML *xml = properties->xml; + const EvDocumentInfo *info; char *text; - - /* Create a new GladeXML object from XML file glade_file */ - xml = glade_xml_new (DATADIR "/evince-properties.glade", NULL, NULL); - g_return_val_if_fail (xml != NULL, NULL); - dialog = glade_xml_get_widget (xml, "properties_dialog"); - g_return_val_if_fail (GTK_IS_DIALOG (dialog), NULL); - + properties->document = document; + + page_cache = ev_page_cache_get (document); + info = ev_page_cache_get_info (page_cache); + if (info->fields_mask & EV_DOCUMENT_INFO_TITLE) { set_property (xml, TITLE_PROPERTY, info->title); } @@ -151,12 +272,12 @@ ev_properties_new (EvDocumentInfo *info, GtkTreeModel *fonts) set_property (xml, CREATOR_PROPERTY, info->creator); } if (info->fields_mask & EV_DOCUMENT_INFO_CREATION_DATE) { - text = ev_properties_format_date ((GTime) info->creation_date); + text = ev_properties_format_date (info->creation_date); set_property (xml, CREATION_DATE_PROPERTY, text); g_free (text); } if (info->fields_mask & EV_DOCUMENT_INFO_MOD_DATE) { - text = ev_properties_format_date ((GTime) info->modified_date); + text = ev_properties_format_date (info->modified_date); set_property (xml, MOD_DATE_PROPERTY, text); g_free (text); } @@ -181,9 +302,30 @@ ev_properties_new (EvDocumentInfo *info, GtkTreeModel *fonts) set_property (xml, SECURITY_PROPERTY, info->security); } - if (fonts) { - setup_fonts_view (xml, fonts); + if (EV_IS_DOCUMENT_FONTS (document)) { + gtk_widget_show (properties->font_page); + setup_fonts_view (properties); + } else { + gtk_widget_hide (properties->font_page); } +} + +EvProperties * +ev_properties_new () +{ + EvProperties *properties; + + properties = g_object_new (EV_TYPE_PROPERTIES, NULL); - return GTK_DIALOG (dialog); + return properties; +} + +void +ev_properties_show (EvProperties *properties, GtkWidget *parent) +{ + gtk_window_set_transient_for (GTK_WINDOW (properties->dialog), + GTK_WINDOW (parent)); + g_signal_connect (properties->dialog, "response", + G_CALLBACK (gtk_widget_destroy), NULL); + gtk_widget_show (properties->dialog); }