40 #include "gnc-date-format.h"
41 #include "dialog-utils.h"
44 #ifndef HAVE_LOCALTIME_R
45 # include "localtime_r.h"
49 #define MAX_DATE_LEN 80
52 G_GNUC_UNUSED
static QofLogModule log_module = GNC_MOD_GUI;
64 GtkWidget* format_combobox;
68 GtkWidget* months_label;
69 GtkWidget* months_number;
70 GtkWidget* months_abbrev;
71 GtkWidget* months_name;
73 GtkWidget* years_label;
74 GtkWidget* years_button;
76 GtkWidget* custom_label;
77 GtkWidget* custom_entry;
79 GtkWidget* sample_label;
82 #define GNC_DATE_FORMAT_GET_PRIVATE(o) \
83 (G_TYPE_INSTANCE_GET_PRIVATE ((o), GNC_TYPE_DATE_FORMAT, GNCDateFormatPriv))
85 static guint date_format_signals [LAST_SIGNAL] = { 0 };
89 static void gnc_date_format_finalize (GObject *
object);
90 static void gnc_date_format_compute_format(
GNCDateFormat *gdf);
92 void gnc_ui_date_format_changed_cb(GtkWidget *unused, gpointer user_data);
94 static GtkHBoxClass *parent_class;
102 gnc_date_format_get_type (
void)
104 static GType date_format_type = 0;
106 if (!date_format_type)
108 static const GTypeInfo date_format_info =
113 (GClassInitFunc) gnc_date_format_class_init,
118 (GInstanceInitFunc) gnc_date_format_init,
122 date_format_type = g_type_register_static(GTK_TYPE_HBOX,
124 &date_format_info, 0);
127 return date_format_type;
134 GObjectClass *gobject_class = (GObjectClass *) klass;
136 parent_class = g_type_class_peek_parent(klass);
138 gobject_class->finalize = gnc_date_format_finalize;
142 date_format_signals [FORMAT_CHANGED] =
143 g_signal_new (
"format_changed",
144 G_OBJECT_CLASS_TYPE (gobject_class),
149 g_cclosure_marshal_VOID__VOID,
160 GtkWidget *dialog, *
table;
162 g_return_if_fail(gdf);
163 g_return_if_fail(GNC_IS_DATE_FORMAT(gdf));
166 builder = gtk_builder_new();
167 gnc_builder_add_from_file (builder,
"gnc-date-format.glade",
"format-liststore");
168 gnc_builder_add_from_file (builder,
"gnc-date-format.glade",
"GNC Date Format");
170 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, gdf);
173 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
174 priv->label = GTK_WIDGET(gtk_builder_get_object (builder,
"widget_label"));
175 priv->format_combobox = GTK_WIDGET(gtk_builder_get_object (builder,
"format_combobox"));
177 priv->months_label = GTK_WIDGET(gtk_builder_get_object (builder,
"months_label"));
178 priv->months_number = GTK_WIDGET(gtk_builder_get_object (builder,
"month_number_button"));
179 priv->months_abbrev = GTK_WIDGET(gtk_builder_get_object (builder,
"month_abbrev_button"));
180 priv->months_name = GTK_WIDGET(gtk_builder_get_object (builder,
"month_name_button"));
182 priv->years_label = GTK_WIDGET(gtk_builder_get_object (builder,
"years_label"));
183 priv->years_button = GTK_WIDGET(gtk_builder_get_object (builder,
"years_button"));
185 priv->custom_label = GTK_WIDGET(gtk_builder_get_object (builder,
"format_label"));
186 priv->custom_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"format_entry"));
188 priv->sample_label = GTK_WIDGET(gtk_builder_get_object (builder,
"sample_label"));
194 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"GNC Date Format"));
196 table = GTK_WIDGET(gtk_builder_get_object (builder,
"date_format_table"));
197 g_object_ref(G_OBJECT(table));
198 gtk_container_remove(GTK_CONTAINER(dialog), table);
199 gtk_container_add(GTK_CONTAINER(gdf), table);
200 g_object_unref(G_OBJECT(table));
202 g_object_unref(G_OBJECT(builder));
205 gtk_widget_destroy(dialog);
210 gnc_date_format_finalize (GObject *
object)
212 g_return_if_fail(
object != NULL);
213 g_return_if_fail(GNC_IS_DATE_FORMAT(
object));
215 if (G_OBJECT_CLASS(parent_class)->finalize)
216 (* G_OBJECT_CLASS(parent_class)->finalize) (
object);
229 gnc_date_format_new (
void)
231 return gnc_date_format_new_with_label (NULL);
236 gnc_date_format_new_without_label (
void)
238 GtkWidget *widget = gnc_date_format_new_with_label(NULL);
242 gtk_widget_destroy(priv->label);
259 gnc_date_format_new_with_label (
const char *label)
264 gdf = g_object_new(GNC_TYPE_DATE_FORMAT, NULL);
265 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
268 gtk_label_set_text(GTK_LABEL(priv->label), label);
270 gnc_date_format_compute_format(gdf);
271 return GTK_WIDGET(gdf);
280 g_return_if_fail(gdf);
281 g_return_if_fail(GNC_IS_DATE_FORMAT(gdf));
283 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
284 gtk_combo_box_set_active(GTK_COMBO_BOX(priv->format_combobox), format);
285 gnc_date_format_compute_format(gdf);
297 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
298 return gtk_combo_box_get_active(GTK_COMBO_BOX(priv->format_combobox));
306 GtkWidget *button = NULL;
308 g_return_if_fail(gdf);
309 g_return_if_fail(GNC_IS_DATE_FORMAT(gdf));
311 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
314 case GNCDATE_MONTH_NUMBER:
315 button = priv->months_number;
317 case GNCDATE_MONTH_ABBREV:
318 button = priv->months_abbrev;
320 case GNCDATE_MONTH_NAME:
321 button = priv->months_name;
327 g_return_if_fail(button);
329 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
330 gnc_date_format_compute_format(gdf);
339 g_return_val_if_fail(gdf, GNCDATE_MONTH_NUMBER);
340 g_return_val_if_fail(GNC_IS_DATE_FORMAT(gdf), GNCDATE_MONTH_NUMBER);
342 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
343 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->months_number)))
344 return GNCDATE_MONTH_NUMBER;
345 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->months_abbrev)))
346 return GNCDATE_MONTH_ABBREV;
347 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->months_name)))
348 return GNCDATE_MONTH_ABBREV;
352 return GNCDATE_MONTH_NUMBER;
357 gnc_date_format_set_years (
GNCDateFormat *gdf, gboolean include_century)
361 g_return_if_fail(gdf);
362 g_return_if_fail(GNC_IS_DATE_FORMAT(gdf));
364 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
365 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->years_button),
367 gnc_date_format_compute_format(gdf);
376 g_return_val_if_fail(gdf, FALSE);
377 g_return_val_if_fail(GNC_IS_DATE_FORMAT(gdf), FALSE);
379 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
380 return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->years_button));
385 gnc_date_format_set_custom (
GNCDateFormat *gdf,
const char *format)
389 g_return_if_fail(gdf);
390 g_return_if_fail(GNC_IS_DATE_FORMAT(gdf));
392 if (format == NULL || *format ==
'\0')
395 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
396 gtk_entry_set_text(GTK_ENTRY(priv->custom_entry), format);
397 gnc_date_format_compute_format(gdf);
406 g_return_val_if_fail(gdf,
"");
407 g_return_val_if_fail(GNC_IS_DATE_FORMAT(gdf),
"");
409 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
410 return gtk_entry_get_text(GTK_ENTRY(priv->custom_entry));
415 gnc_ui_date_format_changed_cb(GtkWidget *unused, gpointer user_data)
419 gnc_date_format_compute_format(gdf);
424 gnc_date_format_enable_month (
GNCDateFormat *gdf, gboolean sensitive)
428 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
429 gtk_widget_set_sensitive(priv->months_label, sensitive);
430 gtk_widget_set_sensitive(priv->months_number, sensitive);
431 gtk_widget_set_sensitive(priv->months_abbrev, sensitive);
432 gtk_widget_set_sensitive(priv->months_name, sensitive);
437 gnc_date_format_enable_year (
GNCDateFormat *gdf, gboolean sensitive)
441 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
442 gtk_widget_set_sensitive(priv->years_label, sensitive);
443 gtk_widget_set_sensitive(priv->years_button, sensitive);
448 gnc_date_format_enable_format (
GNCDateFormat *gdf, gboolean sensitive)
452 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
453 gtk_widget_set_sensitive(priv->custom_label, sensitive);
454 gtk_widget_set_sensitive(priv->custom_entry, sensitive);
463 gboolean enable_year, enable_month, enable_custom, check_modifiers;
464 static gchar *format, *c;
465 gchar date_string[MAX_DATE_LEN];
469 g_return_if_fail(gdf);
470 g_return_if_fail(GNC_IS_DATE_FORMAT(gdf));
472 priv = GNC_DATE_FORMAT_GET_PRIVATE(gdf);
474 gtk_combo_box_get_active(GTK_COMBO_BOX(priv->format_combobox));
479 format = g_strdup(gtk_entry_get_text(GTK_ENTRY(priv->custom_entry)));
480 enable_year = enable_month = check_modifiers = FALSE;
481 enable_custom = TRUE;
487 enable_year = enable_month = check_modifiers = enable_custom = FALSE;
491 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->months_number), TRUE);
492 enable_year = check_modifiers = TRUE;
493 enable_month = enable_custom = FALSE;
497 enable_year = enable_month = check_modifiers = TRUE;
498 enable_custom = FALSE;
503 gnc_date_format_enable_year(gdf, enable_year);
504 gnc_date_format_enable_month(gdf, enable_month);
505 gnc_date_format_enable_format(gdf, enable_custom);
510 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->months_number)))
517 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->months_name)))
519 c = strchr(format,
'b');
524 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->years_button)))
526 c = strchr(format,
'y');
537 g_signal_handlers_block_matched(priv->custom_entry, G_SIGNAL_MATCH_DATA,
538 0, 0, NULL, NULL, gdf);
539 gtk_entry_set_text(GTK_ENTRY(priv->custom_entry), format);
540 g_signal_handlers_unblock_matched(priv->custom_entry, G_SIGNAL_MATCH_DATA,
541 0, 0, NULL, NULL, gdf);
546 qof_strftime(date_string, MAX_DATE_LEN, format, &today);
547 gtk_label_set_text(GTK_LABEL(priv->sample_label), date_string);
555 g_return_if_fail(gdf);
556 g_return_if_fail(GNC_IS_DATE_FORMAT(gdf));
559 gnc_date_format_refresh(gdf);
562 g_signal_emit(G_OBJECT(gdf), date_format_signals[FORMAT_CHANGED], 0);
const gchar * qof_date_text_format_get_string(QofDateFormat df)
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.
const gchar * qof_date_format_get_string(QofDateFormat df)
gsize qof_strftime(gchar *buf, gsize max, const gchar *format, const struct tm *tm)
All type declarations for the whole Gnucash engine.
QofDateFormat qof_date_format_get(void)
time64 gnc_time(time64 *tbuf)
get the current local time
const gchar * QofLogModule