5708a7a8737a2aa13331deaa91db2f31f46ef150
[modest] / src / modest-widget-factory.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 "modest-widget-factory.h"
31 /* include other impl specific header files */
32
33 /* 'private'/'protected' functions */
34 static void modest_widget_factory_class_init    (ModestWidgetFactoryClass *klass);
35 static void modest_widget_factory_init          (ModestWidgetFactory *obj);
36 static void modest_widget_factory_finalize      (GObject *obj);
37
38 static void on_folder_clicked (ModestTnyFolderTreeView *folder_view, TnyMsgFolderIface *folder,
39                                ModestWidgetFactory *self);
40 static void on_message_selected (ModestTnyFolderTreeView *folder_view, TnyMsgIface *msg,
41                                  ModestWidgetFactory *self);
42
43 /* list my signals */
44 enum {
45         /* MY_SIGNAL_1, */
46         /* MY_SIGNAL_2, */
47         LAST_SIGNAL
48 };
49
50 typedef struct _ModestWidgetFactoryPrivate ModestWidgetFactoryPrivate;
51 struct _ModestWidgetFactoryPrivate {
52         
53         ModestTnyAccountStore *account_store;
54         ModestAccountMgr      *account_mgr;
55         ModestConf            *conf;
56         
57         ModestTnyHeaderTreeView *header_view;
58         ModestTnyFolderTreeView *folder_view;
59         ModestTnyMsgView        *msg_preview;
60         ModestAccountView       *account_view;
61
62         gboolean                auto_connect;
63 };
64 #define MODEST_WIDGET_FACTORY_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
65                                                    MODEST_TYPE_WIDGET_FACTORY, \
66                                                    ModestWidgetFactoryPrivate))
67 /* globals */
68 static GObjectClass *parent_class = NULL;
69
70 /* uncomment the following if you have defined any signals */
71 /* static guint signals[LAST_SIGNAL] = {0}; */
72
73 GType
74 modest_widget_factory_get_type (void)
75 {
76         static GType my_type = 0;
77         if (!my_type) {
78                 static const GTypeInfo my_info = {
79                         sizeof(ModestWidgetFactoryClass),
80                         NULL,           /* base init */
81                         NULL,           /* base finalize */
82                         (GClassInitFunc) modest_widget_factory_class_init,
83                         NULL,           /* class finalize */
84                         NULL,           /* class data */
85                         sizeof(ModestWidgetFactory),
86                         1,              /* n_preallocs */
87                         (GInstanceInitFunc) modest_widget_factory_init,
88                 };
89                 my_type = g_type_register_static (G_TYPE_OBJECT,
90                                                   "ModestWidgetFactory",
91                                                   &my_info, 0);
92         }
93         return my_type;
94 }
95
96 static void
97 modest_widget_factory_class_init (ModestWidgetFactoryClass *klass)
98 {
99         GObjectClass *gobject_class;
100         gobject_class = (GObjectClass*) klass;
101
102         parent_class            = g_type_class_peek_parent (klass);
103         gobject_class->finalize = modest_widget_factory_finalize;
104
105         g_type_class_add_private (gobject_class, sizeof(ModestWidgetFactoryPrivate));
106
107         /* signal definitions go here, e.g.: */
108 /*      signals[MY_SIGNAL_1] = */
109 /*              g_signal_new ("my_signal_1",....); */
110 /*      signals[MY_SIGNAL_2] = */
111 /*              g_signal_new ("my_signal_2",....); */
112 /*      etc. */
113 }
114
115 static void
116 modest_widget_factory_init (ModestWidgetFactory *obj)
117 {
118         ModestWidgetFactoryPrivate *priv;
119         priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(obj);
120
121         priv->conf          = NULL;
122         priv->account_mgr   = NULL;
123         priv->account_store = NULL;
124 }
125
126 static void
127 modest_widget_factory_finalize (GObject *obj)
128 {
129         ModestWidgetFactoryPrivate *priv;
130         priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(obj);
131
132         if (priv->account_mgr) {
133                 g_object_unref (G_OBJECT(priv->account_mgr));
134                 priv->account_mgr = NULL;
135         }
136
137         if (priv->conf) {
138                 g_object_unref (G_OBJECT(priv->conf));
139                 priv->conf = NULL;
140         }
141
142         if (priv->account_store) {
143                 g_object_unref (G_OBJECT(priv->account_store));
144                 priv->account_store = NULL;
145         }
146 }
147
148 ModestWidgetFactory*
149 modest_widget_factory_new (ModestConf *conf,
150                            ModestTnyAccountStore *account_store,
151                            ModestAccountMgr *account_mgr,
152                            gboolean auto_connect)
153 {
154         GObject *obj;
155         ModestWidgetFactoryPrivate *priv;
156
157         g_return_val_if_fail (account_store, NULL);
158         g_return_val_if_fail (account_mgr, NULL);
159         g_return_val_if_fail (conf, NULL);
160         
161         obj  = g_object_new(MODEST_TYPE_WIDGET_FACTORY, NULL);  
162         priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(obj);
163
164         priv->auto_connect = auto_connect;
165
166         g_object_ref (G_OBJECT(conf));
167         priv->conf = conf;
168         
169         g_object_ref (G_OBJECT(account_mgr));
170         priv->account_mgr = account_mgr;
171
172         g_object_ref (G_OBJECT(account_store));
173         priv->account_store = account_store;
174         
175         return MODEST_WIDGET_FACTORY(obj);
176 }
177
178
179
180
181 ModestTnyFolderTreeView*
182 modest_widget_factory_get_folder_tree_widget (ModestWidgetFactory *self)
183 {
184         ModestWidgetFactoryPrivate *priv;
185         
186         g_return_val_if_fail (self, NULL);
187
188         priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self);
189
190         if (!priv->folder_view) {
191                 priv->folder_view =
192                         MODEST_TNY_FOLDER_TREE_VIEW(modest_tny_folder_tree_view_new
193                                                     (TNY_ACCOUNT_STORE_IFACE(priv->account_store)));
194                 if (priv->folder_view && priv->auto_connect)
195                         g_signal_connect (G_OBJECT(priv->folder_view), "folder_selected",
196                                           G_CALLBACK(on_folder_clicked), self);
197         }
198                 
199         if (!priv->folder_view)
200                 g_printerr ("modest: cannot instantiate folder view\n");
201         
202         return priv->folder_view;
203 }
204
205
206 ModestTnyHeaderTreeView*
207 modest_widget_factory_get_header_tree_widget (ModestWidgetFactory *self)
208 {
209         ModestWidgetFactoryPrivate *priv;
210         
211         g_return_val_if_fail (self, NULL);
212
213         priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self);
214
215         if (!priv->header_view) {
216                 priv->header_view =
217                         MODEST_TNY_HEADER_TREE_VIEW(modest_tny_header_tree_view_new
218                                                     (NULL, NULL,
219                                                      MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL));
220                 if (priv->header_view && priv->auto_connect)
221                         g_signal_connect (G_OBJECT(priv->header_view), "message_selected",
222                                           G_CALLBACK(on_message_selected), self);
223         }
224         
225         if (!priv->header_view)
226                 g_printerr ("modest: cannot instantiate header view\n");
227         
228         return priv->header_view;
229 }
230
231
232 ModestTnyMsgView*
233 modest_widget_factory_get_msg_preview_widget (ModestWidgetFactory *self)
234 {
235         ModestWidgetFactoryPrivate *priv;
236         
237         g_return_val_if_fail (self, NULL);
238
239         priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self);
240
241         if (!priv->msg_preview)
242                 priv->msg_preview =
243                         MODEST_TNY_MSG_VIEW(modest_tny_msg_view_new (NULL));
244         
245         if (!priv->msg_preview)
246                 g_printerr ("modest: cannot instantiate header view\n");
247         
248         return priv->msg_preview;
249 }
250
251
252 static void
253 on_folder_clicked (ModestTnyFolderTreeView *folder_view, TnyMsgFolderIface *folder,
254                    ModestWidgetFactory *self)
255 {
256         ModestWidgetFactoryPrivate *priv;
257         priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self);
258         
259         modest_tny_header_tree_view_set_folder (priv->header_view, folder);
260 }
261
262
263 static void
264 on_message_selected (ModestTnyFolderTreeView *folder_view, TnyMsgIface *msg,
265                      ModestWidgetFactory *self)
266 {       
267         ModestWidgetFactoryPrivate *priv;
268         priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self);
269
270         modest_tny_msg_view_set_message (priv->msg_preview, msg);
271 }
272
273
274 ModestAccountView*
275 modest_widget_factory_get_account_view_widget (ModestWidgetFactory *self)
276 {
277         ModestWidgetFactoryPrivate *priv;
278         
279         g_return_val_if_fail (self, NULL);
280
281         priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self);
282
283         if (!priv->account_view)
284                 priv->account_view =
285                         MODEST_ACCOUNT_VIEW(modest_account_view_new (priv->account_mgr));
286
287         if (!priv->account_view)
288                 g_printerr ("modest: cannot create account view widget\n");
289         
290         return priv->account_view;      
291 }