2007-04-05 Murray Cumming <murrayc@murrayc.com>
[modest] / src / maemo / modest-connection-specific-smtp-window.c
1 /* connection-specific-smtp-window.c */
2
3 #include "modest-connection-specific-smtp-window.h"
4 #include "modest-connection-specific-smtp-edit-window.h"
5 #include <gtk/gtktreeview.h>
6 #include <gtk/gtkcellrenderertext.h>
7 #include <gtk/gtkliststore.h>
8 #include <gtk/gtkscrolledwindow.h>
9 #include <gtk/gtkbutton.h>
10 #include <gtk/gtkhbox.h>
11 #include <gtk/gtkvbox.h>
12 #include <gtk/gtkstock.h>
13
14 #include <glib/gi18n.h>
15
16 G_DEFINE_TYPE (ModestConnectionSpecificSmtpWindow, modest_connection_specific_smtp_window, GTK_TYPE_WINDOW);
17
18 #define CONNECTION_SPECIFIC_SMTP_WINDOW_GET_PRIVATE(o) \
19         (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_CONNECTION_SPECIFIC_SMTP_WINDOW, ModestConnectionSpecificSmtpWindowPrivate))
20
21 typedef struct _ModestConnectionSpecificSmtpWindowPrivate ModestConnectionSpecificSmtpWindowPrivate;
22
23 struct _ModestConnectionSpecificSmtpWindowPrivate
24 {
25         GtkTreeView *treeview;
26         GtkTreeModel *model;
27 };
28
29 static void
30 modest_connection_specific_smtp_window_get_property (GObject *object, guint property_id,
31                                                                                                                         GValue *value, GParamSpec *pspec)
32 {
33         switch (property_id) {
34         default:
35                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
36         }
37 }
38
39 static void
40 modest_connection_specific_smtp_window_set_property (GObject *object, guint property_id,
41                                                                                                                         const GValue *value, GParamSpec *pspec)
42 {
43         switch (property_id) {
44         default:
45                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
46         }
47 }
48
49 static void
50 modest_connection_specific_smtp_window_dispose (GObject *object)
51 {
52         if (G_OBJECT_CLASS (modest_connection_specific_smtp_window_parent_class)->dispose)
53                 G_OBJECT_CLASS (modest_connection_specific_smtp_window_parent_class)->dispose (object);
54 }
55
56 static void
57 modest_connection_specific_smtp_window_finalize (GObject *object)
58 {
59         ModestConnectionSpecificSmtpWindowPrivate *priv = CONNECTION_SPECIFIC_SMTP_WINDOW_GET_PRIVATE (object);
60
61         g_object_unref (G_OBJECT (priv->model));
62         
63         G_OBJECT_CLASS (modest_connection_specific_smtp_window_parent_class)->finalize (object);
64 }
65
66 static void
67 modest_connection_specific_smtp_window_class_init (ModestConnectionSpecificSmtpWindowClass *klass)
68 {
69         GObjectClass *object_class = G_OBJECT_CLASS (klass);
70
71         g_type_class_add_private (klass, sizeof (ModestConnectionSpecificSmtpWindowPrivate));
72
73         object_class->get_property = modest_connection_specific_smtp_window_get_property;
74         object_class->set_property = modest_connection_specific_smtp_window_set_property;
75         object_class->dispose = modest_connection_specific_smtp_window_dispose;
76         object_class->finalize = modest_connection_specific_smtp_window_finalize;
77 }
78
79 enum MODEL_COLS {
80         MODEL_COL_NAME = 0,
81         MODEL_COL_SERVER_NAME = 1,
82         MODEL_COL_ID = 2
83 };
84
85 static void
86 fill_with_connections (ModestConnectionSpecificSmtpWindow *self)
87 {
88         /* TODO: 
89         * When TnyMaemoDevice provides enough of the libconic API to implement this. */
90 }
91
92         
93 static void
94 on_edit_window_hide (GtkWindow *window, gpointer user_data)
95 {
96         /* Destroy the window when it is closed: */
97         gtk_widget_destroy (GTK_WIDGET (window));
98 }
99
100         
101 static void
102 on_button_edit (GtkButton *button, gpointer user_data)
103 {
104         ModestConnectionSpecificSmtpWindow *self = MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (user_data);
105         
106         /* TODO: Specify the chosen connection to edit: */
107         GtkWidget * window = GTK_WIDGET (modest_connection_specific_smtp_edit_window_new ());
108         gtk_window_set_transient_for (GTK_WINDOW (self), GTK_WINDOW (window));
109         g_signal_connect (G_OBJECT (window), "hide",
110                 G_CALLBACK (on_edit_window_hide), self);
111         gtk_widget_show (window);
112 }
113
114 static void
115 on_button_cancel (GtkButton *button, gpointer user_data)
116 {
117         ModestConnectionSpecificSmtpWindow *self = MODEST_CONNECTION_SPECIFIC_SMTP_WINDOW (user_data);
118
119         /* Hide the window.
120          * The code that showed it will respond to the hide signal. */  
121         gtk_widget_hide (GTK_WIDGET (self));
122 }
123
124 static void
125 modest_connection_specific_smtp_window_init (ModestConnectionSpecificSmtpWindow *self)
126 {
127         ModestConnectionSpecificSmtpWindowPrivate *priv = CONNECTION_SPECIFIC_SMTP_WINDOW_GET_PRIVATE (self);
128
129         /* Create a tree model for the tree view:
130          * with a string for the name, a string for the server name, and an int for the ID.
131          * This must match our MODEL_COLS enum constants.
132          */
133         priv->model = GTK_TREE_MODEL (gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT));
134
135         /* Setup the tree view: */
136         priv->treeview = GTK_TREE_VIEW (gtk_tree_view_new_with_model (priv->model));
137
138         /* name column:
139          * The ID model column in not shown in the view. */
140         GtkTreeViewColumn *view_column = gtk_tree_view_column_new ();
141         GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
142         gtk_tree_view_column_pack_start(view_column, renderer, TRUE);
143         gtk_tree_view_column_set_attributes (view_column, renderer, 
144         "text", MODEL_COL_NAME, NULL);
145         gtk_tree_view_column_set_title (view_column, _("mcen_ia_optionalsmtp_connection_name"));
146         gtk_tree_view_append_column (priv->treeview, view_column);
147
148         
149         /* server name column: */
150         view_column = gtk_tree_view_column_new ();
151         renderer = gtk_cell_renderer_text_new ();
152         gtk_tree_view_column_pack_start(view_column, renderer, TRUE);
153         gtk_tree_view_column_set_attributes (view_column, renderer, 
154         "text", MODEL_COL_SERVER_NAME, NULL);
155         gtk_tree_view_column_set_title (view_column, _("mcen_ia_optionalsmtp_servername"));
156         gtk_tree_view_append_column (priv->treeview, view_column);
157         
158         /* Fill the model with rows: */
159         fill_with_connections (self);
160         
161         GtkWidget *vbox = gtk_vbox_new (FALSE, 2);
162         
163         /* Put the treeview in a scrolled window and add it to the box: */
164         GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
165         gtk_widget_show (scrolled_window);
166         gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET (priv->treeview));
167         gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (scrolled_window), TRUE, TRUE, 2);
168         gtk_widget_show (GTK_WIDGET (priv->treeview));
169         
170         /* Add the buttons: */
171         GtkWidget *hbox = gtk_hbox_new (FALSE, 2);
172         gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 2);
173         gtk_widget_show (hbox);
174         
175         GtkWidget *button_edit = gtk_button_new_from_stock (GTK_STOCK_EDIT);
176         gtk_box_pack_start (GTK_BOX (hbox), button_edit, TRUE, FALSE, 2);
177         gtk_widget_show (button_edit);
178         g_signal_connect (G_OBJECT (button_edit), "clicked",
179                 G_CALLBACK (on_button_edit), self);
180         
181         GtkWidget *button_cancel = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
182         gtk_box_pack_start (GTK_BOX (hbox), button_cancel, TRUE, FALSE, 2);
183         gtk_widget_show (button_cancel);
184         g_signal_connect (G_OBJECT (button_edit), "clicked",
185                 G_CALLBACK (on_button_cancel), self);
186         
187         gtk_widget_show (vbox);
188 }
189
190 ModestConnectionSpecificSmtpWindow*
191 modest_connection_specific_smtp_window_new (void)
192 {
193         return g_object_new (MODEST_TYPE_CONNECTION_SPECIFIC_SMTP_WINDOW, NULL);
194 }
195