39#include <glib/gi18n.h>
40#include <gdk/gdkkeysyms.h>
48#include "dialog-utils.h"
49#include "gnc-date-edit.h"
64static QofLogModule log_module = GNC_MOD_GUI;
65static guint date_edit_signals [LAST_SIGNAL] = { 0 };
67static void gnc_date_edit_dispose (GObject *
object);
68static void gnc_date_edit_finalize (GObject *
object);
69static void gnc_date_edit_forall (GtkContainer *container,
70 gboolean include_internals,
72 gpointer callbabck_data);
73static struct tm gnc_date_edit_get_date_internal (
GNCDateEdit *gde);
74static int date_accel_key_press(GtkWidget *widget,
78G_DEFINE_TYPE (
GNCDateEdit, gnc_date_edit, GTK_TYPE_BOX)
81gnc_strtok_r (
char *s,
const char *delim,
char **save_ptr)
89 s += strspn (s, delim);
95 s = strpbrk (token, delim);
98 *save_ptr = strchr (token,
'\0');
115 g_return_if_fail (GNC_IS_DATE_EDIT (gde));
117 ENTER(
"gde %p", gde);
119 window = gtk_widget_get_window (GTK_WIDGET(gde));
121 seat = gdk_display_get_default_seat (gdk_window_get_display (window));
122 pointer = gdk_seat_get_pointer (seat);
124 gtk_grab_remove (gde->cal_popup);
125 gtk_widget_hide (gde->cal_popup);
128 gdk_seat_ungrab (seat);
130 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gde->date_button),
137day_selected (GtkCalendar *calendar,
GNCDateEdit *gde)
140 guint year, month, day;
141 gde->in_selected_handler = TRUE;
142 gtk_calendar_get_date (calendar, &year, &month, &day);
144 t = gnc_dmy2time64 (day, month + 1, year);
145 gnc_date_edit_set_time (gde, t);
146 gde->in_selected_handler = FALSE;
150day_selected_double_click (GtkCalendar *calendar,
GNCDateEdit *gde)
152 gnc_date_edit_popdown (gde);
156delete_popup (GtkWidget *widget, GdkEvent *event, gpointer data)
161 gnc_date_edit_popdown (gde);
167key_press_popup (GtkWidget *widget, GdkEventKey *event, gpointer data)
171 if (event->keyval != GDK_KEY_Return &&
172 event->keyval != GDK_KEY_KP_Enter &&
173 event->keyval != GDK_KEY_Escape)
174 return date_accel_key_press(gde->date_entry, event, data);
177 g_signal_stop_emission_by_name (G_OBJECT (widget),
"key-press-event");
178 gnc_date_edit_popdown (gde);
187 gint bwidth, bheight;
191 gtk_widget_get_preferred_size (gde->cal_popup, &req, NULL);
193 gdk_window_get_origin (gtk_widget_get_window (gde->date_button), &x, &y);
195 gtk_widget_get_allocation (gde->date_button, &alloc);
198 bwidth = alloc.width;
199 bheight = alloc.height;
201 x += bwidth - req.width;
210 gtk_window_move (GTK_WINDOW (gde->cal_popup), x, y);
215popup_grab_on_window (GdkWindow *window,
218 guint32 activate_time)
220 GdkDisplay *display = gdk_window_get_display (window);
221 GdkSeat *seat = gdk_display_get_default_seat (display);
222 GdkEvent *
event = gtk_get_current_event ();
224 if (keyboard && gdk_seat_grab (seat, window, GDK_SEAT_CAPABILITY_KEYBOARD, TRUE, NULL,
225 event, NULL, NULL) != GDK_GRAB_SUCCESS)
228 if (pointer && gdk_seat_grab (seat, window, GDK_SEAT_CAPABILITY_POINTER, TRUE, NULL,
229 event, NULL, NULL) != GDK_GRAB_SUCCESS)
232 gdk_seat_ungrab (seat);
245 gboolean date_was_valid;
246 GdkDevice *device, *keyboard, *pointer;
248 g_return_if_fail (GNC_IS_DATE_EDIT (gde));
250 ENTER(
"gde %p", gde);
252 device = gtk_get_current_event_device ();
255 date_was_valid =
qof_scan_date (gtk_entry_get_text (GTK_ENTRY (gde->date_entry)),
256 &mtm.tm_mday, &mtm.tm_mon, &mtm.tm_year);
268 if (mtm.tm_year >= 1900)
274 gtk_calendar_select_day (GTK_CALENDAR (gde->calendar), 1);
275 gtk_calendar_select_month (GTK_CALENDAR (gde->calendar), mtm.tm_mon,
277 gtk_calendar_select_day (GTK_CALENDAR (gde->calendar), mtm.tm_mday);
281 toplevel = gtk_widget_get_toplevel (GTK_WIDGET (gde));
282 if (GTK_IS_WINDOW (toplevel))
284 gtk_window_group_add_window (
285 gtk_window_get_group (GTK_WINDOW (toplevel)),
286 GTK_WINDOW (gde->cal_popup));
287 gtk_window_set_transient_for (GTK_WINDOW (gde->cal_popup),
288 GTK_WINDOW (toplevel));
291 position_popup (gde);
293 gtk_widget_show (gde->cal_popup);
295 gtk_widget_grab_focus (gde->cal_popup);
296 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gde->date_button),
299 if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
302 pointer = gdk_device_get_associated_device (device);
307 keyboard = gdk_device_get_associated_device (device);
310 if (!gtk_widget_has_focus (gde->calendar))
311 gtk_widget_grab_focus (gde->calendar);
313 if (!popup_grab_on_window (gtk_widget_get_window ((GTK_WIDGET(gde->cal_popup))),
314 keyboard, pointer, GDK_CURRENT_TIME))
316 gtk_widget_hide (gde->cal_popup);
317 LEAVE(
"Failed to grab window");
321 gtk_grab_add (gde->cal_popup);
328gnc_date_edit_button_pressed (GtkWidget *widget,
329 GdkEventButton *event,
333 GtkWidget *ewidget = gtk_get_event_widget ((GdkEvent *)event);
335 ENTER(
"widget=%p, ewidget=%p, event=%p, gde=%p", widget, ewidget, event, gde);
338 if (ewidget == gde->cal_popup)
340 LEAVE(
"Press on calendar. Ignoring.");
345 if (ewidget != gde->date_button ||
346 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gde->date_button)))
348 LEAVE(
"Press, not on popup button, or while popup is raised.");
352 if (!gtk_widget_has_focus (gde->date_button))
353 gtk_widget_grab_focus (gde->date_button);
355 gde->popup_in_progress = TRUE;
357 gnc_date_edit_popup (gde);
359 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gde->date_button), TRUE);
361 LEAVE(
"Popup in progress.");
366gnc_date_edit_button_released (GtkWidget *widget,
367 GdkEventButton *event,
371 GtkWidget *ewidget = gtk_get_event_widget ((GdkEvent *)event);
372 gboolean popup_in_progress = FALSE;
374 ENTER(
"widget=%p, ewidget=%p, event=%p, gde=%p", widget, ewidget, event, gde);
376 if (gde->popup_in_progress)
378 popup_in_progress = TRUE;
379 gde->popup_in_progress = FALSE;
383 if (ewidget == gde->calendar)
385 LEAVE(
"Button release on calendar.");
389 if (ewidget == gde->date_button)
392 if (!popup_in_progress &&
393 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (gde->date_button)))
395 gnc_date_edit_popdown (gde);
396 LEAVE(
"Release on button, not in progress. Popped down.");
400 LEAVE(
"Button release on button. Allowing.");
405 gnc_date_edit_popdown (gde);
406 LEAVE(
"Release not on button or calendar. Popping down.");
411gnc_date_edit_button_toggled (GtkWidget *widget,
GNCDateEdit *gde)
413 ENTER(
"widget %p, gde %p", widget, gde);
415 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
417 if (!gde->popup_in_progress)
418 gnc_date_edit_popup (gde);
421 gnc_date_edit_popdown (gde);
433 model = gtk_combo_box_get_model(GTK_COMBO_BOX(gde->time_combo));
434 gtk_combo_box_get_active_iter (GTK_COMBO_BOX(gde->time_combo), &iter);
435 gtk_tree_model_get( model, &iter, 0, &text, -1 );
437 gtk_entry_set_text (GTK_ENTRY (gde->time_entry), text);
440 g_signal_emit (G_OBJECT (gde), date_edit_signals [TIME_CHANGED], 0);
444fill_time_combo (GtkWidget *widget,
GNCDateEdit *gde)
447 GtkTreeIter hour_iter, min_iter;
448 struct tm *tm_returned;
453 if (gde->lower_hour > gde->upper_hour)
456 model = gtk_combo_box_get_model (GTK_COMBO_BOX(gde->time_combo));
458 gtk_tree_store_clear (GTK_TREE_STORE(model));
462 g_return_if_fail(tm_returned != NULL);
464 for (i = gde->lower_hour; i <= gde->upper_hour; i++)
470 if (gde->flags & GNC_DATE_EDIT_24_HR)
473 qof_strftime (buffer,
sizeof (buffer),
"%I:00 %p ", &mtm);
475 gtk_tree_store_append (GTK_TREE_STORE(model), &hour_iter, NULL);
476 gtk_tree_store_set (GTK_TREE_STORE(model), &hour_iter, 0, buffer, -1);
478 for (j = 0; j < 60; j += 15)
482 if (gde->flags & GNC_DATE_EDIT_24_HR)
485 qof_strftime (buffer,
sizeof (buffer),
"%I:%M %p", &mtm);
487 gtk_tree_store_append(GTK_TREE_STORE(model), &min_iter, &hour_iter );
488 gtk_tree_store_set (GTK_TREE_STORE(model), &min_iter, 0, buffer, -1);
499 g_return_if_fail(mytm != NULL);
505 1900 + mytm->tm_year);
506 gtk_entry_set_text(GTK_ENTRY(gde->date_entry), buffer);
509 if (!gde->in_selected_handler)
511 gtk_calendar_select_day(GTK_CALENDAR (gde->calendar), 1);
512 gtk_calendar_select_month(GTK_CALENDAR (gde->calendar),
513 mytm->tm_mon, 1900 + mytm->tm_year);
514 gtk_calendar_select_day(GTK_CALENDAR (gde->calendar), mytm->tm_mday);
518 if (gde->flags & GNC_DATE_EDIT_24_HR)
521 qof_strftime (buffer,
sizeof (buffer),
"%I:%M %p", mytm);
522 gtk_entry_set_text(GTK_ENTRY(gde->time_entry), buffer);
526 g_signal_emit (gde, date_edit_signals [DATE_CHANGED], 0);
527 g_signal_emit (gde, date_edit_signals [TIME_CHANGED], 0);
539gnc_date_edit_get_property (GObject *
object,
549 g_value_set_int64 (value, gnc_date_edit_get_date (date_edit));
552 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
567gnc_date_edit_set_property (GObject *
object,
577 gnc_date_edit_set_time_internal (date_edit, g_value_get_int64(value));
580 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
588 GtkContainerClass *container_class = (GtkContainerClass *) klass;
589 GObjectClass *object_class = (GObjectClass *) klass;
591 container_class->forall = gnc_date_edit_forall;
592 object_class->set_property = gnc_date_edit_set_property;
593 object_class->get_property = gnc_date_edit_get_property;
594 object_class->dispose = gnc_date_edit_dispose;
595 object_class->finalize = gnc_date_edit_finalize;
597 date_edit_signals [TIME_CHANGED] =
598 g_signal_new (
"time_changed",
599 G_TYPE_FROM_CLASS (object_class),
603 g_cclosure_marshal_VOID__VOID,
606 date_edit_signals [DATE_CHANGED] =
607 g_signal_new (
"date_changed",
608 G_TYPE_FROM_CLASS (object_class),
612 g_cclosure_marshal_VOID__VOID,
615 g_object_class_install_property(object_class,
617 g_param_spec_int64(
"time",
618 "Date/time (seconds)",
619 "Date/time represented in seconds since midnight UTC, 1 January 1970",
625 klass->date_changed = NULL;
626 klass->time_changed = NULL;
632 gtk_orientable_set_orientation (GTK_ORIENTABLE(gde), GTK_ORIENTATION_HORIZONTAL);
635 gtk_widget_set_name (GTK_WIDGET(gde),
"gnc-id-date-edit");
637 gde->disposed = FALSE;
638 gde->popup_in_progress = FALSE;
640 gde->upper_hour = 19;
641 gde->flags = GNC_DATE_EDIT_SHOW_TIME;
642 gde->in_selected_handler = FALSE;
646gnc_date_edit_finalize (GObject *
object)
649 g_return_if_fail (
object != NULL);
650 g_return_if_fail (GNC_IS_DATE_EDIT (
object));
652 G_OBJECT_CLASS (gnc_date_edit_parent_class)->finalize (
object);
656gnc_date_edit_dispose (GObject *
object)
660 g_return_if_fail (
object != NULL);
661 g_return_if_fail (GNC_IS_DATE_EDIT (
object));
663 gde = GNC_DATE_EDIT (
object);
668 gde->disposed = TRUE;
672 gtk_widget_destroy (GTK_WIDGET(gde->date_entry));
673 gde->date_entry = NULL;
675 gtk_widget_destroy (GTK_WIDGET(gde->date_button));
676 gde->date_button = NULL;
678 gtk_widget_destroy (GTK_WIDGET(gde->time_entry));
679 gde->time_entry = NULL;
681 gtk_widget_destroy (GTK_WIDGET(gde->time_combo));
682 gde->time_combo = NULL;
684 G_OBJECT_CLASS (gnc_date_edit_parent_class)->dispose (
object);
688gnc_date_edit_forall (GtkContainer *container, gboolean include_internals,
689 GtkCallback callback, gpointer callback_data)
691 g_return_if_fail (container != NULL);
692 g_return_if_fail (GNC_IS_DATE_EDIT (container));
693 g_return_if_fail (callback != NULL);
697 if (!include_internals)
700 if (!GTK_CONTAINER_CLASS (gnc_date_edit_parent_class)->forall)
703 GTK_CONTAINER_CLASS (gnc_date_edit_parent_class)->forall (container,
720 g_return_if_fail (gde != NULL);
721 g_return_if_fail (GNC_IS_DATE_EDIT (gde));
725 gde->initial_time = the_time;
727 g_object_set (G_OBJECT (gde),
"time", the_time, NULL);
731gnc_date_edit_set_gdate (
GNCDateEdit *gde,
const GDate *date)
736 g_return_if_fail(gde && GNC_IS_DATE_EDIT(gde) &&
737 date && g_date_valid(date));
738 g_date_to_struct_tm(date, &mytm);
740 gnc_date_edit_set_time(gde, t);
753gnc_date_edit_set_popup_range (
GNCDateEdit *gde,
int low_hour,
int up_hour)
755 g_return_if_fail (gde != NULL);
756 g_return_if_fail (GNC_IS_DATE_EDIT (gde));
758 gde->lower_hour = low_hour;
759 gde->upper_hour = up_hour;
761 fill_time_combo(NULL, gde);
766date_accel_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data)
772 string = gtk_entry_get_text (GTK_ENTRY (widget));
774 tm = gnc_date_edit_get_date_internal (gde);
776 if (!gnc_handle_date_accelerator (event, &tm,
string))
779 gnc_date_edit_set_time (gde,
gnc_mktime (&tm));
781 g_signal_emit (G_OBJECT (gde), date_edit_signals [TIME_CHANGED], 0);
786key_press_entry (GtkWidget *widget, GdkEventKey *event, gpointer data)
788 if (!date_accel_key_press(widget, event, data))
791 g_signal_stop_emission_by_name (widget,
"key-press-event");
796date_focus_out_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
802 tm = gnc_date_edit_get_date_internal (gde);
803 gnc_date_edit_set_time (gde,
gnc_mktime (&tm));
805 g_signal_emit (gde, date_edit_signals [DATE_CHANGED], 0);
806 g_signal_emit (gde, date_edit_signals [TIME_CHANGED], 0);
818 GtkCellRenderer *cell;
821 gde->date_entry = gtk_entry_new ();
822 gtk_entry_set_width_chars (GTK_ENTRY (gde->date_entry), 11);
823 gtk_box_pack_start (GTK_BOX (gde), gde->date_entry, TRUE, TRUE, 0);
824 gtk_widget_show (GTK_WIDGET(gde->date_entry));
825 g_signal_connect (G_OBJECT (gde->date_entry),
"key-press-event",
826 G_CALLBACK (key_press_entry), gde);
827 g_signal_connect (G_OBJECT (gde->date_entry),
"focus-out-event",
828 G_CALLBACK (date_focus_out_event), gde);
831 gde->date_button = gtk_toggle_button_new ();
832 g_signal_connect (gde->date_button,
"button-press-event",
833 G_CALLBACK(gnc_date_edit_button_pressed), gde);
834 g_signal_connect (G_OBJECT (gde->date_button),
"toggled",
835 G_CALLBACK (gnc_date_edit_button_toggled), gde);
836 gtk_box_pack_start (GTK_BOX (gde), gde->date_button, FALSE, FALSE, 0);
838 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
839 gtk_box_set_homogeneous (GTK_BOX (hbox), FALSE);
840 gtk_container_add (GTK_CONTAINER (gde->date_button), hbox);
841 gtk_widget_show (GTK_WIDGET(hbox));
844 gde->cal_label = gtk_label_new (
_(
"Calendar"));
845 gnc_label_set_alignment (gde->cal_label, 0.0, 0.5);
846 gtk_box_pack_start (GTK_BOX (hbox), gde->cal_label, TRUE, TRUE, 0);
847 if (gde->flags & GNC_DATE_EDIT_SHOW_TIME)
848 gtk_widget_show (GTK_WIDGET(gde->cal_label));
851 arrow = gtk_image_new_from_icon_name (
"pan-down-symbolic", GTK_ICON_SIZE_BUTTON);
853 gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, FALSE, 0);
854 gtk_widget_show (GTK_WIDGET(arrow));
856 gtk_widget_show (GTK_WIDGET(gde->date_button));
859 gde->time_entry = gtk_entry_new ();
860 gtk_entry_set_max_length (GTK_ENTRY(gde->time_entry), 12);
861 gtk_widget_set_size_request (GTK_WIDGET(gde->time_entry), 88, -1);
862 gtk_box_pack_start (GTK_BOX (gde), gde->time_entry, TRUE, TRUE, 0);
864 store = gtk_tree_store_new(1, G_TYPE_STRING);
865 gde->time_combo = GTK_WIDGET(gtk_combo_box_new_with_model(GTK_TREE_MODEL(store)));
866 g_object_unref(store);
868 cell = gtk_cell_renderer_text_new();
870 gtk_cell_layout_pack_start( GTK_CELL_LAYOUT( gde->time_combo ), cell, TRUE );
872 gtk_cell_layout_set_attributes( GTK_CELL_LAYOUT( gde->time_combo ), cell,
"text", 0, NULL );
874 g_signal_connect (G_OBJECT (gde->time_combo),
"changed",
875 G_CALLBACK (set_time), gde);
877 gtk_box_pack_start (GTK_BOX (gde), gde->time_combo, FALSE, FALSE, 0);
883 g_signal_connect (G_OBJECT (gde),
"realize",
884 G_CALLBACK (fill_time_combo), gde);
886 if (gde->flags & GNC_DATE_EDIT_SHOW_TIME)
888 gtk_widget_show (GTK_WIDGET(gde->time_entry));
889 gtk_widget_show (GTK_WIDGET(gde->time_combo));
892 gde->cal_popup = gtk_window_new (GTK_WINDOW_POPUP);
893 gtk_widget_set_name (gde->cal_popup,
"gnc-date-edit-popup-window");
895 gtk_window_set_type_hint (GTK_WINDOW (gde->cal_popup),
896 GDK_WINDOW_TYPE_HINT_COMBO);
898 gtk_widget_set_events (GTK_WIDGET(gde->cal_popup),
899 gtk_widget_get_events (GTK_WIDGET(gde->cal_popup)) |
902 g_signal_connect (gde->cal_popup,
"delete-event",
903 G_CALLBACK(delete_popup), gde);
904 g_signal_connect (gde->cal_popup,
"key-press-event",
905 G_CALLBACK(key_press_popup), gde);
906 g_signal_connect (gde->cal_popup,
"button-press-event",
907 G_CALLBACK(gnc_date_edit_button_pressed), gde);
908 g_signal_connect (gde->cal_popup,
"button-release-event",
909 G_CALLBACK(gnc_date_edit_button_released), gde);
910 gtk_window_set_resizable (GTK_WINDOW (gde->cal_popup), FALSE);
911 gtk_window_set_screen (GTK_WINDOW (gde->cal_popup),
912 gtk_widget_get_screen (GTK_WIDGET (gde)));
914 frame = gtk_frame_new (NULL);
915 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
916 gtk_container_add (GTK_CONTAINER (gde->cal_popup), frame);
917 gtk_widget_show (GTK_WIDGET(frame));
919 gde->calendar = gtk_calendar_new ();
920 gtk_calendar_set_display_options
921 (GTK_CALENDAR (gde->calendar),
922 (GTK_CALENDAR_SHOW_DAY_NAMES
923 | GTK_CALENDAR_SHOW_HEADING));
924 g_signal_connect (gde->calendar,
"button-release-event",
925 G_CALLBACK(gnc_date_edit_button_released), gde);
926 g_signal_connect (G_OBJECT (gde->calendar),
"day-selected",
927 G_CALLBACK (day_selected), gde);
928 g_signal_connect (G_OBJECT (gde->calendar),
929 "day-selected-double-click",
930 G_CALLBACK (day_selected_double_click), gde);
931 gtk_container_add (GTK_CONTAINER (frame), gde->calendar);
932 gtk_widget_show (GTK_WIDGET(gde->calendar));
947gnc_date_edit_new (
time64 the_time,
int show_time,
int use_24_format)
949 return gnc_date_edit_new_flags
951 ((show_time ? GNC_DATE_EDIT_SHOW_TIME : 0)
952 | (use_24_format ? GNC_DATE_EDIT_24_HR : 0)));
962gnc_date_edit_new_glade (gchar *widget_name,
963 gchar *string1, gchar *string2,
964 gint int1, gint int2)
969 widget = gnc_date_edit_new(time(NULL), FALSE, FALSE);
970 gtk_widget_show(widget);
985gnc_date_edit_new_flags (
time64 the_time, GNCDateEditFlags flags)
989 gde = g_object_new (GNC_TYPE_DATE_EDIT, NULL, NULL);
992 gde->initial_time = -1;
993 create_children (gde);
994 gnc_date_edit_set_time (gde, the_time);
996 return GTK_WIDGET (gde);
1004 gchar *flags = NULL;
1005 gboolean date_was_valid;
1008 g_assert(gde != NULL);
1009 g_assert(GNC_IS_DATE_EDIT(gde));
1011 date_was_valid =
qof_scan_date (gtk_entry_get_text (GTK_ENTRY (gde->date_entry)),
1012 &tm.tm_mday, &tm.tm_mon, &tm.tm_year);
1014 if (!date_was_valid)
1028 if (gde->flags & GNC_DATE_EDIT_SHOW_TIME)
1033 str = g_strdup (gtk_entry_get_text
1034 (GTK_ENTRY (gde->time_entry)));
1035 temp = gnc_strtok_r (str,
": ", &tokp);
1038 tm.tm_hour = atoi (temp);
1039 temp = gnc_strtok_r (NULL,
": ", &tokp);
1042 if (isdigit (*temp))
1044 tm.tm_min = atoi (temp);
1045 flags = gnc_strtok_r (NULL,
": ",
1047 if (flags && isdigit (*flags))
1049 tm.tm_sec = atoi (flags);
1050 flags = gnc_strtok_r (NULL,
1060 if (flags && (strcasecmp (flags,
"PM") == 0))
1062 if (tm.tm_hour < 12)
1088 g_return_val_if_fail (gde != NULL, 0);
1089 g_return_val_if_fail (GNC_IS_DATE_EDIT (gde), 0);
1091 tm = gnc_date_edit_get_date_internal (gde);
1097gnc_date_edit_get_gdate (
GNCDateEdit *gde, GDate *date)
1101 g_return_if_fail (gde && date);
1102 g_return_if_fail (GNC_IS_DATE_EDIT (gde));
1104 t = gnc_date_edit_get_date(gde);
1105 g_date_clear (date, 1);
1121 g_return_val_if_fail (gde != NULL, 0);
1122 g_return_val_if_fail (GNC_IS_DATE_EDIT (gde), 0);
1124 tm = gnc_date_edit_get_date_internal (gde);
1125 gnc_tm_set_day_end(&tm);
1138gnc_date_edit_set_flags (
GNCDateEdit *gde, GNCDateEditFlags flags)
1140 GNCDateEditFlags old_flags;
1142 g_return_if_fail (gde != NULL);
1143 g_return_if_fail (GNC_IS_DATE_EDIT (gde));
1145 old_flags = gde->flags;
1148 if ((flags & GNC_DATE_EDIT_SHOW_TIME) !=
1149 (old_flags & GNC_DATE_EDIT_SHOW_TIME))
1151 if (flags & GNC_DATE_EDIT_SHOW_TIME)
1153 gtk_widget_show (gde->cal_label);
1154 gtk_widget_show (gde->time_entry);
1155 gtk_widget_show (gde->time_combo);
1159 gtk_widget_hide (gde->cal_label);
1160 gtk_widget_hide (gde->time_entry);
1161 gtk_widget_hide (gde->time_combo);
1165 if ((flags & GNC_DATE_EDIT_24_HR) != (old_flags & GNC_DATE_EDIT_24_HR))
1167 fill_time_combo (NULL, gde);
1182 g_return_val_if_fail (gde != NULL, 0);
1183 g_return_val_if_fail (GNC_IS_DATE_EDIT (gde), 0);
1198gnc_date_activates_default (
GNCDateEdit *gde, gboolean state)
1203 gtk_entry_set_activates_default(GTK_ENTRY(gde->date_entry), state);
1219 gtk_widget_grab_focus (gde->date_entry);
1229gnc_date_make_mnemonic_target (
GNCDateEdit *gde, GtkWidget *label)
1234 gtk_label_set_mnemonic_widget (GTK_LABEL(label), gde->date_entry);
Date and Time handling routines.
All type declarations for the whole Gnucash engine.
time64 gnc_mktime(struct tm *time)
calculate seconds from the epoch given a time struct
void gnc_tm_set_day_neutral(struct tm *tm)
The gnc_tm_set_day_neutral() inline routine will set the appropriate fields in the struct tm to indic...
#define MAX_DATE_LENGTH
The maximum length of a string created by the date printers.
struct tm * gnc_localtime_r(const time64 *secs, struct tm *time)
fill out a time struct from a 64-bit time value adjusted for the current time zone.
void gnc_gdate_set_time64(GDate *gd, time64 time)
Set a GDate to a time64.
void gnc_tm_get_today_neutral(struct tm *tm)
The gnc_tm_get_today_start() routine takes a pointer to a struct tm and fills it in with the timezone...
gboolean qof_scan_date(const char *buff, int *day, int *month, int *year)
qof_scan_date Convert a string into day / month / year integers according to the current dateFormat v...
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
void gnc_tm_free(struct tm *time)
free a struct tm* created with gnc_localtime() or gnc_gmtime()
time64 gnc_time(time64 *tbuf)
get the current time
struct tm * gnc_localtime(const time64 *secs)
fill out a time struct from a 64-bit time value.
gsize qof_strftime(gchar *buf, gsize max, const gchar *format, const struct tm *tm)
qof_strftime calls qof_format_time to print a given time and afterwards tries to put the result into ...
#define LEAVE(format, args...)
Print a function exit debugging message.
#define ENTER(format, args...)
Print a function entry debugging message.