diff options
Diffstat (limited to 'calendar/gui/goto.c')
-rw-r--r-- | calendar/gui/goto.c | 393 |
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; } |