* check for a valid foldername
[modest] / src / gnome / modest-transport-widget.c
1 /* modest-transport-widget.c */
2
3 /* insert (c)/licensing information) */
4
5 #include <glib/gi18n.h>
6 #include <gtk/gtk.h>
7 #include <widgets/modest-combo-box.h>
8 #include <modest-protocol-info.h>
9 #include "modest-transport-widget.h"
10 #include <string.h>
11
12
13
14 /* 'private'/'protected' functions */
15 static void modest_transport_widget_class_init (ModestTransportWidgetClass *klass);
16 static void modest_transport_widget_init       (ModestTransportWidget *obj);
17 static void modest_transport_widget_finalize   (GObject *obj);
18 /* list my signals  */
19 enum {
20         /* MY_SIGNAL_1, */
21         /* MY_SIGNAL_2, */
22         LAST_SIGNAL
23 };
24
25 typedef struct _ModestTransportWidgetPrivate ModestTransportWidgetPrivate;
26 struct _ModestTransportWidgetPrivate {
27         ModestTransportStoreProtocol proto;
28         GtkWidget *servername;
29         GtkWidget *username;
30         GtkWidget *auth;
31         GtkWidget *remember_pwd;
32         
33         ModestPairList *transport_store_protos;
34 };
35 #define MODEST_TRANSPORT_WIDGET_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
36                                                      MODEST_TYPE_TRANSPORT_WIDGET, \
37                                                      ModestTransportWidgetPrivate))
38 /* globals */
39 static GtkContainerClass *parent_class = NULL;
40
41 /* uncomment the following if you have defined any signals */
42 /* static guint signals[LAST_SIGNAL] = {0}; */
43
44 GType
45 modest_transport_widget_get_type (void)
46 {
47         static GType my_type = 0;
48         if (!my_type) {
49                 static const GTypeInfo my_info = {
50                         sizeof(ModestTransportWidgetClass),
51                         NULL,           /* base init */
52                         NULL,           /* base finalize */
53                         (GClassInitFunc) modest_transport_widget_class_init,
54                         NULL,           /* class finalize */
55                         NULL,           /* class data */
56                         sizeof(ModestTransportWidget),
57                         1,              /* n_preallocs */
58                         (GInstanceInitFunc) modest_transport_widget_init,
59                         NULL
60                 };
61                 my_type = g_type_register_static (GTK_TYPE_VBOX,
62                                                   "ModestTransportWidget",
63                                                   &my_info, 0);
64         }
65         return my_type;
66 }
67
68 static void
69 modest_transport_widget_class_init (ModestTransportWidgetClass *klass)
70 {
71         GObjectClass *gobject_class;
72         gobject_class = (GObjectClass*) klass;
73
74         parent_class            = g_type_class_peek_parent (klass);
75         gobject_class->finalize = modest_transport_widget_finalize;
76
77         g_type_class_add_private (gobject_class, sizeof(ModestTransportWidgetPrivate));
78
79         /* signal definitions go here, e.g.: */
80 /*      signals[MY_SIGNAL_1] = */
81 /*              g_signal_new ("my_signal_1",....); */
82 /*      signals[MY_SIGNAL_2] = */
83 /*              g_signal_new ("my_signal_2",....); */
84 /*      etc. */
85 }
86
87 static void
88 modest_transport_widget_init (ModestTransportWidget *obj)
89 {
90         ModestTransportWidgetPrivate *priv;
91         priv = MODEST_TRANSPORT_WIDGET_GET_PRIVATE(obj); 
92         
93         priv->proto = MODEST_PROTOCOL_TRANSPORT_STORE_UNKNOWN;
94 }
95
96 static void
97 modest_transport_widget_finalize (GObject *obj)
98 {
99         ModestTransportWidgetPrivate *priv = MODEST_TRANSPORT_WIDGET_GET_PRIVATE(obj);
100         
101         /* These had to stay alive for as long as the comboboxes that used them: */
102         modest_pair_list_free (priv->transport_store_protos);
103         
104         G_OBJECT_CLASS(parent_class)->finalize (obj);
105 }
106
107 static void
108 on_button_toggled (GtkToggleButton *button, gpointer user_data)
109 {
110         ModestTransportWidgetPrivate *priv;
111
112         priv = (ModestTransportWidgetPrivate *) user_data;
113
114         if (gtk_toggle_button_get_active (button))
115                 gtk_widget_set_sensitive (gtk_widget_get_parent (priv->username), TRUE);
116         else
117                 gtk_widget_set_sensitive (gtk_widget_get_parent (priv->username), FALSE);
118 }
119
120
121 static GtkWidget*
122 smtp_configuration (ModestTransportWidget *self)
123 {
124         ModestTransportWidgetPrivate *priv;
125         GtkWidget *label, *box, *hbox, *combo;
126         
127         priv = MODEST_TRANSPORT_WIDGET_GET_PRIVATE(self);
128         box = gtk_vbox_new (FALSE, 6);
129         
130         label = gtk_label_new (NULL);
131         gtk_label_set_markup (GTK_LABEL(label),
132                               _("<b>SMTP configuration</b>"));  
133         gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 6);
134
135         priv->servername = gtk_entry_new_with_max_length (40);
136         priv->username = gtk_entry_new_with_max_length (40);
137
138         /* Servername */        
139         hbox = gtk_hbox_new (FALSE, 6);
140         gtk_box_pack_start (GTK_BOX(hbox), gtk_label_new (_("Servername: ")),
141                             FALSE, FALSE, 6);
142         gtk_box_pack_start (GTK_BOX(hbox), priv->servername, TRUE, TRUE, 6);
143         gtk_box_pack_start (GTK_BOX(box), hbox, TRUE, TRUE, 6);
144
145         /* Auth */
146         priv->auth = gtk_check_button_new_with_label (_("Requires authentication"));
147         gtk_box_pack_start (GTK_BOX(box), priv->auth, TRUE, FALSE, 6);
148
149         g_signal_connect (priv->auth, "toggled", G_CALLBACK (on_button_toggled), priv);
150         
151         /* Username */
152         hbox = gtk_hbox_new (FALSE, 6);
153         gtk_box_pack_start (GTK_BOX(hbox), gtk_label_new (_("Username: ")),
154                             FALSE, FALSE, 6);
155         gtk_box_pack_start (GTK_BOX(hbox), priv->username, TRUE, TRUE, 6);
156         gtk_widget_set_sensitive (hbox, FALSE);
157         gtk_box_pack_start (GTK_BOX(box), hbox, TRUE, TRUE, 6);
158
159         /* Security */
160         label = gtk_label_new(NULL);
161         gtk_label_set_markup (GTK_LABEL(label),_("<b>Security</b>"));
162         gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 0);
163
164         hbox = gtk_hbox_new (FALSE, 6);
165         label = gtk_label_new(NULL);
166         gtk_label_set_text (GTK_LABEL(label),_("Connection type:"));
167         gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
168
169         /* Note: This ModestPairList* must exist for as long as the combo
170          * that uses it, because the ModestComboBox uses the ID opaquely, 
171          * so it can't know how to manage its memory. */ 
172         priv->transport_store_protos = modest_protocol_info_get_transport_store_protocol_pair_list ();
173         combo  = modest_combo_box_new (priv->transport_store_protos, g_str_equal);
174         
175         gtk_box_pack_start (GTK_BOX(hbox), combo, FALSE, FALSE,0);
176         gtk_box_pack_start (GTK_BOX(box), hbox, FALSE, FALSE, 0);
177
178         hbox = gtk_hbox_new (FALSE, 6);
179         label = gtk_label_new(NULL);
180
181         gtk_label_set_text (GTK_LABEL(label),_("Authentication:"));
182         gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 6);
183
184         /* Note: This ModestPairList* must exist for as long as the combo
185          * that uses it, because the ModestComboBox uses the ID opaquely, 
186          * so it can't know how to manage its memory. */ 
187         priv->auth_protos = modest_protocol_info_get_auth_protocol_pair_list ();
188         combo  = modest_combo_box_new (priv->auth_protos, g_str_equal);
189         
190         gtk_box_pack_start (GTK_BOX(hbox), combo, FALSE, FALSE, 0);
191         priv->remember_pwd =
192                 gtk_check_button_new_with_label (_("Remember password"));
193         gtk_box_pack_start (GTK_BOX(hbox),priv->remember_pwd,
194                             FALSE, FALSE, 0);   
195         return box;
196 }
197
198
199 GtkWidget*
200 modest_transport_widget_new (ModestTransportStoreProtocol proto)
201 {
202         GObject *obj;
203         GtkWidget *w;
204         ModestTransportWidget *self;
205         ModestTransportWidgetPrivate *priv;
206         
207         g_return_val_if_fail (proto, NULL);
208
209         obj = g_object_new(MODEST_TYPE_TRANSPORT_WIDGET, NULL);
210         self = MODEST_TRANSPORT_WIDGET(obj);
211         priv = MODEST_TRANSPORT_WIDGET_GET_PRIVATE(self);
212
213         priv->proto = proto;
214         
215         if (proto == MODEST_PROTOCOL_TRANSPORT_SMTP) 
216                 w = smtp_configuration (self);
217         else
218                 w = gtk_label_new ("");
219         
220         gtk_widget_show_all (w);
221         gtk_box_pack_start (GTK_BOX(self), w, FALSE, FALSE, 2);
222
223         return GTK_WIDGET(self);
224 }
225
226
227 gboolean
228 modest_transport_widget_get_remember_password (ModestTransportWidget *self)
229 {
230         ModestTransportWidgetPrivate *priv;
231
232         g_return_val_if_fail (self, FALSE);
233         priv = MODEST_TRANSPORT_WIDGET_GET_PRIVATE(self);
234
235         return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(priv->remember_pwd));
236 }
237
238 gboolean
239 modest_transport_widget_get_requires_auth (ModestTransportWidget *self)
240 {
241         ModestTransportWidgetPrivate *priv;
242
243         g_return_val_if_fail (self, FALSE);
244         priv = MODEST_TRANSPORT_WIDGET_GET_PRIVATE(self);
245
246         return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(priv->auth));
247 }
248
249 const gchar*
250 modest_transport_widget_get_username (ModestTransportWidget *self)
251 {
252         ModestTransportWidgetPrivate *priv;
253
254         g_return_val_if_fail (self, NULL);
255         priv = MODEST_TRANSPORT_WIDGET_GET_PRIVATE(self);
256         
257         return gtk_entry_get_text (GTK_ENTRY(priv->username));
258 }
259
260 const gchar*
261 modest_transport_widget_get_servername (ModestTransportWidget *self)
262 {
263         ModestTransportWidgetPrivate *priv;
264
265         g_return_val_if_fail (self, NULL);
266         priv = MODEST_TRANSPORT_WIDGET_GET_PRIVATE(self);
267         
268         return gtk_entry_get_text (GTK_ENTRY(priv->servername));
269 }
270
271
272 ModestTransportStoreProtocol
273 modest_transport_widget_get_proto (ModestTransportWidget *self)
274 {
275         ModestTransportWidgetPrivate *priv;
276
277         g_return_val_if_fail (self, MODEST_PROTOCOL_TRANSPORT_STORE_UNKNOWN);
278         priv = MODEST_TRANSPORT_WIDGET_GET_PRIVATE(self);
279
280         return priv->proto;
281 }
282