#include <gio/gio.h>
#include <gtk/gtk.h>
+#ifdef WITH_GCONF
+#include <gconf/gconf-client.h>
+#endif
+
#include "egg-editable-toolbar.h"
#include "egg-toolbar-editor.h"
#include "egg-toolbars-model.h"
/* Settings */
GSettings *settings;
GSettings *default_settings;
- GSettings *lockdown_settings;
/* Menubar accels */
guint menubar_accel_keyval;
GtkPrintSettings *print_settings;
GtkPageSetup *print_page_setup;
gboolean close_after_print;
-
+#ifdef WITH_GCONF
+ GConfClient *gconf_client;
+#endif
#ifdef ENABLE_DBUS
/* DBus */
guint dbus_object_id;
#define ZOOM_CONTROL_ACTION "ViewZoom"
#define NAVIGATION_ACTION "Navigation"
-#define GS_LOCKDOWN_SCHEMA_NAME "org.gnome.desktop.lockdown"
-#define GS_LOCKDOWN_SAVE "disable-save-to-disk"
-#define GS_LOCKDOWN_PRINT "disable-printing"
-#define GS_LOCKDOWN_PRINT_SETUP "disable-print-setup"
+#define GCONF_LOCKDOWN_DIR "/desktop/gnome/lockdown"
+#define GCONF_LOCKDOWN_SAVE "/desktop/gnome/lockdown/disable_save_to_disk"
+#define GCONF_LOCKDOWN_PRINT "/desktop/gnome/lockdown/disable_printing"
+#define GCONF_LOCKDOWN_PRINT_SETUP "/desktop/gnome/lockdown/disable_print_setup"
#ifdef ENABLE_DBUS
#define EV_WINDOW_DBUS_OBJECT_PATH "/org/gnome/evince/Window/%d"
static void ev_window_update_max_min_scale (EvWindow *window);
#ifdef ENABLE_DBUS
static void ev_window_emit_closed (EvWindow *window);
+static void ev_window_emit_doc_loaded (EvWindow *window);
#endif
static guint ev_window_n_copies = 0;
if (has_document && !ev_print_operation_exists_for_document(document))
ok_to_print = FALSE;
- if (has_document && ev_window->priv->lockdown_settings &&
- g_settings_get_boolean (ev_window->priv->lockdown_settings, GS_LOCKDOWN_SAVE)) {
+#ifdef WITH_GCONF
+ if (has_document &&
+ gconf_client_get_bool (ev_window->priv->gconf_client, GCONF_LOCKDOWN_SAVE, NULL)) {
ok_to_copy = FALSE;
}
- if (has_document && ev_window->priv->lockdown_settings &&
- g_settings_get_boolean (ev_window->priv->lockdown_settings, GS_LOCKDOWN_PRINT)) {
+ if (has_document &&
+ gconf_client_get_bool (ev_window->priv->gconf_client, GCONF_LOCKDOWN_PRINT, NULL)) {
ok_to_print = FALSE;
}
+#endif
/* File menu */
ev_window_set_action_sensitive (ev_window, "FileOpenCopy", has_document);
ev_window_setup_action_sensitivity (ev_window);
}
+#ifdef WITH_GCONF
static void
-lockdown_changed (GSettings *lockdown,
- const gchar *key,
+lockdown_changed (GConfClient *client,
+ guint cnxn_id,
+ GConfEntry *entry,
EvWindow *ev_window)
{
ev_window_setup_action_sensitivity (ev_window);
}
+#endif /* WITH_GCONF */
static gboolean
ev_window_setup_document (EvWindow *ev_window)
ev_window);
}
-#ifdef HAVE_DESKTOP_SCHEMAS
- if (!ev_window->priv->lockdown_settings) {
- ev_window->priv->lockdown_settings = g_settings_new (GS_LOCKDOWN_SCHEMA_NAME);
- g_signal_connect (ev_window->priv->lockdown_settings,
- "changed",
- G_CALLBACK (lockdown_changed),
- ev_window);
- }
-#endif
+#ifdef WITH_GCONF
+ if (!ev_window->priv->gconf_client)
+ ev_window->priv->gconf_client = gconf_client_get_default ();
+ gconf_client_add_dir (ev_window->priv->gconf_client,
+ GCONF_LOCKDOWN_DIR,
+ GCONF_CLIENT_PRELOAD_ONELEVEL,
+ NULL);
+ gconf_client_notify_add (ev_window->priv->gconf_client,
+ GCONF_LOCKDOWN_DIR,
+ (GConfClientNotifyFunc)lockdown_changed,
+ ev_window, NULL, NULL);
+#endif /* WITH_GCONF */
ev_window_setup_action_sensitivity (ev_window);
if (!ev_job_is_failed (job)) {
ev_document_model_set_document (ev_window->priv->model, document);
+ ev_window_emit_doc_loaded (ev_window);
setup_chrome_from_metadata (ev_window);
update_chrome_actions (ev_window);
setup_document_from_metadata (ev_window);
GtkPageSetup *print_page_setup;
gint current_page;
gint document_last_page;
- gboolean embed_page_setup;
g_return_if_fail (EV_IS_WINDOW (ev_window));
g_return_if_fail (ev_window->priv->document != NULL);
ev_print_operation_set_current_page (op, current_page);
ev_print_operation_set_print_settings (op, print_settings);
ev_print_operation_set_default_page_setup (op, print_page_setup);
- embed_page_setup = ev_window->priv->lockdown_settings ?
- !g_settings_get_boolean (ev_window->priv->lockdown_settings,
- GS_LOCKDOWN_PRINT_SETUP) :
- TRUE;
- ev_print_operation_set_embed_page_setup (op, embed_page_setup);
+#ifdef WITH_GCONF
+ ev_print_operation_set_embed_page_setup (op, !gconf_client_get_bool (ev_window->priv->gconf_client,
+ GCONF_LOCKDOWN_PRINT_SETUP,
+ NULL));
+#else
+ ev_print_operation_set_embed_page_setup (op, TRUE);
+#endif
g_object_unref (print_settings);
g_object_unref (print_page_setup);
ev_document_fc_mutex_unlock ();
}
+static void
+document_modified_confirmation_dialog_response (GtkDialog *dialog,
+ gint response,
+ EvWindow *ev_window)
+{
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+
+ switch (response) {
+ case GTK_RESPONSE_YES:
+ ev_window_cmd_save_as (NULL, ev_window);
+ break;
+ case GTK_RESPONSE_NO:
+ gtk_widget_destroy (GTK_WIDGET (ev_window));
+ break;
+ case GTK_RESPONSE_CANCEL:
+ default:
+ break;
+ }
+}
+
+static gboolean
+ev_window_check_document_modified (EvWindow *ev_window)
+{
+ EvDocument *document = ev_window->priv->document;
+ GtkWidget *dialog;
+ gchar *text, *markup;
+ const gchar *secondary_text;
+
+ if (!document)
+ return FALSE;
+
+ if (EV_IS_DOCUMENT_FORMS (document) &&
+ ev_document_forms_document_is_modified (EV_DOCUMENT_FORMS (document))) {
+ secondary_text = _("Document contains form fields that have been filled out. "
+ "If you don't save a copy, changes will be permanently lost.");
+ } else if (EV_IS_DOCUMENT_ANNOTATIONS (document) &&
+ ev_document_annotations_document_is_modified (EV_DOCUMENT_ANNOTATIONS (document))) {
+ secondary_text = _("Document contains new or modified annotations. "
+ "If you don't save a copy, changes will be permanently lost.");
+ } else {
+ return FALSE;
+ }
+
+
+ text = g_markup_printf_escaped (_("Save a copy of document ā%sā before closing?"),
+ gtk_window_get_title (GTK_WINDOW (ev_window)));
+
+ dialog = gtk_message_dialog_new (GTK_WINDOW (ev_window),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_NONE,
+ NULL);
+
+ markup = g_strdup_printf ("<b>%s</b>", text);
+ g_free (text);
+
+ gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (dialog), markup);
+ g_free (markup);
+
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "%s", secondary_text);
+
+ gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+ _("Close _without Saving"),
+ GTK_RESPONSE_NO,
+ GTK_STOCK_CANCEL,
+ GTK_RESPONSE_CANCEL,
+ _("Save a _Copy"),
+ GTK_RESPONSE_YES,
+ NULL);
+ gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
+ GTK_RESPONSE_YES,
+ GTK_RESPONSE_NO,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
+ g_signal_connect (dialog, "response",
+ G_CALLBACK (document_modified_confirmation_dialog_response),
+ ev_window);
+ gtk_widget_show (dialog);
+
+ return TRUE;
+}
+
static void
print_jobs_confirmation_dialog_response (GtkDialog *dialog,
gint response,
ev_document_model_set_page (ev_window->priv->model, current_page);
}
+ if (ev_window_check_document_modified (ev_window))
+ return FALSE;
+
if (ev_window_check_print_queue (ev_window))
return FALSE;
return;
if (ev_job_is_finished (ev_window->priv->find_job)) {
- gint n_results;
-
- n_results = ev_job_find_get_n_results (EV_JOB_FIND (ev_window->priv->find_job),
- ev_document_model_get_page (ev_window->priv->model));
- /* TRANS: Sometimes this could be better translated as
- "%d hit(s) on this page". Therefore this string
- contains plural cases. */
- message = g_strdup_printf (ngettext ("%d found on this page",
- "%d found on this page",
- n_results),
- n_results);
+ EvJobFind *job_find = EV_JOB_FIND (ev_window->priv->find_job);
+
+ if (ev_job_find_has_results (job_find)) {
+ gint n_results;
+
+ n_results = ev_job_find_get_n_results (job_find,
+ ev_document_model_get_page (ev_window->priv->model));
+ /* TRANS: Sometimes this could be better translated as
+ "%d hit(s) on this page". Therefore this string
+ contains plural cases. */
+ message = g_strdup_printf (ngettext ("%d found on this page",
+ "%d found on this page",
+ n_results),
+ n_results);
+ } else {
+ message = g_strdup (_("Not found"));
+ }
} else {
gdouble percent;
priv->setup_document_idle = 0;
}
+#ifdef WITH_GCONF
+ if (priv->gconf_client) {
+ g_object_unref (priv->gconf_client);
+ priv->gconf_client = NULL;
+ }
+#endif
+
if (priv->monitor) {
g_object_unref (priv->monitor);
priv->monitor = NULL;
priv->default_settings = NULL;
}
- if (priv->lockdown_settings) {
- g_object_unref (priv->lockdown_settings);
- priv->lockdown_settings = NULL;
- }
-
priv->recent_ui_id = 0;
if (priv->model) {
g_dbus_connection_flush_sync (connection, NULL, NULL);
}
+static void
+ev_window_emit_doc_loaded (EvWindow *window)
+{
+ GDBusConnection *connection;
+ GError *error = NULL;
+
+ if (window->priv->dbus_object_id <= 0)
+ return;
+
+ connection = ev_application_get_dbus_connection (EV_APP);
+ if (!connection)
+ return;
+
+ g_dbus_connection_emit_signal (connection,
+ NULL,
+ window->priv->dbus_object_path,
+ EV_WINDOW_DBUS_INTERFACE,
+ "DocumentLoaded",
+ g_variant_new("(s)", window->priv->uri),
+ &error);
+ if (error) {
+ g_printerr ("Failed to emit DBus signal DocumentLoaded: %s\n",
+ error->message);
+ g_error_free (error);
+
+ return;
+ }
+}
+
static void
method_call_cb (GDBusConnection *connection,
const gchar *sender,
"<arg type='(ii)' name='source_point' direction='out'/>"
"</signal>"
"<signal name='Closed'/>"
+ "<signal name='DocumentLoaded'>"
+ "<arg type='s' name='uri' direction='out'/>"
+ "</signal>"
"</interface>"
"</node>";