* some bugs fixed
[modest] / src / modest-editor-window.c
1 /* modest-editor-window.c */
2
3 /* insert (c)/licensing information) */
4
5 #include "modest-ui.h"
6 #include "modest-editor-window.h"
7
8 /* 'private'/'protected' functions */
9 static void                      modest_editor_window_class_init    (ModestEditorWindowClass *klass);
10 static void                      modest_editor_window_init          (ModestEditorWindow *obj);
11 static void                      modest_editor_window_finalize      (GObject *obj);
12
13 /* list my signals */
14 enum {
15         /* MY_SIGNAL_1, */
16         /* MY_SIGNAL_2, */
17         LAST_SIGNAL
18 };
19
20 typedef struct _ModestEditorWindowPrivate ModestEditorWindowPrivate;
21 struct _ModestEditorWindowPrivate {
22         gpointer user_data;
23         gboolean modified;
24         GList *attachments;
25 };
26 #define MODEST_EDITOR_WINDOW_GET_PRIVATE(o)      (G_TYPE_INSTANCE_GET_PRIVATE((o), \
27                                                   MODEST_TYPE_EDITOR_WINDOW, \
28                                                   ModestEditorWindowPrivate))
29 /* globals */
30 static GtkWindowClass *parent_class = NULL;
31
32 /* uncomment the following if you have defined any signals */
33 /* static guint signals[LAST_SIGNAL] = {0}; */
34
35 GType
36 modest_editor_window_get_type (void)
37 {
38         static GType my_type = 0;
39         if (!my_type) {
40                 static const GTypeInfo my_info = {
41                         sizeof(ModestEditorWindowClass),
42                         NULL,           /* base init */
43                         NULL,           /* base finalize */
44                         (GClassInitFunc) modest_editor_window_class_init,
45                         NULL,           /* class finalize */
46                         NULL,           /* class data */
47                         sizeof(ModestEditorWindow),
48                         1,              /* n_preallocs */
49                         (GInstanceInitFunc) modest_editor_window_init,
50                 };
51                 my_type = g_type_register_static (GTK_TYPE_WINDOW,
52                                                   "ModestEditorWindow",
53                                                   &my_info, 0);
54         }
55         return my_type;
56 }
57
58 static void
59 modest_editor_window_class_init (ModestEditorWindowClass *klass)
60 {
61         GObjectClass *gobject_class;
62         gobject_class = (GObjectClass*) klass;
63
64         parent_class            = g_type_class_peek_parent (klass);
65         gobject_class->finalize = modest_editor_window_finalize;
66
67         g_type_class_add_private (gobject_class, sizeof(ModestEditorWindowPrivate));
68
69         /* signal definitions go here, e.g.: */
70 /*      signals[MY_SIGNAL_1] = */
71 /*              g_signal_new ("my_signal_1",....); */
72 /*      signals[MY_SIGNAL_2] = */
73 /*              g_signal_new ("my_signal_2",....); */
74 /*      etc. */
75 }
76
77 static void
78 modest_editor_window_init (ModestEditorWindow *obj)
79 {
80         ModestEditorWindowPrivate *priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(obj);
81
82         priv->user_data = NULL;
83         priv->modified = FALSE;
84         priv->attachments = NULL;
85 }
86
87 static void
88 modest_editor_window_finalize (GObject *obj)
89 {
90         ModestEditorWindowPrivate *priv;
91
92         priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(obj);
93
94         if (priv->user_data)
95                 g_free(priv->user_data);
96
97         G_OBJECT_CLASS(parent_class)->finalize (obj);
98 }
99
100 GtkWidget*
101 modest_editor_window_new (ModestUI *ui)
102 {
103         GObject *self;
104         ModestEditorWindowPrivate *priv;
105         GtkWidget *w;
106         gpointer data;
107
108         self = G_OBJECT(g_object_new(MODEST_TYPE_EDITOR_WINDOW, NULL));
109         priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(self);
110
111         /* for now create a local test-window */
112
113         data = NULL;
114         w = GTK_WIDGET(modest_ui_new_editor_window(ui, &data));
115         // g_message("new data = %p", data);
116         if (!w)
117                 return NULL;
118         if (!data)
119                 g_message("editor window user data is emtpy");
120
121         gtk_container_add(GTK_CONTAINER(self), w);
122         priv->user_data = data;
123         // g_message("new priv->data = %p", priv->user_data);
124         
125         return GTK_WIDGET(self);
126 }
127
128 /*
129  * return user defined data from a ModestEditorWindow instance
130  * like e.g. a refernce to a GladeXML*
131  */
132 gpointer modest_editor_window_get_data(ModestEditorWindow *edit_win)
133 {
134         ModestEditorWindowPrivate *priv;
135
136         if (!edit_win) {
137                 return NULL;
138         }
139         priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(edit_win);
140
141         // g_message("get priv->data = %p", priv->user_data);
142
143         return priv->user_data;
144 }
145
146 gboolean modest_editor_window_set_modified(ModestEditorWindow *edit_win, gboolean modified)
147 {
148         ModestEditorWindowPrivate *priv;
149
150         if (!edit_win) {
151                 return FALSE;
152         }
153         priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(edit_win);
154
155         priv->modified = modified;
156
157         return priv->modified;
158 }
159
160 gboolean modest_editor_window_get_modified(ModestEditorWindow *edit_win)
161 {
162         ModestEditorWindowPrivate *priv;
163
164         if (!edit_win) {
165                 return FALSE;
166         }
167         priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(edit_win);
168
169         // g_message("get priv->data = %p", priv->user_data);
170
171         return priv->modified;
172 }       
173
174 gboolean modest_editor_window_set_to_header(ModestEditorWindow *edit_win, const gchar *to)
175 {
176         ModestEditorWindowPrivate *priv;
177
178         
179         if (!edit_win)
180                 return FALSE;
181         priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(edit_win);
182
183         return modest_ui_editor_window_set_to_header(to, priv->user_data);
184 }
185
186
187 gboolean modest_editor_window_set_cc_header(ModestEditorWindow *edit_win, const gchar *cc)
188 {
189         ModestEditorWindowPrivate *priv;
190
191         
192         if (!edit_win)
193                 return FALSE;
194         priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(edit_win);
195
196         return modest_ui_editor_window_set_cc_header(cc, priv->user_data);
197 }
198
199 gboolean modest_editor_window_set_bcc_header(ModestEditorWindow *edit_win, const gchar *bcc)
200 {
201         ModestEditorWindowPrivate *priv;
202
203         
204         if (!edit_win)
205                 return FALSE;
206         priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(edit_win);
207
208         return modest_ui_editor_window_set_bcc_header(bcc, priv->user_data);
209 }
210
211 gboolean modest_editor_window_set_subject_header(ModestEditorWindow *edit_win, const gchar *subject)
212 {
213         ModestEditorWindowPrivate *priv;
214
215         
216         if (!edit_win)
217                 return FALSE;
218         priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(edit_win);
219
220         return modest_ui_editor_window_set_subject_header(subject, priv->user_data);
221 }
222
223 gboolean modest_editor_window_set_body(ModestEditorWindow *edit_win, const gchar *body)
224 {
225         ModestEditorWindowPrivate *priv;
226
227         
228         if (!edit_win)
229                 return FALSE;
230         priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(edit_win);
231
232         return modest_ui_editor_window_set_body(body, priv->user_data);
233 }
234
235
236 gboolean modest_editor_window_attach_file(ModestEditorWindow *edit_win, ModestTnyAttachment *attachment)
237 {
238         ModestEditorWindowPrivate *priv;
239
240         if (!edit_win)
241                 return FALSE;
242         priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(edit_win);
243         
244         priv->attachments = g_list_append(
245                                                         priv->attachments, 
246                                                         attachment);
247         
248         return modest_ui_editor_window_update_attachments(priv->user_data);
249 }
250
251 GList * modest_editor_window_set_attachments(ModestEditorWindow *edit_win, const GList* attachments)
252 {
253         ModestEditorWindowPrivate *priv;
254         GList *pos;
255
256         g_return_val_if_fail(edit_win, NULL);
257         
258         priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(edit_win);
259
260         modest_tny_attachment_free_list(priv->attachments);
261         priv->attachments = g_list_copy((GList *)attachments);
262         for (pos = priv->attachments ; pos ; pos = pos->next )
263                 g_object_ref(pos->data);
264         return priv->attachments;
265 }
266
267 GList * modest_editor_window_get_attachments(ModestEditorWindow *edit_win)
268 {
269         ModestEditorWindowPrivate *priv;
270
271         g_return_val_if_fail(edit_win, NULL);
272         
273         priv = MODEST_EDITOR_WINDOW_GET_PRIVATE(edit_win);
274         return priv->attachments;
275 }