+ GtkWidget *datefmt_sample = NULL;
+ gchar *text;
+
+ g_return_if_fail(widget != NULL);
+ g_return_if_fail(*widget != NULL);
+ g_return_if_fail(display.entry_datefmt != NULL);
+
+ datefmt_sample = GTK_WIDGET(gtk_object_get_data
+ (GTK_OBJECT(*widget), "datefmt_sample"));
+ g_return_if_fail(datefmt_sample != NULL);
+
+ text = gtk_editable_get_chars(GTK_EDITABLE(datefmt_sample), 0, -1);
+ g_free(prefs_common.date_format);
+ prefs_common.date_format = text;
+ gtk_entry_set_text(GTK_ENTRY(display.entry_datefmt), text);
+
+ gtk_widget_destroy(*widget);
+ *widget = NULL;
+}
+
+static void date_format_cancel_btn_clicked(GtkButton *button,
+ GtkWidget **widget)
+{
+ g_return_if_fail(widget != NULL);
+ g_return_if_fail(*widget != NULL);
+
+ gtk_widget_destroy(*widget);
+ *widget = NULL;
+}
+
+static void date_format_key_pressed(GtkWidget *keywidget, GdkEventKey *event,
+ GtkWidget **widget)
+{
+ if (event && event->keyval == GDK_Escape)
+ date_format_cancel_btn_clicked(NULL, widget);
+}
+
+static gboolean date_format_on_delete(GtkWidget *dialogwidget,
+ GdkEventAny *event, GtkWidget **widget)
+{
+ g_return_val_if_fail(widget != NULL, FALSE);
+ g_return_val_if_fail(*widget != NULL, FALSE);
+
+ *widget = NULL;
+ return FALSE;
+}
+
+static void date_format_entry_on_change(GtkEditable *editable,
+ GtkLabel *example)
+{
+ time_t cur_time;
+ struct tm *cal_time;
+ gchar buffer[100];
+ gchar *text;
+
+ cur_time = time(NULL);
+ cal_time = localtime(&cur_time);
+ buffer[0] = 0;
+ text = gtk_editable_get_chars(editable, 0, -1);
+ if (text)
+ strftime(buffer, sizeof buffer, text, cal_time);
+ gtk_label_set_text(example, buffer);
+}
+
+static void date_format_select_row(GtkWidget *date_format_list, gint row,
+ gint column, GdkEventButton *event,
+ GtkWidget *date_format)
+{
+ gint cur_pos;
+ gchar *format;
+ gchar *old_format;
+ gchar *new_format;
+ GtkWidget *datefmt_sample;
+
+ /* only on double click */
+ if (!event || event->type != GDK_2BUTTON_PRESS) return;
+
+
+ datefmt_sample = GTK_WIDGET(gtk_object_get_data
+ (GTK_OBJECT(date_format), "datefmt_sample"));
+
+ g_return_if_fail(date_format_list != NULL);
+ g_return_if_fail(date_format != NULL);
+ g_return_if_fail(datefmt_sample != NULL);
+
+ /* get format from clist */
+ gtk_clist_get_text(GTK_CLIST(date_format_list), row, 0, &format);
+
+ cur_pos = gtk_editable_get_position(GTK_EDITABLE(datefmt_sample));
+ old_format = gtk_entry_get_text(GTK_ENTRY(datefmt_sample));
+
+ /* insert the format into the text entry */
+ new_format = g_malloc(strlen(old_format) + 3);
+
+ strncpy(new_format, old_format, cur_pos);
+ new_format[cur_pos] = '\0';
+ strcat(new_format, format);
+ strcat(new_format, &old_format[cur_pos]);
+
+ gtk_entry_set_text(GTK_ENTRY(datefmt_sample), new_format);
+ gtk_editable_set_position(GTK_EDITABLE(datefmt_sample), cur_pos + 2);
+
+ g_free(new_format);
+}
+
+static GtkWidget *date_format_create(GtkButton *button, void *data)
+{
+ static GtkWidget *datefmt_win = NULL;
+ GtkWidget *vbox1;
+ GtkWidget *scrolledwindow1;
+ GtkWidget *datefmt_clist;
+ GtkWidget *table;
+ GtkWidget *label1;
+ GtkWidget *label2;
+ GtkWidget *label3;
+ GtkWidget *confirm_area;
+ GtkWidget *ok_btn;
+ GtkWidget *cancel_btn;
+ GtkWidget *datefmt_entry;
+
+ const struct {
+ gchar *fmt;
+ gchar *txt;
+ } time_format[] = {
+ { "%a", _("the full abbreviated weekday name") },
+ { "%A", _("the full weekday name") },
+ { "%b", _("the abbreviated month name") },
+ { "%B", _("the full month name") },
+ { "%c", _("the preferred date and time for the current locale") },
+ { "%C", _("the century number (year/100)") },
+ { "%d", _("the day of the month as a decimal number") },
+ { "%H", _("the hour as a decimal number using a 24-hour clock") },
+ { "%I", _("the hour as a decimal number using a 12-hour clock") },
+ { "%j", _("the day of the year as a decimal number") },
+ { "%m", _("the month as a decimal number") },
+ { "%M", _("the minute as a decimal number") },
+ { "%p", _("either AM or PM") },
+ { "%S", _("the second as a decimal number") },
+ { "%w", _("the day of the week as a decimal number") },
+ { "%x", _("the preferred date for the current locale") },
+ { "%y", _("the last two digits of a year") },
+ { "%Y", _("the year as a decimal number") },
+ { "%Z", _("the time zone or name or abbreviation") }
+ };
+
+ gchar *titles[2];
+ gint i;
+ const gint TIME_FORMAT_ELEMS =
+ sizeof time_format / sizeof time_format[0];
+
+ if (datefmt_win) return datefmt_win;
+
+ datefmt_win = gtk_window_new(GTK_WINDOW_DIALOG);
+ gtk_container_set_border_width(GTK_CONTAINER(datefmt_win), 8);
+ gtk_window_set_title(GTK_WINDOW(datefmt_win), _("Date format"));
+ gtk_window_set_position(GTK_WINDOW(datefmt_win), GTK_WIN_POS_CENTER);
+ gtk_widget_set_usize(datefmt_win, 440, 280);
+
+ vbox1 = gtk_vbox_new(FALSE, 10);
+ gtk_widget_show(vbox1);
+ gtk_container_add(GTK_CONTAINER(datefmt_win), vbox1);
+
+ scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy
+ (GTK_SCROLLED_WINDOW(scrolledwindow1),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_widget_show(scrolledwindow1);
+ gtk_box_pack_start(GTK_BOX(vbox1), scrolledwindow1, TRUE, TRUE, 0);
+
+ titles[0] = _("Specifier");
+ titles[1] = _("Description");
+ datefmt_clist = gtk_clist_new_with_titles(2, titles);
+ gtk_widget_show(datefmt_clist);
+ gtk_container_add(GTK_CONTAINER(scrolledwindow1), datefmt_clist);
+/* gtk_clist_set_column_width(GTK_CLIST(datefmt_clist), 0, 80); */
+
+ gtk_clist_set_selection_mode(GTK_CLIST(datefmt_clist),
+ GTK_SELECTION_BROWSE);
+
+ for (i = 0; i < TIME_FORMAT_ELEMS; i++) {
+ gchar *text[2];
+ /* phoney casting necessary because of gtk... */
+ text[0] = (gchar *)time_format[i].fmt;
+ text[1] = (gchar *)time_format[i].txt;
+ gtk_clist_append(GTK_CLIST(datefmt_clist), text);
+ }
+
+ table = gtk_table_new(2, 2, FALSE);
+ gtk_widget_show(table);
+ gtk_box_pack_start(GTK_BOX(vbox1), table, FALSE, FALSE, 0);
+ gtk_table_set_row_spacings(GTK_TABLE(table), 4);
+ gtk_table_set_col_spacings(GTK_TABLE(table), 8);
+
+ label1 = gtk_label_new(_("Date format"));
+ gtk_widget_show(label1);
+ gtk_table_attach(GTK_TABLE(table), label1, 0, 1, 0, 1,
+ GTK_FILL, 0, 0, 0);
+ gtk_label_set_justify(GTK_LABEL(label1), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment(GTK_MISC(label1), 0, 0.5);
+
+ datefmt_entry = gtk_entry_new_with_max_length(256);
+ gtk_widget_show(datefmt_entry);
+ gtk_table_attach(GTK_TABLE(table), datefmt_entry, 1, 2, 0, 1,
+ (GTK_EXPAND | GTK_FILL), 0, 0, 0);
+
+ /* we need the "sample" entry box; add it as data so callbacks can
+ * get the entry box */
+ gtk_object_set_data(GTK_OBJECT(datefmt_win), "datefmt_sample",
+ datefmt_entry);
+
+ label2 = gtk_label_new(_("Example"));
+ gtk_widget_show(label2);
+ gtk_table_attach(GTK_TABLE(table), label2, 0, 1, 1, 2,
+ GTK_FILL, 0, 0, 0);
+ gtk_label_set_justify(GTK_LABEL(label2), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment(GTK_MISC(label2), 0, 0.5);
+
+ label3 = gtk_label_new("");
+ gtk_widget_show(label3);
+ gtk_table_attach(GTK_TABLE(table), label3, 1, 2, 1, 2,
+ (GTK_EXPAND | GTK_FILL), 0, 0, 0);
+ gtk_label_set_justify(GTK_LABEL(label3), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment(GTK_MISC(label3), 0, 0.5);
+
+ gtkut_button_set_create(&confirm_area, &ok_btn, _("OK"),
+ &cancel_btn, _("Cancel"), NULL, NULL);
+ gtk_widget_grab_default(ok_btn);
+ gtk_widget_show(confirm_area);
+
+ gtk_box_pack_start(GTK_BOX(vbox1), confirm_area, FALSE, FALSE, 0);
+
+ /* set the current format */
+ gtk_entry_set_text(GTK_ENTRY(datefmt_entry), prefs_common.date_format);
+ date_format_entry_on_change(GTK_EDITABLE(datefmt_entry),
+ GTK_LABEL(label3));
+
+ gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
+ GTK_SIGNAL_FUNC(date_format_ok_btn_clicked),
+ &datefmt_win);
+ gtk_signal_connect(GTK_OBJECT(cancel_btn), "clicked",
+ GTK_SIGNAL_FUNC(date_format_cancel_btn_clicked),
+ &datefmt_win);
+ gtk_signal_connect(GTK_OBJECT(datefmt_win), "key_press_event",
+ GTK_SIGNAL_FUNC(date_format_key_pressed),
+ &datefmt_win);
+ gtk_signal_connect(GTK_OBJECT(datefmt_win), "delete_event",
+ GTK_SIGNAL_FUNC(date_format_on_delete),
+ &datefmt_win);
+ gtk_signal_connect(GTK_OBJECT(datefmt_entry), "changed",
+ GTK_SIGNAL_FUNC(date_format_entry_on_change),
+ label3);
+
+ gtk_signal_connect(GTK_OBJECT(datefmt_clist), "select_row",
+ GTK_SIGNAL_FUNC(date_format_select_row),
+ datefmt_win);
+
+ gtk_window_set_position(GTK_WINDOW(datefmt_win), GTK_WIN_POS_CENTER);
+ gtk_window_set_modal(GTK_WINDOW(datefmt_win), TRUE);
+
+ gtk_widget_show(datefmt_win);
+ manage_window_set_transient(GTK_WINDOW(datefmt_win));
+
+ gtk_widget_grab_focus(ok_btn);
+
+ return datefmt_win;
+}
+
+void prefs_quote_colors_dialog(void)
+{
+ if (!quote_color_win)
+ prefs_quote_colors_dialog_create();