1 /*
2  * Copyright (C) 2007  Ignacio Casal Quinteiro <nacho.resa@gmail.com>
3  * 		 2005  Paolo Maggi
4  *
5  *     This program is free software: you can redistribute it and/or modify
6  *     it under the terms of the GNU General Public License as published by
7  *     the Free Software Foundation, either version 3 of the License, or
8  *     (at your option) any later version.
9  *
10  *     This program is distributed in the hope that it will be useful,
11  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *     GNU 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, see <http://www.gnu.org/licenses/>.
17  *
18  */
19 
20 #include "gtr-io-error-info-bar.h"
21 
22 #include <glib.h>
23 #include <gtk/gtk.h>
24 #include <glib/gi18n.h>
25 
26 static void
set_contents(GtkInfoBar * infobar,GtkWidget * contents)27 set_contents (GtkInfoBar * infobar, GtkWidget * contents)
28 {
29   GtkWidget *content_area;
30 
31   content_area = gtk_info_bar_get_content_area (infobar);
32   gtk_container_add (GTK_CONTAINER (content_area), contents);
33 }
34 
35 /*
36  * Message area funcs
37  */
38 static void
set_info_bar_text_and_icon(GtkInfoBar * infobar,const gchar * icon_stock_id,const gchar * primary_text,const gchar * secondary_text)39 set_info_bar_text_and_icon (GtkInfoBar * infobar,
40                             const gchar * icon_stock_id,
41                             const gchar * primary_text,
42                             const gchar * secondary_text)
43 {
44   GtkWidget *hbox_content;
45   GtkWidget *image;
46   GtkWidget *vbox;
47   gchar *primary_markup;
48   gchar *secondary_markup;
49   GtkWidget *primary_label;
50   GtkWidget *secondary_label;
51 
52   hbox_content = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 8);
53   gtk_widget_show (hbox_content);
54 
55   image = gtk_image_new_from_icon_name (icon_stock_id, GTK_ICON_SIZE_DIALOG);
56   gtk_widget_show (image);
57   gtk_box_pack_start (GTK_BOX (hbox_content), image, FALSE, FALSE, 0);
58   gtk_widget_set_halign (image, 0.5);
59   gtk_widget_set_valign (image, 0.0);
60 
61   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
62   gtk_widget_show (vbox);
63   gtk_box_pack_start (GTK_BOX (hbox_content), vbox, TRUE, TRUE, 0);
64 
65   primary_markup = g_strdup_printf ("<b>%s</b>", primary_text);
66   primary_label = gtk_label_new (primary_markup);
67   g_free (primary_markup);
68 
69   gtk_widget_show (primary_label);
70 
71   gtk_box_pack_start (GTK_BOX (vbox), primary_label, TRUE, TRUE, 0);
72   gtk_label_set_use_markup (GTK_LABEL (primary_label), TRUE);
73   gtk_label_set_line_wrap (GTK_LABEL (primary_label), FALSE);
74   gtk_label_set_xalign (GTK_LABEL (primary_label), 0.0);
75   gtk_label_set_yalign (GTK_LABEL (primary_label), 0.5);
76 
77   gtk_widget_set_can_focus (primary_label, TRUE);
78 
79   gtk_label_set_selectable (GTK_LABEL (primary_label), TRUE);
80 
81   if (secondary_text != NULL)
82     {
83       secondary_markup = g_strdup_printf ("<small>%s</small>",
84                                           secondary_text);
85       secondary_label = gtk_label_new (secondary_markup);
86       g_free (secondary_markup);
87 
88       gtk_widget_show (secondary_label);
89 
90       gtk_box_pack_start (GTK_BOX (vbox), secondary_label, TRUE, TRUE, 0);
91 
92       gtk_widget_set_can_focus (secondary_label, TRUE);
93 
94       gtk_label_set_use_markup (GTK_LABEL (secondary_label), TRUE);
95       gtk_label_set_line_wrap (GTK_LABEL (secondary_label), TRUE);
96       gtk_label_set_selectable (GTK_LABEL (secondary_label), TRUE);
97       gtk_label_set_xalign (GTK_LABEL (secondary_label), 0.0);
98       gtk_label_set_yalign (GTK_LABEL (secondary_label), 0.5);
99     }
100 
101   set_contents (infobar, hbox_content);
102 }
103 
104 /*
105  * Callback func called when warning button is clicked
106  */
107 static void
warning_message_button_clicked(GtkWidget * widget,gint response_id,gpointer data)108 warning_message_button_clicked (GtkWidget * widget,
109                                 gint response_id, gpointer data)
110 {
111   if (response_id == GTK_RESPONSE_CLOSE)
112     {
113       gtk_widget_hide (GTK_WIDGET (widget));
114     }
115 }
116 
117 GtkWidget *
create_error_info_bar(const gchar * primary_text,const gchar * secondary_text)118 create_error_info_bar (const gchar * primary_text,
119                        const gchar * secondary_text)
120 {
121   GtkWidget *infobar;
122 
123   infobar = gtk_info_bar_new_with_buttons (_("_Close"),
124                                            GTK_RESPONSE_CLOSE, NULL);
125 
126   gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), GTK_MESSAGE_WARNING);
127 
128   set_info_bar_text_and_icon (GTK_INFO_BAR (infobar),
129                               "dialog-error-symbolic",
130                               primary_text, secondary_text);
131 
132   g_signal_connect (G_OBJECT (infobar), "response",
133                     G_CALLBACK (warning_message_button_clicked), NULL);
134 
135   gtk_widget_show (infobar);
136 
137   return infobar;
138 }
139 
140 GtkWidget *
create_info_info_bar(const gchar * primary_text,const gchar * secondary_text)141 create_info_info_bar (const gchar * primary_text,
142                       const gchar * secondary_text)
143 {
144   GtkWidget *infobar;
145 
146   infobar = gtk_info_bar_new_with_buttons (_("_OK"),
147                                            GTK_RESPONSE_OK, NULL);
148 
149   gtk_info_bar_set_message_type (GTK_INFO_BAR (infobar), GTK_MESSAGE_INFO);
150 
151   set_info_bar_text_and_icon (GTK_INFO_BAR (infobar),
152                               "dialog-information-symbolic",
153                               primary_text, secondary_text);
154 
155   g_signal_connect (G_OBJECT (infobar), "response",
156                     G_CALLBACK (gtk_widget_hide), NULL);
157 
158   gtk_widget_show (infobar);
159 
160   return infobar;
161 }
162