aboutsummaryrefslogtreecommitdiffstats
path: root/filter/filter-datespec.c
diff options
context:
space:
mode:
authorNot Zed <NotZed@Ximian.com>2002-08-02 12:00:22 +0800
committerMichael Zucci <zucchi@src.gnome.org>2002-08-02 12:00:22 +0800
commita683952c1320f3998b4f0fd658f2057caad31b60 (patch)
tree9fa481cffdddde987d840b3f237b94b116eca2ea /filter/filter-datespec.c
parent63f0feb6647e76dfea69f588959ef00a5fa9c1fe (diff)
downloadgsoc2013-evolution-a683952c1320f3998b4f0fd658f2057caad31b60.tar
gsoc2013-evolution-a683952c1320f3998b4f0fd658f2057caad31b60.tar.gz
gsoc2013-evolution-a683952c1320f3998b4f0fd658f2057caad31b60.tar.bz2
gsoc2013-evolution-a683952c1320f3998b4f0fd658f2057caad31b60.tar.lz
gsoc2013-evolution-a683952c1320f3998b4f0fd658f2057caad31b60.tar.xz
gsoc2013-evolution-a683952c1320f3998b4f0fd658f2057caad31b60.tar.zst
gsoc2013-evolution-a683952c1320f3998b4f0fd658f2057caad31b60.zip
Added a datespec editor window.
2002-08-02 Not Zed <NotZed@Ximian.com> * filter.glade: Added a datespec editor window. * filter-datespec.c (button_clicked): Rewritten to use glade. Simplified all the code around it as a result, etc, and fixed bug #21798. svn path=/trunk/; revision=17684
Diffstat (limited to 'filter/filter-datespec.c')
-rw-r--r--filter/filter-datespec.c654
1 files changed, 177 insertions, 477 deletions
diff --git a/filter/filter-datespec.c b/filter/filter-datespec.c
index ae0683e0f2..698e95325d 100644
--- a/filter/filter-datespec.c
+++ b/filter/filter-datespec.c
@@ -26,19 +26,18 @@
#include <math.h>
#include <glib.h>
#include <gtk/gtkcalendar.h>
-#include <gtk/gtkhbox.h>
-#include <gtk/gtkhseparator.h>
#include <gtk/gtklabel.h>
#include <gtk/gtkmenu.h>
#include <gtk/gtkmenuitem.h>
#include <gtk/gtkoptionmenu.h>
#include <gtk/gtkspinbutton.h>
-#include <gtk/gtktable.h>
+#include <gtk/gtknotebook.h>
#include <libgnome/gnome-defs.h>
#include <libgnome/gnome-i18n.h>
#include <libgnomeui/gnome-dialog.h>
#include <libgnomeui/gnome-dialog-util.h>
#include <libgnomeui/gnome-stock.h>
+#include <glade/glade.h>
#include "filter-datespec.h"
#include "e-util/e-sexp.h"
@@ -58,16 +57,6 @@ static void filter_datespec_class_init (FilterDatespecClass *class);
static void filter_datespec_init (FilterDatespec *gspaper);
static void filter_datespec_finalise (GtkObject *obj);
-static void make_span_editor (FilterDatespec *fds);
-static void adj_value_changed (GtkAdjustment *adj, gpointer user_data);
-static void omenu_item_activated (GtkMenuItem *item, gpointer user_data);
-static gchar *describe_button (FilterDatespec *fds);
-static gchar *stringify_agoness (FilterDatespec *fds);
-static void set_adjustments (FilterDatespec *fds);
-
-static void cal_day_selected (GtkCalendar *cal, gpointer user_data);
-static void cal_day_selected_double_click (GtkCalendar *cal, gpointer user_data);
-
#define PRIV(x) (((FilterDatespec *)(x))->priv)
typedef struct _timespan {
@@ -78,28 +67,23 @@ typedef struct _timespan {
} timespan;
static const timespan timespans[] = {
- { 31557600, N_("year"), N_("years"), 1000.0 },
- { 2419200, N_("month"), N_("months"), 12.0 },
- { 604800, N_("week"), N_("weeks"), 52.0 },
- { 86400, N_("day"), N_("days"), 31.0 },
- { 3600, N_("hour"), N_("hours"), 23.0 },
+ { 1, N_("second"), N_("seconds"), 59.0 },
{ 60, N_("minute"), N_("minutes"), 59.0 },
- { 1, N_("second"), N_("seconds"), 59.0 }
+ { 3600, N_("hour"), N_("hours"), 23.0 },
+ { 86400, N_("day"), N_("days"), 31.0 },
+ { 604800, N_("week"), N_("weeks"), 52.0 },
+ { 2419200, N_("month"), N_("months"), 12.0 },
+ { 31557600, N_("year"), N_("years"), 1000.0 },
};
#define DAY_INDEX 3
#define N_TIMESPANS (sizeof (timespans) / sizeof (timespans[0]))
struct _FilterDatespecPrivate {
- GnomeDialog *gd;
- GtkWidget *descriptive_label;
- GtkWidget *cur_extra_widget;
- FilterDatespec_type selected_type;
-
- GtkWidget *date_chooser;
- GtkWidget *span_chooser;
- GtkWidget *omenu, *spinbutton, *recent_item;
- gboolean double_click;
+ GtkWidget *label_button;
+ GtkWidget *notebook_type, *option_type, *calendar_specify, *spin_relative, *option_relative;
+ FilterDatespec_type type;
+ int span;
};
static FilterElementClass *parent_class;
@@ -153,7 +137,6 @@ filter_datespec_init (FilterDatespec *o)
{
o->priv = g_malloc0 (sizeof (*o->priv));
o->type = FDST_UNKNOWN;
- PRIV(o)->selected_type = FDST_UNKNOWN;
}
static void
@@ -161,8 +144,7 @@ filter_datespec_finalise(GtkObject *obj)
{
FilterDatespec *o = (FilterDatespec *)obj;
- if (o->priv)
- g_free (o->priv);
+ g_free (o->priv);
((GtkObjectClass *)(parent_class))->finalize(obj);
}
@@ -185,18 +167,11 @@ static gboolean
validate (FilterElement *fe)
{
FilterDatespec *fds = (FilterDatespec *) fe;
- gboolean valid = TRUE;
+ gboolean valid;
- if (fds->value <= 0) {
- GtkWidget *gd;
-
- valid = FALSE;
-
- if (fds->type == FDST_UNKNOWN)
- gd = gnome_ok_dialog (_("You have forgotten to choose a date."));
- else
- gd = gnome_ok_dialog (_("You have chosen an invalid date."));
-
+ valid = fds->type != FDST_UNKNOWN;
+ if (!valid) {
+ GtkWidget *gd = gnome_ok_dialog (_("You have forgotten to choose a date."));
gnome_dialog_run_and_close (GNOME_DIALOG (gd));
}
@@ -270,229 +245,188 @@ xml_decode (FilterElement *fe, xmlNodePtr node)
return 0;
}
-static void
-activate_now (GtkMenuItem *item, FilterDatespec *fds)
+static int get_best_span(time_t val)
{
- if (PRIV (fds)->cur_extra_widget) {
- gtk_container_remove (GTK_CONTAINER (PRIV(fds)->gd->vbox),
- PRIV (fds)->cur_extra_widget);
- PRIV (fds)->cur_extra_widget = NULL;
+ int i;
+
+ for (i=N_TIMESPANS-1;i>=0;i--) {
+ if (val % timespans[i].seconds == 0)
+ return i;
}
-
- gtk_label_set_text (GTK_LABEL (PRIV (fds)->descriptive_label),
- _("The message's date will be compared against\n"
- "whatever the time is when the filter is run\n"
- "or vfolder is opened."));
-
- PRIV (fds)->selected_type = FDST_NOW;
+
+ return 0;
}
+/* sets button label */
static void
-activate_specified (GtkMenuItem *item, FilterDatespec *fds)
+set_button(FilterDatespec *fds)
{
- struct tm *seltime;
-
- /* Remove other widget if it exists */
-
- if (PRIV (fds)->cur_extra_widget) {
- gtk_container_remove (GTK_CONTAINER (PRIV (fds)->gd->vbox),
- PRIV (fds)->cur_extra_widget);
- PRIV (fds)->cur_extra_widget = NULL;
+ char buf[128];
+ char *label = buf;
+
+ switch (fds->type) {
+ case FDST_UNKNOWN:
+ label = _("<click here to select a date>");
+ break;
+ case FDST_NOW:
+ label = _("now");
+ break;
+ case FDST_SPECIFIED: {
+ struct tm tm;
+
+ localtime_r(&fds->value, &tm);
+ /* strftime for date filter display, only needs to show a day date (i.e. no time) */
+ strftime(buf, sizeof(buf), _("%d-%b-%Y"), &tm);
+ break; }
+ case FDST_X_AGO:
+ if (fds->value == 0)
+ label = _("now");
+ else {
+ int span, count;
+
+ span = get_best_span(fds->value);
+ count = fds->value / timespans[span].seconds;
+
+ if (count == 1)
+ /* 1 (minute|day|...) ago (singular time ago) */
+ sprintf(buf, _("%d %s ago"), count, timespans[span].singular);
+ else
+ /* N (minutes|days|...) ago (plural time ago) */
+ sprintf(buf, _("%d %s ago"), count, timespans[span].plural);
+ }
+ break;
}
-
- /* Set description */
-
- gtk_label_set_text (GTK_LABEL (PRIV (fds)->descriptive_label),
- _("The message's date will be compared against\n"
- "the time that you specify here."));
-
- /* Reset if going from one type to another */
- if (PRIV (fds)->selected_type != FDST_SPECIFIED)
- fds->value = 0;
-
- PRIV (fds)->selected_type = FDST_SPECIFIED;
-
- /* Set the calendar's time */
- if (fds->value < 1)
- fds->value = time (NULL);
+ gtk_label_set_text((GtkLabel *)fds->priv->label_button, label);
+}
- /* gmtime? */
- seltime = localtime (&(fds->value));
-
- gtk_calendar_select_month (GTK_CALENDAR (PRIV (fds)->date_chooser),
- seltime->tm_mon,
- seltime->tm_year + 1900);
- gtk_calendar_select_day (GTK_CALENDAR (PRIV (fds)->date_chooser),
- seltime->tm_mday);
-
- gtk_box_pack_start (GTK_BOX (PRIV (fds)->gd->vbox),
- PRIV (fds)->date_chooser,
- TRUE, TRUE, 3);
- gtk_widget_show (PRIV (fds)->date_chooser);
- PRIV (fds)->cur_extra_widget = PRIV (fds)->date_chooser;
+static void
+get_values(FilterDatespec *fds)
+{
+ struct _FilterDatespecPrivate *p = PRIV(fds);
+
+ switch(fds->priv->type) {
+ case FDST_SPECIFIED: {
+ guint year, month, day;
+ struct tm tm;
+
+ gtk_calendar_get_date((GtkCalendar *)p->calendar_specify, &year, &month, &day);
+ memset(&tm, 0, sizeof(tm));
+ tm.tm_mday = day;
+ tm.tm_year = year - 1900;
+ tm.tm_mon = month;
+ fds->value = mktime(&tm);
+ /* what about timezone? */
+ break; }
+ case FDST_X_AGO: {
+ int val;
+
+ val = gtk_spin_button_get_value_as_int((GtkSpinButton *)p->spin_relative);
+ fds->value = timespans[p->span].seconds * val;
+ break; }
+ case FDST_NOW:
+ default:
+ break;
+ }
+
+ fds->type = p->type;
}
static void
-activate_x_ago (GtkMenuItem *item, FilterDatespec *fds)
+set_values(FilterDatespec *fds)
{
- if (PRIV (fds)->cur_extra_widget) {
- gtk_container_remove (GTK_CONTAINER (PRIV (fds)->gd->vbox),
- PRIV (fds)->cur_extra_widget);
- PRIV (fds)->cur_extra_widget = NULL;
+ struct _FilterDatespecPrivate *p = PRIV(fds);
+
+ p->type = fds->type==FDST_UNKNOWN ? FDST_NOW : fds->type;
+
+ switch (p->type) {
+ case FDST_NOW:
+ case FDST_UNKNOWN:
+ /* noop */
+ break;
+ case FDST_SPECIFIED: {
+ struct tm tm;
+
+ localtime_r(&fds->value, &tm);
+ gtk_calendar_select_month((GtkCalendar*)p->calendar_specify, tm.tm_mon, tm.tm_year + 1900);
+ gtk_calendar_select_day((GtkCalendar*)p->calendar_specify, tm.tm_mday);
+ break; }
+ case FDST_X_AGO:
+ p->span = get_best_span(fds->value);
+ gtk_spin_button_set_value((GtkSpinButton*)p->spin_relative, fds->value/timespans[p->span].seconds);
+ gtk_option_menu_set_history((GtkOptionMenu*)p->option_relative, p->span);
+ break;
}
-
- gtk_label_set_text (GTK_LABEL (PRIV (fds)->descriptive_label),
- _("The message's date will be compared against\n"
- "a time relative to when the filter is run;\n"
- "\"a week ago\", for example."));
-
- /* Reset if going from one type to another */
- if (PRIV (fds)->selected_type != FDST_X_AGO)
- fds->value = 0;
-
- PRIV (fds)->selected_type = FDST_X_AGO;
- if (fds->value > 0)
- set_adjustments (fds);
-
- gtk_box_pack_start (GTK_BOX (PRIV (fds)->gd->vbox),
- PRIV (fds)->span_chooser,
- TRUE, TRUE, 3);
- gtk_widget_show (PRIV (fds)->span_chooser);
- PRIV (fds)->cur_extra_widget = PRIV (fds)->span_chooser;
+ gtk_notebook_set_page((GtkNotebook*)p->notebook_type, p->type);
+ gtk_option_menu_set_history((GtkOptionMenu*)p->option_type, p->type);
}
-typedef void (*my_menu_callback) (GtkMenuItem *, FilterDatespec *);
+
+static void
+set_option_type(GtkMenu *menu, FilterDatespec *fds)
+{
+ GtkWidget *w;
+
+ /* ugh, no other way to 'get_history' */
+ w = gtk_menu_get_active(menu);
+ fds->priv->type = g_list_index(GTK_MENU_SHELL(menu)->children, w);
+ gtk_notebook_set_page((GtkNotebook*)fds->priv->notebook_type, fds->priv->type);
+}
+
+static void
+set_option_relative(GtkMenu *menu, FilterDatespec *fds)
+{
+ GtkWidget *w;
+
+ w = gtk_menu_get_active(menu);
+ fds->priv->span = g_list_index(GTK_MENU_SHELL(menu)->children, w);
+}
+
+static void
+dialogue_clicked(GnomeDialog *gd, int button, FilterDatespec *fds)
+{
+ if (button != 0)
+ return;
+
+ get_values(fds);
+ set_button(fds);
+}
static void
button_clicked (GtkButton *button, FilterDatespec *fds)
{
GnomeDialog *gd;
- GtkWidget *box;
- GtkWidget *label;
- GtkWidget *menu;
- GtkWidget *selectomatic;
- GtkWidget *sep;
- int i;
- gchar *desc;
-
- /* keep in sync with FilterDatespec_type! */
- const char *items[] = { N_("the current time"), N_("a time you specify"),
- N_("a time relative to the current time"), NULL };
- const my_menu_callback callbacks[]
- = { activate_now, activate_specified, activate_x_ago };
-
- PRIV (fds)->descriptive_label = gtk_label_new("");
- PRIV (fds)->cur_extra_widget = NULL;
- PRIV (fds)->double_click = FALSE;
-
- /* The calendar */
-
- PRIV (fds)->date_chooser = gtk_calendar_new ();
- gtk_object_ref (GTK_OBJECT (PRIV (fds)->date_chooser));
- gtk_signal_connect (GTK_OBJECT (PRIV (fds)->date_chooser), "day_selected",
- cal_day_selected, fds);
- gtk_signal_connect (GTK_OBJECT (PRIV (fds)->date_chooser), "day_selected_double_click",
- cal_day_selected_double_click, fds);
-
- /* The span editor thingie */
-
- make_span_editor (fds);
- gtk_object_ref (GTK_OBJECT (PRIV (fds)->span_chooser));
-
- /* The dialog */
-
+ struct _FilterDatespecPrivate *p = PRIV(fds);
+ GtkWidget *w, *x;
+ GladeXML *gui;
+
+ gui = glade_xml_new(FILTER_GLADEDIR "/filter.glade", "filter_datespec");
+ w = glade_xml_get_widget(gui, "filter_datespec");
+
gd = (GnomeDialog *) gnome_dialog_new (_("Select a time to compare against"),
GNOME_STOCK_BUTTON_OK,
GNOME_STOCK_BUTTON_CANCEL,
NULL);
- PRIV (fds)->gd = gd;
-
- /* The menu */
-
- menu = gtk_menu_new ();
-
- for (i = 0; items[i]; i++) {
- GtkWidget *item;
-
- item = gtk_menu_item_new_with_label (gettext (items[i]));
- gtk_signal_connect (GTK_OBJECT (item), "activate",
- callbacks[i], fds);
- gtk_menu_append (GTK_MENU (menu), item);
- gtk_widget_show (item);
- }
-
- gtk_widget_show (menu);
-
- /* The selector */
-
- selectomatic = gtk_option_menu_new();
- gtk_option_menu_set_menu (GTK_OPTION_MENU (selectomatic), GTK_WIDGET (menu));
- if (fds->type != FDST_UNKNOWN)
- /* Keep in sync with FilterDatespec_type! */
- gtk_option_menu_set_history (GTK_OPTION_MENU (selectomatic), fds->type);
-
- gtk_widget_show ((GtkWidget *)selectomatic);
-
- /* The label */
-
- label = gtk_label_new (_("Compare against"));
- gtk_widget_show (label);
-
- /* The hbox */
-
- box = gtk_hbox_new (FALSE, 3);
- gtk_box_pack_start (GTK_BOX (box), label,
- TRUE, TRUE, 2);
- gtk_box_pack_start (GTK_BOX (box), selectomatic,
- TRUE, TRUE, 2);
- gtk_widget_show (box);
- gtk_box_pack_start ((GtkBox *)gd->vbox, (GtkWidget *)box, TRUE, TRUE, 3);
-
- /* The separator */
-
- sep = gtk_hseparator_new ();
- gtk_widget_show (sep);
- gtk_box_pack_start (GTK_BOX (gd->vbox), sep, TRUE, TRUE, 3);
-
- /* The descriptive label */
-
- gtk_box_pack_start (GTK_BOX (gd->vbox), PRIV (fds)->descriptive_label, TRUE, TRUE, 3);
- gtk_misc_set_alignment (GTK_MISC (PRIV (fds)->descriptive_label), 0.5, 0.5);
- gtk_widget_show (PRIV (fds)->descriptive_label);
-
- /* Set up the current view */
-
- if (fds->type == FDST_UNKNOWN)
- fds->type = FDST_NOW;
- PRIV (fds)->selected_type = fds->type;
- (callbacks[fds->type]) (NULL, fds);
-
- /* go go gadget gnomedialog! */
-
- switch (gnome_dialog_run_and_close(gd)) {
- case -1: /*wm close*/
- if (PRIV (fds)->double_click == FALSE)
- break;
- /* else fall */
- case 0:
- fds->type = PRIV (fds)->selected_type;
-
- PRIV (fds)->descriptive_label = NULL;
-
- desc = describe_button (fds);
- gtk_label_set_text (GTK_LABEL (GTK_BIN (button)->child), desc);
- g_free (desc);
- /* falllllll */
- case 1:
- /* cancel */
- break;
- }
-
- gtk_widget_destroy (PRIV (fds)->date_chooser);
- gtk_widget_destroy (PRIV (fds)->span_chooser);
+ p->notebook_type = glade_xml_get_widget(gui, "notebook_type");
+ p->option_type = glade_xml_get_widget(gui, "option_type");
+ p->calendar_specify = glade_xml_get_widget(gui, "calendar_specify");
+ p->spin_relative = glade_xml_get_widget(gui, "spin_relative");
+ p->option_relative = glade_xml_get_widget(gui, "option_relative");
+
+ set_values(fds);
+
+ gtk_signal_connect((GtkObject *)GTK_OPTION_MENU(p->option_type)->menu, "deactivate", set_option_type, fds);
+ gtk_signal_connect((GtkObject *)GTK_OPTION_MENU(p->option_relative)->menu, "deactivate", set_option_relative, fds);
+
+ gtk_box_pack_start ((GtkBox *)gd->vbox, w, TRUE, TRUE, 3);
+
+ gtk_signal_connect((GtkObject *)gd, "clicked", dialogue_clicked, fds);
+
+ gnome_dialog_run_and_close(gd);
+
+ return;
}
static GtkWidget *
@@ -500,20 +434,17 @@ get_widget (FilterElement *fe)
{
FilterDatespec *fds = (FilterDatespec *)fe;
GtkWidget *button;
- GtkWidget *label;
- gchar *desc;
- desc = describe_button (fds);
- label = gtk_label_new (desc);
- gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
- g_free (desc);
+ fds->priv->label_button = gtk_label_new ("");
+ gtk_misc_set_alignment (GTK_MISC (fds->priv->label_button), 0.5, 0.5);
+ set_button(fds);
button = gtk_button_new();
- gtk_container_add (GTK_CONTAINER (button), label);
+ gtk_container_add (GTK_CONTAINER (button), fds->priv->label_button);
gtk_signal_connect (GTK_OBJECT (button), "clicked", button_clicked, fds);
gtk_widget_show (button);
- gtk_widget_show (label);
+ gtk_widget_show (fds->priv->label_button);
return button;
}
@@ -543,234 +474,3 @@ format_sexp (FilterElement *fe, GString *out)
break;
}
}
-
-static gchar *
-stringify_agoness (FilterDatespec *fds)
-{
- time_t val;
- GString *str;
- gchar *ret;
-
- str = g_string_new("");
- val = fds->value;
-
- if (val == 0) {
- g_string_append (str, _("now"));
- } else {
- int where;
-
- where = 0;
-
- while (val) {
- int count;
-
- count = 0;
-
- while (timespans[where].seconds <= val) {
- count++;
- val -= timespans[where].seconds;
- }
-
- if (count != 0 ) {
- if (count > 1)
- g_string_sprintfa (str, "%d %s", (int) count, gettext (timespans[where].plural));
- else
- g_string_sprintfa (str, "%d %s", (int) count, gettext (timespans[where].singular));
-
- if (val)
- g_string_append (str, ", ");
- }
-
- where++;
- }
-
- g_string_append (str, _(" ago"));
- }
-
- ret = str->str;
- g_string_free (str, FALSE);
- return ret;
-}
-
-static void
-make_span_editor (FilterDatespec *fds)
-{
- int i;
- GtkObject *adj;
- GtkWidget *hbox, *menu, *om, *sb, *label;
-
- /*PRIV (fds)->span_chooser = gtk_vbox_new (TRUE, 3);*/
-
- hbox = gtk_hbox_new (TRUE, 3);
-
- adj = gtk_adjustment_new (0.0, 0.0,
- /*timespans[i].max*/100000.0,
- 1.0, 10.0, 0.0);
- sb = gtk_spin_button_new (GTK_ADJUSTMENT (adj), 0, 0);
- gtk_widget_show (GTK_WIDGET (sb));
- gtk_box_pack_start (GTK_BOX (hbox), sb, TRUE, TRUE, 0);
-
- menu = gtk_menu_new ();
- for (i = 0; i < N_TIMESPANS; i++) {
- GtkWidget *item;
-
- item = gtk_menu_item_new_with_label (gettext (timespans[i].plural));
- gtk_object_set_data (GTK_OBJECT (item), "timespan", (gpointer) &(timespans[i]));
- gtk_signal_connect (GTK_OBJECT (item), "activate", omenu_item_activated, fds);
- gtk_widget_show (item);
- gtk_menu_prepend (GTK_MENU (menu), item);
-
- if (i == DAY_INDEX)
- PRIV (fds)->recent_item = item;
- }
-
- om = gtk_option_menu_new ();
- gtk_option_menu_set_menu (GTK_OPTION_MENU (om), menu);
- gtk_option_menu_set_history (GTK_OPTION_MENU (om), DAY_INDEX);
- gtk_widget_show (om);
- gtk_box_pack_start (GTK_BOX (hbox), om, FALSE, TRUE, 0);
-
- label = gtk_label_new (_("ago"));
- gtk_widget_show (label);
- gtk_misc_set_padding (GTK_MISC (label), 3, 0);
- gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
-
- gtk_widget_show (hbox);
-
- PRIV (fds)->span_chooser = hbox;
- PRIV (fds)->omenu = om;
- PRIV (fds)->spinbutton = sb;
-
- /* if we do this earlier, we get the signal before the private
- * members have been set up. */
- gtk_signal_connect (adj, "value_changed",
- adj_value_changed, fds);
-}
-
-static void
-omenu_item_activated (GtkMenuItem *item, gpointer user_data)
-{
- FilterDatespec *fds = (FilterDatespec *) user_data;
- GtkOptionMenu *om;
- timespan *old_ts, *new_ts;
- int cur_val;
- gfloat new_val;
-
- if (!PRIV (fds)->recent_item) {
- PRIV (fds)->recent_item = GTK_WIDGET (item);
- return;
- }
-
- om = GTK_OPTION_MENU (PRIV (fds)->omenu);
- old_ts = gtk_object_get_data (GTK_OBJECT (PRIV (fds)->recent_item), "timespan");
- new_ts = gtk_object_get_data (GTK_OBJECT (item), "timespan");
-
- cur_val = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (PRIV (fds)->spinbutton));
-
- /*if (old_ts->seconds > new_ts->seconds)*/
- new_val = ceil (cur_val * old_ts->seconds / new_ts->seconds);
-
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (PRIV (fds)->spinbutton), new_val);
- PRIV (fds)->recent_item = GTK_WIDGET (item);
-}
-
-static void
-adj_value_changed (GtkAdjustment *adj, gpointer user_data)
-{
- FilterDatespec *fds = (FilterDatespec *) user_data;
- GtkOptionMenu *om;
- timespan *ts;
-
- om = GTK_OPTION_MENU (PRIV (fds)->omenu);
-
- if (om->menu_item == NULL) /* this has happened to me... dunno what it means */
- return;
-
- ts = gtk_object_get_data (GTK_OBJECT (om->menu_item), "timespan");
- fds->value = ts->seconds *
- (gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (PRIV (fds)->spinbutton)));
-}
-
-static void
-set_adjustments (FilterDatespec *fds)
-{
- time_t val;
- int i;
-
- val = fds->value;
-
- for (i = 0; i < N_TIMESPANS; i++) {
- if (val % timespans[i].seconds == 0) {
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (PRIV (fds)->spinbutton),
- (gfloat) val / timespans[i].seconds);
- break;
- }
- }
-
- gtk_option_menu_set_history (GTK_OPTION_MENU (PRIV (fds)->omenu),
- N_TIMESPANS - (i + 1));
-}
-
-static gchar *
-format_time (time_t time)
-{
- struct tm *as_tm;
- char buf[128];
-
- /* no idea if this format is the 'correct' one */
-
- as_tm = localtime (&time);
- strftime (buf, 128, _("%b %d %l:%M %p"), as_tm);
- return g_strdup (buf);
-}
-
-static gchar *
-describe_button (FilterDatespec *fds)
-{
- gchar *desc = NULL;
-
- switch (fds->type) {
- case FDST_UNKNOWN:
- desc = g_strdup (_("<click here to select a date>"));
- break;
- case FDST_NOW:
- desc = g_strdup (_("now"));
- break;
- case FDST_SPECIFIED:
- desc = format_time (fds->value);
- break;
- case FDST_X_AGO:
- desc = stringify_agoness (fds);
- break;
- }
-
- return desc;
-}
-
-static void
-cal_day_selected (GtkCalendar *cal, gpointer user_data)
-{
- FilterDatespec *fds = (FilterDatespec *)user_data;
- struct tm seltime;
-
- seltime.tm_sec = 0;
- seltime.tm_min = 0;
- seltime.tm_hour = 0;
- seltime.tm_mday = cal->selected_day;
- seltime.tm_mon = cal->month;
- seltime.tm_year = cal->year - 1900;
- seltime.tm_isdst = -1;
-
- fds->value = mktime (&seltime);
-}
-
-static void
-cal_day_selected_double_click (GtkCalendar *cal, gpointer user_data)
-{
- FilterDatespec *fds = (FilterDatespec *)user_data;
-
- cal_day_selected (cal, user_data);
- PRIV (fds)->double_click = TRUE;
- gnome_dialog_close (PRIV (fds)->gd);
-}
-