* added ModestWidgetMemory, new generic system for saving/restoring widget
[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
32
33 #define PARAM_X           "x"
34 #define PARAM_Y           "y"
35 #define PARAM_HEIGHT      "height"
36 #define PARAM_WIDTH       "width"
37
38 #define PARAM_POS         "pos"
39
40
41 static gchar*
42 get_keyname (ModestConf *conf, const gchar *name, const gchar *param)
43 {
44         gchar *esc_name, *keyname;
45         esc_name = modest_conf_key_escape (conf, name);
46
47         keyname = g_strdup_printf ("%s/%s/%s",
48                                    MODEST_CONF_WIDGET_NAMESPACE, 
49                                    esc_name, param);
50         g_free (esc_name);
51         return keyname;
52 }
53
54
55 static gboolean
56 save_settings_window (ModestConf *conf, GtkWindow *win, const gchar *name)
57 {
58         gchar *key;
59
60         int x,y;
61         int height, width;
62         
63         gtk_window_get_size (win, &width, &height);
64         
65         key = get_keyname (conf, name, PARAM_HEIGHT);
66         modest_conf_set_int (conf, key, height, NULL);
67         g_free (key);
68         
69         key = get_keyname (conf, name, PARAM_WIDTH);
70         modest_conf_set_int (conf, key, width, NULL);
71         g_free (key);
72
73         return TRUE;
74 }
75
76
77 static gboolean
78 restore_settings_window (ModestConf *conf, GtkWindow *win, const gchar *name)
79 {
80         gchar *key;
81         int height = 0, width = 0;
82
83         key = get_keyname (conf, name, PARAM_HEIGHT);
84         
85         if (modest_conf_key_exists (conf, key, NULL))
86                 height = modest_conf_get_int (conf, key, NULL);
87
88         g_free (key);
89
90         key = get_keyname (conf, name, PARAM_WIDTH);
91         if (modest_conf_key_exists (conf, key, NULL))
92                 width = modest_conf_get_int (conf, key, NULL);
93
94         g_free (key);
95
96         if (height && width)
97                 gtk_window_set_default_size (win, width, height);
98
99         return TRUE;
100 }
101
102
103 static gboolean
104 save_settings_paned (ModestConf *conf, GtkPaned *paned, const gchar *name)
105 {
106         gchar *key;
107         int pos;
108
109         pos = gtk_paned_get_position (paned);
110         
111         key = get_keyname (conf, name, PARAM_POS);
112         modest_conf_set_int (conf, key, pos, NULL);
113         g_free (key);
114         
115         return TRUE;
116 }
117
118
119 static gboolean
120 restore_settings_paned (ModestConf *conf, GtkPaned *paned, const gchar *name)
121 {
122         gchar *key;
123         int pos;
124         
125         key = get_keyname (conf, name, PARAM_POS);
126         
127         if (modest_conf_key_exists (conf, key, NULL)) {
128                 pos = modest_conf_get_int (conf, key, NULL);
129                 gtk_paned_set_position (paned, pos);
130         }
131
132         g_free (key);
133         return TRUE;
134 }
135
136
137 gboolean
138 modest_widget_memory_save_settings (ModestConf *conf, GtkWidget *widget,
139                                     const gchar *name)
140 {
141         g_return_val_if_fail (conf, FALSE);
142         g_return_val_if_fail (widget, FALSE);
143         g_return_val_if_fail (name, FALSE);
144
145         if (GTK_IS_WINDOW(widget))
146                 save_settings_window (conf, (GtkWindow*)widget, name);
147         if (GTK_IS_PANED(widget))
148                 save_settings_paned (conf, (GtkPaned*)widget, name);
149         
150
151         
152 }
153
154 gboolean
155 modest_widget_memory_restore_settings (ModestConf *conf, GtkWidget *widget,
156                                        const gchar *name)
157 {
158         g_return_val_if_fail (conf, FALSE);
159         g_return_val_if_fail (widget, FALSE);
160         g_return_val_if_fail (name, FALSE);
161         
162         if (GTK_IS_WINDOW(widget))
163                 restore_settings_window (conf, (GtkWindow*)widget, name);
164         if (GTK_IS_PANED(widget))
165                 restore_settings_paned (conf, (GtkPaned*)widget, name);
166         
167         return TRUE;
168 }