]> www.fi.muni.cz Git - evince.git/blob - shell/ev-password.c
7a5c819ab3d14a21c88f95071ca4383657564f8d
[evince.git] / shell / ev-password.c
1 /* this file is part of evince, a gnome document viewer
2  *
3  *  Copyright (C) 2005 Red Hat, Inc
4  *
5  * Evince is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * Evince is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23
24 #include "ev-password.h"
25 #include <glib/gi18n.h>
26 #include <gtk/gtk.h>
27 #include <glade/glade.h>
28
29 #define EV_PASSWORD_DATA "ev-password-data"
30
31 static void
32 ev_password_set_bad_password_label (GtkWidget *password,
33                                     gchar     *message)
34 {
35         GladeXML *xml;
36         GtkWidget *label;
37         gchar *markup;
38
39         xml = g_object_get_data (G_OBJECT (password), EV_PASSWORD_DATA);
40         g_assert (xml);
41
42         label = glade_xml_get_widget (xml, "bad_password_label");
43         markup = g_strdup_printf ("<span color=\"red\" size=\"smaller\">%s</span>",
44                                   message);
45         gtk_label_set_markup (GTK_LABEL (label), markup);
46         g_free (markup);
47 }
48
49 static void
50 ev_window_password_entry_changed_cb (GtkEditable *editable,
51                                      GtkWidget   *password)
52 {
53         const char *text;
54         GtkWidget *button;
55         GladeXML *xml;
56
57         xml = g_object_get_data (G_OBJECT (password), EV_PASSWORD_DATA);
58         g_assert (xml);
59
60         text = gtk_entry_get_text (GTK_ENTRY (editable));
61         button = glade_xml_get_widget (xml, "ok_button");
62
63         if (text == NULL || *text == '\0')
64                 gtk_widget_set_sensitive (button, FALSE);
65         else
66                 gtk_widget_set_sensitive (button, TRUE);
67
68         ev_password_set_bad_password_label (password, " ");
69 }
70
71 GtkWidget *
72 ev_password_dialog_new (GtkWidget  *toplevel,
73                         const char *uri)
74 {
75         const char *glade_file = DATADIR "/evince-password.glade";
76         GladeXML *xml;
77         GtkWidget *dialog, *label;
78         GtkWidget *entry;
79         char *format;
80         char *markup;
81
82         xml = glade_xml_new (glade_file, NULL, NULL);
83         if (xml == NULL) {
84                 dialog = gtk_message_dialog_new (GTK_WINDOW (toplevel),
85                                                  GTK_DIALOG_DESTROY_WITH_PARENT,
86                                                  GTK_MESSAGE_ERROR,
87                                                  GTK_BUTTONS_CLOSE,
88                                                  _("Unable to find glade file"));
89                 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
90                                                           _("The glade file, %s, cannot be found.  Please check that your installation is complete."),
91                                                           glade_file);
92                 gtk_dialog_run (GTK_DIALOG (dialog));
93                 gtk_widget_destroy (dialog);
94                 return NULL;
95         }
96         
97         dialog = glade_xml_get_widget (xml, "password_dialog");
98         label = glade_xml_get_widget (xml, "password_label");
99         entry = glade_xml_get_widget (xml, "password_entry");
100
101         gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (toplevel));
102         g_signal_connect (entry, "changed", G_CALLBACK (ev_window_password_entry_changed_cb), dialog);
103         format = g_strdup_printf ("<span size=\"larger\" weight=\"bold\">%s</span>\n\n%s",
104                                   _("Password required"),
105                                   _("The document <i>%s</i> is locked and requires a password before it can be opened."));
106         markup = g_markup_printf_escaped (format, uri);
107         gtk_label_set_markup (GTK_LABEL (label), markup);
108         g_free (format);
109         g_free (markup);
110
111         g_object_set_data_full (G_OBJECT (dialog), EV_PASSWORD_DATA, xml, g_object_unref);
112         ev_password_set_bad_password_label (dialog, " ");
113
114         return dialog;
115 }
116
117 char *
118 ev_password_dialog_get_password (GtkWidget *password)
119 {
120         GladeXML *xml;
121         GtkWidget *entry;
122
123         xml = g_object_get_data (G_OBJECT (password), EV_PASSWORD_DATA);
124         g_assert (xml);
125
126         entry = glade_xml_get_widget (xml, "password_entry");
127
128         return g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
129 }
130
131 void
132 ev_password_dialog_set_bad_pass (GtkWidget *password)
133 {
134         GladeXML *xml;
135         GtkWidget *entry;
136
137         xml = g_object_get_data (G_OBJECT (password), EV_PASSWORD_DATA);
138         g_assert (xml);
139
140         entry = glade_xml_get_widget (xml, "password_entry");
141         gtk_entry_set_text (GTK_ENTRY (entry), "");
142         ev_password_set_bad_password_label (password, _("Incorrect password"));
143 }