X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-properties.c;h=d7974c0f1ef5b16bb3777e73075fd9cabac85196;hb=1b553f2b8c0b409ff4a5c93d4341df6e4bfb4b61;hp=295194f47888c5dc295c3834fb8ffd985bf78160;hpb=34af9d3d79512725f33a28299f92f39997290181;p=evince.git diff --git a/shell/ev-properties.c b/shell/ev-properties.c index 295194f4..d7974c0f 100644 --- a/shell/ev-properties.c +++ b/shell/ev-properties.c @@ -26,12 +26,14 @@ #include "ev-document-fonts.h" #include "ev-jobs.h" #include "ev-job-queue.h" +#include "ev-page-cache.h" #include #include #include #include #include +#include enum { @@ -76,6 +78,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) @@ -94,15 +172,71 @@ ev_properties_format_date (GTime utime) return g_locale_to_utf8 (s, -1, NULL, NULL, NULL); } +/* This is cut out of gconvert.c from glib (and mildly modified). Not all + backends give valid UTF-8 for properties, so we make sure that is. + */ +static gchar * +make_valid_utf8 (const gchar *name) +{ + GString *string; + const gchar *remainder, *invalid; + gint remaining_bytes, valid_bytes; + + string = NULL; + remainder = name; + remaining_bytes = strlen (name); + + while (remaining_bytes != 0) + { + if (g_utf8_validate (remainder, remaining_bytes, &invalid)) + break; + valid_bytes = invalid - remainder; + + if (string == NULL) + string = g_string_sized_new (remaining_bytes); + + g_string_append_len (string, remainder, valid_bytes); + g_string_append_c (string, '?'); + + remaining_bytes -= valid_bytes + 1; + remainder = invalid + 1; + } + + if (string == NULL) + return g_strdup (name); + + g_string_append (string, remainder); + + g_assert (g_utf8_validate (string->str, -1, NULL)); + + return g_string_free (string, FALSE); +} + static void set_property (GladeXML *xml, Property property, const char *text) { GtkWidget *widget; + char *valid_text; widget = glade_xml_get_widget (xml, properties_info[property].label_id); g_return_if_fail (GTK_IS_LABEL (widget)); - gtk_label_set_text (GTK_LABEL (widget), text ? text : ""); + if (text == NULL || text[0] == '\000') { + gchar *markup; + + markup = g_markup_printf_escaped ("%s", _("None")); + gtk_label_set_markup (GTK_LABEL (widget), markup); + g_free (markup); + + return; + } + text = text ? text : ""; + + valid_text = make_valid_utf8 (text); + + gtk_label_set_text (GTK_LABEL (widget), valid_text); + + g_free (valid_text); } static void @@ -114,30 +248,33 @@ update_progress_label (GtkWidget *label, double progress) (int) (progress * 100)); gtk_label_set_text (GTK_LABEL (label), progress_text); g_free (progress_text); + gtk_widget_show (label); } else { - gtk_label_set_text (GTK_LABEL (label), ""); + gtk_widget_hide (label); } } static void -job_fonts_finished_cb (EvJob *job, GtkTreeView *tree_view) -{ +job_fonts_finished_cb (EvJob *job, EvProperties *properties) +{ EvDocumentFonts *document_fonts = EV_DOCUMENT_FONTS (job->document); - GtkWidget *progress_label; double progress; - progress_label = g_object_get_data (G_OBJECT (tree_view), "progress_label"); progress = ev_document_fonts_get_progress (document_fonts); - update_progress_label (progress_label, progress); + update_progress_label (properties->fonts_progress_label, progress); if (EV_JOB_FONTS (job)->scan_completed) { g_signal_handlers_disconnect_by_func - (job, job_fonts_finished_cb, tree_view); + (job, job_fonts_finished_cb, properties); } else { + GtkTreeModel *model; EvJob *new_job; - ev_document_fonts_fill_model (document_fonts, - gtk_tree_view_get_model (tree_view)); + model = gtk_tree_view_get_model + (GTK_TREE_VIEW (properties->fonts_treeview)); + ev_document_doc_mutex_lock (); + ev_document_fonts_fill_model (document_fonts, model); + ev_document_doc_mutex_unlock (); new_job = ev_job_fonts_new (job->document); ev_job_queue_add_job (job, EV_JOB_PRIORITY_LOW); g_object_unref (new_job); @@ -145,57 +282,37 @@ job_fonts_finished_cb (EvJob *job, GtkTreeView *tree_view) } static void -setup_fonts_view (GladeXML *xml, EvDocument *document) +setup_fonts_view (EvProperties *properties) { - GtkCellRenderer *renderer; - GtkTreeViewColumn *column; + GtkTreeView *tree_view = GTK_TREE_VIEW (properties->fonts_treeview); GtkListStore *list_store; EvJob *job; - GtkWidget *tree_view; - GtkWidget *progress_label; - - tree_view = glade_xml_get_widget (xml, "fonts_treeview"); - progress_label = glade_xml_get_widget (xml, "font_progress_label"); - - 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 (tree_view), 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); list_store = gtk_list_store_new (NUM_COLS, G_TYPE_STRING); - gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), - GTK_TREE_MODEL (list_store)); + gtk_tree_view_set_model (tree_view, GTK_TREE_MODEL (list_store)); - job = ev_job_fonts_new (document); - g_object_set_data (G_OBJECT (tree_view), "progress_label", - progress_label); + job = ev_job_fonts_new (properties->document); g_signal_connect_object (job, "finished", G_CALLBACK (job_fonts_finished_cb), - tree_view, 0); + properties, 0); ev_job_queue_add_job (job, EV_JOB_PRIORITY_LOW); g_object_unref (job); } -GtkDialog * -ev_properties_new (EvDocument *document, const EvDocumentInfo *info) +void +ev_properties_set_document (EvProperties *properties, + EvDocument *document) { - GladeXML *xml; - GtkWidget *dialog; + 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); } @@ -225,16 +342,11 @@ ev_properties_new (EvDocument *document, const EvDocumentInfo *info) g_free (text); } if (info->fields_mask & EV_DOCUMENT_INFO_FORMAT) { - char **format_str = g_strsplit (info->format, "-", 2); - - text = g_strdup_printf (_("%s"), format_str[1]); + text = g_strdup_printf ("%s", info->format); set_property (xml, FORMAT_PROPERTY, text); - - g_free (text); - g_strfreev (format_str); } if (info->fields_mask & EV_DOCUMENT_INFO_N_PAGES) { - text = g_strdup_printf (_("%d"), info->n_pages); + text = g_strdup_printf ("%d", info->n_pages); set_property (xml, N_PAGES_PROPERTY, text); g_free (text); } @@ -246,10 +358,29 @@ ev_properties_new (EvDocument *document, const EvDocumentInfo *info) } if (EV_IS_DOCUMENT_FONTS (document)) { - setup_fonts_view (xml, document); + gtk_widget_show (properties->font_page); + setup_fonts_view (properties); } else { - gtk_widget_hide (glade_xml_get_widget (xml, "fonts_page")); + gtk_widget_hide (properties->font_page); } +} - return GTK_DIALOG (dialog); +EvProperties * +ev_properties_new () +{ + EvProperties *properties; + + properties = g_object_new (EV_TYPE_PROPERTIES, NULL); + + 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); }