Install glade file.
[modest] / src / gtk-glade / modest-ui.c
1 /* modest-ui.c */
2
3 /* insert (c)/licensing information) */
4
5 #include <gtk/gtk.h>
6 #include <glade/glade.h>
7 #include <glib/gi18n.h>
8 #include <string.h>
9
10 #ifdef HAVE_CONFIG_H
11 #include <config.h>
12 #endif /*HAVE_CONFIG_H*/
13
14 #include "../modest-ui.h"
15 #include "../modest-window-mgr.h"
16 #include "../modest-account-mgr.h"
17
18 #include "../modest-tny-account-store.h"
19 #include "../modest-tny-folder-tree-view.h"
20 #include "../modest-tny-header-tree-view.h"
21 #include "../modest-tny-msg-view.h"
22
23 //#include "modest.glade.h"
24
25 #define MODEST_GLADE          PREFIX "/share/modest/glade/modest.glade"
26 #define MODEST_GLADE_MAIN_WIN "main"
27 #define MODEST_GLADE_EDIT_WIN "new_mail"
28
29
30 /* 'private'/'protected' functions */
31 static void   modest_ui_class_init     (ModestUIClass *klass);
32 static void   modest_ui_init           (ModestUI *obj);
33 static void   modest_ui_finalize       (GObject *obj);
34
35 static void    modest_ui_window_destroy    (GtkWidget *win, gpointer data);
36 static void    modest_ui_last_window_closed (GObject *obj, gpointer data);
37
38 static GtkWidget* modest_main_window_toolbar (void);
39 static GtkWidget* modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr);
40 static GtkWidget* modest_main_window_header_tree (TnyMsgFolderIface *folder);
41
42 static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
43                                TnyMsgFolderIface *folder,
44                                gpointer data);
45 static void on_message_clicked (ModestTnyFolderTreeView *folder_tree,
46                                 TnyMsgIface *message,
47                                 gpointer data);
48
49
50 /* list my signals */
51 enum {
52         /* MY_SIGNAL_1, */
53         /* MY_SIGNAL_2, */
54         LAST_SIGNAL
55 };
56
57
58 typedef struct _ModestUIPrivate ModestUIPrivate;
59 struct _ModestUIPrivate {
60         
61         ModestConf           *modest_conf;
62         ModestAccountMgr     *modest_acc_mgr;
63         ModestWindowMgr      *modest_window_mgr;
64         
65         GtkWindow            *main_window;
66         GSList*              *edit_window_list;      
67
68         GladeXML             *glade_xml;
69
70
71 };
72 #define MODEST_UI_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
73                                        MODEST_TYPE_UI, \
74                                        ModestUIPrivate))
75 /* globals */
76 static GObjectClass *parent_class = NULL;
77
78 /* uncomment the following if you have defined any signals */
79 /* static guint signals[LAST_SIGNAL] = {0}; */
80
81 GType
82 modest_ui_get_type (void)
83 {
84         static GType my_type = 0;
85         if (!my_type) {
86                 static const GTypeInfo my_info = {
87                         sizeof(ModestUIClass),
88                         NULL,           /* base init */
89                         NULL,           /* base finalize */
90                         (GClassInitFunc) modest_ui_class_init,
91                         NULL,           /* class finalize */
92                         NULL,           /* class data */
93                         sizeof(ModestUI),
94                         1,              /* n_preallocs */
95                         (GInstanceInitFunc) modest_ui_init,
96                 };
97                 my_type = g_type_register_static (G_TYPE_OBJECT,
98                                                   "ModestUI",
99                                                   &my_info, 0);
100         }
101         return my_type;
102 }
103
104 static void
105 modest_ui_class_init (ModestUIClass *klass)
106 {
107         GObjectClass *gobject_class;
108         gobject_class = (GObjectClass*) klass;
109
110         parent_class            = g_type_class_peek_parent (klass);
111         gobject_class->finalize = modest_ui_finalize;
112
113         g_type_class_add_private (gobject_class, sizeof(ModestUIPrivate));
114
115         /* signal definitions go here, e.g.: */
116 /*      signals[MY_SIGNAL_1] = */
117 /*              g_signal_new ("my_signal_1",....); */
118 /*      signals[MY_SIGNAL_2] = */
119 /*              g_signal_new ("my_signal_2",....); */
120 /*      etc. */
121 }
122
123 static void
124 modest_ui_init (ModestUI *obj)
125 {
126         ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj);
127
128         priv->modest_acc_mgr    = NULL;
129         priv->modest_conf       = NULL;
130         priv->modest_window_mgr = NULL;
131         priv->glade_xml         = NULL;
132         
133 }
134
135 static void
136 modest_ui_finalize (GObject *obj)
137 {
138         ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj);     
139         
140         if (priv->modest_acc_mgr)
141                 g_object_unref (priv->modest_acc_mgr);
142         priv->modest_acc_mgr = NULL;
143         
144         if (priv->modest_conf)
145                 g_object_unref (priv->modest_conf);
146         priv->modest_conf = NULL;
147         
148         if (priv->modest_window_mgr)
149                 g_object_unref (priv->modest_window_mgr);
150         priv->modest_window_mgr = NULL;
151 }
152         
153 GObject*
154 modest_ui_new (ModestConf *modest_conf)
155 {
156         GObject *obj;
157         ModestUIPrivate *priv;
158         ModestAccountMgr *modest_acc_mgr;
159
160         g_return_val_if_fail (modest_conf, NULL);
161
162         obj = g_object_new(MODEST_TYPE_UI, NULL);       
163         priv = MODEST_UI_GET_PRIVATE(obj);
164
165         modest_acc_mgr =
166                 MODEST_ACCOUNT_MGR(modest_account_mgr_new (modest_conf));
167         if (!modest_acc_mgr) {
168                 g_warning ("could not create ModestAccountMgr instance");
169                 g_object_unref (obj);
170                 return NULL;
171         }
172
173         glade_init ();
174         priv->glade_xml = glade_xml_new (MODEST_GLADE,
175                                          MODEST_GLADE_MAIN_WIN,
176                                          NULL);
177         if (!priv->glade_xml) {
178                 g_warning ("failed to do glade stuff");
179                 g_object_unref (obj);
180                 return NULL;
181         }
182         
183         priv->modest_acc_mgr = modest_acc_mgr;
184         g_object_ref (priv->modest_conf = modest_conf);
185
186         priv->modest_window_mgr = MODEST_WINDOW_MGR(modest_window_mgr_new());
187         g_signal_connect (priv->modest_window_mgr, "last_window_closed",
188                           G_CALLBACK(modest_ui_last_window_closed),
189                           NULL);
190         return obj;
191 }
192
193
194 gboolean
195 modest_ui_show_main_window (ModestUI *modest_ui)
196 {
197         GtkWidget       *win;
198         int              height, width;
199         ModestUIPrivate *priv;
200         GtkWidget     *folder_view, *header_view;
201         GtkWidget     *message_view;
202         
203         GtkWidget  *folder_view_holder,
204                 *header_view_holder,
205                 *message_view_holder;
206
207         priv = MODEST_UI_GET_PRIVATE(modest_ui);
208         
209         height = modest_conf_get_int (priv->modest_conf,
210                                       MODEST_CONF_MAIN_WINDOW_HEIGHT,NULL);
211         width  = modest_conf_get_int (priv->modest_conf,
212                                       MODEST_CONF_MAIN_WINDOW_WIDTH,NULL);
213         
214         win = glade_xml_get_widget (priv->glade_xml, "main");
215         if (!win) {
216                 g_warning ("could not create main window");
217                 return FALSE;
218         }
219
220         folder_view =
221                 GTK_WIDGET(modest_main_window_folder_tree(priv->modest_acc_mgr));
222         folder_view_holder = glade_xml_get_widget (priv->glade_xml, "folders");
223         if (!folder_view||!folder_view_holder) {
224                 g_warning ("failed to create folder tree");
225                 return FALSE;
226         }
227         gtk_container_add (GTK_CONTAINER(folder_view_holder), folder_view);
228         
229         header_view  =  GTK_WIDGET(modest_main_window_header_tree (NULL));
230         header_view_holder = glade_xml_get_widget (priv->glade_xml, "mail_list");
231         if (!header_view) {
232                 g_warning ("failed to create header tree");
233                 return FALSE;
234         }
235         gtk_container_add (GTK_CONTAINER(header_view_holder), header_view);
236
237         g_signal_connect (G_OBJECT(folder_view), "folder_selected", 
238                           G_CALLBACK(on_folder_clicked), modest_ui);
239         
240         message_view  = GTK_WIDGET(modest_tny_msg_view_new (NULL));
241         message_view_holder = glade_xml_get_widget (priv->glade_xml, "mail_view");
242         if (!message_view) {
243                 g_warning ("failed to create message view");
244                 return FALSE;
245         }
246         gtk_container_add (GTK_CONTAINER(message_view_holder), message_view);
247
248         g_signal_connect (header_view, "message_selected", 
249                           G_CALLBACK(on_message_clicked),
250                           modest_ui);
251         
252         modest_window_mgr_register (priv->modest_window_mgr,
253                                     G_OBJECT(win), MODEST_MAIN_WINDOW, 0);
254         g_signal_connect (win, "destroy", G_CALLBACK(modest_ui_window_destroy),
255                           modest_ui);
256         gtk_widget_set_usize (GTK_WIDGET(win), height, width);
257         gtk_window_set_title (GTK_WINDOW(win), PACKAGE_STRING);
258         
259         gtk_widget_show_all (win);
260         return TRUE;
261 }
262
263
264 gboolean
265 modest_ui_show_edit_window (ModestUI *modest_ui, const gchar* to,
266                             const gchar* cc, const gchar* bcc,
267                             const gchar* subject, const gchar *body,
268                             const GSList* att)
269 {
270         GtkWidget       *win;
271         ModestUIPrivate *priv;
272         
273         priv = MODEST_UI_GET_PRIVATE(modest_ui);
274         int height = modest_conf_get_int (priv->modest_conf,
275                                           MODEST_CONF_EDIT_WINDOW_HEIGHT,NULL);
276         int width  = modest_conf_get_int (priv->modest_conf,
277                                           MODEST_CONF_EDIT_WINDOW_WIDTH,NULL);
278
279         win = glade_xml_get_widget (priv->glade_xml, "new_mail");
280         if (!win) {
281                 g_warning ("could not create edit window");
282                 return FALSE;
283         }
284         
285         modest_window_mgr_register (priv->modest_window_mgr,
286                                     G_OBJECT(win), MODEST_EDIT_WINDOW, 0);
287
288         g_signal_connect (win, "destroy", G_CALLBACK(modest_ui_window_destroy),
289                           modest_ui);
290
291         gtk_widget_set_usize (GTK_WIDGET(win), height, width);
292         gtk_window_set_title (GTK_WINDOW(win),
293                               subject ? subject : "Untitled");
294
295         gtk_widget_show_all (win);
296
297         return TRUE;
298 }
299
300
301 static void
302 modest_ui_window_destroy (GtkWidget *win, gpointer data)
303 {
304         ModestUIPrivate *priv;
305
306         g_return_if_fail (data);
307
308         priv = MODEST_UI_GET_PRIVATE((ModestUI*)data);
309         if (!modest_window_mgr_unregister (priv->modest_window_mgr, G_OBJECT(win)))
310                 g_warning ("modest window mgr: failed to unregister %p",
311                            G_OBJECT(win));
312 }
313
314
315 static void
316 modest_ui_last_window_closed (GObject *obj, gpointer data)
317 {
318         gtk_main_quit ();
319 }
320
321
322
323
324 static void on_folder_clicked (ModestTnyFolderTreeView *folder_tree,
325                                TnyMsgFolderIface *folder,
326                                gpointer data)
327 {
328         GtkWidget *win;
329         ModestTnyHeaderTreeView *tree_view;
330         ModestUIPrivate *priv;
331         GtkWidget *scrollview;
332                 
333         g_return_if_fail (folder);
334         g_return_if_fail (data);
335
336         priv = MODEST_UI_GET_PRIVATE(data);
337         scrollview = glade_xml_get_widget (priv->glade_xml,"mail_list");
338
339         tree_view = MODEST_TNY_HEADER_TREE_VIEW(
340                 gtk_bin_get_child(GTK_BIN(scrollview)));
341         win = glade_xml_get_widget (priv->glade_xml, "main");
342         gtk_window_set_title (GTK_WINDOW(win),
343                               tny_msg_folder_iface_get_name(folder));
344
345         modest_tny_header_tree_view_set_folder (tree_view,
346                                                 folder);        
347 }
348
349
350
351 static void on_message_clicked (ModestTnyFolderTreeView *folder_tree,
352                                 TnyMsgIface *message,
353                                 gpointer data)
354 {
355         GtkWidget *scrollview;
356         ModestTnyMsgView *msg_view;
357         ModestUIPrivate *priv;
358         
359         g_return_if_fail (message);
360         g_return_if_fail (data);
361
362         priv = MODEST_UI_GET_PRIVATE(data);
363         scrollview = glade_xml_get_widget (priv->glade_xml,"mail_view");
364
365         msg_view = MODEST_TNY_MSG_VIEW(
366                 gtk_bin_get_child(GTK_BIN(scrollview)));
367
368         modest_tny_msg_view_set_message (msg_view,
369                                          message);
370 }
371
372
373
374 static GtkWidget*
375 modest_main_window_header_tree (TnyMsgFolderIface *folder)
376 {
377         GtkTreeViewColumn *column;
378         GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); 
379         GtkWidget *header_tree;
380         
381         header_tree = GTK_WIDGET(modest_tny_header_tree_view_new(folder));
382         if (!header_tree) {
383                 g_warning ("could not create header tree");
384                 return NULL;
385         }
386         
387         column =  gtk_tree_view_column_new_with_attributes(_("Date"), renderer,
388                                                            "text",
389                                                            TNY_MSG_HEADER_LIST_MODEL_DATE_RECEIVED_COLUMN,
390                                                            NULL);
391         gtk_tree_view_column_set_resizable (column, TRUE);
392         gtk_tree_view_append_column (GTK_TREE_VIEW(header_tree), column);
393
394
395
396         column =  gtk_tree_view_column_new_with_attributes(_("From"), renderer,
397                                                            "text",
398                                                            TNY_MSG_HEADER_LIST_MODEL_FROM_COLUMN,
399                                                            NULL);
400         gtk_tree_view_column_set_resizable (column, TRUE);
401         gtk_tree_view_append_column (GTK_TREE_VIEW(header_tree), column);
402
403
404         column =  gtk_tree_view_column_new_with_attributes(_("Subject"), renderer,
405                                                            "text",
406                                                            TNY_MSG_HEADER_LIST_MODEL_SUBJECT_COLUMN,
407                                                            NULL);
408         gtk_tree_view_column_set_resizable (column, TRUE);
409         gtk_tree_view_append_column (GTK_TREE_VIEW(header_tree), column);
410
411         gtk_tree_view_set_headers_visible   (GTK_TREE_VIEW(header_tree), TRUE);
412         gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(header_tree), TRUE);
413         
414         return GTK_WIDGET(header_tree);
415 }
416
417
418
419
420 static GtkWidget*
421 modest_main_window_folder_tree (ModestAccountMgr *modest_acc_mgr)
422 {
423         GtkTreeViewColumn *column;
424         GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); 
425         GtkWidget *folder_tree;
426         TnyAccountStoreIface *account_store_iface =
427                 TNY_ACCOUNT_STORE_IFACE(modest_tny_account_store_new (modest_acc_mgr));
428         if (!account_store_iface) {
429                 g_warning ("could not initialze ModestTnyAccountStore");
430                 return NULL;
431         }
432         
433         folder_tree = modest_tny_folder_tree_view_new (account_store_iface);
434         if (!folder_tree) {
435                 g_warning ("could not create folder list");
436                 return NULL;
437         }
438
439         column = gtk_tree_view_column_new_with_attributes(_("All Mail Folders"),
440                                                           renderer,"text",
441                                                           TNY_ACCOUNT_TREE_MODEL_NAME_COLUMN,
442                                                           NULL);        
443         gtk_tree_view_column_set_resizable (column, TRUE);
444         gtk_tree_view_append_column (GTK_TREE_VIEW(folder_tree), column);
445
446         column = gtk_tree_view_column_new_with_attributes(_("Unread"),
447                                                           renderer, "text",
448                                                           TNY_ACCOUNT_TREE_MODEL_UNREAD_COLUMN,
449                                                           NULL);
450         gtk_tree_view_column_set_resizable (column, TRUE);
451         gtk_tree_view_append_column (GTK_TREE_VIEW(folder_tree), column);
452
453         
454         gtk_tree_view_set_headers_visible   (GTK_TREE_VIEW(folder_tree), TRUE);
455         gtk_tree_view_set_headers_clickable (GTK_TREE_VIEW(folder_tree), TRUE);
456
457         return folder_tree;
458 }