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