39 #include <glib/gi18n.h> 40 #include <gdk/gdkkeysyms.h> 48 #include "dialog-utils.h" 49 #include "gnc-date-edit.h" 64 static QofLogModule log_module = GNC_MOD_GUI;
65 static guint date_edit_signals [LAST_SIGNAL] = { 0 };
67 static void gnc_date_edit_dispose (GObject *
object);
68 static void gnc_date_edit_finalize (GObject *
object);
69 static void gnc_date_edit_forall (GtkContainer *container,
70 gboolean include_internals,
72 gpointer callbabck_data);
73 static struct tm gnc_date_edit_get_date_internal (
GNCDateEdit *gde);
74 static int date_accel_key_press(GtkWidget *widget,
78 G_DEFINE_TYPE (
GNCDateEdit, gnc_date_edit, GTK_TYPE_BOX)
81 gnc_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),
137 day_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);
145 gnc_date_edit_set_time (gde, t);
146 gde->in_selected_handler = FALSE;
150 day_selected_double_click (GtkCalendar *calendar,
GNCDateEdit *gde)
152 gnc_date_edit_popdown (gde);
156 delete_popup (GtkWidget *widget, GdkEvent *event, gpointer data)
161 gnc_date_edit_popdown (gde);
167 key_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);
215 popup_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);
328 gnc_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.");
366 gnc_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.");
411 gnc_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);
444 fill_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));
460 g_return_if_fail(tm_returned != NULL);
462 for (i = gde->lower_hour; i <= gde->upper_hour; i++)
468 if (gde->flags & GNC_DATE_EDIT_24_HR)
471 qof_strftime (buffer,
sizeof (buffer),
"%I:00 %p ", &mtm);
473 gtk_tree_store_append (GTK_TREE_STORE(model), &hour_iter, NULL);
474 gtk_tree_store_set (GTK_TREE_STORE(model), &hour_iter, 0, buffer, -1);
476 for (j = 0; j < 60; j += 15)
480 if (gde->flags & GNC_DATE_EDIT_24_HR)
483 qof_strftime (buffer,
sizeof (buffer),
"%I:%M %p", &mtm);
485 gtk_tree_store_append(GTK_TREE_STORE(model), &min_iter, &hour_iter );
486 gtk_tree_store_set (GTK_TREE_STORE(model), &min_iter, 0, buffer, -1);
497 g_return_if_fail(mytm != NULL);
503 1900 + mytm->tm_year);
504 gtk_entry_set_text(GTK_ENTRY(gde->date_entry), buffer);
507 if (!gde->in_selected_handler)
509 gtk_calendar_select_day(GTK_CALENDAR (gde->calendar), 1);
510 gtk_calendar_select_month(GTK_CALENDAR (gde->calendar),
511 mytm->tm_mon, 1900 + mytm->tm_year);
512 gtk_calendar_select_day(GTK_CALENDAR (gde->calendar), mytm->tm_mday);
516 if (gde->flags & GNC_DATE_EDIT_24_HR)
519 qof_strftime (buffer,
sizeof (buffer),
"%I:%M %p", mytm);
520 gtk_entry_set_text(GTK_ENTRY(gde->time_entry), buffer);
524 g_signal_emit (gde, date_edit_signals [DATE_CHANGED], 0);
525 g_signal_emit (gde, date_edit_signals [TIME_CHANGED], 0);
537 gnc_date_edit_get_property (GObject *
object,
547 g_value_set_int64 (value, gnc_date_edit_get_date (date_edit));
550 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
565 gnc_date_edit_set_property (GObject *
object,
575 gnc_date_edit_set_time_internal (date_edit, g_value_get_int64(value));
578 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
586 GtkContainerClass *container_class = (GtkContainerClass *) klass;
587 GObjectClass *object_class = (GObjectClass *) klass;
589 container_class->forall = gnc_date_edit_forall;
590 object_class->set_property = gnc_date_edit_set_property;
591 object_class->get_property = gnc_date_edit_get_property;
592 object_class->dispose = gnc_date_edit_dispose;
593 object_class->finalize = gnc_date_edit_finalize;
595 date_edit_signals [TIME_CHANGED] =
596 g_signal_new (
"time_changed",
597 G_TYPE_FROM_CLASS (object_class),
601 g_cclosure_marshal_VOID__VOID,
604 date_edit_signals [DATE_CHANGED] =
605 g_signal_new (
"date_changed",
606 G_TYPE_FROM_CLASS (object_class),
610 g_cclosure_marshal_VOID__VOID,
613 g_object_class_install_property(object_class,
615 g_param_spec_int64(
"time",
616 "Date/time (seconds)",
617 "Date/time represented in seconds since midnight UTC, 1 January 1970",
623 klass->date_changed = NULL;
624 klass->time_changed = NULL;
630 gtk_orientable_set_orientation (GTK_ORIENTABLE(gde), GTK_ORIENTATION_HORIZONTAL);
633 gtk_widget_set_name (GTK_WIDGET(gde),
"gnc-id-date-edit");
635 gde->disposed = FALSE;
636 gde->popup_in_progress = FALSE;
638 gde->upper_hour = 19;
639 gde->flags = GNC_DATE_EDIT_SHOW_TIME;
640 gde->in_selected_handler = FALSE;
644 gnc_date_edit_finalize (GObject *
object)
647 g_return_if_fail (
object != NULL);
648 g_return_if_fail (GNC_IS_DATE_EDIT (
object));
650 G_OBJECT_CLASS (gnc_date_edit_parent_class)->finalize (
object);
654 gnc_date_edit_dispose (GObject *
object)
658 g_return_if_fail (
object != NULL);
659 g_return_if_fail (GNC_IS_DATE_EDIT (
object));
661 gde = GNC_DATE_EDIT (
object);
666 gde->disposed = TRUE;
670 gtk_widget_destroy (GTK_WIDGET(gde->date_entry));
671 gde->date_entry = NULL;
673 gtk_widget_destroy (GTK_WIDGET(gde->date_button));
674 gde->date_button = NULL;
676 gtk_widget_destroy (GTK_WIDGET(gde->time_entry));
677 gde->time_entry = NULL;
679 gtk_widget_destroy (GTK_WIDGET(gde->time_combo));
680 gde->time_combo = NULL;
682 G_OBJECT_CLASS (gnc_date_edit_parent_class)->dispose (
object);
686 gnc_date_edit_forall (GtkContainer *container, gboolean include_internals,
687 GtkCallback callback, gpointer callback_data)
689 g_return_if_fail (container != NULL);
690 g_return_if_fail (GNC_IS_DATE_EDIT (container));
691 g_return_if_fail (callback != NULL);
695 if (!include_internals)
698 if (!GTK_CONTAINER_CLASS (gnc_date_edit_parent_class)->forall)
701 GTK_CONTAINER_CLASS (gnc_date_edit_parent_class)->forall (container,
718 g_return_if_fail (gde != NULL);
719 g_return_if_fail (GNC_IS_DATE_EDIT (gde));
723 gde->initial_time = the_time;
725 g_object_set (G_OBJECT (gde),
"time", the_time, NULL);
729 gnc_date_edit_set_gdate (
GNCDateEdit *gde,
const GDate *date)
734 g_return_if_fail(gde && GNC_IS_DATE_EDIT(gde) &&
735 date && g_date_valid(date));
736 g_date_to_struct_tm(date, &mytm);
738 gnc_date_edit_set_time(gde, t);
751 gnc_date_edit_set_popup_range (
GNCDateEdit *gde,
int low_hour,
int up_hour)
753 g_return_if_fail (gde != NULL);
754 g_return_if_fail (GNC_IS_DATE_EDIT (gde));
756 gde->lower_hour = low_hour;
757 gde->upper_hour = up_hour;
759 fill_time_combo(NULL, gde);
764 date_accel_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data)
770 string = gtk_entry_get_text (GTK_ENTRY (widget));
772 tm = gnc_date_edit_get_date_internal (gde);
774 if (!gnc_handle_date_accelerator (event, &tm,
string))
777 gnc_date_edit_set_time (gde,
gnc_mktime (&tm));
779 g_signal_emit (G_OBJECT (gde), date_edit_signals [TIME_CHANGED], 0);
784 key_press_entry (GtkWidget *widget, GdkEventKey *event, gpointer data)
786 if (!date_accel_key_press(widget, event, data))
789 g_signal_stop_emission_by_name (widget,
"key-press-event");
794 date_focus_out_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
800 tm = gnc_date_edit_get_date_internal (gde);
801 gnc_date_edit_set_time (gde,
gnc_mktime (&tm));
803 g_signal_emit (gde, date_edit_signals [DATE_CHANGED], 0);
804 g_signal_emit (gde, date_edit_signals [TIME_CHANGED], 0);
816 GtkCellRenderer *cell;
819 gde->date_entry = gtk_entry_new ();
820 gtk_entry_set_width_chars (GTK_ENTRY (gde->date_entry), 11);
821 gtk_box_pack_start (GTK_BOX (gde), gde->date_entry, TRUE, TRUE, 0);
822 gtk_widget_show (GTK_WIDGET(gde->date_entry));
823 g_signal_connect (G_OBJECT (gde->date_entry),
"key-press-event",
824 G_CALLBACK (key_press_entry), gde);
825 g_signal_connect (G_OBJECT (gde->date_entry),
"focus-out-event",
826 G_CALLBACK (date_focus_out_event), gde);
829 gde->date_button = gtk_toggle_button_new ();
830 g_signal_connect (gde->date_button,
"button-press-event",
831 G_CALLBACK(gnc_date_edit_button_pressed), gde);
832 g_signal_connect (G_OBJECT (gde->date_button),
"toggled",
833 G_CALLBACK (gnc_date_edit_button_toggled), gde);
834 gtk_box_pack_start (GTK_BOX (gde), gde->date_button, FALSE, FALSE, 0);
836 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
837 gtk_box_set_homogeneous (GTK_BOX (hbox), FALSE);
838 gtk_container_add (GTK_CONTAINER (gde->date_button), hbox);
839 gtk_widget_show (GTK_WIDGET(hbox));
842 gde->cal_label = gtk_label_new (_(
"Calendar"));
843 gnc_label_set_alignment (gde->cal_label, 0.0, 0.5);
844 gtk_box_pack_start (GTK_BOX (hbox), gde->cal_label, TRUE, TRUE, 0);
845 if (gde->flags & GNC_DATE_EDIT_SHOW_TIME)
846 gtk_widget_show (GTK_WIDGET(gde->cal_label));
849 arrow = gtk_image_new_from_icon_name (
"pan-down-symbolic", GTK_ICON_SIZE_BUTTON);
851 gtk_box_pack_start (GTK_BOX (hbox), arrow, TRUE, FALSE, 0);
852 gtk_widget_show (GTK_WIDGET(arrow));
854 gtk_widget_show (GTK_WIDGET(gde->date_button));
857 gde->time_entry = gtk_entry_new ();
858 gtk_entry_set_max_length (GTK_ENTRY(gde->time_entry), 12);
859 gtk_widget_set_size_request (GTK_WIDGET(gde->time_entry), 88, -1);
860 gtk_box_pack_start (GTK_BOX (gde), gde->time_entry, TRUE, TRUE, 0);
862 store = gtk_tree_store_new(1, G_TYPE_STRING);
863 gde->time_combo = GTK_WIDGET(gtk_combo_box_new_with_model(GTK_TREE_MODEL(store)));
864 g_object_unref(store);
866 cell = gtk_cell_renderer_text_new();
868 gtk_cell_layout_pack_start( GTK_CELL_LAYOUT( gde->time_combo ), cell, TRUE );
870 gtk_cell_layout_set_attributes( GTK_CELL_LAYOUT( gde->time_combo ), cell,
"text", 0, NULL );
872 g_signal_connect (G_OBJECT (gde->time_combo),
"changed",
873 G_CALLBACK (set_time), gde);
875 gtk_box_pack_start (GTK_BOX (gde), gde->time_combo, FALSE, FALSE, 0);
881 g_signal_connect (G_OBJECT (gde),
"realize",
882 G_CALLBACK (fill_time_combo), gde);
884 if (gde->flags & GNC_DATE_EDIT_SHOW_TIME)
886 gtk_widget_show (GTK_WIDGET(gde->time_entry));
887 gtk_widget_show (GTK_WIDGET(gde->time_combo));
890 gde->cal_popup = gtk_window_new (GTK_WINDOW_POPUP);
891 gtk_widget_set_name (gde->cal_popup,
"gnc-date-edit-popup-window");
893 gtk_window_set_type_hint (GTK_WINDOW (gde->cal_popup),
894 GDK_WINDOW_TYPE_HINT_COMBO);
896 gtk_widget_set_events (GTK_WIDGET(gde->cal_popup),
897 gtk_widget_get_events (GTK_WIDGET(gde->cal_popup)) |
900 g_signal_connect (gde->cal_popup,
"delete-event",
901 G_CALLBACK(delete_popup), gde);
902 g_signal_connect (gde->cal_popup,
"key-press-event",
903 G_CALLBACK(key_press_popup), gde);
904 g_signal_connect (gde->cal_popup,
"button-press-event",
905 G_CALLBACK(gnc_date_edit_button_pressed), gde);
906 g_signal_connect (gde->cal_popup,
"button-release-event",
907 G_CALLBACK(gnc_date_edit_button_released), gde);
908 gtk_window_set_resizable (GTK_WINDOW (gde->cal_popup), FALSE);
909 gtk_window_set_screen (GTK_WINDOW (gde->cal_popup),
910 gtk_widget_get_screen (GTK_WIDGET (gde)));
912 frame = gtk_frame_new (NULL);
913 gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
914 gtk_container_add (GTK_CONTAINER (gde->cal_popup), frame);
915 gtk_widget_show (GTK_WIDGET(frame));
917 gde->calendar = gtk_calendar_new ();
918 gtk_calendar_set_display_options
919 (GTK_CALENDAR (gde->calendar),
920 (GTK_CALENDAR_SHOW_DAY_NAMES
921 | GTK_CALENDAR_SHOW_HEADING));
922 g_signal_connect (gde->calendar,
"button-release-event",
923 G_CALLBACK(gnc_date_edit_button_released), gde);
924 g_signal_connect (G_OBJECT (gde->calendar),
"day-selected",
925 G_CALLBACK (day_selected), gde);
926 g_signal_connect (G_OBJECT (gde->calendar),
927 "day-selected-double-click",
928 G_CALLBACK (day_selected_double_click), gde);
929 gtk_container_add (GTK_CONTAINER (frame), gde->calendar);
930 gtk_widget_show (GTK_WIDGET(gde->calendar));
945 gnc_date_edit_new (
time64 the_time,
int show_time,
int use_24_format)
947 return gnc_date_edit_new_flags
949 ((show_time ? GNC_DATE_EDIT_SHOW_TIME : 0)
950 | (use_24_format ? GNC_DATE_EDIT_24_HR : 0)));
960 gnc_date_edit_new_glade (gchar *widget_name,
961 gchar *string1, gchar *string2,
962 gint int1, gint int2)
967 widget = gnc_date_edit_new(time(NULL), FALSE, FALSE);
968 gtk_widget_show(widget);
983 gnc_date_edit_new_flags (
time64 the_time, GNCDateEditFlags flags)
987 gde = g_object_new (GNC_TYPE_DATE_EDIT, NULL, NULL);
990 gde->initial_time = -1;
991 create_children (gde);
992 gnc_date_edit_set_time (gde, the_time);
994 return GTK_WIDGET (gde);
1002 gchar *flags = NULL;
1003 gboolean date_was_valid;
1006 g_assert(gde != NULL);
1007 g_assert(GNC_IS_DATE_EDIT(gde));
1009 date_was_valid =
qof_scan_date (gtk_entry_get_text (GTK_ENTRY (gde->date_entry)),
1010 &tm.tm_mday, &tm.tm_mon, &tm.tm_year);
1012 if (!date_was_valid)
1026 if (gde->flags & GNC_DATE_EDIT_SHOW_TIME)
1031 str = g_strdup (gtk_entry_get_text
1032 (GTK_ENTRY (gde->time_entry)));
1033 temp = gnc_strtok_r (str,
": ", &tokp);
1036 tm.tm_hour = atoi (temp);
1037 temp = gnc_strtok_r (NULL,
": ", &tokp);
1040 if (isdigit (*temp))
1042 tm.tm_min = atoi (temp);
1043 flags = gnc_strtok_r (NULL,
": ",
1045 if (flags && isdigit (*flags))
1047 tm.tm_sec = atoi (flags);
1048 flags = gnc_strtok_r (NULL,
1058 if (flags && (strcasecmp (flags,
"PM") == 0))
1060 if (tm.tm_hour < 12)
1086 g_return_val_if_fail (gde != NULL, 0);
1087 g_return_val_if_fail (GNC_IS_DATE_EDIT (gde), 0);
1089 tm = gnc_date_edit_get_date_internal (gde);
1095 gnc_date_edit_get_gdate (
GNCDateEdit *gde, GDate *date)
1099 g_return_if_fail (gde && date);
1100 g_return_if_fail (GNC_IS_DATE_EDIT (gde));
1102 t = gnc_date_edit_get_date(gde);
1103 g_date_clear (date, 1);
1119 g_return_val_if_fail (gde != NULL, 0);
1120 g_return_val_if_fail (GNC_IS_DATE_EDIT (gde), 0);
1122 tm = gnc_date_edit_get_date_internal (gde);
1123 gnc_tm_set_day_end(&tm);
1136 gnc_date_edit_set_flags (
GNCDateEdit *gde, GNCDateEditFlags flags)
1138 GNCDateEditFlags old_flags;
1140 g_return_if_fail (gde != NULL);
1141 g_return_if_fail (GNC_IS_DATE_EDIT (gde));
1143 old_flags = gde->flags;
1146 if ((flags & GNC_DATE_EDIT_SHOW_TIME) !=
1147 (old_flags & GNC_DATE_EDIT_SHOW_TIME))
1149 if (flags & GNC_DATE_EDIT_SHOW_TIME)
1151 gtk_widget_show (gde->cal_label);
1152 gtk_widget_show (gde->time_entry);
1153 gtk_widget_show (gde->time_combo);
1157 gtk_widget_hide (gde->cal_label);
1158 gtk_widget_hide (gde->time_entry);
1159 gtk_widget_hide (gde->time_combo);
1163 if ((flags & GNC_DATE_EDIT_24_HR) != (old_flags & GNC_DATE_EDIT_24_HR))
1165 fill_time_combo (NULL, gde);
1180 g_return_val_if_fail (gde != NULL, 0);
1181 g_return_val_if_fail (GNC_IS_DATE_EDIT (gde), 0);
1196 gnc_date_activates_default (
GNCDateEdit *gde, gboolean state)
1201 gtk_entry_set_activates_default(GTK_ENTRY(gde->date_entry), state);
1217 gtk_widget_grab_focus (gde->date_entry);
1227 gnc_date_make_mnemonic_target (
GNCDateEdit *gde, GtkWidget *label)
1232 gtk_label_set_mnemonic_widget (GTK_LABEL(label), gde->date_entry);
size_t qof_print_date_dmy_buff(gchar *buff, size_t buflen, int day, int month, int year)
qof_print_date_dmy_buff Convert a date as day / month / year integers into a localized string represe...
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 ...
Date and Time handling routines.
time64 gnc_dmy2time64(gint day, gint month, gint year)
Convert a day, month, and year to a time64, returning the first second of the day.
#define ENTER(format, args...)
Print a function entry debugging message.
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_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...
void gnc_tm_free(struct tm *time)
free a struct tm* created with gnc_localtime() or gnc_gmtime()
time64 gnc_mktime(struct tm *time)
calculate seconds from the epoch given a time struct
#define MAX_DATE_LENGTH
The maximum length of a string created by the date printers.
struct tm * gnc_localtime(const time64 *secs)
fill out a time struct from a 64-bit time value.
All type declarations for the whole Gnucash engine.
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...
void gnc_gdate_set_time64(GDate *gd, time64 time)
Set a GDate to a time64.
#define LEAVE(format, args...)
Print a function exit debugging message.
time64 gnc_time(time64 *tbuf)
get the current time
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
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...