1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2014 Maxime DOYEN
4 * This file is part of HomeBank.
6 * HomeBank is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * HomeBank 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
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include <gdk/gdkkeysyms.h>
27 #include "gtk-dateentry.h"
46 static void gtk_dateentry_class_init (GtkDateEntryClass
*klass
);
47 static void gtk_dateentry_init (GtkDateEntry
*dateentry
);
48 static void gtk_dateentry_destroy (GtkObject
*dateentry
);
49 static void gtk_dateentry_popup_display (GtkDateEntry
*dateentry
);
50 static gint
gtk_dateentry_arrow_press (GtkWidget
* widget
,
51 GtkDateEntry
* dateentry
);
52 static gint
gtk_dateentry_button_press (GtkWidget
*widget
,
56 static void gtk_dateentry_entry_parse(GtkWidget
* calendar
, gpointer user_data
);
57 static gint
gtk_dateentry_entry_key (GtkWidget
*widget
, GdkEventKey
*event
, gpointer user_data
);
58 static void gtk_dateentry_calendar_getfrom(GtkWidget
* calendar
, GtkDateEntry
* dateentry
);
59 static gint
gtk_dateentry_calendar_select(GtkWidget
* calendar
, gpointer user_data
);
60 static void gtk_dateentry_calendar_year(GtkWidget
* calendar
, GtkDateEntry
* dateentry
);
61 static void gtk_dateentry_hide_popdown_window(GtkDateEntry
*dateentry
);
62 static gint
gtk_dateentry_arrow_press (GtkWidget
* widget
, GtkDateEntry
* dateentry
);
63 static gint
key_press_popup (GtkWidget
*widget
, GdkEventKey
*event
, gpointer user_data
);
64 static gint
gtk_dateentry_button_press (GtkWidget
* widget
, GdkEvent
* event
, gpointer data
);
66 static void gtk_dateentry_entry_set_text(GtkDateEntry
* dateentry
);
70 gtk_dateentry_set_property (GObject *object,
76 gtk_dateentry_get_property (GObject *object,
82 static GtkHBoxClass
*parent_class
= NULL
;
83 static guint dateentry_signals
[LAST_SIGNAL
] = {0,};
87 // this is to be able to seizure d or d/m or m/d in the gtkdateentry
89 /* order of these in the current locale */
90 static GDateDMY dmy_order
[3] =
92 G_DATE_DAY
, G_DATE_MONTH
, G_DATE_YEAR
95 struct _GDateParseTokens
{
101 typedef struct _GDateParseTokens GDateParseTokens
;
106 g_date_fill_parse_tokens (const gchar
*str
, GDateParseTokens
*pt
)
108 gchar num
[4][NUM_LEN
+1];
112 DB( g_print("\n[dateentry] fill parse token\n") );
114 /* We count 4, but store 3; so we can give an error
117 num
[0][0] = num
[1][0] = num
[2][0] = num
[3][0] = '\0';
119 s
= (const guchar
*) str
;
121 while (*s
&& pt
->num_ints
< 4)
125 while (*s
&& g_ascii_isdigit (*s
) && i
< NUM_LEN
)
127 num
[pt
->num_ints
][i
] = *s
;
134 num
[pt
->num_ints
][i
] = '\0';
138 if (*s
== '\0') break;
143 pt
->n
[0] = pt
->num_ints
> 0 ? atoi (num
[0]) : 0;
144 pt
->n
[1] = pt
->num_ints
> 1 ? atoi (num
[1]) : 0;
145 pt
->n
[2] = pt
->num_ints
> 2 ? atoi (num
[2]) : 0;
149 static void g_date_determine_dmy(void)
153 GDateParseTokens testpt
;
156 DB( g_print("\n[dateentry] determine dmy\n") );
159 g_date_clear (&d
, 1); /* clear for scratch use */
162 /* had to pick a random day - don't change this, some strftimes
163 * are broken on some days, and this one is good so far. */
164 g_date_set_dmy (&d
, 4, 7, 1976);
166 g_date_strftime (buf
, 127, "%x", &d
);
168 g_date_fill_parse_tokens (buf
, &testpt
);
171 while (i
< testpt
.num_ints
)
176 dmy_order
[i
] = G_DATE_MONTH
;
179 dmy_order
[i
] = G_DATE_DAY
;
182 //using_twodigit_years = TRUE; /* FALL THRU */
184 dmy_order
[2] = G_DATE_YEAR
;
190 DB( g_print(" dmy legend: 0=day, 1=month, 2=year\n") );
191 DB( g_print(" dmy is: %d %d %d\n", dmy_order
[0], dmy_order
[1], dmy_order
[2]) );
199 gtk_dateentry_get_type ()
201 static GType dateentry_type
= 0;
203 //DB( g_print("\n[dateentry] get_type\n") );
207 static const GTypeInfo dateentry_info
=
209 sizeof (GtkDateEntryClass
),
210 NULL
, /* base_init */
211 NULL
, /* base_finalize */
212 (GClassInitFunc
) gtk_dateentry_class_init
,
213 NULL
, /* class_finalize */
214 NULL
, /* class_data */
215 sizeof (GtkDateEntry
),
217 (GInstanceInitFunc
) gtk_dateentry_init
,
221 //dateentry_type = gtk_type_unique (gtk_hbox_get_type (), &dateentry_info);
223 dateentry_type
= g_type_register_static (GTK_TYPE_HBOX
, "GtkDateEntry",
228 return dateentry_type
;
232 gtk_dateentry_class_init (GtkDateEntryClass
* klass
)
234 //GObjectClass *gobject_class;
235 GtkObjectClass
*object_class
;
236 //GtkWidgetClass *widget_class;
238 //gobject_class = (GObjectClass*) klass;
239 object_class
= (GtkObjectClass
*) klass
;
240 //widget_class = (GtkWidgetClass*) klass;
242 parent_class
= g_type_class_peek_parent (klass
);
244 DB( g_print("\n[dateentry] class_init\n") );
247 object_class
->destroy
= gtk_dateentry_destroy
;
249 dateentry_signals
[CHANGED
] =
250 g_signal_new ("changed",
251 G_OBJECT_CLASS_TYPE (klass
),
253 G_STRUCT_OFFSET (GtkDateEntryClass
, changed
),
255 g_cclosure_marshal_VOID__VOID
,
258 g_date_determine_dmy();
261 gobject_class->set_property = gtk_dateentry_set_property;
262 gobject_class->get_property = gtk_dateentry_get_property;
264 g_object_class_install_property (gobject_class,
266 g_param_spec_uint( "date",
268 "The date currently selected",
271 (G_PARAM_READABLE | G_PARAM_WRITABLE)
277 static gboolean
gtk_dateentry_focus(GtkWidget
*widget
,
278 GdkEventFocus
*event
,
281 GtkDateEntry
*dateentry
= user_data
;
283 DB( g_print("\n[dateentry] focus-out-event %d\n", gtk_widget_is_focus(GTK_WIDGET(dateentry
))) );
285 gtk_dateentry_entry_parse(GTK_WIDGET(dateentry
), dateentry
);
291 gtk_dateentry_init (GtkDateEntry
*dateentry
)
296 DB( g_print("\n[dateentry] init\n") );
298 /* initialize datas */
299 dateentry
->date
= g_date_new();
301 g_date_set_time_t(dateentry
->date
, time(NULL
));
303 g_date_set_dmy(&dateentry
->mindate
, 1, 1, 1900);
304 g_date_set_dmy(&dateentry
->maxdate
, 31, 12, 2200);
307 widget
=GTK_WIDGET(dateentry
);
308 gtk_box_set_homogeneous(GTK_BOX(widget
), FALSE
);
310 dateentry
->entry
= gtk_entry_new ();
311 gtk_widget_set_size_request(dateentry
->entry
, 90, -1);
312 gtk_box_pack_start (GTK_BOX (dateentry
), dateentry
->entry
, TRUE
, TRUE
, 0);
314 dateentry
->arrow
= gtk_toggle_button_new ();
315 arrow
= gtk_arrow_new (GTK_ARROW_DOWN
, GTK_SHADOW_IN
);
316 gtk_container_add (GTK_CONTAINER (dateentry
->arrow
), arrow
);
317 gtk_box_pack_end (GTK_BOX (dateentry
), dateentry
->arrow
, FALSE
, FALSE
, 0);
319 gtk_widget_show (dateentry
->entry
);
320 gtk_widget_show (dateentry
->arrow
);
323 /* our popup window */
324 dateentry
->popwin
= gtk_window_new (GTK_WINDOW_POPUP
);
325 gtk_widget_set_events (dateentry
->popwin
,
326 gtk_widget_get_events(dateentry
->popwin
) | GDK_KEY_PRESS_MASK
);
328 dateentry
->frame
= gtk_frame_new (NULL
);
329 gtk_container_add (GTK_CONTAINER (dateentry
->popwin
), dateentry
->frame
);
330 gtk_frame_set_shadow_type (GTK_FRAME (dateentry
->frame
), GTK_SHADOW_OUT
);
331 gtk_widget_show (dateentry
->frame
);
333 dateentry
->calendar
= gtk_calendar_new ();
334 gtk_container_add (GTK_CONTAINER (dateentry
->frame
), dateentry
->calendar
);
335 gtk_widget_show (dateentry
->calendar
);
338 g_signal_connect (GTK_OBJECT (dateentry
->entry
), "activate",
339 G_CALLBACK (gtk_dateentry_entry_parse
), dateentry
);
341 g_signal_connect (GTK_OBJECT (dateentry
->entry
), "focus-out-event",
342 G_CALLBACK (gtk_dateentry_focus
), dateentry
);
345 g_signal_connect (GTK_OBJECT (dateentry
->entry
), "key_press_event",
346 G_CALLBACK (gtk_dateentry_entry_key
), dateentry
);
348 // arrow/popwin signals
349 g_signal_connect (GTK_OBJECT (dateentry
->arrow
), "toggled",
350 G_CALLBACK (gtk_dateentry_arrow_press
), dateentry
);
352 g_signal_connect (GTK_OBJECT (dateentry
->popwin
), "key_press_event",
353 G_CALLBACK (key_press_popup
), dateentry
);
355 g_signal_connect (GTK_OBJECT (dateentry
->popwin
), "button_press_event",
356 G_CALLBACK (gtk_dateentry_button_press
), dateentry
);
359 g_signal_connect (GTK_OBJECT (dateentry
->calendar
), "prev-year",
360 G_CALLBACK (gtk_dateentry_calendar_year
), dateentry
);
361 g_signal_connect (GTK_OBJECT (dateentry
->calendar
), "next-year",
362 G_CALLBACK (gtk_dateentry_calendar_year
), dateentry
);
363 g_signal_connect (GTK_OBJECT (dateentry
->calendar
), "prev-month",
364 G_CALLBACK (gtk_dateentry_calendar_year
), dateentry
);
365 g_signal_connect (GTK_OBJECT (dateentry
->calendar
), "next-month",
366 G_CALLBACK (gtk_dateentry_calendar_year
), dateentry
);
368 g_signal_connect (GTK_OBJECT (dateentry
->calendar
), "day-selected",
369 G_CALLBACK (gtk_dateentry_calendar_getfrom
), dateentry
);
371 g_signal_connect (GTK_OBJECT (dateentry
->calendar
), "day-selected-double-click",
372 G_CALLBACK (gtk_dateentry_calendar_select
), dateentry
);
374 //gtk_dateentry_calendar_getfrom(NULL, dateentry);
378 GtkWidget
*gtk_dateentry_new ()
380 GtkDateEntry
*dateentry
;
382 DB( g_print("\n[dateentry] new\n") );
384 dateentry
= g_object_new (GTK_TYPE_DATE_ENTRY
, NULL
);
386 return GTK_WIDGET(dateentry
);
390 static void gtk_dateentry_destroy (GtkObject
* object
)
392 GtkDateEntry
*dateentry
;
394 DB( g_print(" \n[dateentry] destroy\n") );
396 g_return_if_fail (GTK_IS_DATE_ENTRY (object
));
398 dateentry
= GTK_DATE_ENTRY (object
);
400 DB( g_print(" free gtkentry: %p\n", dateentry
->entry
) );
401 DB( g_print(" free arrow: %p\n", dateentry
->arrow
) );
402 DB( g_print(" free popwin: %p\n", dateentry
->popwin
) );
404 DB( g_print(" free dateentry: %p\n", dateentry
) );
406 if(dateentry
->popwin
)
407 gtk_widget_destroy (dateentry
->popwin
);
408 dateentry
->popwin
= NULL
;
411 g_date_free(dateentry
->date
);
412 dateentry
->date
= NULL
;
414 GTK_OBJECT_CLASS (parent_class
)->destroy (object
);
420 void gtk_dateentry_set_date(GtkDateEntry
*dateentry
, guint32 julian_days
)
422 DB( g_print(" \n[dateentry] set date\n") );
424 g_return_if_fail (GTK_IS_DATE_ENTRY (dateentry
));
426 if(g_date_valid_julian(julian_days
))
428 g_date_set_julian (dateentry
->date
, julian_days
);
432 g_date_set_time_t(dateentry
->date
, time(NULL
));
434 gtk_dateentry_entry_set_text(dateentry
);
440 void gtk_dateentry_set_mindate(GtkDateEntry
*dateentry
, guint32 julian_days
)
442 DB( g_print(" \n[dateentry] set date\n") );
444 g_return_if_fail (GTK_IS_DATE_ENTRY (dateentry
));
446 if(g_date_valid_julian(julian_days
))
448 g_date_set_julian (&dateentry
->mindate
, julian_days
);
456 void gtk_dateentry_set_maxdate(GtkDateEntry
*dateentry
, guint32 julian_days
)
458 DB( g_print(" \n[dateentry] set date\n") );
460 g_return_if_fail (GTK_IS_DATE_ENTRY (dateentry
));
462 if(g_date_valid_julian(julian_days
))
464 g_date_set_julian (&dateentry
->maxdate
, julian_days
);
472 guint32
gtk_dateentry_get_date(GtkDateEntry
* dateentry
)
474 DB( g_print(" \n[dateentry] get date\n") );
476 g_return_val_if_fail (GTK_IS_DATE_ENTRY (dateentry
), 0);
478 return(g_date_get_julian(dateentry
->date
));
484 gtk_dateentry_set_property (GObject *object,
489 GtkDateEntry *dateentry = GTK_DATE_ENTRY (object);
491 DB( g_print("\n[dateentry] set %d\n", prop_id) );
497 DB( g_print(" -> date to %d\n", g_value_get_uint (value)) );
499 g_date_set_julian (dateentry->date, g_value_get_uint (value));
500 gtk_dateentry_entry_set_text(dateentry);
505 //G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
513 gtk_dateentry_get_property (GObject *object,
518 GtkDateEntry *dateentry = GTK_DATE_ENTRY (object);
520 DB( g_print("\n[dateentry] get\n") );
525 DB( g_print(" -> date is %d\n", 0) );
526 g_value_set_uint (value, g_date_get_julian(dateentry->date));
530 //G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
538 ** fill in our gtkentry from our GDate
540 static void gtk_dateentry_entry_set_text(GtkDateEntry
* dateentry
)
544 DB( g_print("\n[dateentry] date2entry\n") );
546 g_date_clamp(dateentry
->date
, &dateentry
->mindate
, &dateentry
->maxdate
);
549 if(g_date_valid(dateentry
->date
) == TRUE
)
551 g_date_strftime (buffer
, 256 - 1, "%x", dateentry
->date
);
552 gtk_entry_set_text (GTK_ENTRY (dateentry
->entry
), buffer
);
554 DB( g_print(" = %s\n", buffer
) );
557 gtk_entry_set_text (GTK_ENTRY (dateentry
->entry
), "??");
560 /* emit the signal */
561 if(dateentry
->lastdate
!= g_date_get_julian(dateentry
->date
))
563 DB( g_print(" **emit 'changed' signal**\n") );
565 g_signal_emit_by_name (dateentry
, "changed", NULL
, NULL
);
568 dateentry
->lastdate
= g_date_get_julian(dateentry
->date
);
573 static void gtk_dateentry_tokens(GtkWidget
*gtkentry
, gpointer user_data
)
575 GtkDateEntry
*dateentry
= user_data
;
579 str
= gtk_entry_get_text (GTK_ENTRY (dateentry
->entry
));
581 g_date_fill_parse_tokens(str
, &pt
);
582 DB( g_print(" -> parsetoken return is %d values :%d %d %d\n", pt
.num_ints
, pt
.n
[0], pt
.n
[1], pt
.n
[2]) );
584 // initialize with today's date
585 g_date_set_time_t(dateentry
->date
, time(NULL
));
587 switch( pt
.num_ints
)
590 DB( g_print(" -> seizured 1 number\n") );
591 if(g_date_valid_day(pt
.n
[0]))
592 g_date_set_day(dateentry
->date
, pt
.n
[0]);
595 DB( g_print(" -> seizured 2 numbers\n") );
596 if( dmy_order
[0] != G_DATE_YEAR
)
598 if( dmy_order
[0] == G_DATE_DAY
)
600 if(g_date_valid_day(pt
.n
[0]))
601 g_date_set_day(dateentry
->date
, pt
.n
[0]);
602 if(g_date_valid_month(pt
.n
[1]))
603 g_date_set_month(dateentry
->date
, pt
.n
[1]);
607 if(g_date_valid_day(pt
.n
[1]))
608 g_date_set_day(dateentry
->date
, pt
.n
[1]);
609 if(g_date_valid_month(pt
.n
[0]))
610 g_date_set_month(dateentry
->date
, pt
.n
[0]);
625 ** parse the gtkentry and store the GDate
627 static void gtk_dateentry_entry_parse(GtkWidget
*gtkentry
, gpointer user_data
)
629 GtkDateEntry
*dateentry
= user_data
;
632 DB( g_print("\n[dateentry] entry_parse\n") );
634 str
= gtk_entry_get_text (GTK_ENTRY (dateentry
->entry
));
636 //1) we parse the string according to the locale
637 g_date_set_parse (dateentry
->date
, str
);
638 if(g_date_valid(dateentry
->date
) == FALSE
)
640 //2) give a try to tokens: day, day/month, month/day
641 gtk_dateentry_tokens(gtkentry
, user_data
);
644 //3) at last if date still invalid, put today's dateentry_signals
645 // we should consider just warn the user here
646 if(g_date_valid(dateentry
->date
) == FALSE
)
649 g_date_set_time_t(dateentry
->date
, time(NULL
));
652 gtk_dateentry_entry_set_text(dateentry
);
656 static void gtk_dateentry_calendar_year(GtkWidget
*calendar
, GtkDateEntry
*dateentry
)
658 guint year
, month
, day
;
660 DB( g_print(" (dateentry) year changed\n") );
662 gtk_calendar_get_date (GTK_CALENDAR (dateentry
->calendar
), &year
, &month
, &day
);
664 g_object_set(calendar
, "year", 1900, NULL
);
667 g_object_set(calendar
, "year", 2200, NULL
);
672 ** store the calendar date to GDate, update our gtkentry
674 static void gtk_dateentry_calendar_getfrom(GtkWidget
* calendar
, GtkDateEntry
* dateentry
)
676 guint year
, month
, day
;
678 DB( g_print(" (dateentry) get from calendar\n") );
680 gtk_calendar_get_date (GTK_CALENDAR (dateentry
->calendar
), &year
, &month
, &day
);
681 g_date_set_dmy (dateentry
->date
, day
, month
+ 1, year
);
682 gtk_dateentry_entry_set_text(dateentry
);
686 static gint
gtk_dateentry_calendar_select(GtkWidget
* calendar
, gpointer user_data
)
688 GtkDateEntry
*dateentry
= user_data
;
690 DB( g_print(" (dateentry) calendar_select\n") );
692 gtk_dateentry_hide_popdown_window(dateentry
);
693 gtk_dateentry_calendar_getfrom(NULL
, dateentry
);
699 gtk_dateentry_entry_key (GtkWidget
*widget
, GdkEventKey
*event
, gpointer user_data
)
701 GtkDateEntry
*dateentry
= user_data
;
703 DB( g_print("\n[dateentry] entry key pressed: state=%04x, keyval=%04x\n", event
->state
, event
->keyval
) );
705 if( event
->keyval
== GDK_KEY_Up
)
707 if( !(event
->state
& (GDK_SHIFT_MASK
| GDK_CONTROL_MASK
)) )
709 g_date_add_days (dateentry
->date
, 1);
710 gtk_dateentry_entry_set_text(dateentry
);
713 if( event
->state
& GDK_SHIFT_MASK
)
715 g_date_add_months (dateentry
->date
, 1);
716 gtk_dateentry_entry_set_text(dateentry
);
719 if( event
->state
& GDK_CONTROL_MASK
)
721 g_date_add_years (dateentry
->date
, 1);
722 gtk_dateentry_entry_set_text(dateentry
);
727 if( event
->keyval
== GDK_KEY_Down
)
729 if( !(event
->state
& (GDK_SHIFT_MASK
| GDK_CONTROL_MASK
)) )
731 g_date_subtract_days (dateentry
->date
, 1);
732 gtk_dateentry_entry_set_text(dateentry
);
735 if( event
->state
& GDK_SHIFT_MASK
)
737 g_date_subtract_months (dateentry
->date
, 1);
738 gtk_dateentry_entry_set_text(dateentry
);
741 if( event
->state
& GDK_CONTROL_MASK
)
743 g_date_subtract_years (dateentry
->date
, 1);
744 gtk_dateentry_entry_set_text(dateentry
);
754 position_popup (GtkDateEntry
* dateentry
)
757 gint bwidth
, bheight
;
759 GdkWindow
*gdkwindow
;
760 GtkAllocation allocation
;
762 DB( g_print("\n[dateentry] position popup\n") );
764 gtk_widget_size_request (dateentry
->popwin
, &req
);
766 gdkwindow
= gtk_widget_get_window(dateentry
->arrow
);
767 gdk_window_get_origin (gdkwindow
, &x
, &y
);
769 gtk_widget_get_allocation(dateentry
->arrow
, &allocation
);
772 bwidth
= allocation
.width
;
773 bheight
= allocation
.height
;
775 x
+= bwidth
- req
.width
;
784 gtk_window_move (GTK_WINDOW (dateentry
->popwin
), x
, y
);
790 gtk_dateentry_popup_display (GtkDateEntry
* dateentry
)
795 //gint height, width, x, y;
796 //gint old_width, old_height;
798 DB( g_print("\n[dateentry] popup_display\n****\n\n") );
800 //old_width = dateentry->popwin->allocation.width;
801 //old_height = dateentry->popwin->allocation.height;
805 str
= gtk_entry_get_text (GTK_ENTRY (dateentry
->entry
));
806 g_date_set_parse (dateentry
->date
, str
);
808 if(g_date_valid(dateentry
->date
) == TRUE
)
810 /* GtkCalendar expects month to be in 0-11 range (inclusive) */
811 month
= g_date_get_month (dateentry
->date
) - 1;
812 gtk_calendar_select_month (GTK_CALENDAR (dateentry
->calendar
),
813 CLAMP (month
, 0, 11),
814 g_date_get_year (dateentry
->date
));
815 gtk_calendar_select_day (GTK_CALENDAR (dateentry
->calendar
),
816 g_date_get_day (dateentry
->date
));
819 position_popup(dateentry
);
821 gtk_widget_show (dateentry
->popwin
);
823 gtk_grab_add (dateentry
->popwin
);
825 // this close the popup */
826 GdkWindow
*gdkwindow
;
827 gdkwindow
= gtk_widget_get_window(dateentry
->popwin
);
829 gdk_pointer_grab (gdkwindow
, TRUE
,
830 GDK_BUTTON_PRESS_MASK
|
831 GDK_BUTTON_RELEASE_MASK
|
832 GDK_POINTER_MOTION_MASK
,
833 NULL
, NULL
, GDK_CURRENT_TIME
);
838 gtk_dateentry_hide_popdown_window(GtkDateEntry
*dateentry
)
840 DB( g_print("\n[dateentry] hide_popdown_window\n") );
842 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dateentry
->arrow
), FALSE
);
844 gtk_grab_remove(dateentry
->popwin
);
845 gdk_pointer_ungrab(GDK_CURRENT_TIME
);
846 gtk_widget_hide(dateentry
->popwin
);
850 gtk_dateentry_arrow_press (GtkWidget
* widget
, GtkDateEntry
* dateentry
)
852 GtkToggleButton
*button
;
854 DB( g_print("\n[dateentry] arrow_press\n") );
856 button
= GTK_TOGGLE_BUTTON(widget
);
858 if(!gtk_toggle_button_get_active(button
)){
859 gtk_widget_hide (dateentry
->popwin
);
860 gtk_grab_remove (dateentry
->popwin
);
861 gdk_pointer_ungrab (GDK_CURRENT_TIME
);
863 gtk_dateentry_calendar_getfrom(NULL
, dateentry
);
867 gtk_dateentry_popup_display(dateentry
);
872 key_press_popup (GtkWidget
*widget
, GdkEventKey
*event
, gpointer user_data
)
874 GtkDateEntry
*dateentry
= user_data
;
877 DB( g_print("\n[dateentry] key pressed%d\n", event
->keyval
) );
879 if (event
->keyval
!= GDK_KEY_Escape
)
882 g_signal_stop_emission_by_name (widget
, "key_press_event");
884 gtk_dateentry_hide_popdown_window(dateentry
);
892 gtk_dateentry_button_press (GtkWidget
* widget
, GdkEvent
* event
, gpointer user_data
)
896 DB( g_print("\n[dateentry] button_press\n") );
898 child
= gtk_get_event_widget (event
);
906 child
= gtk_widget_get_parent(child
);
910 gtk_widget_hide (widget
);
911 gtk_grab_remove (widget
);
912 gdk_pointer_ungrab (GDK_CURRENT_TIME
);
913 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(GTK_DATE_ENTRY(user_data
)->arrow
), FALSE
);