2 * This file is a part of hildon
4 * Copyright (C) 2005, 2008 Nokia Corporation.
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free
18 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 * SECTION:hildon-picker-dialog
23 * @short_description: A utility widget that shows a #HildonTouchPicker widget
25 * HildonPickerDialog is a utility widget that shows a #HildonTouchPicker widget in
26 * a new dialog (see #GtkDialog for more information about this issue)
38 #include <gtk/gtkmarshal.h>
40 #include "hildon-touch-picker.h"
41 #include "hildon-picker-dialog.h"
43 #define _(String) dgettext("hildon-libs", String)
45 #define HILDON_PICKER_DIALOG_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HILDON_TYPE_PICKER_DIALOG, HildonPickerDialogPrivate))
47 G_DEFINE_TYPE (HildonPickerDialog, hildon_picker_dialog, GTK_TYPE_DIALOG)
49 struct _HildonPickerDialogPrivate
55 GtkWidget *title_label;
64 PROP_DONE_BUTTON_TEXT,
74 #define DEFAULT_DONE_BUTTON_TEXT "Done"
77 hildon_picker_dialog_set_property (GObject * object,
83 hildon_picker_dialog_get_property (GObject * object,
85 GValue * value, GParamSpec * pspec);
87 static void hildon_picker_dialog_realize (GtkWidget * widget);
89 /* private functions */
90 static gboolean requires_done_button (HildonPickerDialog * dialog);
93 _select_on_picker_changed_cb (HildonTouchPicker * dialog,
94 gint column, gpointer data);
97 _hildon_picker_dialog_set_picker (HildonPickerDialog * dialog,
98 HildonTouchPicker * picker);
101 _update_title_on_picker_changed_cb (HildonTouchPicker * picker,
102 gint column, gpointer data);
105 hildon_picker_dialog_class_init (HildonPickerDialogClass * class)
107 GObjectClass *gobject_class;
108 GtkObjectClass *object_class;
109 GtkWidgetClass *widget_class;
110 GtkContainerClass *container_class;
112 gobject_class = (GObjectClass *) class;
113 object_class = (GtkObjectClass *) class;
114 widget_class = (GtkWidgetClass *) class;
115 container_class = (GtkContainerClass *) class;
118 gobject_class->set_property = hildon_picker_dialog_set_property;
119 gobject_class->get_property = hildon_picker_dialog_get_property;
122 widget_class->realize = hildon_picker_dialog_realize;
124 /* HildonPickerDialog */
125 class->set_picker = _hildon_picker_dialog_set_picker;
135 g_object_class_install_property (gobject_class,
136 PROP_DONE_BUTTON_TEXT,
137 g_param_spec_string ("done-button-text",
140 DEFAULT_DONE_BUTTON_TEXT,
145 g_type_class_add_private (object_class, sizeof (HildonPickerDialogPrivate));
150 hildon_picker_dialog_init (HildonPickerDialog * dialog)
152 GtkWidget *separator = NULL;
154 dialog->priv = HILDON_PICKER_DIALOG_GET_PRIVATE (dialog);
156 dialog->priv->picker = NULL;
157 dialog->priv->button =
158 gtk_dialog_add_button (GTK_DIALOG (dialog), "", GTK_RESPONSE_OK);
160 dialog->priv->title_label = gtk_label_new ("default value");
161 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
162 dialog->priv->title_label, FALSE, FALSE, 0);
163 separator = gtk_hseparator_new ();
164 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
165 separator, FALSE, FALSE, 0);
167 dialog->priv->signal_id = 0;
169 /* gtk_widget_show (dialog->priv->title_label); */
170 /* gtk_widget_show (separator); */
175 hildon_picker_dialog_set_property (GObject * object,
177 const GValue * value, GParamSpec * pspec)
179 HildonPickerDialogPrivate *priv = HILDON_PICKER_DIALOG_GET_PRIVATE (object);
183 case PROP_DONE_BUTTON_TEXT:
184 hildon_picker_dialog_set_done_label (HILDON_PICKER_DIALOG (object),
185 g_value_get_string (value));
188 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
194 hildon_picker_dialog_get_property (GObject * object,
196 GValue * value, GParamSpec * pspec)
198 HildonPickerDialog *dialog;
199 HildonPickerDialogPrivate *priv;
201 dialog = HILDON_PICKER_DIALOG (object);
202 priv = HILDON_PICKER_DIALOG_GET_PRIVATE (object);
205 case PROP_DONE_BUTTON_TEXT:
206 g_value_set_string (value, hildon_picker_dialog_get_done_label (dialog));
209 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
216 hildon_picker_dialog_realize (GtkWidget * widget)
218 GTK_WIDGET_CLASS (hildon_picker_dialog_parent_class)->realize (widget);
220 /* gdk_window_set_decorations (widget->window, GDK_DECOR_BORDER); */
223 /* ------------------------------ PRIVATE METHODS ---------------------------- */
225 _select_on_picker_changed_cb (HildonTouchPicker * picker,
226 gint column, gpointer data)
228 HildonPickerDialog *dialog = NULL;
230 g_return_if_fail (HILDON_IS_PICKER_DIALOG (data));
232 dialog = HILDON_PICKER_DIALOG (data);
234 gtk_dialog_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
238 _update_title_on_picker_changed_cb (HildonTouchPicker * picker,
239 gint column, gpointer data)
241 HildonPickerDialog *dialog = NULL;
242 gchar *new_title = NULL;
244 g_return_if_fail (HILDON_IS_PICKER_DIALOG (data));
246 dialog = HILDON_PICKER_DIALOG (data);
248 new_title = hildon_touch_picker_get_current_text (picker);
250 if (dialog->priv->title_label != NULL) {
251 /* gtk_label_set_text (GTK_LABEL(picker->priv->title_label), new_title); */
253 gtk_window_set_title (GTK_WINDOW (dialog), new_title);
260 hildon_picker_dialog_set_done_label (HildonPickerDialog * dialog,
263 HildonPickerDialogPrivate *priv;
265 g_return_if_fail (HILDON_IS_PICKER_DIALOG (dialog));
266 g_return_if_fail (label != NULL);
268 priv = HILDON_PICKER_DIALOG_GET_PRIVATE (dialog);
270 gtk_button_set_label (GTK_BUTTON (priv->button), label);
274 hildon_picker_dialog_get_done_label (HildonPickerDialog * dialog)
276 HildonPickerDialogPrivate *priv;
278 g_return_val_if_fail (HILDON_IS_PICKER_DIALOG (dialog), NULL);
280 priv = HILDON_PICKER_DIALOG_GET_PRIVATE (dialog);
282 return gtk_button_get_label (GTK_BUTTON (priv->button));
286 requires_done_button (HildonPickerDialog * dialog)
289 HildonTouchPickerSelectionMode mode =
290 HILDON_TOUCH_PICKER_SELECTION_MODE_SINGLE;
293 hildon_touch_picker_get_num_columns (HILDON_TOUCH_PICKER
294 (dialog->priv->picker));
296 hildon_touch_picker_get_column_selection_mode (HILDON_TOUCH_PICKER
297 (dialog->priv->picker));
299 return ((n_columns > 1)
300 || (mode == HILDON_TOUCH_PICKER_SELECTION_MODE_MULTIPLE));
304 /* ------------------------------ PUBLIC METHODS ---------------------------- */
307 * hildon_picker_dialog_new:
310 * Creates a new #HildonPickerDialog
312 * Returns: a new #HildonPickerDialog
315 hildon_picker_dialog_new (GtkWindow * parent)
317 GtkDialog *dialog = NULL;
319 dialog = g_object_new (HILDON_TYPE_PICKER_DIALOG, NULL);
322 gtk_window_set_transient_for (GTK_WINDOW (dialog), parent);
325 return GTK_WIDGET (dialog);
330 _hildon_picker_dialog_set_picker (HildonPickerDialog * dialog,
331 HildonTouchPicker * picker)
333 if (dialog->priv->picker != NULL) {
334 gtk_container_remove (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox),
335 dialog->priv->picker);
336 g_object_unref (dialog->priv->picker);
337 dialog->priv->picker = NULL;
340 dialog->priv->picker = GTK_WIDGET (picker);
342 if (dialog->priv->picker != NULL) {
343 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
344 dialog->priv->picker, TRUE, TRUE, 0);
345 gtk_widget_show (dialog->priv->picker);
346 g_object_ref (dialog->priv->picker);
349 if (dialog->priv->signal_id) {
350 g_signal_handler_disconnect (dialog->priv->picker,
351 dialog->priv->signal_id);
354 if (requires_done_button (dialog)) {
355 gtk_dialog_set_has_separator (GTK_DIALOG (dialog), TRUE);
356 gtk_widget_show (GTK_DIALOG (dialog)->action_area);
357 /* update the title */
358 dialog->priv->signal_id =
359 g_signal_connect (G_OBJECT (dialog->priv->picker), "changed",
360 G_CALLBACK (_update_title_on_picker_changed_cb),
363 gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
364 gtk_widget_hide (GTK_DIALOG (dialog)->action_area);
365 dialog->priv->signal_id =
366 g_signal_connect (G_OBJECT (dialog->priv->picker), "changed",
367 G_CALLBACK (_select_on_picker_changed_cb), dialog);
374 hildon_picker_dialog_set_picker (HildonPickerDialog * dialog,
375 HildonTouchPicker * picker)
377 g_return_val_if_fail (HILDON_IS_PICKER_DIALOG (dialog), FALSE);
378 g_return_val_if_fail (HILDON_IS_TOUCH_PICKER (picker), FALSE);
380 return HILDON_PICKER_DIALOG_GET_CLASS (dialog)->set_picker (dialog, picker);
384 hildon_picker_dialog_get_picker (HildonPickerDialog * dialog)
386 g_return_val_if_fail (HILDON_IS_PICKER_DIALOG (dialog), NULL);
388 return HILDON_TOUCH_PICKER (dialog->priv->picker);