diff options
Diffstat (limited to 'calendar/gui')
-rw-r--r-- | calendar/gui/calendar.c | 5 | ||||
-rw-r--r-- | calendar/gui/eventedit.c | 33 | ||||
-rw-r--r-- | calendar/gui/eventedit.h | 6 | ||||
-rw-r--r-- | calendar/gui/month-view.c | 189 | ||||
-rw-r--r-- | calendar/gui/year-view.c | 35 |
5 files changed, 237 insertions, 31 deletions
diff --git a/calendar/gui/calendar.c b/calendar/gui/calendar.c index bacd7c9291..963f91be06 100644 --- a/calendar/gui/calendar.c +++ b/calendar/gui/calendar.c @@ -201,6 +201,11 @@ calendar_get_objects_in_range (GList *objects, time_t start, time_t end, GCompar } } + /* Put the list in increasing order if no sort function was specified */ + + if (!sort_func) + new_events = g_list_reverse (new_events); + return new_events; } diff --git a/calendar/gui/eventedit.c b/calendar/gui/eventedit.c index c46da47c1f..a8a972158f 100644 --- a/calendar/gui/eventedit.c +++ b/calendar/gui/eventedit.c @@ -1482,3 +1482,36 @@ event_editor_new (GnomeCalendar *gcal, iCalObject *ical) return retval; } + +void +event_editor_new_whole_day (GnomeCalendar *owner, time_t day) +{ + struct tm tm; + iCalObject *ico; + GtkWidget *ee; + + g_return_if_fail (owner != NULL); + g_return_if_fail (GNOME_IS_CALENDAR (owner)); + + ico = ical_new ("", user_name, ""); + ico->new = TRUE; + + tm = *localtime (&day); + + /* Set the start time of the event to the beginning of the day */ + + tm.tm_hour = day_begin; + tm.tm_min = 0; + tm.tm_sec = 0; + ico->dtstart = mktime (&tm); + + /* Set the end time of the event to the end of the day */ + + tm.tm_hour = day_end; + ico->dtend = mktime (&tm); + + /* Launch the event editor */ + + ee = event_editor_new (owner, ico); + gtk_widget_show (ee); +} diff --git a/calendar/gui/eventedit.h b/calendar/gui/eventedit.h index 9cb80e3912..15ef540333 100644 --- a/calendar/gui/eventedit.h +++ b/calendar/gui/eventedit.h @@ -71,6 +71,12 @@ typedef struct { guint event_editor_get_type (void); GtkWidget *event_editor_new (GnomeCalendar *owner, iCalObject *); +/* Convenience function to create and show a new event editor for an event that goes from day_begin + * to day_end of the specified day. + */ +void event_editor_new_whole_day (GnomeCalendar *owner, time_t day); + + END_GNOME_DECLS diff --git a/calendar/gui/month-view.c b/calendar/gui/month-view.c index 7cce9b359e..07a92578dd 100644 --- a/calendar/gui/month-view.c +++ b/calendar/gui/month-view.c @@ -7,10 +7,12 @@ #include <config.h> #include <libgnomeui/gnome-canvas-text.h> +#include "eventedit.h" #include "layout.h" #include "month-view.h" #include "main.h" #include "mark.h" +#include "quick-view.h" #include "timeutil.h" @@ -71,6 +73,184 @@ month_view_class_init (MonthViewClass *class) widget_class->size_allocate = month_view_size_allocate; } +/* Creates the quick view when a day is clicked in the month view */ +static void +do_quick_view_popup (MonthView *mv, GdkEventButton *event, int day) +{ + time_t day_begin_time, day_end_time; + GList *list; + GtkWidget *qv; + char date_str[256]; + + day_begin_time = time_from_day (mv->year, mv->month, day); + day_end_time = time_day_end (day_begin_time); + + list = calendar_get_events_in_range (mv->calendar->cal, day_begin_time, day_end_time); + + strftime (date_str, sizeof (date_str), "%a %b %d %Y", localtime (&day_begin_time)); + qv = quick_view_new (mv->calendar, date_str, list); + + quick_view_do_popup (QUICK_VIEW (qv), event); + + gtk_widget_destroy (qv); + calendar_destroy_event_list (list); +} + +/* Callback used to destroy the popup menu when the month view is destroyed */ +static void +destroy_menu (GtkWidget *widget, gpointer data) +{ + gtk_widget_destroy (GTK_WIDGET (data)); +} + +/* Creates a new appointment in the current day */ +static void +new_appointment (GtkWidget *widget, gpointer data) +{ + MonthView *mv; + time_t *t; + + mv = MONTH_VIEW (data); + t = gtk_object_get_data (GTK_OBJECT (widget), "time_data"); + + event_editor_new_whole_day (mv->calendar, *t); +} + +/* Convenience functions to jump to a view and set the time */ +static void +do_jump (GtkWidget *widget, gpointer data, char *view_name) +{ + MonthView *mv; + time_t *t; + + mv = MONTH_VIEW (data); + + /* Get the time data from the menu item */ + + t = gtk_object_get_data (GTK_OBJECT (widget), "time_data"); + + /* Set the view and time */ + + gnome_calendar_set_view (mv->calendar, view_name); + gnome_calendar_goto (mv->calendar, *t); +} + +/* The following three callbacks set the view in the calendar and change the time */ + +static void +jump_to_day (GtkWidget *widget, gpointer data) +{ + do_jump (widget, data, "dayview"); +} + +static void +jump_to_week (GtkWidget *widget, gpointer data) +{ + do_jump (widget, data, "weekview"); +} + +static void +jump_to_year (GtkWidget *widget, gpointer data) +{ + do_jump (widget, data, "yearview"); +} + +static GnomeUIInfo mv_popup_menu[] = { + GNOMEUIINFO_ITEM_STOCK (N_("_New appointment in this day..."), NULL, new_appointment, GNOME_STOCK_MENU_NEW), + + GNOMEUIINFO_SEPARATOR, + + GNOMEUIINFO_ITEM_STOCK (N_("Jump to this _day"), NULL, jump_to_day, GNOME_STOCK_MENU_JUMP_TO), + GNOMEUIINFO_ITEM_STOCK (N_("Jump to this _week"), NULL, jump_to_week, GNOME_STOCK_MENU_JUMP_TO), + GNOMEUIINFO_ITEM_STOCK (N_("Jump to this _year"), NULL, jump_to_year, GNOME_STOCK_MENU_JUMP_TO), + GNOMEUIINFO_END +}; + +/* Creates the popup menu for the month view if it does not yet exist, and attaches it to the month + * view object so that it can be destroyed when appropriate. + */ +static GtkWidget * +get_popup_menu (MonthView *mv) +{ + GtkWidget *menu; + + menu = gtk_object_get_data (GTK_OBJECT (mv), "popup_menu"); + + if (!menu) { + menu = gnome_popup_menu_new (mv_popup_menu); + gtk_object_set_data (GTK_OBJECT (mv), "popup_menu", menu); + gtk_signal_connect (GTK_OBJECT (mv), "destroy", + (GtkSignalFunc) destroy_menu, + menu); + } + + return menu; +} + +/* Pops up the menu for the month view. */ +static void +do_popup_menu (MonthView *mv, GdkEventButton *event, int day) +{ + GtkWidget *menu; + static time_t t; + + menu = get_popup_menu (mv); + + /* Enable or disable items as appropriate */ + + gtk_widget_set_sensitive (mv_popup_menu[0].widget, day != 0); + gtk_widget_set_sensitive (mv_popup_menu[2].widget, day != 0); + gtk_widget_set_sensitive (mv_popup_menu[3].widget, day != 0); + + if (day == 0) + day = 1; + + /* Store the time for the menu item callbacks to use */ + + t = time_from_day (mv->year, mv->month, day); + + gtk_object_set_data (GTK_OBJECT (mv_popup_menu[0].widget), "time_data", &t); + gtk_object_set_data (GTK_OBJECT (mv_popup_menu[2].widget), "time_data", &t); + gtk_object_set_data (GTK_OBJECT (mv_popup_menu[3].widget), "time_data", &t); + gtk_object_set_data (GTK_OBJECT (mv_popup_menu[4].widget), "time_data", &t); + + gnome_popup_menu_do_popup (menu, NULL, NULL, event, mv); +} + +/* Event handler for day groups. When mouse button 1 is pressed, it will pop up a quick view with + * the events in that day. When mouse button 3 is pressed, it will pop up a menu. + */ +static gint +day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) +{ + MonthView *mv; + int child_num; + int day; + + mv = MONTH_VIEW (data); + + child_num = gnome_month_item_child2num (GNOME_MONTH_ITEM (mv->mitem), item); + day = gnome_month_item_num2day (GNOME_MONTH_ITEM (mv->mitem), child_num); + + switch (event->type) { + case GDK_BUTTON_PRESS: + if ((event->button.button == 1) && (day != 0)) { + do_quick_view_popup (mv, (GdkEventButton *) event, day); + return TRUE; + } else if (event->button.button == 3) { + do_popup_menu (mv, (GdkEventButton *) event, day); + return TRUE; + } + + break; + + default: + break; + } + + return FALSE; +} + /* Returns the index of the specified arrow in the array of arrows */ static int get_arrow_index (MonthView *mv, GnomeCanvasItem *arrow) @@ -188,6 +368,9 @@ arrow_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) return TRUE; case GDK_BUTTON_PRESS: + if (event->button.button != 1) + break; + do_arrow_click (mv, item); return TRUE; @@ -251,7 +434,8 @@ month_view_init (MonthView *mv) NULL); /* Arrows and text items. The arrows start hidden by default; they will be shown as - * appropriate by the item adjustment code. + * appropriate by the item adjustment code. Also, connect to the event signal of the + * day groups so that we can pop up the quick view when appropriate. */ points = gnome_canvas_points_new (3); @@ -259,6 +443,9 @@ month_view_init (MonthView *mv) for (i = 0; i < 42; i++) { day_group = gnome_month_item_num2child (GNOME_MONTH_ITEM (mv->mitem), i + GNOME_MONTH_ITEM_DAY_GROUP); + gtk_signal_connect (GTK_OBJECT (day_group), "event", + (GtkSignalFunc) day_event, + mv); /* Up arrow */ diff --git a/calendar/gui/year-view.c b/calendar/gui/year-view.c index 5746d61803..113b842714 100644 --- a/calendar/gui/year-view.c +++ b/calendar/gui/year-view.c @@ -178,37 +178,12 @@ static void new_appointment (GtkWidget *widget, gpointer data) { YearView *yv; - GtkWidget *ee; time_t *t; - struct tm tm; - iCalObject *ico; yv = YEAR_VIEW (data); - - /* Get the time data from the menu item */ - t = gtk_object_get_data (GTK_OBJECT (widget), "time_data"); - tm = *localtime (t); - - ico = ical_new ("", user_name, ""); - ico->new = TRUE; - - /* Set the start time of the event to the beginning of the day */ - - tm.tm_hour = day_begin; - tm.tm_min = 0; - tm.tm_sec = 0; - ico->dtstart = mktime (&tm); - - /* Set the end time of the event to the end of the day */ - - tm.tm_hour = day_end; - ico->dtend = mktime (&tm); - - /* Launch the event editor */ - ee = event_editor_new (yv->calendar, ico); - gtk_widget_show (ee); + event_editor_new_whole_day (yv->calendar, *t); } /* Convenience functions to jump to a view and set the time */ @@ -252,13 +227,13 @@ jump_to_month (GtkWidget *widget, gpointer data) /* Information for the year view's popup menu */ static GnomeUIInfo yv_popup_menu[] = { - GNOMEUIINFO_ITEM_STOCK ("_New appointment in this day...", NULL, new_appointment, GNOME_STOCK_MENU_NEW), + GNOMEUIINFO_ITEM_STOCK (N_("_New appointment in this day..."), NULL, new_appointment, GNOME_STOCK_MENU_NEW), GNOMEUIINFO_SEPARATOR, - GNOMEUIINFO_ITEM_STOCK ("Jump to this _day", NULL, jump_to_day, GNOME_STOCK_MENU_JUMP_TO), - GNOMEUIINFO_ITEM_STOCK ("Jump to this _week", NULL, jump_to_week, GNOME_STOCK_MENU_JUMP_TO), - GNOMEUIINFO_ITEM_STOCK ("Jump to this _month", NULL, jump_to_month, GNOME_STOCK_MENU_JUMP_TO), + GNOMEUIINFO_ITEM_STOCK (N_("Jump to this _day"), NULL, jump_to_day, GNOME_STOCK_MENU_JUMP_TO), + GNOMEUIINFO_ITEM_STOCK (N_("Jump to this _week"), NULL, jump_to_week, GNOME_STOCK_MENU_JUMP_TO), + GNOMEUIINFO_ITEM_STOCK (N_("Jump to this _month"), NULL, jump_to_month, GNOME_STOCK_MENU_JUMP_TO), GNOMEUIINFO_END }; |