* modest_ui_new now returns ModestUI* instead of GObject
[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 connect_widgets (ModestWidgetFactory *self);
39 static void on_folder_clicked (ModestTnyFolderTreeView *folder_view, TnyMsgFolderIface *folder,
40                                ModestWidgetFactory *self);
41 static void on_message_selected (ModestTnyFolderTreeView *folder_view, TnyMsgIface *msg,
42                                  ModestWidgetFactory *self);
43
44 /* list my signals */
45 enum {
46         /* MY_SIGNAL_1, */
47         /* MY_SIGNAL_2, */
48         LAST_SIGNAL
49 };
50
51 typedef struct _ModestWidgetFactoryPrivate ModestWidgetFactoryPrivate;
52 struct _ModestWidgetFactoryPrivate {
53
54         ModestTnyHeaderTreeView *header_view;
55         ModestTnyFolderTreeView *folder_view;
56         ModestTnyMsgView        *msg_preview;
57         
58 };
59 #define MODEST_WIDGET_FACTORY_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
60                                                    MODEST_TYPE_WIDGET_FACTORY, \
61                                                    ModestWidgetFactoryPrivate))
62 /* globals */
63 static GObjectClass *parent_class = NULL;
64
65 /* uncomment the following if you have defined any signals */
66 /* static guint signals[LAST_SIGNAL] = {0}; */
67
68 GType
69 modest_widget_factory_get_type (void)
70 {
71         static GType my_type = 0;
72         if (!my_type) {
73                 static const GTypeInfo my_info = {
74                         sizeof(ModestWidgetFactoryClass),
75                         NULL,           /* base init */
76                         NULL,           /* base finalize */
77                         (GClassInitFunc) modest_widget_factory_class_init,
78                         NULL,           /* class finalize */
79                         NULL,           /* class data */
80                         sizeof(ModestWidgetFactory),
81                         1,              /* n_preallocs */
82                         (GInstanceInitFunc) modest_widget_factory_init,
83                 };
84                 my_type = g_type_register_static (G_TYPE_OBJECT,
85                                                   "ModestWidgetFactory",
86                                                   &my_info, 0);
87         }
88         return my_type;
89 }
90
91 static void
92 modest_widget_factory_class_init (ModestWidgetFactoryClass *klass)
93 {
94         GObjectClass *gobject_class;
95         gobject_class = (GObjectClass*) klass;
96
97         parent_class            = g_type_class_peek_parent (klass);
98         gobject_class->finalize = modest_widget_factory_finalize;
99
100         g_type_class_add_private (gobject_class, sizeof(ModestWidgetFactoryPrivate));
101
102         /* signal definitions go here, e.g.: */
103 /*      signals[MY_SIGNAL_1] = */
104 /*              g_signal_new ("my_signal_1",....); */
105 /*      signals[MY_SIGNAL_2] = */
106 /*              g_signal_new ("my_signal_2",....); */
107 /*      etc. */
108 }
109
110 static void
111 modest_widget_factory_init (ModestWidgetFactory *obj)
112 {
113
114 }
115
116 static void
117 modest_widget_factory_finalize (GObject *obj)
118 {
119
120 }
121
122 ModestWidgetFactory*
123 modest_widget_factory_new (ModestTnyAccountStore *account_store, gboolean autoconnect)
124 {
125         GObject *obj;
126         ModestWidgetFactoryPrivate *priv;
127
128         g_return_val_if_fail (account_store, NULL);
129
130         obj  = g_object_new(MODEST_TYPE_WIDGET_FACTORY, NULL);  
131         priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(obj);
132
133         priv->folder_view =
134                 MODEST_TNY_FOLDER_TREE_VIEW(modest_tny_folder_tree_view_new
135                                             (TNY_ACCOUNT_STORE_IFACE(account_store)));
136         if (!priv->folder_view) {
137                 g_printerr ("modest: cannot instantiate folder view\n");
138                 g_object_unref (obj);
139                 return NULL;
140         }
141         
142         priv->header_view =
143                 MODEST_TNY_HEADER_TREE_VIEW(modest_tny_header_tree_view_new
144                                             (NULL, NULL, MODEST_TNY_HEADER_TREE_VIEW_STYLE_NORMAL));
145         if (!priv->header_view) {
146                 g_printerr ("modest: cannot instantiate header view\n");
147                 g_object_unref (obj);
148                 return NULL;
149         }
150
151         priv->msg_preview =
152                 MODEST_TNY_MSG_VIEW(modest_tny_msg_view_new (NULL));
153         if (!priv->msg_preview) {
154                 g_printerr ("modest: cannot instantiate msg preview\n");
155                 g_object_unref (obj);
156                 return NULL;
157         }
158
159         if (autoconnect)
160                 connect_widgets (MODEST_WIDGET_FACTORY(obj));
161
162         return MODEST_WIDGET_FACTORY(obj);
163 }
164
165
166
167
168 ModestTnyFolderTreeView*
169 modest_widget_factory_get_folder_tree_widget (ModestWidgetFactory *self)
170 {
171         g_return_val_if_fail (self, NULL);
172
173         return MODEST_WIDGET_FACTORY_GET_PRIVATE(self)->folder_view;
174         
175 }
176
177
178 ModestTnyHeaderTreeView*
179 modest_widget_factory_get_header_tree_widget (ModestWidgetFactory *self)
180 {
181         g_return_val_if_fail (self, NULL);
182         
183         return MODEST_WIDGET_FACTORY_GET_PRIVATE(self)->header_view;
184 }
185
186
187 ModestTnyMsgView*
188 modest_widget_factory_get_msg_preview_widget (ModestWidgetFactory *self)
189 {
190         g_return_val_if_fail (self, NULL);
191
192         return MODEST_WIDGET_FACTORY_GET_PRIVATE(self)->msg_preview;
193 }
194
195
196
197 static void
198 connect_widgets (ModestWidgetFactory *self)
199 {
200         ModestWidgetFactoryPrivate *priv;
201
202         g_return_if_fail (self);
203
204         priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self);
205
206         /* folder view signals */
207         g_signal_connect (G_OBJECT(priv->folder_view), "folder_selected",
208                           G_CALLBACK(on_folder_clicked), self);
209         /* header view signals */
210         g_signal_connect (G_OBJECT(priv->header_view), "message_selected",
211                           G_CALLBACK(on_message_selected), self);
212 //      g_signal_connect (G_OBJECT(priv->header_view), "row-activated",
213 //                        G_CALLBACK(on_header_activated), self);
214 //      g_signal_connect (G_OBJECT(header_view), "status_update",
215 //                        G_CALLBACK(on_headers_status_update), self);
216 }
217
218
219
220 static void
221 on_folder_clicked (ModestTnyFolderTreeView *folder_view, TnyMsgFolderIface *folder,
222                    ModestWidgetFactory *self)
223 {
224         ModestWidgetFactoryPrivate *priv;
225         priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self);
226         
227         modest_tny_header_tree_view_set_folder (priv->header_view, folder);
228 }
229
230
231 static void
232 on_message_selected (ModestTnyFolderTreeView *folder_view, TnyMsgIface *msg,
233                      ModestWidgetFactory *self)
234 {       
235         ModestWidgetFactoryPrivate *priv;
236         priv = MODEST_WIDGET_FACTORY_GET_PRIVATE(self);
237
238         modest_tny_msg_view_set_message (priv->msg_preview, msg);
239 }
240