]> git.sur5r.net Git - glabels/blob - src/message-bar.c
Imported Upstream version 3.0.0
[glabels] / src / message-bar.c
1 /*
2  *  message-bar.c
3  *  Copyright (C) 2009  Jim Evins <evins@snaught.com>.
4  *
5  *  This file is part of gLabels.
6  *
7  *  gLabels is free software: you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation, either version 3 of the License, or
10  *  (at your option) any later version.
11  *
12  *  gLabels is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  *
17  *  You should have received a copy of the GNU General Public License
18  *  along with gLabels.  If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include <config.h>
22
23 #include "message-bar.h"
24
25 #include "debug.h"
26
27
28 /*===========================================*/
29 /* Private data types                        */
30 /*===========================================*/
31
32 struct _glMessageBarPrivate {
33
34         GtkWidget *icon;
35         GtkWidget *label;
36
37         gchar     *primary_text;
38         gchar     *secondary_text;
39 };
40
41
42 /*===========================================*/
43 /* Private globals                           */
44 /*===========================================*/
45
46
47 /*===========================================*/
48 /* Local function prototypes                 */
49 /*===========================================*/
50
51 static void       gl_message_bar_finalize       (GObject               *object);
52
53 static void       gl_message_bar_construct      (glMessageBar          *this,
54                                                  GtkMessageType         type,
55                                                  GtkButtonsType         buttons,
56                                                  const gchar           *message_format,
57                                                  va_list                args);
58
59
60 /*****************************************************************************/
61 /* Boilerplate object stuff.                                                 */
62 /*****************************************************************************/
63 G_DEFINE_TYPE (glMessageBar, gl_message_bar, GTK_TYPE_INFO_BAR)
64
65
66 /*****************************************************************************/
67 /* Class Init Function.                                                      */
68 /*****************************************************************************/
69 static void
70 gl_message_bar_class_init (glMessageBarClass *class)
71 {
72         GObjectClass *object_class = G_OBJECT_CLASS (class);
73
74         gl_message_bar_parent_class = g_type_class_peek_parent (class);
75
76         object_class->finalize = gl_message_bar_finalize;       
77 }
78
79
80 /*****************************************************************************/
81 /* Object Instance Init Function.                                            */
82 /*****************************************************************************/
83 static void
84 gl_message_bar_init (glMessageBar *dialog)
85 {
86         g_return_if_fail (GL_IS_MESSAGE_BAR (dialog));
87
88         dialog->priv = g_new0 (glMessageBarPrivate, 1);
89 }
90
91
92 /*****************************************************************************/
93 /* Finalize Function.                                                        */
94 /*****************************************************************************/
95 static void 
96 gl_message_bar_finalize (GObject *object)
97 {
98         glMessageBar* dialog = GL_MESSAGE_BAR (object);;
99         
100         g_return_if_fail (object != NULL);
101         g_return_if_fail (GL_IS_MESSAGE_BAR (dialog));
102         g_return_if_fail (dialog->priv != NULL);
103
104         g_free (dialog->priv->primary_text);
105         g_free (dialog->priv->secondary_text);
106         g_free (dialog->priv);
107
108         G_OBJECT_CLASS (gl_message_bar_parent_class)->finalize (object);
109 }
110
111
112 /*****************************************************************************/
113 /* NEW message bar.                                                          */
114 /*****************************************************************************/
115 GtkWidget *
116 gl_message_bar_new (GtkMessageType  type,
117                     GtkButtonsType  buttons,
118                     const gchar    *message_format,
119                     ...)
120 {
121         GtkWidget *widget;
122         va_list    args;
123
124         widget = GTK_WIDGET (g_object_new (GL_TYPE_MESSAGE_BAR, NULL));
125         
126         va_start (args, message_format);
127         gl_message_bar_construct (GL_MESSAGE_BAR (widget), type, buttons, message_format, args);
128         va_end (args);
129
130         return widget;
131 }
132
133
134 /*****************************************************************************/
135 /* Construct message bar.                                                    */
136 /*****************************************************************************/
137 static void
138 gl_message_bar_construct (glMessageBar    *this,
139                           GtkMessageType   type,
140                           GtkButtonsType   buttons,
141                           const gchar     *message_format,
142                           va_list          args)
143 {
144         GtkWidget *hbox;
145
146         gtk_info_bar_set_message_type (GTK_INFO_BAR (this), type);
147
148         this->priv->icon = gtk_image_new ();
149         switch (type)
150         {
151         case GTK_MESSAGE_INFO:
152                 gtk_image_set_from_stock (GTK_IMAGE (this->priv->icon),
153                                           GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);
154                 break;
155         case GTK_MESSAGE_WARNING:
156                 gtk_image_set_from_stock (GTK_IMAGE (this->priv->icon),
157                                           GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
158                 break;
159         case GTK_MESSAGE_QUESTION:
160                 gtk_image_set_from_stock (GTK_IMAGE (this->priv->icon),
161                                           GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
162                 break;
163         case GTK_MESSAGE_ERROR:
164                 gtk_image_set_from_stock (GTK_IMAGE (this->priv->icon),
165                                           GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG);
166                 break;
167         default:
168                 break;
169         }
170
171         this->priv->primary_text = g_strdup_vprintf (message_format, args);
172         this->priv->label = gtk_label_new (this->priv->primary_text);
173
174         hbox = gtk_info_bar_get_content_area (GTK_INFO_BAR (this));
175         gtk_box_pack_start (GTK_BOX (hbox), this->priv->icon, FALSE, FALSE, 0);
176         gtk_box_pack_start (GTK_BOX (hbox), this->priv->label, FALSE, FALSE, 0);
177
178         switch (buttons)
179         {
180         case GTK_BUTTONS_OK:
181                 gtk_info_bar_add_button (GTK_INFO_BAR (this),
182                                          GTK_STOCK_OK, GTK_RESPONSE_ACCEPT);
183                 break;
184         case GTK_BUTTONS_CLOSE:
185                 gtk_info_bar_add_button (GTK_INFO_BAR (this),
186                                          GTK_STOCK_CLOSE, GTK_RESPONSE_ACCEPT);
187                 break;
188         case GTK_BUTTONS_CANCEL:
189                 gtk_info_bar_add_button (GTK_INFO_BAR (this),
190                                          GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
191                 break;
192         case GTK_BUTTONS_YES_NO:
193                 gtk_info_bar_add_button (GTK_INFO_BAR (this),
194                                          GTK_STOCK_YES, GTK_RESPONSE_ACCEPT);
195                 gtk_info_bar_add_button (GTK_INFO_BAR (this),
196                                          GTK_STOCK_NO, GTK_RESPONSE_REJECT);
197                 break;
198         case GTK_BUTTONS_OK_CANCEL:
199                 gtk_info_bar_add_button (GTK_INFO_BAR (this),
200                                          GTK_STOCK_OK, GTK_RESPONSE_ACCEPT);
201                 gtk_info_bar_add_button (GTK_INFO_BAR (this),
202                                          GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
203                 break;
204         default:
205                 break;
206         }
207 }
208
209
210 /*****************************************************************************/
211 /* Set secondary text.                                                       */
212 /*****************************************************************************/
213 void
214 gl_message_bar_format_secondary_text (glMessageBar   *this,
215                                       const gchar    *message_format,
216                                       ...)
217 {
218         va_list    args;
219         gchar     *markup;
220
221         g_free (this->priv->secondary_text);
222
223         va_start (args, message_format);
224         this->priv->secondary_text = g_strdup_vprintf (message_format, args);
225         va_end (args);
226
227         markup = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n%s",
228                                   this->priv->primary_text,
229                                   this->priv->secondary_text);
230
231         gtk_label_set_markup (GTK_LABEL (this->priv->label), markup);
232
233         g_free (markup);
234 }
235
236
237
238
239
240
241 /*
242  * Local Variables:       -- emacs
243  * mode: C                -- emacs
244  * c-basic-offset: 8      -- emacs
245  * tab-width: 8           -- emacs
246  * indent-tabs-mode: nil  -- emacs
247  * End:                   -- emacs
248  */