aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/goto.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/goto.c')
-rw-r--r--calendar/gui/goto.c393
1 files changed, 128 insertions, 265 deletions
diff --git a/calendar/gui/goto.c b/calendar/gui/goto.c
index 07e75e5d3d..71d377f2b8 100644
--- a/calendar/gui/goto.c
+++ b/calendar/gui/goto.c
@@ -1,332 +1,195 @@
-/* Go to date dialog for gnomecal
+/* Go to date dialog for Evolution
*
* Copyright (C) 1998 Red Hat Software, Inc.
+ * Copyright (C) 2000 Helix Code, Inc.
*
- * Author: Federico Mena <federico@nuclecu.unam.mx>
+ * Authors: Federico Mena <federico@nuclecu.unam.mx>
+ * JP Rosevear <jpr@helixcode.com>
*/
#include <config.h>
#include <gnome.h>
-#include <cal-util/timeutil.h>
-#include "gnome-cal.h"
-#include "gnome-month-item.h"
+#include <glade/glade.h>
#include "calendar-commands.h"
-#include "mark.h"
+#include "goto.h"
-
-static GtkWidget *goto_win; /* The goto dialog window */
-static GnomeMonthItem *month_item; /* The month item in the dialog */
-static GnomeCalendar *gnome_calendar; /* The gnome calendar the dialog refers to */
-static int current_index; /* The index of the day marked as current, or -1 if none */
-
-
-/* Updates the specified month item by marking it appropriately from the calendar the dialog refers
- * to. Also marks the current day if appropriate.
- */
-static void
-update (void)
+typedef struct
{
- GnomeCanvasItem *item;
- time_t t;
- struct tm tm;
+ GladeXML *xml;
+ GtkWidget *dialog;
- unmark_month_item (month_item);
- mark_month_item (month_item, gnome_calendar);
-
- if (current_index != -1) {
- item = gnome_month_item_num2child (month_item,
- GNOME_MONTH_ITEM_DAY_LABEL + current_index);
- gnome_canvas_item_set (item,
- "fill_color", color_spec_from_prop (COLOR_PROP_DAY_FG),
- "fontset", NORMAL_DAY_FONTSET,
- NULL);
- current_index = -1;
- }
+ GtkWidget *month;
+ GtkWidget *year;
+ ECalendar *ecal;
+ GtkWidget *vbox;
- t = time (NULL);
- tm = *localtime (&t);
+ GnomeCalendar *gcal;
+ gint year_val;
+ gint month_val;
+ gint day_val;
+
+} GoToDialog;
- if (((tm.tm_year + 1900) == month_item->year) && (tm.tm_mon == month_item->month)) {
- current_index = gnome_month_item_day2index (month_item, tm.tm_mday);
- g_assert (current_index != -1);
-
- item = gnome_month_item_num2child (month_item,
- GNOME_MONTH_ITEM_DAY_LABEL + current_index);
- gnome_canvas_item_set (item,
- "fill_color", color_spec_from_prop (COLOR_PROP_CURRENT_DAY_FG),
- "fontset", CURRENT_DAY_FONTSET,
- NULL);
- }
-}
+GoToDialog *dlg = NULL;
/* Callback used when the year adjustment is changed */
static void
year_changed (GtkAdjustment *adj, gpointer data)
{
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (month_item),
- "year", (int) adj->value,
- NULL);
- update ();
-}
-
-/* Creates the year control with its adjustment */
-static GtkWidget *
-create_year (int year)
-{
- GtkWidget *hbox;
- GtkAdjustment *adj;
- GtkWidget *w;
-
- hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
-
- w = gtk_label_new (_("Year:"));
- gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
-
- adj = GTK_ADJUSTMENT (gtk_adjustment_new (year, 1900, 9999, 1, 10, 10));
- gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
- (GtkSignalFunc) year_changed,
- NULL);
-
- w = gtk_spin_button_new (adj, 1.0, 0);
- gtk_widget_set_usize (w, 60, 0);
- gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
+ GoToDialog *dlg = data;
- return hbox;
+ dlg->year_val = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (dlg->year));
+ e_calendar_item_set_first_month (dlg->ecal->calitem, dlg->year_val, dlg->month_val);
}
/* Callback used when a month button is toggled */
static void
-month_toggled (GtkToggleButton *toggle, gpointer data)
+month_changed (GtkToggleButton *toggle, gpointer data)
{
- if (!toggle->active)
- return;
+ GoToDialog *dlg = data;
+ GtkWidget *menu, *active;
+
+ menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (dlg->month));
+ active = gtk_menu_get_active (GTK_MENU (menu));
+ dlg->month_val = g_list_index (GTK_MENU_SHELL (menu)->children, active);
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (month_item),
- "month", GPOINTER_TO_INT (data),
- NULL);
- update ();
+ e_calendar_item_set_first_month (dlg->ecal->calitem, dlg->year_val, dlg->month_val);
}
-/* Creates the months control */
-static GtkWidget *
-create_months (int month)
+/* Event handler for day groups in the month item. A button press makes the calendar jump to the
+ * selected day and destroys the Go-to dialog box.
+ */
+static void
+ecal_event (ECalendarItem *calitem, gpointer user_data)
{
- time_t start_time;
- GtkWidget *table;
- GtkWidget *w;
- GSList *group;
- int i, row, col;
+ GoToDialog *dlg = user_data;
+ GDate start_date, end_date;
struct tm tm;
- char buf[100];
-
- gnome_calendar_get_selected_time_range (gnome_calendar, &start_time, NULL);
-
- tm = *localtime (&start_time);
-
- table = gtk_table_new (2, 6, TRUE);
-
- group = NULL;
-
- for (i = 0; i < 12; i++) {
- row = i / 6;
- col = i % 6;
-
- tm.tm_mon = i;
- strftime (buf, 100, "%b", &tm);
-
- w = gtk_radio_button_new (group);
- group = gtk_radio_button_group (GTK_RADIO_BUTTON (w));
- gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (w), FALSE);
+ time_t et;
+
+ e_calendar_item_get_selection (calitem, &start_date, &end_date);
+ g_date_to_struct_tm (&start_date, &tm);
+ et = mktime (&tm);
+
+ gnome_calendar_goto (dlg->gcal, et);
- gtk_container_add (GTK_CONTAINER (w), gtk_label_new (buf));
+ gnome_dialog_close (GNOME_DIALOG (dlg->dialog));
+}
- if (i == month)
- gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (w), TRUE);
+/* Creates the canvas with the month item for selecting days */
+static ECalendar *
+create_ecal (void)
+{
+ ECalendar *ecal;
- gtk_signal_connect (GTK_OBJECT (w), "toggled",
- (GtkSignalFunc) month_toggled,
- GINT_TO_POINTER (i));
- gtk_table_attach (GTK_TABLE (table), w,
- col, col + 1,
- row, row + 1,
- GTK_EXPAND | GTK_FILL,
- GTK_EXPAND | GTK_FILL,
- 0, 0);
- gtk_widget_show_all (w);
- }
+ ecal = E_CALENDAR (e_calendar_new ());
- return table;
+ e_calendar_item_set_display_popup (ecal->calitem, FALSE);
+
+ return ecal;
}
-/* Sets the scrolling region of the canvas to the allocation size */
static void
-set_scroll_region (GtkWidget *widget, GtkAllocation *allocation)
+goto_today (GoToDialog *dlg)
{
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (month_item),
- "width", (double) (allocation->width - 1),
- "height", (double) (allocation->height - 1),
- NULL);
-
- gnome_canvas_set_scroll_region (GNOME_CANVAS (widget),
- 0, 0,
- allocation->width, allocation->height);
+ gnome_calendar_goto_today (dlg->gcal);
}
-/* Event handler for day groups in the month item. A button press makes the calendar jump to the
- * selected day and destroys the Go-to dialog box.
+/* Gets the widgets from the XML file and returns if they are all available.
*/
-static gint
-day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data)
+static gboolean
+get_widgets (GoToDialog *dlg)
{
- int child_num, day;
-
- child_num = gnome_month_item_child2num (month_item, item);
- day = gnome_month_item_num2day (month_item, child_num);
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- if ((event->button.button == 1) && (day != 0)) {
- gnome_calendar_goto (gnome_calendar,
- time_from_day (month_item->year, month_item->month, day));
- gtk_widget_destroy (goto_win);
- }
- break;
-
- default:
- break;
- }
+#define GW(name) glade_xml_get_widget (dlg->xml, name)
- return FALSE;
-}
+ dlg->dialog = GW ("goto-dialog");
-/* Creates the canvas with the month item for selecting days */
-static GtkWidget *
-create_days (int day, int month, int year)
-{
- GtkWidget *canvas;
- int i;
- GnomeCanvasItem *day_group;
-
- canvas = gnome_canvas_new ();
- gtk_widget_set_usize (canvas, 150, 120);
-
- month_item = GNOME_MONTH_ITEM (gnome_month_item_new (gnome_canvas_root (GNOME_CANVAS (canvas))));
- gnome_canvas_item_set (GNOME_CANVAS_ITEM (month_item),
- "month", month,
- "year", year,
- "start_on_monday", week_starts_on_monday,
- NULL);
- colorify_month_item (month_item, default_color_func, NULL);
- month_item_prepare_prelight (month_item, default_color_func, NULL);
- update ();
-
- /* Connect to size_allocate so that we can change the size of the month item and the
- * scrolling region appropriately.
- */
-
- gtk_signal_connect (GTK_OBJECT (canvas), "size_allocate",
- (GtkSignalFunc) set_scroll_region,
- NULL);
-
- /* Bind the day groups to our event handler */
-
- for (i = 0; i < 42; i++) {
- day_group = gnome_month_item_num2child (month_item, i + GNOME_MONTH_ITEM_DAY_GROUP);
- gtk_signal_connect (GTK_OBJECT (day_group), "event",
- (GtkSignalFunc) day_event,
- NULL);
- }
+ dlg->month = GW ("month");
+ dlg->year = GW ("year");
+ dlg->vbox = GW ("vbox");
+
+#undef GW
- return canvas;
+ return (dlg->dialog
+ && dlg->month
+ && dlg->year
+ && dlg->vbox);
}
static void
-goto_today (GtkWidget *widget, gpointer data)
+goto_dialog_init_widgets (GoToDialog *dlg)
{
- gnome_calendar_goto_today (gnome_calendar);
- gtk_widget_destroy (goto_win);
+ GtkWidget *menu;
+ GtkAdjustment *adj;
+ GList *l;
+
+ menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (dlg->month));
+ for (l = GTK_MENU_SHELL (menu)->children; l != NULL; l = l->next)
+ gtk_signal_connect (GTK_OBJECT (menu), "selection_done",
+ GTK_SIGNAL_FUNC (month_changed), dlg);
+
+ adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (dlg->year));
+ gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
+ (GtkSignalFunc) year_changed, dlg);
+
+ gtk_signal_connect (GTK_OBJECT (dlg->ecal->calitem),
+ "selection_changed",
+ (GtkSignalFunc) ecal_event,
+ dlg);
}
/* Creates a "goto date" dialog and runs it */
void
goto_dialog (GnomeCalendar *gcal)
{
+ GtkWidget *menu;
time_t start_time;
- GtkWidget *vbox;
- GtkWidget *hbox;
- GtkWidget *w;
- GtkWidget *days;
struct tm tm;
+ int b;
- gnome_calendar = gcal;
- current_index = -1;
+ if (dlg) {
+ return;
+ }
+
+ dlg = g_new0 (GoToDialog, 1);
+
+ /* Load the content widgets */
+ dlg->xml = glade_xml_new (EVOLUTION_GLADEDIR "/goto-dialog.glade", NULL);
+ if (!dlg->xml) {
+ g_message ("goto_dialog(): Could not load the Glade XML file!");
+ return;
+ }
- gnome_calendar_get_selected_time_range (gnome_calendar, &start_time, NULL);
+ if (!get_widgets (dlg)) {
+ g_message ("goto_dialog(): Could not find all widgets in the XML file!");
+ return;
+ }
+ dlg->gcal = gcal;
+ gnome_calendar_get_selected_time_range (dlg->gcal, &start_time, NULL);
tm = *localtime (&start_time);
+ dlg->year_val = tm.tm_year + 1900;
+ dlg->month_val = tm.tm_mon;
+ dlg->day_val = tm.tm_mday;
- goto_win = gnome_dialog_new (_("Go to date"),
- GNOME_STOCK_BUTTON_CANCEL,
- NULL);
- gnome_dialog_set_parent (GNOME_DIALOG (goto_win),
- GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gcal))));
-
+ menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (dlg->month));
+ gtk_option_menu_set_history (GTK_OPTION_MENU (dlg->month), dlg->month_val);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (dlg->year), dlg->year_val);
- vbox = GNOME_DIALOG (goto_win)->vbox;
-
- /* Instructions */
-
- w = gtk_label_new (_("Please select the date you want to go to.\n"
- "When you click on a day, you will be taken\n"
- "to that date."));
- gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
- gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.0);
- gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
-
- /* Create month item before creating the year controls, since the
- * latter ones need the month_item to be created.
- */
-
- days = create_days (tm.tm_mday, tm.tm_mon, tm.tm_year + 1900);
-
- /* Year */
-
- w = create_year (tm.tm_year + 1900);
- gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
-
- /* Month */
-
- w = create_months (tm.tm_mon);
- gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
-
- /* Days (canvas with month item) */
-
- gtk_box_pack_start (GTK_BOX (vbox), days, TRUE, TRUE, 0);
- gtk_widget_show (days);
-
- /* Today button */
+ dlg->ecal = create_ecal ();
+ gtk_box_pack_start (GTK_BOX (dlg->vbox), GTK_WIDGET (dlg->ecal), TRUE, TRUE, 0);
+ gtk_widget_show (GTK_WIDGET (dlg->ecal));
- hbox = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
- gtk_widget_show (hbox);
+ goto_dialog_init_widgets (dlg);
- w = gtk_button_new_with_label (_("Go to today"));
- gtk_signal_connect (GTK_OBJECT (w), "clicked",
- (GtkSignalFunc) goto_today,
- NULL);
- gtk_box_pack_start (GTK_BOX (hbox), w, FALSE, FALSE, 0);
- gtk_widget_show (w);
+ gnome_dialog_set_parent (GNOME_DIALOG (dlg->dialog),
+ GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gcal))));
- /* Run! */
+ b = gnome_dialog_run_and_close (GNOME_DIALOG (dlg->dialog));
+ if (b == 0)
+ goto_today (dlg);
- gtk_window_set_modal (GTK_WINDOW (goto_win), TRUE);
- gnome_dialog_set_close (GNOME_DIALOG (goto_win), TRUE);
- gnome_dialog_set_parent (GNOME_DIALOG (goto_win),
- GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (gnome_calendar))));
- gtk_widget_show (goto_win);
+ gtk_object_unref (GTK_OBJECT (dlg->xml));
+ g_free (dlg);
+ dlg = NULL;
}