* Added ModestWindowMgr object
[modest] / src / widgets / modest-window-mgr.c
1 /* Copyright (c) 2006,2007 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-window-mgr.h"
31 /* include other impl specific header files */
32
33 /* 'private'/'protected' functions */
34 static void modest_window_mgr_class_init (ModestWindowMgrClass *klass);
35 static void modest_window_mgr_init       (ModestWindowMgr *obj);
36 static void modest_window_mgr_finalize   (GObject *obj);
37 /* list my signals  */
38 enum {
39         /* MY_SIGNAL_1, */
40         /* MY_SIGNAL_2, */
41         LAST_SIGNAL
42 };
43
44 typedef struct _ModestWindowMgrPrivate ModestWindowMgrPrivate;
45 struct _ModestWindowMgrPrivate {
46         GList *window_list;
47 };
48 #define MODEST_WINDOW_MGR_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
49                                                MODEST_TYPE_WINDOW_MGR, \
50                                                ModestWindowMgrPrivate))
51 /* globals */
52 static GObjectClass *parent_class = NULL;
53
54 /* uncomment the following if you have defined any signals */
55 /* static guint signals[LAST_SIGNAL] = {0}; */
56
57 GType
58 modest_window_mgr_get_type (void)
59 {
60         static GType my_type = 0;
61         if (!my_type) {
62                 static const GTypeInfo my_info = {
63                         sizeof(ModestWindowMgrClass),
64                         NULL,           /* base init */
65                         NULL,           /* base finalize */
66                         (GClassInitFunc) modest_window_mgr_class_init,
67                         NULL,           /* class finalize */
68                         NULL,           /* class data */
69                         sizeof(ModestWindowMgr),
70                         1,              /* n_preallocs */
71                         (GInstanceInitFunc) modest_window_mgr_init,
72                         NULL
73                 };
74                 my_type = g_type_register_static (G_TYPE_OBJECT,
75                                                   "ModestWindowMgr",
76                                                   &my_info, 0);
77         }
78         return my_type;
79 }
80
81 static void
82 modest_window_mgr_class_init (ModestWindowMgrClass *klass)
83 {
84         GObjectClass *gobject_class;
85         gobject_class = (GObjectClass*) klass;
86
87         parent_class            = g_type_class_peek_parent (klass);
88         gobject_class->finalize = modest_window_mgr_finalize;
89
90         g_type_class_add_private (gobject_class, sizeof(ModestWindowMgrPrivate));
91 }
92
93 static void
94 modest_window_mgr_init (ModestWindowMgr *obj)
95 {
96         ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj);
97
98         priv->window_list = NULL;
99 }
100
101 static void
102 modest_window_mgr_finalize (GObject *obj)
103 {
104         ModestWindowMgrPrivate *priv = MODEST_WINDOW_MGR_GET_PRIVATE(obj);
105
106         if (priv->window_list) {
107                 GList *iter = priv->window_list;
108                 /* unregister pending windows */
109                 while (iter) {
110                         modest_window_mgr_unregister_window (MODEST_WINDOW_MGR (obj), 
111                                                              MODEST_WINDOW (iter->data));
112                         iter = g_list_next (iter);
113                 }
114                 g_list_free (priv->window_list);
115                 priv->window_list = NULL;
116         }
117
118         G_OBJECT_CLASS(parent_class)->finalize (obj);
119 }
120
121 ModestWindowMgr*
122 modest_window_mgr_new (void)
123 {
124         return MODEST_WINDOW_MGR(g_object_new(MODEST_TYPE_WINDOW_MGR, NULL));
125 }
126
127 void 
128 modest_window_mgr_register_window (ModestWindowMgr *self, 
129                                    ModestWindow *window)
130 {
131         GList *win;
132         ModestWindowMgrPrivate *priv;
133
134         g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
135         g_return_if_fail (MODEST_IS_WINDOW (window));
136
137         priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
138
139         win = g_list_find (priv->window_list, window);
140         if (win) {
141                 g_warning ("Trying to register an already registered window");
142                 return;
143         }
144
145         /* Add to list. Keep a reference to the window */
146         g_object_ref (window);
147         priv->window_list = g_list_prepend (priv->window_list, window);
148 }
149
150 void 
151 modest_window_mgr_unregister_window (ModestWindowMgr *self, 
152                                      ModestWindow *window)
153 {
154         GList *win;
155         ModestWindowMgrPrivate *priv;
156
157         g_return_if_fail (MODEST_IS_WINDOW_MGR (self));
158         g_return_if_fail (MODEST_IS_WINDOW (window));
159
160         priv = MODEST_WINDOW_MGR_GET_PRIVATE (self);
161
162         win = g_list_find (priv->window_list, window);
163         if (!win) {
164                 g_warning ("Trying to unregister a window that has not being registered yet");
165                 return;
166         }
167
168         /* Remove from list. Remove the reference to the window */
169         g_object_unref (win->data);
170         priv->window_list = g_list_remove_link (priv->window_list, win);
171 }
172
173 ModestWindow * 
174 modest_window_mgr_find_window_for_msgid (ModestWindowMgr *self, 
175                                          gchar *msgid, 
176                                          GType modest_window_type)
177 {
178         /* TODO */
179
180         return NULL;
181 }