834b0dcbce762060c649bb61c521fc3195b47584
[modest] / src / gtk2 / modest-ui.c
1 /* Copyright (c) 2006, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 #include <gtk/gtk.h>
31 #include <glade/glade.h>
32 #include <glib/gi18n.h>
33 #include <string.h>
34
35 #ifdef HAVE_CONFIG_H
36 #include <config.h>
37 #endif /*HAVE_CONFIG_H*/
38
39 #include "../modest-ui.h"
40 #include "../modest-account-mgr.h"
41 #include "../modest-widget-factory.h"
42 #include "modest-main-window.h"
43
44
45 /* 'private'/'protected' functions */
46 static void   modest_ui_class_init     (ModestUIClass *klass);
47 static void   modest_ui_init           (ModestUI *obj);
48 static void   modest_ui_finalize       (GObject *obj);
49
50 gchar *on_password_requested (TnyAccountIface *, const gchar *, gboolean *);
51
52
53 typedef struct _ModestUIPrivate ModestUIPrivate;
54 struct _ModestUIPrivate {
55         ModestConf            *conf;
56         ModestAccountMgr      *account_mgr;
57         ModestWidgetFactory   *widget_factory;  
58         ModestTnyAccountStore *account_store;
59
60         GtkWidget              *main_window;
61 };
62
63 #define MODEST_UI_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
64                                        MODEST_TYPE_UI, \
65                                        ModestUIPrivate))
66
67
68 /* list my signals */
69 enum {
70         /* MY_SIGNAL_1, */
71         /* MY_SIGNAL_2, */
72         LAST_SIGNAL
73 };
74
75 /* globals */
76 static GObjectClass *parent_class = NULL;
77
78
79 GType
80 modest_ui_get_type (void)
81 {
82         static GType my_type = 0;
83         if (!my_type) {
84                 static const GTypeInfo my_info = {
85                         sizeof(ModestUIClass),
86                         NULL,           /* base init */
87                         NULL,           /* base finalize */
88                         (GClassInitFunc) modest_ui_class_init,
89                         NULL,           /* class finalize */
90                         NULL,           /* class data */
91                         sizeof(ModestUI),
92                         1,              /* n_preallocs */
93                         (GInstanceInitFunc) modest_ui_init,
94                         NULL
95                 };
96                 my_type = g_type_register_static (G_TYPE_OBJECT,
97                                                   "ModestUI",
98                                                   &my_info, 0);
99         }
100         return my_type;
101 }
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 }
116
117
118 static void
119 modest_ui_init (ModestUI *obj)
120 {
121         ModestUIPrivate *priv;
122
123         priv = MODEST_UI_GET_PRIVATE(obj);
124
125         priv->account_store  = NULL;
126         priv->account_mgr    = NULL;
127         priv->conf           = NULL;
128         priv->widget_factory = NULL;
129
130         priv->main_window    = NULL;
131 }
132
133
134 static void
135 modest_ui_finalize (GObject *obj)
136 {
137         
138         ModestUIPrivate *priv = MODEST_UI_GET_PRIVATE(obj);
139
140         if (priv->account_store) {
141                 g_object_unref (G_OBJECT(priv->account_store));
142                 priv->account_store = NULL;
143         }
144                 
145         if (priv->account_mgr) {
146                 g_object_unref (G_OBJECT(priv->account_mgr));
147                 priv->account_mgr = NULL;
148         }
149
150         if (priv->widget_factory) {
151                 g_object_unref (G_OBJECT(priv->widget_factory));
152                 priv->widget_factory = NULL;
153         }
154
155         if (priv->conf) {
156                 g_object_unref (G_OBJECT(priv->conf));
157                 priv->conf = NULL;
158         }       
159 }
160
161
162 ModestUI*
163 modest_ui_new (ModestConf *modest_conf)
164 {
165         GObject *obj;
166         ModestUIPrivate *priv;
167
168         g_return_val_if_fail (modest_conf, NULL);
169
170         obj  = g_object_new(MODEST_TYPE_UI, NULL);
171         priv = MODEST_UI_GET_PRIVATE(obj);
172
173         g_object_ref (G_OBJECT(modest_conf));
174         priv->conf = modest_conf;
175         
176         priv->account_mgr = MODEST_ACCOUNT_MGR(modest_account_mgr_new (priv->conf));
177         if (!priv->account_mgr) {
178                 g_printerr ("modest: could not create ModestAccountMgr instance\n");
179                 g_object_unref (obj);
180                 return NULL;
181         }
182
183         priv->account_store = modest_tny_account_store_new (priv->account_mgr);
184         if (!priv->account_store) {
185                 g_printerr ("modest: could not initialze ModestTnyAccountStore instance\n");
186                 return NULL;
187         }
188
189         priv->widget_factory = modest_widget_factory_new (
190                 priv->conf, priv->account_store, priv->account_mgr);
191         if (!priv->account_store) {
192                 g_printerr ("modest: could not initialize widget factory\n");
193                 return NULL;
194         }
195                 
196         return MODEST_UI(obj);
197 }
198
199 static gboolean
200 on_main_window_delete_event (GtkWidget *widget, GdkEvent *event, ModestUI *self)
201 {
202         g_warning (__FUNCTION__);
203         gtk_main_quit ();
204         return FALSE;
205 }
206
207
208 GtkWidget*
209 modest_ui_main_window (ModestUI *modest_ui)
210 {
211         ModestUIPrivate *priv;
212
213         g_return_val_if_fail (modest_ui, NULL);
214         priv = MODEST_UI_GET_PRIVATE(modest_ui);
215
216         if (!priv->main_window) {
217                 priv->main_window =
218                         modest_main_window_new (priv->conf, priv->account_mgr,
219                                                 priv->widget_factory);
220                 g_signal_connect (G_OBJECT(priv->main_window), "delete-event",
221                                   G_CALLBACK(on_main_window_delete_event), modest_ui);
222         }
223                 
224         if (!priv->main_window)
225                 g_printerr ("modest: could not create main window\n");
226         
227         return priv->main_window;
228 }