1 /*
2 * Copyright © 2009-2018 Siyan Panayotov <contact@siyanpanayotov.com>
3 *
4 * This file is part of Viewnior.
5 *
6 * Viewnior is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * Viewnior is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with Viewnior. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include <gtk/gtk.h>
21 #include "vnr-message-area.h"
22
23 G_DEFINE_TYPE (VnrMessageArea, vnr_message_area, GTK_TYPE_EVENT_BOX);
24
25 static void
vnr_message_area_class_init(VnrMessageAreaClass * klass)26 vnr_message_area_class_init (VnrMessageAreaClass * klass) {}
27
28 GtkWidget *
vnr_message_area_new()29 vnr_message_area_new ()
30 {
31 return (GtkWidget *) g_object_new (VNR_TYPE_MESSAGE_AREA, NULL);
32 }
33
34 static void
cancel_button_cb(GtkWidget * widget,VnrMessageArea * msg_area)35 cancel_button_cb(GtkWidget *widget, VnrMessageArea * msg_area)
36 {
37 vnr_message_area_hide(msg_area);
38 }
39
40 static void
vnr_message_area_initialize(VnrMessageArea * msg_area)41 vnr_message_area_initialize(VnrMessageArea * msg_area)
42 {
43 msg_area->with_button = FALSE;
44 msg_area->hbox = gtk_hbox_new(FALSE, 7);
45 gtk_container_add(GTK_CONTAINER (msg_area), msg_area->hbox);
46 gtk_container_set_border_width(GTK_CONTAINER (msg_area->hbox), 7);
47
48 msg_area->image = gtk_image_new();
49 gtk_box_pack_start (GTK_BOX (msg_area->hbox), msg_area->image,
50 FALSE, FALSE, 0);
51
52 msg_area->message = gtk_label_new (NULL);
53 gtk_label_set_line_wrap(GTK_LABEL (msg_area->message), TRUE);
54 gtk_label_set_selectable(GTK_LABEL(msg_area->message), TRUE);
55 gtk_box_pack_start (GTK_BOX (msg_area->hbox), msg_area->message,
56 FALSE, FALSE, 0);
57
58 msg_area->button_box = gtk_vbutton_box_new();
59 gtk_box_pack_end(GTK_BOX (msg_area->hbox), msg_area->button_box,
60 FALSE, FALSE, 0);
61
62 msg_area->user_button = gtk_button_new();
63 gtk_container_add(GTK_CONTAINER(msg_area->button_box),
64 msg_area->user_button);
65
66 msg_area->cancel_button = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
67 g_signal_connect(msg_area->cancel_button, "clicked",
68 G_CALLBACK(cancel_button_cb), msg_area);
69 gtk_container_add(GTK_CONTAINER(msg_area->button_box),
70 msg_area->cancel_button);
71
72 gtk_widget_hide_all(msg_area->hbox);
73 gtk_widget_set_state(GTK_WIDGET(msg_area), GTK_STATE_SELECTED);
74 gtk_widget_set_state(msg_area->button_box, GTK_STATE_NORMAL);
75 msg_area->initialized = TRUE;
76 }
77
78 static void
vnr_message_area_init(VnrMessageArea * msg_area)79 vnr_message_area_init (VnrMessageArea * msg_area)
80 {
81 msg_area->initialized = FALSE;
82 }
83
84 static void
vnr_message_area_show_basic(VnrMessageArea * msg_area,gboolean critical,const char * message,gboolean close_image)85 vnr_message_area_show_basic (VnrMessageArea *msg_area,
86 gboolean critical,
87 const char *message, gboolean close_image)
88 {
89 char *warning;
90 if(!msg_area->initialized)
91 {
92 vnr_message_area_initialize(msg_area);
93 }
94
95 msg_area->is_critical = critical;
96
97 if(critical)
98 gtk_image_set_from_stock (GTK_IMAGE(msg_area->image),
99 GTK_STOCK_DIALOG_ERROR,
100 GTK_ICON_SIZE_DIALOG);
101 else
102 gtk_image_set_from_stock (GTK_IMAGE(msg_area->image),
103 GTK_STOCK_DIALOG_INFO,
104 GTK_ICON_SIZE_DIALOG);
105
106 msg_area->is_critical = critical;
107
108 warning = g_markup_printf_escaped ("<span weight=\"bold\">%s</span>",
109 message);
110
111 gtk_label_set_markup(GTK_LABEL(msg_area->message), warning);
112
113 g_free (warning);
114 if(close_image == TRUE)
115 vnr_window_close(msg_area->vnr_win);
116 }
117
118 void
vnr_message_area_show(VnrMessageArea * msg_area,gboolean critical,const char * message,gboolean close_image)119 vnr_message_area_show (VnrMessageArea *msg_area,
120 gboolean critical,
121 const char *message, gboolean close_image)
122 {
123 vnr_message_area_show_basic(msg_area, critical, message, close_image);
124
125
126 if(msg_area->with_button)
127 {
128 g_signal_handlers_disconnect_by_func (msg_area->user_button,
129 msg_area->c_handler,
130 msg_area);
131 msg_area->with_button = FALSE;
132 }
133
134 gtk_widget_show_all(GTK_WIDGET (msg_area->hbox));
135 gtk_widget_hide_all(GTK_WIDGET (msg_area->button_box));
136 }
137
138 void
vnr_message_area_show_with_button(VnrMessageArea * msg_area,gboolean critical,const char * message,gboolean close_image,const gchar * button_stock_id,GCallback c_handler)139 vnr_message_area_show_with_button (VnrMessageArea *msg_area,
140 gboolean critical,
141 const char *message,
142 gboolean close_image,
143 const gchar *button_stock_id,
144 GCallback c_handler)
145 {
146 vnr_message_area_show_basic(msg_area, critical, message, close_image);
147
148 gtk_button_set_use_stock (GTK_BUTTON(msg_area->user_button), TRUE);
149 gtk_button_set_label (GTK_BUTTON(msg_area->user_button), button_stock_id);
150
151 if(msg_area->with_button)
152 g_signal_handlers_disconnect_by_func (msg_area->user_button,
153 msg_area->c_handler,
154 msg_area->vnr_win);
155 else
156 msg_area->with_button = TRUE;
157
158 msg_area->c_handler = c_handler;
159 g_signal_connect(msg_area->user_button, "clicked", c_handler, msg_area->vnr_win);
160
161 gtk_widget_show_all(GTK_WIDGET (msg_area->hbox));
162 }
163
164 void
vnr_message_area_hide(VnrMessageArea * msg_area)165 vnr_message_area_hide (VnrMessageArea *msg_area)
166 {
167 gtk_widget_hide_all(GTK_WIDGET (msg_area->hbox));
168 if(msg_area->with_button)
169 {
170 g_signal_handlers_disconnect_by_func (msg_area->user_button,
171 msg_area->c_handler,
172 msg_area->vnr_win);
173 msg_area->with_button = FALSE;
174 }
175 }
176
177 gboolean
vnr_message_area_is_visible(VnrMessageArea * msg_area)178 vnr_message_area_is_visible (VnrMessageArea *msg_area)
179 {
180 if(msg_area->initialized && gtk_widget_get_visible(GTK_WIDGET(msg_area)))
181 return TRUE;
182 else
183 return FALSE;
184 }
185
186 gboolean
vnr_message_area_is_critical(VnrMessageArea * msg_area)187 vnr_message_area_is_critical (VnrMessageArea *msg_area)
188 {
189 if(msg_area->initialized && gtk_widget_get_visible(GTK_WIDGET(msg_area)) &&
190 msg_area->is_critical)
191 return TRUE;
192 else
193 return FALSE;
194 }
195