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-calendar-popup
27 * @short_description: CalendarPopup allows choosing a date from a popup calendar.
28 * @see_also: #HildonDateEditor, #HildonTimeEditor
30 * HildonCalendarPopup is a dialog which contains a HildonCalendar. It
31 * also contains arrow buttons for changing the month/year. If an
32 * entered date is invalid, an information message will be shown.
36 * #HildonCalendarPopup has been deprecated since Hildon 2.2 and should not
37 * be used in newly written code.
38 * See <link linkend="hildon-migrating-date-widgets">Migrating Date Widgets</link>
39 * section to know how to migrate this deprecated widget.
44 * <title>HildonCalendarPopup example</title>
48 * GtkWidget *parent, *popup;
50 * // get current date into &y, &m, &d...
52 * gtk_widget_get_ancestor (GTK_WIDGET (data), GTK_TYPE_WINDOW);
53 * popup = hildon_calendar_popup_new (GTK_WINDOW (parent), y, m, d);
55 * result = gtk_dialog_run (GTK_DIALOG (popup));
58 * case GTK_RESPONSE_OK:
59 * case GTK_RESPONSE_ACCEPT:
61 * hildon_calendar_popup_get_date (HILDON_CALENDAR_POPUP (popup), &y, &m, &d);
63 * // here set the new date
65 * gtk_widget_destroy(popup);
73 #undef HILDON_DISABLE_DEPRECATED
84 #include <gdk/gdkkeysyms.h>
86 #include "hildon-calendar-popup.h"
87 #include "hildon-calendar-popup-private.h"
88 #include "hildon-calendar.h"
91 dgettext("hildon-libs", String)
102 hildon_calendar_popup_class_init (HildonCalendarPopupClass *cal_class);
105 hildon_calendar_popup_init (HildonCalendarPopup *cal);
108 hildon_calendar_selected_date (GtkWidget *self,
112 hildon_key_pressed (GtkWidget *widget,
117 hildon_calendar_popup_set_property (GObject *object,
119 const GValue * value,
122 hildon_calendar_popup_get_property (GObject *object,
127 static GtkDialog* parent_class;
140 hildon_calendar_popup_get_type (void)
142 static GType popup_type = 0;
145 static const GTypeInfo popup_info = {
146 sizeof (HildonCalendarPopupClass),
147 NULL, /* base_init */
148 NULL, /* base_finalize */
149 (GClassInitFunc) hildon_calendar_popup_class_init,
150 NULL, /* class_finalize */
151 NULL, /* class_data */
152 sizeof (HildonCalendarPopup),
154 (GInstanceInitFunc) hildon_calendar_popup_init,
156 popup_type = g_type_register_static (GTK_TYPE_DIALOG,
157 "HildonCalendarPopup",
165 * hildon_calendar_popup_new:
166 * @parent: parent window for dialog
167 * @year: initial year
168 * @month: initial month
171 * This function returns a new HildonCalendarPopup. The initially
172 * selected date is specified by the parameters (year, month, day).
173 * If the specified date is invalid, the current date is used.
175 * Returns: new @HildonCalendarPopup widget
178 hildon_calendar_popup_new (GtkWindow *parent,
183 HildonCalendarPopup *cal = NULL;
185 /* Create new HildonCalendarPopup */
186 cal = HILDON_CALENDAR_POPUP (g_object_new (HILDON_TYPE_CALENDAR_POPUP,
187 "year", year, "month", month, "day", day,
191 gtk_window_set_transient_for (GTK_WINDOW(cal), parent);
194 return GTK_WIDGET (cal);
198 * hildon_calendar_popup_set_date:
199 * @cal: the @HildonCalendarPopup widget
204 * Activates a new date on the calendar popup.
207 hildon_calendar_popup_set_date (HildonCalendarPopup *cal,
212 guint dtmp, mtmp, ytmp = 0;
213 HildonCalendarPopupPrivate *priv;
215 g_return_if_fail (HILDON_IS_CALENDAR_POPUP (cal));
217 priv = HILDON_CALENDAR_POPUP_GET_PRIVATE (cal);
220 /* Choose current date if the date is invalid: */
221 init_dmy (year, month, day, &dtmp, &mtmp, &ytmp);
223 /* Remove all visual markers */
224 hildon_calendar_clear_marks (HILDON_CALENDAR (priv->cal));
227 hildon_calendar_select_month (HILDON_CALENDAR (priv->cal), mtmp - 1, ytmp);
228 hildon_calendar_select_day (HILDON_CALENDAR (priv->cal), dtmp);
232 * hildon_calendar_popup_get_date:
233 * @cal: the @HildonCalendarPopup widget
238 * Gets the currently selected year, month, and day.
239 * It's possible to pass NULL to any of the pointers if you don't need that data.
242 hildon_calendar_popup_get_date (HildonCalendarPopup *cal,
247 HildonCalendarPopupPrivate *priv;
249 g_return_if_fail (HILDON_IS_CALENDAR_POPUP (cal));
251 priv = HILDON_CALENDAR_POPUP_GET_PRIVATE (cal);
254 hildon_calendar_get_date (HILDON_CALENDAR (priv->cal), year, month, day);
261 ! g_date_valid_dmy (*day, *month, *year))
262 *day = g_date_get_days_in_month (*month, *year);
266 hildon_calendar_popup_class_init (HildonCalendarPopupClass *cal_class)
268 GObjectClass *object_class = G_OBJECT_CLASS (cal_class);
269 parent_class = g_type_class_peek_parent (cal_class);
271 object_class->set_property = hildon_calendar_popup_set_property;
272 object_class->get_property = hildon_calendar_popup_get_property;
274 g_type_class_add_private(cal_class, sizeof (HildonCalendarPopupPrivate));
276 /* Install new properties for the GObject_class */
278 g_object_class_install_property (object_class, PROP_MIN_YEAR,
279 g_param_spec_uint ("min-year",
280 "Minimum valid year",
281 "Minimum valid year",
286 g_object_class_install_property (object_class, PROP_MAX_YEAR,
287 g_param_spec_uint ("max-year",
288 "Maximum valid year",
289 "Maximum valid year",
294 g_object_class_install_property (object_class, PROP_DAY,
295 g_param_spec_int ("day",
297 "currently selected day",
303 g_object_class_install_property (object_class, PROP_MONTH,
304 g_param_spec_int ("month",
306 "currently selected month",
312 g_object_class_install_property (object_class, PROP_YEAR,
313 g_param_spec_int ("year",
315 "the currently selected year",
324 hildon_calendar_popup_init (HildonCalendarPopup *cal)
326 HildonCalendarPopupPrivate *priv;
327 static int set_domain = 1;
329 priv = HILDON_CALENDAR_POPUP_GET_PRIVATE(cal);
332 /* set the domain directory for different language */
333 /* FIXME I can't exactly figure out why is this here... */
335 (void) bindtextdomain ("hildon-libs", LOCALEDIR);
339 priv->cal = hildon_calendar_new ();
341 /* dialog options and packing */
342 hildon_calendar_set_display_options (HILDON_CALENDAR (priv->cal),
343 HILDON_CALENDAR_SHOW_HEADING |
344 HILDON_CALENDAR_SHOW_DAY_NAMES |
345 HILDON_CALENDAR_SHOW_WEEK_NUMBERS);
347 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (cal)->vbox), priv->cal,
349 gtk_dialog_set_has_separator (GTK_DIALOG (cal), FALSE);
350 gtk_dialog_add_button (GTK_DIALOG (cal), _("wdgt_bd_done"), GTK_RESPONSE_OK);
351 gtk_widget_show(priv->cal);
353 /* Connect signals */
354 g_signal_connect (G_OBJECT (priv->cal), "key-press-event",
355 G_CALLBACK (hildon_key_pressed), cal);
357 g_signal_connect (G_OBJECT (priv->cal), "selected_date",
358 G_CALLBACK (hildon_calendar_selected_date), cal);
360 /* set decorations, needs realizing first */
361 /* FIXME That should be moved to on_realize */
362 gtk_widget_realize (GTK_WIDGET (cal));
363 gdk_window_set_decorations (GTK_WIDGET (cal)->window, GDK_DECOR_BORDER);
367 * Signal handler for key-press-event. Closes the dialog for some
371 hildon_key_pressed (GtkWidget *widget,
375 g_assert (HILDON_IS_CALENDAR_POPUP (cal_popup));
377 /* Handle Return key press as OK response */
378 if (event->keyval == GDK_Return)
380 gtk_dialog_response (GTK_DIALOG (cal_popup), GTK_RESPONSE_OK);
384 /* Handle Esc key press as CANCEL response */
385 if ((event->keyval == GDK_Escape))
387 gtk_dialog_response (GTK_DIALOG (cal_popup), GTK_RESPONSE_CANCEL);
395 * Validates the given date or initializes it with the current date
398 init_dmy (guint year,
405 g_assert (d != NULL);
406 g_assert (m != NULL);
407 g_assert (y != NULL);
411 /* Initialize the date with a valid selected date */
412 if (g_date_valid_dmy (day, month, year)) {
418 /* If selected date is invalid initialize the date with current date */
419 g_date_clear (&date, 1);
420 g_date_set_time (&date, time (NULL));
422 *d = g_date_get_day (&date);
423 *m = g_date_get_month (&date);
424 *y = g_date_get_year (&date);
429 * Exits the dialog when "selected_date" signal is emmited. */
431 hildon_calendar_selected_date (GtkWidget *self,
434 g_assert (GTK_IS_WIDGET (self));
435 g_assert (HILDON_IS_CALENDAR_POPUP (cal_popup));
437 gtk_dialog_response (GTK_DIALOG (cal_popup), GTK_RESPONSE_OK);
442 hildon_calendar_popup_set_property (GObject *object,
447 HildonCalendarPopup *popup = HILDON_CALENDAR_POPUP (object);
449 HildonCalendarPopupPrivate *priv =
450 HILDON_CALENDAR_POPUP_GET_PRIVATE(HILDON_CALENDAR_POPUP (object));
453 switch (property_id) {
457 guint year, month, day = 0;
458 hildon_calendar_popup_get_date (popup, &year, &month, &day);
460 /*Verifies that the date is valid: */
461 hildon_calendar_popup_set_date (popup, year, month, g_value_get_int (value));
467 guint year, month, day = 0;
468 hildon_calendar_popup_get_date (popup, &year, &month, &day);
470 /*Verifies that the date is valid: */
471 hildon_calendar_popup_set_date (popup, year, g_value_get_int (value), day);
477 guint year, month, day = 0;
478 hildon_calendar_popup_get_date (popup, &year, &month, &day);
480 /*Verifies that the date is valid: */
481 hildon_calendar_popup_set_date (popup, g_value_get_int (value), month, day);
486 g_object_set_property (G_OBJECT (priv->cal), "min-year", value);
490 g_object_set_property (G_OBJECT (priv->cal), "max-year", value);
494 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
500 hildon_calendar_popup_get_property (GObject *object,
505 HildonCalendarPopupPrivate *priv =
506 HILDON_CALENDAR_POPUP_GET_PRIVATE (HILDON_CALENDAR_POPUP (object));
509 switch (property_id) {
512 g_object_get_property (G_OBJECT (priv->cal), pspec->name, value);
516 g_object_get_property (G_OBJECT (priv->cal), pspec->name, value);
520 g_object_get_property (G_OBJECT (priv->cal), pspec->name, value);
524 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);