]> www.fi.muni.cz Git - evince.git/blob - shell/ev-message-area.c
c469ec4b6a115599c10b9f176b7b933127156620
[evince.git] / shell / ev-message-area.c
1 /* ev-message-area.c
2  *  this file is part of evince, a gnome document viewer
3  *
4  * Copyright (C) 2007 Carlos Garcia Campos
5  *
6  * Author:
7  *   Carlos Garcia Campos <carlosgc@gnome.org>
8  *
9  * Evince is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * Evince is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
22  */
23
24 #include <config.h>
25
26 #include <gtk/gtk.h>
27
28 #include "ev-message-area.h"
29
30 #define EV_MESSAGE_AREA_GET_PRIVATE(obj) \
31         (G_TYPE_INSTANCE_GET_PRIVATE ((obj), EV_TYPE_MESSAGE_AREA, EvMessageAreaPrivate))
32
33 struct _EvMessageAreaPrivate {
34         GtkWidget *image;
35         GtkWidget *label;
36         GtkWidget *secondary_label;
37         
38         guint      message_type : 3;
39 };
40
41 enum {
42         PROP_0,
43         PROP_MESSAGE_TYPE,
44         PROP_TEXT,
45         PROP_SECONDARY_TEXT,
46         PROP_IMAGE
47 };
48
49 static void ev_message_area_set_property (GObject      *object,
50                                           guint         prop_id,
51                                           const GValue *value,
52                                           GParamSpec   *pspec);
53 static void ev_message_area_get_property (GObject      *object,
54                                           guint         prop_id,
55                                           GValue       *value,
56                                           GParamSpec   *pspec);
57
58 G_DEFINE_TYPE (EvMessageArea, ev_message_area, GEDIT_TYPE_MESSAGE_AREA)
59
60 static void
61 ev_message_area_class_init (EvMessageAreaClass *class)
62 {
63         GObjectClass *gobject_class = G_OBJECT_CLASS (class);
64
65         gobject_class->set_property = ev_message_area_set_property;
66         gobject_class->get_property = ev_message_area_get_property;
67
68         g_object_class_install_property (gobject_class,
69                                          PROP_MESSAGE_TYPE,
70                                          g_param_spec_enum ("message-type",
71                                                             "Message Type",
72                                                             "The type of message",
73                                                             GTK_TYPE_MESSAGE_TYPE,
74                                                             GTK_MESSAGE_INFO,
75                                                             G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
76         g_object_class_install_property (gobject_class,
77                                          PROP_TEXT,
78                                          g_param_spec_string ("text",
79                                                               "Text",
80                                                               "The primary text of the message dialog",
81                                                               NULL,
82                                                               G_PARAM_READWRITE));
83         g_object_class_install_property (gobject_class,
84                                          PROP_SECONDARY_TEXT,
85                                          g_param_spec_string ("secondary-text",
86                                                               "Secondary Text",
87                                                               "The secondary text of the message dialog",
88                                                               NULL,
89                                                               G_PARAM_READWRITE));
90         g_object_class_install_property (gobject_class,
91                                          PROP_IMAGE,
92                                          g_param_spec_object ("image",
93                                                               "Image",
94                                                               "The image",
95                                                               GTK_TYPE_WIDGET,
96                                                               G_PARAM_READWRITE));
97
98         g_type_class_add_private (gobject_class, sizeof (EvMessageAreaPrivate));
99 }
100
101 static void
102 ev_message_area_init (EvMessageArea *area)
103 {
104         GtkWidget *main_box;
105         GtkWidget *hbox, *vbox;
106         
107         area->priv = EV_MESSAGE_AREA_GET_PRIVATE (area);
108
109         main_box = gtk_vbox_new (FALSE, 12);
110         
111         hbox = gtk_hbox_new (FALSE, 12);
112         vbox = gtk_vbox_new (FALSE, 12);
113         
114         area->priv->label = gtk_label_new (NULL);
115         gtk_label_set_use_markup (GTK_LABEL (area->priv->label), TRUE);
116         gtk_label_set_line_wrap (GTK_LABEL (area->priv->label), TRUE);
117         gtk_label_set_selectable (GTK_LABEL (area->priv->label), TRUE);
118         gtk_misc_set_alignment (GTK_MISC (area->priv->label), 0.0, 0.5);
119         GTK_WIDGET_SET_FLAGS (area->priv->label, GTK_CAN_FOCUS);
120         gtk_box_pack_start (GTK_BOX (vbox), area->priv->label, TRUE, TRUE, 0);
121         gtk_widget_show (area->priv->label);
122         
123         area->priv->secondary_label = gtk_label_new (NULL);
124         gtk_label_set_use_markup (GTK_LABEL (area->priv->secondary_label), TRUE);
125         gtk_label_set_line_wrap (GTK_LABEL (area->priv->secondary_label), TRUE);
126         gtk_label_set_selectable (GTK_LABEL (area->priv->secondary_label), TRUE);
127         gtk_misc_set_alignment (GTK_MISC (area->priv->secondary_label), 0.0, 0.5);
128         GTK_WIDGET_SET_FLAGS (area->priv->secondary_label, GTK_CAN_FOCUS);
129         gtk_box_pack_start (GTK_BOX (vbox), area->priv->secondary_label, TRUE, TRUE, 0);
130
131         area->priv->image = gtk_image_new_from_stock (NULL, GTK_ICON_SIZE_DIALOG);
132         gtk_misc_set_alignment (GTK_MISC (area->priv->image), 0.5, 0.0);
133         gtk_box_pack_start (GTK_BOX (hbox), area->priv->image, FALSE, FALSE, 0);
134         gtk_widget_show (area->priv->image);
135
136         gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
137         gtk_widget_show (vbox);
138
139         gtk_box_pack_start (GTK_BOX (main_box), hbox, TRUE, TRUE, 0);
140         gtk_widget_show (hbox);
141         
142         gedit_message_area_set_contents (GEDIT_MESSAGE_AREA (area), main_box);
143         gtk_widget_show (main_box);
144 }
145
146 static void
147 ev_message_area_set_image_for_type (EvMessageArea *area,
148                                     GtkMessageType type)
149 {
150         const gchar *stock_id = NULL;
151         AtkObject   *atk_obj;
152
153         switch (type) {
154         case GTK_MESSAGE_INFO:
155                 stock_id = GTK_STOCK_DIALOG_INFO;
156                 break;
157         case GTK_MESSAGE_QUESTION:
158                 stock_id = GTK_STOCK_DIALOG_QUESTION;
159                 break;
160         case GTK_MESSAGE_WARNING:
161                 stock_id = GTK_STOCK_DIALOG_WARNING;
162                 break;
163         case GTK_MESSAGE_ERROR:
164                 stock_id = GTK_STOCK_DIALOG_ERROR;
165                 break;
166         case GTK_MESSAGE_OTHER:
167                 break;
168         default:
169                 g_warning ("Unknown GtkMessageType %u", type);
170                 break;
171         }
172
173         if (stock_id)
174                 gtk_image_set_from_stock (GTK_IMAGE (area->priv->image), stock_id,
175                                           GTK_ICON_SIZE_DIALOG);
176
177         atk_obj = gtk_widget_get_accessible (GTK_WIDGET (area));
178         if (GTK_IS_ACCESSIBLE (atk_obj)) {
179                 atk_object_set_role (atk_obj, ATK_ROLE_ALERT);
180                 if (stock_id) {
181                         GtkStockItem item;
182
183                         gtk_stock_lookup (stock_id, &item);
184                         atk_object_set_name (atk_obj, item.label);
185                 }
186         }
187 }
188
189 static void
190 ev_message_area_set_property (GObject      *object,
191                               guint         prop_id,
192                               const GValue *value,
193                               GParamSpec   *pspec)
194 {
195         EvMessageArea *area = EV_MESSAGE_AREA (object);
196
197         switch (prop_id) {
198         case PROP_MESSAGE_TYPE:
199                 area->priv->message_type = g_value_get_enum (value);
200                 ev_message_area_set_image_for_type (area, area->priv->message_type);
201                 break;
202         case PROP_TEXT:
203                 ev_message_area_set_text (area, g_value_get_string (value));
204                 break;
205         case PROP_SECONDARY_TEXT:
206                 ev_message_area_set_secondary_text (area, g_value_get_string (value));
207                 break;
208         case PROP_IMAGE:
209                 ev_message_area_set_image (area, (GtkWidget *)g_value_get_object (value));
210                 break;
211         default:
212                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
213                 break;
214         }
215 }
216
217 static void
218 ev_message_area_get_property (GObject     *object,
219                               guint        prop_id,
220                               GValue      *value,
221                               GParamSpec  *pspec)
222 {
223         EvMessageArea *area = EV_MESSAGE_AREA (object);
224
225         switch (prop_id) {
226         case PROP_MESSAGE_TYPE:
227                 g_value_set_enum (value, (GtkMessageType) area->priv->message_type);
228                 break;
229         case PROP_TEXT:
230                 g_value_set_string (value, gtk_label_get_label (GTK_LABEL (area->priv->label)));
231                 break;
232         case PROP_SECONDARY_TEXT:
233                 g_value_set_string (value, gtk_label_get_label (GTK_LABEL (area->priv->secondary_label)));
234                 break;
235         case PROP_IMAGE:
236                 g_value_set_object (value, area->priv->image);
237                 break;
238         default:
239                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
240                 break;
241         }
242 }
243
244 GtkWidget *
245 ev_message_area_new (GtkMessageType type,
246                      const gchar   *text,
247                      const gchar   *first_button_text,
248                      ...)
249 {
250         GtkWidget *widget;
251
252         widget = g_object_new (EV_TYPE_MESSAGE_AREA,
253                                "message-type", type,
254                                "text", text,
255                                NULL);
256         if (first_button_text) {
257                 va_list args;
258                 
259                 va_start (args, first_button_text);
260                 gedit_message_area_add_buttons_valist (GEDIT_MESSAGE_AREA (widget),
261                                                        first_button_text,
262                                                        args);
263                 va_end (args);
264         }
265
266         return widget;
267 }
268
269 void
270 ev_message_area_set_image (EvMessageArea *area,
271                            GtkWidget     *image)
272 {
273         GtkWidget *parent;
274
275         g_return_if_fail (EV_IS_MESSAGE_AREA (area));
276
277         area->priv->message_type = GTK_MESSAGE_OTHER;
278
279         parent = area->priv->image->parent;
280         gtk_container_add (GTK_CONTAINER (parent), image);
281         gtk_container_remove (GTK_CONTAINER (parent), area->priv->image);
282         gtk_box_reorder_child (GTK_BOX (parent), image, 0);
283
284         area->priv->image = image;
285
286         g_object_notify (G_OBJECT (area), "image");
287 }
288
289 void
290 ev_message_area_set_image_from_stock (EvMessageArea *area,
291                                       const gchar   *stock_id)
292 {
293         g_return_if_fail (EV_IS_MESSAGE_AREA (area));
294         g_return_if_fail (stock_id != NULL);
295         
296         gtk_image_set_from_stock (GTK_IMAGE (area->priv->image),
297                                   stock_id,
298                                   GTK_ICON_SIZE_DIALOG);
299 }
300
301 void
302 ev_message_area_set_text (EvMessageArea *area,
303                           const gchar   *str)
304 {
305         g_return_if_fail (EV_IS_MESSAGE_AREA (area));
306
307         if (str) {
308                 gchar *msg;
309
310                 msg = g_strdup_printf ("<b>%s</b>", str);
311                 gtk_label_set_markup (GTK_LABEL (area->priv->label), msg);
312                 g_free (msg);
313         } else {
314                 gtk_label_set_markup (GTK_LABEL (area->priv->label), NULL);
315         }
316
317         g_object_notify (G_OBJECT (area), "text");
318 }
319
320 void
321 ev_message_area_set_secondary_text (EvMessageArea *area,
322                                     const gchar   *str)
323 {
324         g_return_if_fail (EV_IS_MESSAGE_AREA (area));
325
326         if (str) {
327                 gchar *msg;
328
329                 msg = g_strdup_printf ("<small>%s</small>", str);
330                 gtk_label_set_markup (GTK_LABEL (area->priv->secondary_label), msg);
331                 g_free (msg);
332                 gtk_widget_show (area->priv->secondary_label);
333         } else {
334                 gtk_label_set_markup (GTK_LABEL (area->priv->secondary_label), NULL);
335                 gtk_widget_hide (area->priv->secondary_label);
336         }
337
338         g_object_notify (G_OBJECT (area), "secondary-text");
339 }