2007-04-15 Sergio Villar Senin <svillar@igalia.com>
[modest] / src / modest-widget-memory.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-memory.h>
31 #include <modest-widget-memory-priv.h>
32
33 #include <modest-tny-platform-factory.h>
34 #include <modest-tny-folder.h>
35 #include <widgets/modest-header-view.h>
36 #include <widgets/modest-msg-view.h>
37 #include <widgets/modest-folder-view.h>
38 #include "widgets/modest-main-window.h"
39 #include <string.h>
40
41 gchar*
42 _modest_widget_memory_get_keyname (const gchar *name, const gchar *param)
43 {
44         gchar *esc_name, *keyname;
45
46         g_return_val_if_fail (name, NULL);
47         g_return_val_if_fail (param, NULL);
48         
49         esc_name = modest_conf_key_escape (name);
50
51         keyname = g_strdup_printf ("%s/%s/%s",
52                                    MODEST_CONF_WIDGET_NAMESPACE, 
53                                    esc_name, param);
54         g_free (esc_name);
55         return keyname;
56 }
57
58
59 gchar*
60 _modest_widget_memory_get_keyname_with_type (const gchar *name, guint type,
61                                              const gchar *param)
62 {
63         gchar *esc_name, *keyname;
64         
65         g_return_val_if_fail (name, NULL);
66         g_return_val_if_fail (param, NULL);
67
68         esc_name = modest_conf_key_escape (name);
69
70         keyname = g_strdup_printf ("%s/%s/%s_%d",
71                                    MODEST_CONF_WIDGET_NAMESPACE, 
72                                    esc_name, param, type);
73         g_free (esc_name);
74         return keyname;
75 }
76
77
78 gchar*
79 _modest_widget_memory_get_keyname_with_double_type (const gchar *name,
80                                                     guint type1, guint type2,
81                                                     const gchar *param)
82 {
83         gchar *esc_name, *keyname;
84         
85         g_return_val_if_fail (name, NULL);
86         g_return_val_if_fail (param, NULL);
87
88         esc_name = modest_conf_key_escape (name);
89
90         keyname = g_strdup_printf ("%s/%s/%s_%d_%d",
91                                    MODEST_CONF_WIDGET_NAMESPACE, 
92                                    esc_name, param, type1, type2);
93         g_free (esc_name);
94         return keyname;
95 }
96
97
98
99 static gboolean
100 save_settings_widget (ModestConf *conf, GtkWidget *widget, const gchar *name)
101 {
102         gchar *key;
103
104         key = _modest_widget_memory_get_keyname (name, MODEST_WIDGET_MEMORY_PARAM_HEIGHT);
105         modest_conf_set_int (conf, key, GTK_WIDGET(widget)->allocation.height, NULL);
106         g_free (key);
107         
108         key = _modest_widget_memory_get_keyname (name, MODEST_WIDGET_MEMORY_PARAM_WIDTH);
109         modest_conf_set_int (conf, key, GTK_WIDGET(widget)->allocation.width, NULL);
110         g_free (key);
111
112         return TRUE;
113 }
114
115
116 static gboolean
117 restore_settings_widget (ModestConf *conf, GtkWidget *widget, const gchar *name)
118 {
119         GtkRequisition req;
120         gchar *key;
121
122         key = _modest_widget_memory_get_keyname (name, MODEST_WIDGET_MEMORY_PARAM_HEIGHT);
123         
124         if (modest_conf_key_exists (conf, key, NULL))
125                 req.height = modest_conf_get_int (conf, key, NULL);
126
127         g_free (key);
128         
129         key = _modest_widget_memory_get_keyname (name, MODEST_WIDGET_MEMORY_PARAM_WIDTH);
130         if (modest_conf_key_exists (conf, key, NULL))
131                 req.width = modest_conf_get_int (conf, key, NULL);
132         g_free (key);
133
134         if (req.height && req.width) 
135                 gtk_widget_size_request (widget, &req);
136
137         return TRUE;
138
139 }
140
141
142
143 static gboolean
144 save_settings_window (ModestConf *conf, GtkWindow *win, const gchar *name)
145 {
146         gchar *key;
147         int height, width;
148         
149         gtk_window_get_size (win, &width, &height);
150         
151         key = _modest_widget_memory_get_keyname (name, MODEST_WIDGET_MEMORY_PARAM_HEIGHT);
152         modest_conf_set_int (conf, key, height, NULL);
153         g_free (key);
154         
155         key = _modest_widget_memory_get_keyname (name, MODEST_WIDGET_MEMORY_PARAM_WIDTH);
156         modest_conf_set_int (conf, key, width, NULL);
157         g_free (key);
158
159         /* Save also the main window style */
160         if (MODEST_IS_MAIN_WINDOW (win)) {
161                 ModestMainWindowStyle style = modest_main_window_get_style (MODEST_MAIN_WINDOW (win));
162
163                 key = _modest_widget_memory_get_keyname (name, MODEST_WIDGET_MEMORY_PARAM_WINDOW_STYLE);
164                 modest_conf_set_int (conf, key, style, NULL);
165                 g_free (key);
166         }
167         
168         return TRUE;
169 }
170
171
172 static gboolean
173 restore_settings_window (ModestConf *conf, GtkWindow *win, const gchar *name)
174 {
175         gchar *key;
176         int height = 0, width = 0;
177
178         key = _modest_widget_memory_get_keyname (name, MODEST_WIDGET_MEMORY_PARAM_HEIGHT);
179         
180         if (modest_conf_key_exists (conf, key, NULL))
181                 height = modest_conf_get_int (conf, key, NULL);
182
183         g_free (key);
184
185         key = _modest_widget_memory_get_keyname (name, MODEST_WIDGET_MEMORY_PARAM_WIDTH);
186         if (modest_conf_key_exists (conf, key, NULL))
187                 width = modest_conf_get_int (conf, key, NULL);
188
189         g_free (key);
190
191         if (height && width)
192                 gtk_window_set_default_size (win, width, height);
193
194         /* Restore also the main window style */
195         if (MODEST_IS_MAIN_WINDOW (win)) {
196                 ModestMainWindowStyle style;
197
198                 key = _modest_widget_memory_get_keyname (name, MODEST_WIDGET_MEMORY_PARAM_WINDOW_STYLE);
199                 if (modest_conf_key_exists (conf, key, NULL)) {
200                         style = (ModestMainWindowStyle) modest_conf_get_int (conf, key, NULL);          
201                         modest_main_window_set_style (MODEST_MAIN_WINDOW (win), style);
202                         g_free (key);
203                 }
204         }
205
206         return TRUE;
207 }
208
209
210 static gboolean
211 save_settings_paned (ModestConf *conf, GtkPaned *paned, const gchar *name)
212 {
213         gchar *key;
214         int pos;
215
216         pos = gtk_paned_get_position (paned);
217         
218         key = _modest_widget_memory_get_keyname (name, MODEST_WIDGET_MEMORY_PARAM_POS);
219         modest_conf_set_int (conf, key, pos, NULL);
220         g_free (key);
221         
222         return TRUE;
223 }
224
225
226 static gboolean
227 restore_settings_paned (ModestConf *conf, GtkPaned *paned, const gchar *name)
228 {
229         gchar *key;
230         int pos;
231         
232         key = _modest_widget_memory_get_keyname (name, MODEST_WIDGET_MEMORY_PARAM_POS);
233         
234         if (modest_conf_key_exists (conf, key, NULL)) {
235                 pos = modest_conf_get_int (conf, key, NULL);
236                 gtk_paned_set_position (paned, pos);
237         }
238
239         g_free (key);
240         return TRUE;
241 }
242
243
244 static gboolean
245 save_settings_header_view (ModestConf *conf, ModestHeaderView *header_view,
246                            const gchar *name)
247 {
248         gchar *key;
249         GString *str;
250         GList *cols, *cursor;
251         TnyFolder *folder;
252         TnyFolderType type;
253         ModestHeaderViewStyle style;
254
255         folder = modest_header_view_get_folder (header_view);
256         if (!folder || modest_header_view_is_empty (header_view))
257                 return TRUE; /* no non-empty folder: no settings */
258         
259         type  = modest_tny_folder_guess_folder_type (folder);
260         style = modest_header_view_get_style   (header_view);
261         
262         key = _modest_widget_memory_get_keyname_with_double_type (name, type, style,
263                                                                   MODEST_WIDGET_MEMORY_PARAM_COLUMN_WIDTH);
264
265         cursor = cols = modest_header_view_get_columns (header_view);
266         str = g_string_new (NULL);
267
268         /* NOTE: the exact details of this format are important, as they
269          * are also used in modest-init.
270          */
271         while (cursor) {
272
273                 int col_id, width;
274                 GtkTreeViewColumn *col;
275                 
276                 col    = GTK_TREE_VIEW_COLUMN (cursor->data);
277                 col_id = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(col),
278                                                             MODEST_HEADER_VIEW_COLUMN));
279                 width = gtk_tree_view_column_get_width (col);
280                 
281                 g_string_append_printf (str, "%d:%d ", col_id, width);
282                 cursor = g_list_next (cursor);
283         }
284
285         modest_conf_set_string (conf, key, str->str, NULL);
286
287         g_free (key);   
288         g_string_free (str, TRUE);
289         g_list_free (cols);
290         g_object_unref (G_OBJECT (folder));
291         
292         return TRUE;
293 }
294
295
296 static gboolean
297 restore_settings_header_view (ModestConf *conf, ModestHeaderView *header_view,
298                               const gchar *name)
299 {
300         gchar *key;
301         TnyFolder *folder;
302         TnyFolderType type;
303         ModestHeaderViewStyle style;
304
305         folder = modest_header_view_get_folder (header_view);
306         if (!folder || modest_header_view_is_empty (header_view))
307                 return TRUE; /* no non-empty folder: no settings */
308         
309         type = modest_tny_folder_guess_folder_type (folder);
310         style = modest_header_view_get_style   (header_view);
311
312         key = _modest_widget_memory_get_keyname_with_double_type (name, type, style,
313                                                                   MODEST_WIDGET_MEMORY_PARAM_COLUMN_WIDTH);
314         if (modest_conf_key_exists (conf, key, NULL)) {
315                 
316                 gchar *data, *cursor;
317                 guint col, width;
318                 GList *cols = NULL;
319                 GList *colwidths = NULL;
320         
321                 cursor = data = modest_conf_get_string (conf, key, NULL);
322                 while (cursor && sscanf (cursor, "%u:%u ", &col, &width) == 2) {
323                         cols      = g_list_append (cols, GINT_TO_POINTER(col));
324                         colwidths = g_list_append (colwidths, GINT_TO_POINTER(width));
325                         cursor = strchr (cursor + 1, ' ');
326                 }
327                 g_free (data);  
328                 
329                 if (cols) {
330                         GList *viewcolumns, *colcursor, *widthcursor;
331                         modest_header_view_set_columns (header_view, cols);
332
333                         widthcursor = colwidths;
334                         colcursor = viewcolumns = gtk_tree_view_get_columns (GTK_TREE_VIEW(header_view));
335                         while (colcursor && widthcursor) {
336                                 int width = GPOINTER_TO_INT(widthcursor->data);
337                                 if (width > 0)
338                                         gtk_tree_view_column_set_max_width(GTK_TREE_VIEW_COLUMN(colcursor->data),
339                                                                            width);
340                                 colcursor = g_list_next (colcursor);
341                                 widthcursor = g_list_next (widthcursor);
342                         }
343                         g_list_free (cols);
344                         g_list_free (colwidths);
345                         g_list_free (viewcolumns);
346                 }
347         }
348
349         g_free (key);
350         g_object_unref (G_OBJECT (folder));
351
352         return TRUE;
353 }
354
355
356
357 static gboolean
358 save_settings_folder_view (ModestConf *conf, ModestFolderView *folder_view,
359                            const gchar *name)
360 {
361         return TRUE; /* FIXME: implement this */
362 }
363
364 static gboolean
365 restore_settings_folder_view (ModestConf *conf, ModestFolderView *folder_view,
366                               const gchar *name)
367 {
368         return TRUE; /* FIXME: implement this */
369 }
370
371
372 static gboolean
373 save_settings_msg_view (ModestConf *conf, ModestMsgView *msg_view,
374                            const gchar *name)
375 {
376         return TRUE; /* FIXME: implement this */
377 }
378
379 static gboolean
380 restore_settings_msg_view (ModestConf *conf, ModestMsgView *msg_view,
381                               const gchar *name)
382 {
383         return TRUE; /* FIXME: implement this */
384 }
385
386
387
388 gboolean
389 modest_widget_memory_save (ModestConf *conf, GObject *widget, const gchar *name)
390 {
391         g_return_val_if_fail (conf, FALSE);
392         g_return_val_if_fail (widget, FALSE);
393         g_return_val_if_fail (name, FALSE);
394
395         if (GTK_IS_WINDOW(widget))
396                 return save_settings_window (conf, GTK_WINDOW(widget), name);
397         else if (GTK_IS_PANED(widget))
398                 return save_settings_paned (conf, GTK_PANED(widget), name);
399         else if (MODEST_IS_HEADER_VIEW(widget))
400                 return save_settings_header_view (conf, MODEST_HEADER_VIEW(widget), name);
401         else if (MODEST_IS_FOLDER_VIEW(widget))
402                 return save_settings_folder_view (conf, MODEST_FOLDER_VIEW(widget), name);
403         else if (MODEST_IS_MSG_VIEW(widget))
404                 return save_settings_msg_view (conf, MODEST_MSG_VIEW(widget), name);
405         else if (GTK_IS_WIDGET(widget))
406                 return save_settings_widget (conf, GTK_WIDGET(widget), name);
407         
408         g_printerr ("modest: %p (%s) is not a known widget\n", widget, name);   
409         return FALSE;
410 }
411
412
413
414 gboolean
415 modest_widget_memory_restore (ModestConf *conf, GObject *widget, const gchar *name)
416 {
417         g_return_val_if_fail (conf, FALSE);
418         g_return_val_if_fail (widget, FALSE);
419         g_return_val_if_fail (name, FALSE);
420         
421         if (GTK_IS_WINDOW(widget))
422                 return restore_settings_window (conf, GTK_WINDOW(widget), name);
423         else if (GTK_IS_PANED(widget))
424                 return restore_settings_paned (conf, GTK_PANED(widget), name);
425         else if (MODEST_IS_HEADER_VIEW(widget))
426                 return restore_settings_header_view (conf, MODEST_HEADER_VIEW(widget), name);
427         else if (MODEST_IS_FOLDER_VIEW(widget))
428                 return restore_settings_folder_view (conf, MODEST_FOLDER_VIEW(widget), name);
429         else if (MODEST_IS_MSG_VIEW(widget))
430                 return restore_settings_msg_view (conf, MODEST_MSG_VIEW(widget), name);
431         else if (GTK_IS_WIDGET(widget))
432                 return restore_settings_widget (conf, GTK_WIDGET(widget), name);
433         
434         g_printerr ("modest: %p (%s) is not a known widget\n", widget, name);
435         return FALSE;
436 }