* Removed close button from accounts view window
[modest] / src / hildon2 / modest-hildon-sort-dialog.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-defs.h"
31 #include "modest-text-utils.h"
32 #include "modest-hildon-sort-dialog.h"
33 #include "widgets/modest-sort-criterium-view.h"
34
35
36 static gint    modest_hildon_sort_dialog_add_sort_key  (ModestSortCriteriumView *self, const gchar *sort_key);
37 static void    modest_hildon_sort_dialog_set_sort_key (ModestSortCriteriumView *self, gint key);
38 static void    modest_hildon_sort_dialog_set_sort_order (ModestSortCriteriumView *self, GtkSortType sort_type);
39 static gint    modest_hildon_sort_dialog_get_sort_key (ModestSortCriteriumView *self);
40 static GtkSortType modest_hildon_sort_dialog_get_sort_order (ModestSortCriteriumView *self);
41 static void modest_sort_criterium_view_init (gpointer g_iface, gpointer iface_data);
42
43 G_DEFINE_TYPE_EXTENDED (ModestHildonSortDialog, 
44                         modest_hildon_sort_dialog, 
45                         HILDON_TYPE_PICKER_DIALOG,
46                         0,
47                         G_IMPLEMENT_INTERFACE (MODEST_TYPE_SORT_CRITERIUM_VIEW, modest_sort_criterium_view_init));
48
49 typedef struct _ModestHildonSortDialogPrivate ModestHildonSortDialogPrivate;
50 struct _ModestHildonSortDialogPrivate {
51         gint id;
52         GtkSortType sort_type;
53 };
54
55 #define MODEST_HILDON_SORT_DIALOG_GET_PRIVATE(o)   (G_TYPE_INSTANCE_GET_PRIVATE((o), \
56                                                     MODEST_TYPE_HILDON_SORT_DIALOG, \
57                                                     ModestHildonSortDialogPrivate))
58
59 enum {
60         MODEST_HILDON_SORT_DIALOG_RECIPIENT_AZ,
61         MODEST_HILDON_SORT_DIALOG_RECIPIENT_ZA,
62         MODEST_HILDON_SORT_DIALOG_DATE_NEWEST,
63         MODEST_HILDON_SORT_DIALOG_DATE_OLDEST,
64         MODEST_HILDON_SORT_DIALOG_SUBJECT_AZ,
65         MODEST_HILDON_SORT_DIALOG_SUBJECT_ZA,
66         MODEST_HILDON_SORT_DIALOG_ATTACHMENT,
67         MODEST_HILDON_SORT_DIALOG_SIZE_LARGEST,
68         MODEST_HILDON_SORT_DIALOG_SIZE_SMALLEST,
69         MODEST_HILDON_SORT_DIALOG_PRIORITY,
70         MODEST_HILDON_SORT_DIALOG_NUM_SORT_CRITERIUM
71 };
72
73 enum {
74         NAME_COLUMN,
75         ID_COLUMN,
76         NUM_COLUMS
77 };
78
79 static void
80 modest_hildon_sort_dialog_finalize (GObject *object)
81 {
82         G_OBJECT_CLASS (modest_hildon_sort_dialog_parent_class)->finalize (object);
83 }
84
85 static void
86 modest_hildon_sort_dialog_class_init (ModestHildonSortDialogClass *klass)
87 {
88         GObjectClass *object_class = G_OBJECT_CLASS (klass);
89
90         object_class->finalize = modest_hildon_sort_dialog_finalize;
91
92         g_type_class_add_private (object_class, sizeof(ModestHildonSortDialogClass));
93 }
94
95 static void
96 modest_hildon_sort_dialog_init (ModestHildonSortDialog *self)
97 {
98         ModestHildonSortDialogPrivate *priv;
99
100         priv = MODEST_HILDON_SORT_DIALOG_GET_PRIVATE(self);
101         priv->id = 0;
102         priv->sort_type = GTK_SORT_ASCENDING;
103 }
104
105 static gint
106 modest_hildon_sort_dialog_add_sort_key (ModestSortCriteriumView *self, const gchar *sort_key)
107 {
108         ModestHildonSortDialogPrivate *priv;
109
110         priv = MODEST_HILDON_SORT_DIALOG_GET_PRIVATE(self);
111
112         /* We return a different ID each time, it does not really
113            matter which one we return, we just want them to be
114            different */
115         return priv->id++;
116 }
117
118 static void
119 modest_hildon_sort_dialog_set_sort_key (ModestSortCriteriumView *self, gint key)
120 {
121         HildonTouchSelector *selector;
122         ModestHildonSortDialogPrivate *priv;
123         gint active;
124
125         g_return_if_fail (MODEST_IS_HILDON_SORT_DIALOG (self));
126
127         priv = MODEST_HILDON_SORT_DIALOG_GET_PRIVATE(self);
128         selector = hildon_picker_dialog_get_selector (HILDON_PICKER_DIALOG (self));
129
130         /* Map to our selector */
131         switch (key) {
132         case 0:
133                 if (priv->sort_type == GTK_SORT_ASCENDING)
134                         active = MODEST_HILDON_SORT_DIALOG_RECIPIENT_AZ;
135                 else
136                         active = MODEST_HILDON_SORT_DIALOG_RECIPIENT_ZA;
137                 break;
138         case 1:
139                 if (priv->sort_type == GTK_SORT_ASCENDING)
140                         active = MODEST_HILDON_SORT_DIALOG_DATE_OLDEST;
141                 else
142                         active = MODEST_HILDON_SORT_DIALOG_DATE_NEWEST;
143                 break;
144         case 2:
145                 if (priv->sort_type == GTK_SORT_ASCENDING)
146                         active = MODEST_HILDON_SORT_DIALOG_SUBJECT_AZ;
147                 else
148                         active = MODEST_HILDON_SORT_DIALOG_SUBJECT_ZA;
149                 break;
150         case 3:
151                 active = MODEST_HILDON_SORT_DIALOG_ATTACHMENT;
152                 break;
153         case 4:
154                 if (priv->sort_type == GTK_SORT_ASCENDING)
155                         active = MODEST_HILDON_SORT_DIALOG_SIZE_SMALLEST;
156                 else
157                         active = MODEST_HILDON_SORT_DIALOG_SIZE_LARGEST;
158                 break;
159         case 5:
160                 active = MODEST_HILDON_SORT_DIALOG_PRIORITY;
161                 break;
162         default:
163                 g_warning ("%s, no valid key found... falling back to default (0)", __FUNCTION__);
164                 active = 0;
165         }
166         hildon_touch_selector_set_active (selector, 0, active);
167 }
168
169 static void
170 modest_hildon_sort_dialog_set_sort_order (ModestSortCriteriumView *self, 
171                                           GtkSortType sort_type)
172 {
173         HildonTouchSelector *selector;
174         gint active, new;
175         ModestHildonSortDialogPrivate *priv;
176
177         g_return_if_fail (MODEST_IS_HILDON_SORT_DIALOG (self));
178
179         priv = MODEST_HILDON_SORT_DIALOG_GET_PRIVATE(self);
180         selector = hildon_picker_dialog_get_selector (HILDON_PICKER_DIALOG (self));
181         active = hildon_touch_selector_get_active (selector, 0);
182
183         /* Map to our selector, we need to check the current selected
184            key because this way we allow to select the order first and
185            then the key */
186         switch (active) {
187         case MODEST_HILDON_SORT_DIALOG_RECIPIENT_AZ:
188         case MODEST_HILDON_SORT_DIALOG_RECIPIENT_ZA:
189                 if (sort_type == GTK_SORT_ASCENDING)
190                         new = MODEST_HILDON_SORT_DIALOG_RECIPIENT_ZA;
191                 else
192                         new = MODEST_HILDON_SORT_DIALOG_RECIPIENT_AZ;
193                 break;
194         case MODEST_HILDON_SORT_DIALOG_DATE_NEWEST:
195         case MODEST_HILDON_SORT_DIALOG_DATE_OLDEST:
196                 if (sort_type == GTK_SORT_ASCENDING)
197                         new = MODEST_HILDON_SORT_DIALOG_DATE_NEWEST;
198                 else
199                         new = MODEST_HILDON_SORT_DIALOG_DATE_OLDEST;
200                 break;
201         case MODEST_HILDON_SORT_DIALOG_SUBJECT_AZ:
202         case MODEST_HILDON_SORT_DIALOG_SUBJECT_ZA:
203                 if (sort_type == GTK_SORT_ASCENDING)
204                         new = MODEST_HILDON_SORT_DIALOG_SUBJECT_ZA;
205                 else
206                         new = MODEST_HILDON_SORT_DIALOG_SUBJECT_AZ;
207                 break;
208         case MODEST_HILDON_SORT_DIALOG_ATTACHMENT:
209                 new = MODEST_HILDON_SORT_DIALOG_ATTACHMENT;
210                 break;
211         case MODEST_HILDON_SORT_DIALOG_SIZE_LARGEST:
212         case MODEST_HILDON_SORT_DIALOG_SIZE_SMALLEST:
213                 if (sort_type == GTK_SORT_ASCENDING)
214                         new = MODEST_HILDON_SORT_DIALOG_SIZE_SMALLEST;
215                 else
216                         new = MODEST_HILDON_SORT_DIALOG_SIZE_LARGEST;
217                 break;
218         case MODEST_HILDON_SORT_DIALOG_PRIORITY:
219                 new = MODEST_HILDON_SORT_DIALOG_PRIORITY;
220                 break;
221         default:
222                 g_warning ("%s, no valid key found... falling back to current (%d)", __FUNCTION__, active);
223                 new = active;
224         }
225
226         /* Activate the proper index */
227         hildon_touch_selector_set_active (selector, 0, new);
228         priv->sort_type = sort_type;
229 }
230
231 static gint
232 modest_hildon_sort_dialog_get_sort_key (ModestSortCriteriumView *self)
233 {
234         HildonTouchSelector *selector;
235         gint active;
236
237         g_return_val_if_fail (MODEST_IS_HILDON_SORT_DIALOG (self), 0);
238
239         selector = hildon_picker_dialog_get_selector (HILDON_PICKER_DIALOG (self));
240         active = hildon_touch_selector_get_active (selector, 0);
241
242         switch (active) {
243         case MODEST_HILDON_SORT_DIALOG_RECIPIENT_AZ:
244         case MODEST_HILDON_SORT_DIALOG_RECIPIENT_ZA:
245                 return 0;
246         case MODEST_HILDON_SORT_DIALOG_DATE_NEWEST:
247         case MODEST_HILDON_SORT_DIALOG_DATE_OLDEST:
248                 return 1;
249         case MODEST_HILDON_SORT_DIALOG_SUBJECT_AZ:
250         case MODEST_HILDON_SORT_DIALOG_SUBJECT_ZA:
251                 return 2;
252         case MODEST_HILDON_SORT_DIALOG_ATTACHMENT:
253                 return 3;
254         case MODEST_HILDON_SORT_DIALOG_SIZE_LARGEST:
255         case MODEST_HILDON_SORT_DIALOG_SIZE_SMALLEST:
256                 return 4;
257         case MODEST_HILDON_SORT_DIALOG_PRIORITY:
258                 return 5;
259         default:
260                 /* Default is order by ascending date */
261                 g_return_val_if_reached (1);
262                 return 1;
263         }
264 }
265
266 static GtkSortType 
267 modest_hildon_sort_dialog_get_sort_order (ModestSortCriteriumView *self)
268 {
269         HildonTouchSelector *selector;
270         GtkTreeModel *model;
271         GtkTreeIter iter;
272         gint id;
273
274         g_return_val_if_fail (MODEST_IS_HILDON_SORT_DIALOG (self), GTK_SORT_ASCENDING);
275
276         selector = hildon_picker_dialog_get_selector (HILDON_PICKER_DIALOG (self));
277         hildon_touch_selector_get_selected (selector, 0, &iter);
278
279         model = hildon_touch_selector_get_model (selector, 0);
280         gtk_tree_model_get (model, &iter, ID_COLUMN, &id, -1);
281
282         switch (id) {
283         case MODEST_HILDON_SORT_DIALOG_RECIPIENT_AZ:
284         case MODEST_HILDON_SORT_DIALOG_SUBJECT_AZ:
285         case MODEST_HILDON_SORT_DIALOG_DATE_OLDEST:
286         case MODEST_HILDON_SORT_DIALOG_SIZE_SMALLEST:
287                 return GTK_SORT_ASCENDING;
288         case MODEST_HILDON_SORT_DIALOG_RECIPIENT_ZA:
289         case MODEST_HILDON_SORT_DIALOG_DATE_NEWEST:
290         case MODEST_HILDON_SORT_DIALOG_SUBJECT_ZA:
291         case MODEST_HILDON_SORT_DIALOG_SIZE_LARGEST:    
292         case MODEST_HILDON_SORT_DIALOG_ATTACHMENT:
293         case MODEST_HILDON_SORT_DIALOG_PRIORITY:
294                 return GTK_SORT_DESCENDING;
295         default:
296                 /* Default is order by ascending date */
297                 g_return_val_if_reached (GTK_SORT_ASCENDING);
298                 return GTK_SORT_ASCENDING;
299         }
300 }
301
302 static void
303 modest_sort_criterium_view_init (gpointer g_iface,
304                                  gpointer iface_data)
305 {
306         ModestSortCriteriumViewIface *iface = (ModestSortCriteriumViewIface *) g_iface;
307
308         iface->add_sort_key_func = modest_hildon_sort_dialog_add_sort_key;
309         iface->get_sort_key_func = modest_hildon_sort_dialog_get_sort_key;
310         iface->set_sort_key_func = modest_hildon_sort_dialog_set_sort_key;
311         iface->get_sort_order_func = modest_hildon_sort_dialog_get_sort_order;
312         iface->set_sort_order_func = modest_hildon_sort_dialog_set_sort_order;
313 }
314
315 static void
316 modest_hildon_sort_dialog_fill (ModestHildonSortDialog *self)
317 {
318         GtkListStore *names_list;
319         GtkWidget *selector;
320         GtkTreeIter iter;
321         HildonTouchSelectorColumn *column;
322
323         /* Fill in model */
324         names_list = gtk_list_store_new (NUM_COLUMS, G_TYPE_STRING, G_TYPE_INT);
325         gtk_list_store_append (names_list, &iter);
326         gtk_list_store_set (names_list, &iter, NAME_COLUMN, _("mcen_li_sort_sender_recipient_az"), 
327                             ID_COLUMN, MODEST_HILDON_SORT_DIALOG_RECIPIENT_AZ, -1);
328         gtk_list_store_append (names_list, &iter);
329         gtk_list_store_set (names_list, &iter, NAME_COLUMN, _("mcen_li_sort_sender_recipient_za"), 
330                             ID_COLUMN, MODEST_HILDON_SORT_DIALOG_RECIPIENT_ZA, -1);
331         gtk_list_store_append (names_list, &iter);
332         gtk_list_store_set (names_list, &iter, NAME_COLUMN, _("mcen_li_sort_date_newest"), 
333                             ID_COLUMN, MODEST_HILDON_SORT_DIALOG_DATE_NEWEST, -1);
334         gtk_list_store_append (names_list, &iter);
335         gtk_list_store_set (names_list, &iter, NAME_COLUMN, _("mcen_li_sort_date_oldest"), 
336                             ID_COLUMN, MODEST_HILDON_SORT_DIALOG_DATE_OLDEST, -1);
337         gtk_list_store_append (names_list, &iter);
338         gtk_list_store_set (names_list, &iter, NAME_COLUMN, _("mcen_li_sort_subject_az"), 
339                             ID_COLUMN, MODEST_HILDON_SORT_DIALOG_SUBJECT_AZ, -1);
340         gtk_list_store_append (names_list, &iter);
341         gtk_list_store_set (names_list, &iter, NAME_COLUMN, _("mcen_li_sort_subject_za"), 
342                             ID_COLUMN, MODEST_HILDON_SORT_DIALOG_SUBJECT_ZA, -1);
343         gtk_list_store_append (names_list, &iter);
344         gtk_list_store_set (names_list, &iter, NAME_COLUMN, _("mcen_li_sort_attachment"), 
345                             ID_COLUMN, MODEST_HILDON_SORT_DIALOG_ATTACHMENT, -1);
346         gtk_list_store_append (names_list, &iter);
347         gtk_list_store_set (names_list, &iter, NAME_COLUMN, _("mcen_li_sort_size_largest"), 
348                             ID_COLUMN, MODEST_HILDON_SORT_DIALOG_SIZE_LARGEST, -1);
349         gtk_list_store_append (names_list, &iter);
350         gtk_list_store_set (names_list, &iter, NAME_COLUMN, _("mcen_li_sort_size_smallest"), 
351                             ID_COLUMN, MODEST_HILDON_SORT_DIALOG_SIZE_SMALLEST, -1);
352         gtk_list_store_append (names_list, &iter);
353         gtk_list_store_set (names_list, &iter, NAME_COLUMN, _("mcen_li_sort_priority"), 
354                             ID_COLUMN, MODEST_HILDON_SORT_DIALOG_PRIORITY, -1);
355
356         /* Add columns */
357         selector = hildon_touch_selector_new ();
358         column = hildon_touch_selector_append_text_column (HILDON_TOUCH_SELECTOR (selector), 
359                                                            GTK_TREE_MODEL (names_list), TRUE);
360         g_object_set (G_OBJECT (column), "text-column", NAME_COLUMN, NULL);
361
362         /* Set the selector */
363         hildon_picker_dialog_set_selector (HILDON_PICKER_DIALOG (self), HILDON_TOUCH_SELECTOR (selector));
364 }
365
366 GtkWidget*
367 modest_hildon_sort_dialog_new (GtkWindow *parent)
368 {
369         GtkWidget *result = g_object_new (MODEST_TYPE_HILDON_SORT_DIALOG, NULL);
370
371         modest_hildon_sort_dialog_fill (MODEST_HILDON_SORT_DIALOG (result));
372
373         if (parent)
374                 gtk_window_set_transient_for(GTK_WINDOW(result), parent);
375
376         /* Set title */
377         gtk_window_set_title (GTK_WINDOW (result), _CS("ckdg_ti_sort"));
378
379         return result;
380 }