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