2 * This file is a part of hildon
4 * Copyright (C) 2005, 2006 Nokia Corporation, all rights reserved.
6 * Contact: Rodrigo Novo <rodrigo.novo@nokia.com>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; version 2.1 of
11 * the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 * SECTION:hildon-sort-dialog
27 * @short_description: A widget for defining the sorting order of items.
29 * HildonSortDialog is used to define an order (ascending/descending)
30 * and a field by which items are sorted in a list. The combo boxes
31 * display the current value when the dialog is opened.
35 * #HildonSortDialog has been deprecated since Hildon 2.2
36 * See <link linkend="hildon-migrating-sort-dialogs">Migrating Sort Dialogs</link>
37 * section to know how to migrate this deprecated widget.
42 * <title>An example for using HildonSortDialog</title>
44 * HildonSortDialog *sort_dialog = HILDON_SORT_DIALOG (hildon_sort_dialog_new (parent));
46 * gint response_id, add_sort_index;
48 * sort_by[0] = STR_SORT_BY_DATE;
49 * sort_by[1] = STR_SORT_BY_NAME;
50 * sort_by[2] = STR_SORT_BY_SIZE;
53 * sorting_order[0] = STR_SORTING_ORDER_ASCENDING;
54 * sorting_order[1] = STR_SORTING_ORDER_DESCENDING;
55 * sorting_order[2] = NULL;
57 * add_sort_index = hildon_sort_dialog_add_sort_key (sort_dialog, STR_SORT_BY_DATE);
59 * hildon_sort_dialog_add_sort_key (sort_dialog, STR_SORT_BY_NAME);
61 * hildon_sort_dialog_add_sort_key (sort_dialog, STR_SORT_BY_SIZE);
63 * if (dialog.first_time_clicked == TRUE)
65 * hildon_sort_dialog_set_sort_key (sort_dialog, add_sort_index);
68 * if (dialog.first_time_clicked == FALSE)
70 * hildon_sort_dialog_set_sort_key (sort_dialog, dialog.sort_key);
71 * hildon_sort_dialog_set_sort_order (sort_dialog, dialog.sort_order);
74 * gtk_widget_show (GTK_WIDGET (sort_dialog));
76 * response_id = gtk_dialog_run (GTK_DIALOG (sort_dialog));
78 * if (response_id == GTK_RESPONSE_OK)
80 * dialog.sort_key = hildon_sort_dialog_get_sort_key (sort_dialog);
82 * gtk_label_set_text (GTK_LABEL (dialog.label1), sort_by [dialog.sort_key]);
84 * dialog.sort_order = hildon_sort_dialog_get_sort_order (sort_dialog);
86 * gtk_label_set_text (GTK_LABEL (dialog.label2), sorting_order [dialog.sort_order]);
88 * dialog.first_time_clicked = FALSE;
94 #undef HILDON_DISABLE_DEPRECATED
103 #include "hildon-sort-dialog.h"
104 #include "hildon-caption.h"
105 #include "hildon-sort-dialog-private.h"
108 dgettext("hildon-libs", String)
110 static GtkDialogClass* parent_class;
113 hildon_sort_dialog_class_init (HildonSortDialogClass *class);
116 hildon_sort_dialog_init (HildonSortDialog *widget);
119 hildon_sort_dialog_set_property (GObject * object,
125 hildon_sort_dialog_get_property (GObject *object,
131 reconstruct_combo (HildonSortDialog *dialog,
136 sort_key_changed (GtkWidget *widget,
137 HildonSortDialog *dialog);
140 hildon_sort_dialog_finalize (GObject *object);
143 hildon_sort_dialog_add_sort_key_with_sorting (HildonSortDialog *dialog,
144 const gchar *sort_key,
155 sort_key_changed (GtkWidget *widget,
156 HildonSortDialog *dialog)
158 g_return_if_fail (HILDON_IS_SORT_DIALOG (dialog));
160 HildonSortDialogPrivate *priv = HILDON_SORT_DIALOG_GET_PRIVATE (dialog);
163 gint index = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
164 g_return_if_fail (index < priv->index_counter && index > 0);
166 if (priv->key_reversed [index] != priv->reversed) {
167 reconstruct_combo (dialog, TRUE, priv->key_reversed [index]);
168 gtk_combo_box_set_active (GTK_COMBO_BOX (priv->combo_order), 0);
171 priv->reversed = priv->key_reversed [index];
174 /* Initialises the sort dialog class. */
176 hildon_sort_dialog_class_init (HildonSortDialogClass *class)
178 GObjectClass *gobject_class = G_OBJECT_CLASS (class);
179 parent_class = g_type_class_peek_parent (class);
180 g_type_class_add_private (class, sizeof (HildonSortDialogPrivate));
182 gobject_class->set_property = hildon_sort_dialog_set_property;
183 gobject_class->get_property = hildon_sort_dialog_get_property;
184 gobject_class->finalize = (gpointer) hildon_sort_dialog_finalize;
187 * HildonSortDialog:sort-key:
189 * The currently active sort key.
191 g_object_class_install_property (gobject_class, PROP_SORT_KEY,
192 g_param_spec_int ("sort-key",
194 "The currently active sort key",
197 0, G_PARAM_READWRITE));
200 * HildonSortDialog:sort-order:
202 * The sort order for the currently active sort key.
204 g_object_class_install_property (gobject_class, PROP_SORT_ORDER,
205 g_param_spec_enum ("sort-order",
207 "The current sorting order",
214 hildon_sort_dialog_add_sort_key_with_sorting (HildonSortDialog *dialog,
215 const gchar *sort_key,
218 HildonSortDialogPrivate *priv;
220 g_return_val_if_fail (HILDON_IS_SORT_DIALOG (dialog), -1);
221 g_return_val_if_fail (sort_key != NULL, -1);
223 priv = HILDON_SORT_DIALOG_GET_PRIVATE (dialog);
226 gboolean *new_array = g_malloc (sizeof (gboolean) * (priv->index_counter + 1));
228 /* Rewrite the old values */
230 for (i = 0; i < priv->index_counter; i++)
231 new_array [i] = priv->key_reversed [i];
233 new_array [priv->index_counter] = sorting;
234 gtk_combo_box_append_text (GTK_COMBO_BOX (priv->combo_key), sort_key);
236 /* Free the old one and reassign */
237 if (priv->key_reversed != NULL)
238 g_free (priv->key_reversed);
239 priv->key_reversed = new_array;
241 return priv->index_counter++;
245 reconstruct_combo (HildonSortDialog *dialog,
249 HildonSortDialogPrivate *priv;
250 priv = HILDON_SORT_DIALOG_GET_PRIVATE (dialog);
254 gtk_combo_box_remove_text (GTK_COMBO_BOX (priv->combo_order), 1);
255 gtk_combo_box_remove_text (GTK_COMBO_BOX (priv->combo_order), 0);
259 gtk_combo_box_append_text (GTK_COMBO_BOX (priv->combo_order), _("ckdg_va_sort_descending"));
260 gtk_combo_box_append_text (GTK_COMBO_BOX (priv->combo_order), _("ckdg_va_sort_ascending"));
262 gtk_combo_box_append_text (GTK_COMBO_BOX (priv->combo_order), _("ckdg_va_sort_ascending"));
263 gtk_combo_box_append_text (GTK_COMBO_BOX (priv->combo_order), _("ckdg_va_sort_descending"));
268 hildon_sort_dialog_init (HildonSortDialog * dialog)
270 HildonSortDialogPrivate *priv;
273 g_assert(HILDON_IS_SORT_DIALOG (dialog));
275 priv = HILDON_SORT_DIALOG_GET_PRIVATE (dialog);
278 priv->index_counter = 0;
279 priv->reversed = FALSE;
280 priv->key_reversed = NULL;
282 group = GTK_SIZE_GROUP (gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL));
284 gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
285 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
286 gtk_window_set_title (GTK_WINDOW (dialog), _("ckdg_ti_sort"));
289 priv->combo_key = gtk_combo_box_new_text ();
290 priv->caption_key = hildon_caption_new(group, _("ckdg_fi_sort_field"), priv->combo_key,
291 NULL, HILDON_CAPTION_OPTIONAL);
292 hildon_caption_set_separator(HILDON_CAPTION (priv->caption_key), "");
293 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
294 priv->caption_key, FALSE, FALSE, 0);
297 priv->combo_order = gtk_combo_box_new_text ();
298 reconstruct_combo (dialog, FALSE, FALSE);
300 priv->caption_order = hildon_caption_new (group, _("ckdg_fi_sort_order"),
302 NULL, HILDON_CAPTION_OPTIONAL);
303 hildon_caption_set_separator(HILDON_CAPTION(priv->caption_order), "");
304 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
305 priv->caption_order, FALSE, FALSE, 0);
307 gtk_combo_box_set_active (GTK_COMBO_BOX (priv->combo_key), 0);
308 gtk_combo_box_set_active (GTK_COMBO_BOX (priv->combo_order), 0);
309 g_signal_connect (G_OBJECT (priv->combo_key), "changed", (gpointer) sort_key_changed, dialog);
311 /* Create the OK/CANCEL buttons */
312 (void) gtk_dialog_add_button (GTK_DIALOG(dialog),
315 /* FIXME: Hardcoded sizes are bad */
316 gtk_window_resize (GTK_WINDOW (dialog), 370, 100);
317 gtk_widget_show_all (GTK_DIALOG (dialog)->vbox);
319 g_object_unref (group); /* Captions now own their references to sizegroup */
323 * hildon_sort_dialog_get_type:
325 * Returns GType for HildonSortDialog as produced by
326 * g_type_register_static().
328 * Returns: HildonSortDialog type
331 hildon_sort_dialog_get_type (void)
333 static GType dialog_type = 0;
336 static const GTypeInfo dialog_info = {
337 sizeof (HildonSortDialogClass),
338 NULL, /* base_init */
339 NULL, /* base_finalize */
340 (GClassInitFunc) hildon_sort_dialog_class_init,
341 NULL, /* class_finalize */
342 NULL, /* class_data */
343 sizeof (HildonSortDialog),
345 (GInstanceInitFunc) hildon_sort_dialog_init
348 dialog_type = g_type_register_static (GTK_TYPE_DIALOG,
356 * hildon_sort_dialog_new:
357 * @parent: widget to be transient for, or NULL if none
359 * HildonSortDialog contains two HildonCaptions with combo boxes.
361 * Returns: pointer to a new @HildonSortDialog widget
364 hildon_sort_dialog_new (GtkWindow * parent)
366 GtkWidget *sort_dialog = g_object_new (HILDON_TYPE_SORT_DIALOG, NULL);
369 gtk_window_set_transient_for (GTK_WINDOW (sort_dialog), parent);
375 * hildon_sort_dialog_get_sort_key:
376 * @dialog: the #HildonSortDialog widget
378 * Gets index to currently active sort key.
380 * Returns: an integer which is the index value of the "Sort by"
384 hildon_sort_dialog_get_sort_key (HildonSortDialog *dialog)
386 GtkWidget *combo_key;
387 HildonSortDialogPrivate *priv;
389 g_return_val_if_fail (HILDON_IS_SORT_DIALOG (dialog), -1);
391 priv = HILDON_SORT_DIALOG_GET_PRIVATE (dialog);
394 combo_key = gtk_bin_get_child (GTK_BIN (priv->caption_key));
396 return gtk_combo_box_get_active (GTK_COMBO_BOX (combo_key));
400 * hildon_sort_dialog_get_sort_order:
401 * @dialog: the #HildonSortDialog widget
403 * Gets current sorting order from "Sort order" field.
405 * Returns: current sorting order as #GtkSortType
408 hildon_sort_dialog_get_sort_order (HildonSortDialog *dialog)
410 GtkWidget *combo_order;
411 HildonSortDialogPrivate *priv;
413 g_return_val_if_fail (HILDON_IS_SORT_DIALOG (dialog), 0);
415 priv = HILDON_SORT_DIALOG_GET_PRIVATE (dialog);
418 combo_order = gtk_bin_get_child (GTK_BIN (priv->caption_order));
420 gint sort_order = gtk_combo_box_get_active (GTK_COMBO_BOX (combo_order));
423 return (sort_order == 0) ? 1 : 0;
429 * hildon_sort_dialog_set_sort_key:
430 * @dialog: the #HildonSortDialog widget
431 * @key: combo box's index value
433 * Sets the index value of the #HildonSortDialog widget.
436 hildon_sort_dialog_set_sort_key (HildonSortDialog * dialog,
439 GtkWidget *combo_key;
440 HildonSortDialogPrivate *priv;
442 g_return_if_fail (HILDON_IS_SORT_DIALOG (dialog));
444 priv = HILDON_SORT_DIALOG_GET_PRIVATE (dialog);
447 combo_key = gtk_bin_get_child (GTK_BIN (priv->caption_key));
448 gtk_combo_box_set_active (GTK_COMBO_BOX (combo_key), key);
450 g_object_notify (G_OBJECT (dialog), "sort-key");
454 * hildon_sort_dialog_set_sort_order:
455 * @dialog: the #HildonSortDialog widget
456 * @order: combo box's index value
458 * Sets the index value of the #HildonSortDialog widget.
461 hildon_sort_dialog_set_sort_order (HildonSortDialog *dialog,
464 GtkWidget *combo_order;
465 HildonSortDialogPrivate *priv;
467 g_return_if_fail (HILDON_IS_SORT_DIALOG (dialog));
469 priv = HILDON_SORT_DIALOG_GET_PRIVATE (dialog);
472 combo_order = gtk_bin_get_child (GTK_BIN (priv->caption_order));
475 order = (order == 0) ? 1 : 0;
477 gtk_combo_box_set_active (GTK_COMBO_BOX (combo_order), order);
479 g_object_notify (G_OBJECT (dialog), "sort-order");
483 * hildon_sort_dialog_add_sort_key:
484 * @dialog: the #HildonSortDialog widget
485 * @sort_key: combo box's index value
487 * Adds a new sort key and returns the respective index in
490 * Returns: an integer which is the index of the added combo box's
494 hildon_sort_dialog_add_sort_key (HildonSortDialog *dialog,
495 const gchar *sort_key)
497 return hildon_sort_dialog_add_sort_key_with_sorting (dialog, sort_key, FALSE);
501 * hildon_sort_dialog_add_sort_key_reversed:
502 * @dialog: the #HildonSortDialog widget
503 * @sort_key: combo box's index value
505 * Adds a new sort key and returns the respective index in
506 * sort key combobox. The default sort order for this key is reversed (Descending first).
508 * Returns: an integer which is the index of the added combo box's
513 hildon_sort_dialog_add_sort_key_reversed (HildonSortDialog *dialog,
514 const gchar *sort_key)
516 return hildon_sort_dialog_add_sort_key_with_sorting (dialog, sort_key, TRUE);
520 hildon_sort_dialog_set_property (GObject *object,
525 HildonSortDialog *dialog;
527 dialog = HILDON_SORT_DIALOG(object);
532 hildon_sort_dialog_set_sort_key (dialog, g_value_get_int (value));
535 case PROP_SORT_ORDER:
536 hildon_sort_dialog_set_sort_order (dialog, g_value_get_enum (value));
540 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
546 hildon_sort_dialog_get_property (GObject *object,
551 HildonSortDialog *dialog;
553 dialog = HILDON_SORT_DIALOG (object);
558 g_value_set_int (value, hildon_sort_dialog_get_sort_key (dialog));
561 case PROP_SORT_ORDER:
562 g_value_set_enum (value, hildon_sort_dialog_get_sort_order (dialog));
566 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
573 hildon_sort_dialog_finalize (GObject *object)
575 HildonSortDialogPrivate *priv;
576 HildonSortDialog *dialog;
578 dialog = HILDON_SORT_DIALOG (object);
579 priv = HILDON_SORT_DIALOG_GET_PRIVATE (dialog);
582 if (priv != NULL && priv->key_reversed != NULL)
583 g_free (priv->key_reversed);
585 if (G_OBJECT_CLASS (parent_class)->finalize)
586 G_OBJECT_CLASS (parent_class)->finalize(object);