From 550314f75b3a94e468e5f1117b9425d6d3784161 Mon Sep 17 00:00:00 2001 From: Federico Mena Quintero Date: Tue, 29 Sep 1998 00:54:21 +0000 Subject: New file that presents a quick view of the events in a particular day when 1998-09-28 Federico Mena Quintero * quick-view.[ch]: New file that presents a quick view of the events in a particular day when the mouse is clicked on the year view. Work in progress. * year-view.c (do_quick_view_popup): New function that creates a quick view for the events in a day. * Makefile.am (gnomecal_SOURCES): Added quick-view.[ch] to the list of sources. svn path=/trunk/; revision=413 --- calendar/ChangeLog | 12 +++ calendar/Makefile.am | 2 + calendar/gnome-cal.h | 4 +- calendar/gui/Makefile.am | 2 + calendar/gui/gnome-cal.h | 4 +- calendar/gui/quick-view.c | 217 ++++++++++++++++++++++++++++++++++++++++++++++ calendar/gui/quick-view.h | 59 +++++++++++++ calendar/gui/year-view.c | 27 +++++- calendar/quick-view.c | 217 ++++++++++++++++++++++++++++++++++++++++++++++ calendar/quick-view.h | 59 +++++++++++++ calendar/year-view.c | 27 +++++- 11 files changed, 616 insertions(+), 14 deletions(-) create mode 100644 calendar/gui/quick-view.c create mode 100644 calendar/gui/quick-view.h create mode 100644 calendar/quick-view.c create mode 100644 calendar/quick-view.h diff --git a/calendar/ChangeLog b/calendar/ChangeLog index fc2761ac1f..7fd66fdbaf 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,15 @@ +1998-09-28 Federico Mena Quintero + + * quick-view.[ch]: New file that presents a quick view of the + events in a particular day when the mouse is clicked on the year + view. Work in progress. + + * year-view.c (do_quick_view_popup): New function that creates a + quick view for the events in a day. + + * Makefile.am (gnomecal_SOURCES): Added quick-view.[ch] to the + list of sources. + 1998-09-27 Federico Mena Quintero * main.c: Hotkey for File/Exit should be C-q, not C-x. diff --git a/calendar/Makefile.am b/calendar/Makefile.am index 3f1cb80632..bc6081dc10 100644 --- a/calendar/Makefile.am +++ b/calendar/Makefile.am @@ -45,6 +45,8 @@ gnomecal_SOURCES = \ popup-menu.c \ popup-menu.h \ prop.c \ + quick-view.c \ + quick-view.h \ timeutil.c \ timeutil.h \ view-utils.h \ diff --git a/calendar/gnome-cal.h b/calendar/gnome-cal.h index afe546be2d..ab4f5ff304 100644 --- a/calendar/gnome-cal.h +++ b/calendar/gnome-cal.h @@ -8,9 +8,7 @@ #ifndef GNOME_CALENDAR_APP_H #define GNOME_CALENDAR_APP_H -#include -#include -#include +#include #include "calendar.h" diff --git a/calendar/gui/Makefile.am b/calendar/gui/Makefile.am index 3f1cb80632..bc6081dc10 100644 --- a/calendar/gui/Makefile.am +++ b/calendar/gui/Makefile.am @@ -45,6 +45,8 @@ gnomecal_SOURCES = \ popup-menu.c \ popup-menu.h \ prop.c \ + quick-view.c \ + quick-view.h \ timeutil.c \ timeutil.h \ view-utils.h \ diff --git a/calendar/gui/gnome-cal.h b/calendar/gui/gnome-cal.h index afe546be2d..ab4f5ff304 100644 --- a/calendar/gui/gnome-cal.h +++ b/calendar/gui/gnome-cal.h @@ -8,9 +8,7 @@ #ifndef GNOME_CALENDAR_APP_H #define GNOME_CALENDAR_APP_H -#include -#include -#include +#include #include "calendar.h" diff --git a/calendar/gui/quick-view.c b/calendar/gui/quick-view.c new file mode 100644 index 0000000000..cbb5cfb5c0 --- /dev/null +++ b/calendar/gui/quick-view.c @@ -0,0 +1,217 @@ +/* Quick view widget for Gnomecal + * + * Copyright (C) 1998 The Free Software Foundation + * + * Author: Federico Mena +#include "quick-view.h" +#include "main.h" + + +static void quick_view_class_init (QuickViewClass *class); +static void quick_view_init (QuickView *qv); + + +GtkType +quick_view_get_type (void) +{ + static GtkType quick_view_type = 0; + + if (!quick_view_type) { + GtkTypeInfo quick_view_info = { + "QuickView", + sizeof (QuickView), + sizeof (QuickViewClass), + (GtkClassInitFunc) quick_view_class_init, + (GtkObjectInitFunc) quick_view_init, + NULL, /* reserved_1 */ + NULL, /* reserved_2 */ + (GtkClassInitFunc) NULL + }; + + quick_view_type = gtk_type_unique (gtk_window_get_type (), &quick_view_info); + } + + return quick_view_type; +} + +static void +quick_view_class_init (QuickViewClass *class) +{ +} + +static void +quick_view_init (QuickView *qv) +{ + GTK_WINDOW (qv)->type = GTK_WINDOW_POPUP; + gtk_window_position (GTK_WINDOW (qv), GTK_WIN_POS_MOUSE); +} + +/* Handles button release events from the canvas in the quick view. When a button release is + * received, it pops down the quick view and calls gtk_main_quit(). + */ +static gint +button_release (GtkWidget *widget, GdkEventButton *event, gpointer data) +{ + QuickView *qv; + + qv = data; + + if (event->button != qv->button) + return FALSE; + + gdk_pointer_ungrab (event->time); + gtk_grab_remove (GTK_WIDGET (qv)); + gtk_widget_hide (GTK_WIDGET (qv)); + + gtk_main_quit (); /* End modality */ + return TRUE; +} + + +/* Creates the items corresponding to a single calendar object. Takes in the y position of the + * items to create and returns the y position of the next item to create. + */ +double +create_items_for_event (QuickView *qv, CalendarObject *co, double y) +{ + GnomeCanvas *canvas; + char start[100], end[100]; + struct tm start_tm, end_tm; + char *str; + + /* FIXME: make this nice */ + + canvas = GNOME_CANVAS (qv->canvas); + + start_tm = *localtime (&co->ev_start); + end_tm = *localtime (&co->ev_end); + + if (am_pm_flag) { + strftime (start, sizeof (start), "%I:%M%p", &start_tm); + strftime (end, sizeof (end), "%I:%M%p", &end_tm); + } else { + strftime (start, sizeof (start), "%H:%M", &start_tm); + strftime (end, sizeof (end), "%H:%M", &end_tm); + } + + str = g_copy_strings (start, " - ", end, " ", co->ico->summary, NULL); + + gnome_canvas_item_new (gnome_canvas_root (canvas), + gnome_canvas_text_get_type (), + "x", 0.0, + "y", y, + "anchor", GTK_ANCHOR_NW, + "text", str, + NULL); + + g_free (str); + + return (y + 16); /* FIXME */ +} + +/* Creates the canvas items corresponding to the events in the list */ +static void +setup_event_list (QuickView *qv, GList *event_list) +{ + CalendarObject *co; + double y; + + /* If there are no events, then just put a simple label */ + + if (!event_list) { + gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (qv->canvas)), + gnome_canvas_text_get_type (), + "x", 0.0, + "y", 0.0, + "anchor", GTK_ANCHOR_NW, + "text", _("No appointments scheduled for this day"), + NULL); + return; + } + + /* Create the items for all the events in the list */ + + y = 0.0; + + for (; event_list; event_list = event_list->next) { + co = event_list->data; + y = create_items_for_event (qv, co, y); + } + + /* Set the scrolling region to fit all the items */ + + gnome_canvas_set_scroll_region (GNOME_CANVAS (qv->canvas), + 0.0, 0.0, + 300.0, y); /* FIXME: figure out reasonable sizes */ + + gnome_canvas_set_size (GNOME_CANVAS (qv->canvas), 300, y); +} + +GtkWidget * +quick_view_new (GnomeCalendar *calendar, char *title, GList *event_list) +{ + QuickView *qv; + GtkWidget *w; + + g_return_val_if_fail (calendar != NULL, NULL); + g_return_val_if_fail (GNOME_IS_CALENDAR (calendar), NULL); + + qv = gtk_type_new (quick_view_get_type ()); + qv->calendar = calendar; + + /* Create base widgets for the popup window */ + + w = gtk_frame_new (title); + gtk_container_add (GTK_CONTAINER (qv), w); + gtk_widget_show (w); + + gtk_widget_push_visual (gdk_imlib_get_visual ()); + gtk_widget_push_colormap (gdk_imlib_get_colormap ()); + + qv->canvas = gnome_canvas_new (); + + gtk_widget_pop_colormap (); + gtk_widget_pop_visual (); + + gtk_signal_connect (GTK_OBJECT (qv->canvas), "button_release_event", + (GtkSignalFunc) button_release, + qv); + + gtk_container_add (GTK_CONTAINER (w), qv->canvas); + gtk_widget_show (qv->canvas); + + /* Set up the event list */ + + setup_event_list (qv, event_list); + + return GTK_WIDGET (qv); +} + +void +quick_view_do_popup (QuickView *qv, GdkEventButton *event) +{ + g_return_if_fail (qv != NULL); + g_return_if_fail (IS_QUICK_VIEW (qv)); + g_return_if_fail (event != NULL); + + /* Pop up the window */ + + gtk_widget_show (GTK_WIDGET (qv)); + gtk_grab_add (GTK_WIDGET (qv)); + + gdk_pointer_grab (GTK_WIDGET (qv)->window, + TRUE, + GDK_BUTTON_RELEASE_MASK, + NULL, + NULL, + event->time); + + qv->button = event->button; + + gtk_main (); /* Begin modality */ + + /* The button release event handler will call gtk_main_quit() */ +} diff --git a/calendar/gui/quick-view.h b/calendar/gui/quick-view.h new file mode 100644 index 0000000000..c6b2cf8814 --- /dev/null +++ b/calendar/gui/quick-view.h @@ -0,0 +1,59 @@ +/* Quick view widget for Gnomecal + * + * Copyright (C) 1998 The Free Software Foundation + * + * Author: Federico Mena +#include "gnome-cal.h" + + +BEGIN_GNOME_DECLS + + +#define TYPE_QUICK_VIEW (quick_view_get_type ()) +#define QUICK_VIEW(obj) (GTK_CHECK_CAST ((obj), TYPE_QUICK_VIEW, QuickView)) +#define QUICK_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_QUICK_VIEW, QuickViewClass)) +#define IS_QUICK_VIEW(obj) (GTK_CHECK_TYPE ((obj), TYPE_QUICK_VIEW)) +#define IS_QUICK_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), TYPE_QUICK_VIEW)) + + +typedef struct _QuickView QuickView; +typedef struct _QuickViewClass QuickViewClass; + +struct _QuickView { + GtkWindow window; + + GnomeCalendar *calendar; /* The calendar we are associated to */ + + GtkWidget *canvas; /* The canvas that displays the contents of the quick view */ + + int button; /* The button that was pressed to pop up the quick view */ +}; + +struct _QuickViewClass { + GtkWindowClass parent_class; +}; + + +/* Standard Gtk function */ +GtkType quick_view_get_type (void); + +/* Creates a new quick view with the specified title and the specified event list. It is associated + * to the specified calendar. The event list must be a list of CalendarObject structures. + */ +GtkWidget *quick_view_new (GnomeCalendar *calendar, char *title, GList *event_list); + +/* Pops up the quick view widget modally and loops until the uses closes it by releasing the mouse + * button. You can destroy the quick view when this function returns. + */ +void quick_view_do_popup (QuickView *qv, GdkEventButton *event); + + +END_GNOME_DECLS + +#endif diff --git a/calendar/gui/year-view.c b/calendar/gui/year-view.c index 2027cac398..d5710228df 100644 --- a/calendar/gui/year-view.c +++ b/calendar/gui/year-view.c @@ -13,6 +13,7 @@ #include "year-view.h" #include "main.h" #include "mark.h" +#include "quick-view.h" #include "timeutil.h" @@ -305,6 +306,27 @@ do_popup_menu (YearView *yv, GdkEventButton *event, int allow_new, int allow_day gnome_popup_menu_do_popup (menu, NULL, NULL, event, yv); } +/* Creates the quick view when the user clicks on a day */ +static void +do_quick_view_popup (YearView *yv, GdkEventButton *event, int year, int month, int day) +{ + time_t day_start, day_end; + GList *list; + GtkWidget *qv; + + day_start = time_from_day (year, month, day); + day_end = time_end_of_day (day_start); + + list = calendar_get_events_in_range (yv->calendar->cal, day_start, day_end); + + qv = quick_view_new (yv->calendar, "Put the date here", list); + + quick_view_do_popup (QUICK_VIEW (qv), event); + + gtk_widget_destroy (qv); + calendar_destroy_event_list (list); +} + /* Event handler for days in the year's month items */ static gint day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) @@ -325,10 +347,7 @@ day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) break; if (event->button.button == 1) { - gnome_calendar_dayjump (yv->calendar, - time_from_day (mitem->year, - mitem->month, - day)); + do_quick_view_popup (yv, (GdkEventButton *) event, mitem->year, mitem->month, day); return TRUE; } else if (event->button.button == 3) { do_popup_menu (yv, (GdkEventButton *) event, TRUE, TRUE, TRUE, TRUE, diff --git a/calendar/quick-view.c b/calendar/quick-view.c new file mode 100644 index 0000000000..cbb5cfb5c0 --- /dev/null +++ b/calendar/quick-view.c @@ -0,0 +1,217 @@ +/* Quick view widget for Gnomecal + * + * Copyright (C) 1998 The Free Software Foundation + * + * Author: Federico Mena +#include "quick-view.h" +#include "main.h" + + +static void quick_view_class_init (QuickViewClass *class); +static void quick_view_init (QuickView *qv); + + +GtkType +quick_view_get_type (void) +{ + static GtkType quick_view_type = 0; + + if (!quick_view_type) { + GtkTypeInfo quick_view_info = { + "QuickView", + sizeof (QuickView), + sizeof (QuickViewClass), + (GtkClassInitFunc) quick_view_class_init, + (GtkObjectInitFunc) quick_view_init, + NULL, /* reserved_1 */ + NULL, /* reserved_2 */ + (GtkClassInitFunc) NULL + }; + + quick_view_type = gtk_type_unique (gtk_window_get_type (), &quick_view_info); + } + + return quick_view_type; +} + +static void +quick_view_class_init (QuickViewClass *class) +{ +} + +static void +quick_view_init (QuickView *qv) +{ + GTK_WINDOW (qv)->type = GTK_WINDOW_POPUP; + gtk_window_position (GTK_WINDOW (qv), GTK_WIN_POS_MOUSE); +} + +/* Handles button release events from the canvas in the quick view. When a button release is + * received, it pops down the quick view and calls gtk_main_quit(). + */ +static gint +button_release (GtkWidget *widget, GdkEventButton *event, gpointer data) +{ + QuickView *qv; + + qv = data; + + if (event->button != qv->button) + return FALSE; + + gdk_pointer_ungrab (event->time); + gtk_grab_remove (GTK_WIDGET (qv)); + gtk_widget_hide (GTK_WIDGET (qv)); + + gtk_main_quit (); /* End modality */ + return TRUE; +} + + +/* Creates the items corresponding to a single calendar object. Takes in the y position of the + * items to create and returns the y position of the next item to create. + */ +double +create_items_for_event (QuickView *qv, CalendarObject *co, double y) +{ + GnomeCanvas *canvas; + char start[100], end[100]; + struct tm start_tm, end_tm; + char *str; + + /* FIXME: make this nice */ + + canvas = GNOME_CANVAS (qv->canvas); + + start_tm = *localtime (&co->ev_start); + end_tm = *localtime (&co->ev_end); + + if (am_pm_flag) { + strftime (start, sizeof (start), "%I:%M%p", &start_tm); + strftime (end, sizeof (end), "%I:%M%p", &end_tm); + } else { + strftime (start, sizeof (start), "%H:%M", &start_tm); + strftime (end, sizeof (end), "%H:%M", &end_tm); + } + + str = g_copy_strings (start, " - ", end, " ", co->ico->summary, NULL); + + gnome_canvas_item_new (gnome_canvas_root (canvas), + gnome_canvas_text_get_type (), + "x", 0.0, + "y", y, + "anchor", GTK_ANCHOR_NW, + "text", str, + NULL); + + g_free (str); + + return (y + 16); /* FIXME */ +} + +/* Creates the canvas items corresponding to the events in the list */ +static void +setup_event_list (QuickView *qv, GList *event_list) +{ + CalendarObject *co; + double y; + + /* If there are no events, then just put a simple label */ + + if (!event_list) { + gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (qv->canvas)), + gnome_canvas_text_get_type (), + "x", 0.0, + "y", 0.0, + "anchor", GTK_ANCHOR_NW, + "text", _("No appointments scheduled for this day"), + NULL); + return; + } + + /* Create the items for all the events in the list */ + + y = 0.0; + + for (; event_list; event_list = event_list->next) { + co = event_list->data; + y = create_items_for_event (qv, co, y); + } + + /* Set the scrolling region to fit all the items */ + + gnome_canvas_set_scroll_region (GNOME_CANVAS (qv->canvas), + 0.0, 0.0, + 300.0, y); /* FIXME: figure out reasonable sizes */ + + gnome_canvas_set_size (GNOME_CANVAS (qv->canvas), 300, y); +} + +GtkWidget * +quick_view_new (GnomeCalendar *calendar, char *title, GList *event_list) +{ + QuickView *qv; + GtkWidget *w; + + g_return_val_if_fail (calendar != NULL, NULL); + g_return_val_if_fail (GNOME_IS_CALENDAR (calendar), NULL); + + qv = gtk_type_new (quick_view_get_type ()); + qv->calendar = calendar; + + /* Create base widgets for the popup window */ + + w = gtk_frame_new (title); + gtk_container_add (GTK_CONTAINER (qv), w); + gtk_widget_show (w); + + gtk_widget_push_visual (gdk_imlib_get_visual ()); + gtk_widget_push_colormap (gdk_imlib_get_colormap ()); + + qv->canvas = gnome_canvas_new (); + + gtk_widget_pop_colormap (); + gtk_widget_pop_visual (); + + gtk_signal_connect (GTK_OBJECT (qv->canvas), "button_release_event", + (GtkSignalFunc) button_release, + qv); + + gtk_container_add (GTK_CONTAINER (w), qv->canvas); + gtk_widget_show (qv->canvas); + + /* Set up the event list */ + + setup_event_list (qv, event_list); + + return GTK_WIDGET (qv); +} + +void +quick_view_do_popup (QuickView *qv, GdkEventButton *event) +{ + g_return_if_fail (qv != NULL); + g_return_if_fail (IS_QUICK_VIEW (qv)); + g_return_if_fail (event != NULL); + + /* Pop up the window */ + + gtk_widget_show (GTK_WIDGET (qv)); + gtk_grab_add (GTK_WIDGET (qv)); + + gdk_pointer_grab (GTK_WIDGET (qv)->window, + TRUE, + GDK_BUTTON_RELEASE_MASK, + NULL, + NULL, + event->time); + + qv->button = event->button; + + gtk_main (); /* Begin modality */ + + /* The button release event handler will call gtk_main_quit() */ +} diff --git a/calendar/quick-view.h b/calendar/quick-view.h new file mode 100644 index 0000000000..c6b2cf8814 --- /dev/null +++ b/calendar/quick-view.h @@ -0,0 +1,59 @@ +/* Quick view widget for Gnomecal + * + * Copyright (C) 1998 The Free Software Foundation + * + * Author: Federico Mena +#include "gnome-cal.h" + + +BEGIN_GNOME_DECLS + + +#define TYPE_QUICK_VIEW (quick_view_get_type ()) +#define QUICK_VIEW(obj) (GTK_CHECK_CAST ((obj), TYPE_QUICK_VIEW, QuickView)) +#define QUICK_VIEW_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_QUICK_VIEW, QuickViewClass)) +#define IS_QUICK_VIEW(obj) (GTK_CHECK_TYPE ((obj), TYPE_QUICK_VIEW)) +#define IS_QUICK_VIEW_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), TYPE_QUICK_VIEW)) + + +typedef struct _QuickView QuickView; +typedef struct _QuickViewClass QuickViewClass; + +struct _QuickView { + GtkWindow window; + + GnomeCalendar *calendar; /* The calendar we are associated to */ + + GtkWidget *canvas; /* The canvas that displays the contents of the quick view */ + + int button; /* The button that was pressed to pop up the quick view */ +}; + +struct _QuickViewClass { + GtkWindowClass parent_class; +}; + + +/* Standard Gtk function */ +GtkType quick_view_get_type (void); + +/* Creates a new quick view with the specified title and the specified event list. It is associated + * to the specified calendar. The event list must be a list of CalendarObject structures. + */ +GtkWidget *quick_view_new (GnomeCalendar *calendar, char *title, GList *event_list); + +/* Pops up the quick view widget modally and loops until the uses closes it by releasing the mouse + * button. You can destroy the quick view when this function returns. + */ +void quick_view_do_popup (QuickView *qv, GdkEventButton *event); + + +END_GNOME_DECLS + +#endif diff --git a/calendar/year-view.c b/calendar/year-view.c index 2027cac398..d5710228df 100644 --- a/calendar/year-view.c +++ b/calendar/year-view.c @@ -13,6 +13,7 @@ #include "year-view.h" #include "main.h" #include "mark.h" +#include "quick-view.h" #include "timeutil.h" @@ -305,6 +306,27 @@ do_popup_menu (YearView *yv, GdkEventButton *event, int allow_new, int allow_day gnome_popup_menu_do_popup (menu, NULL, NULL, event, yv); } +/* Creates the quick view when the user clicks on a day */ +static void +do_quick_view_popup (YearView *yv, GdkEventButton *event, int year, int month, int day) +{ + time_t day_start, day_end; + GList *list; + GtkWidget *qv; + + day_start = time_from_day (year, month, day); + day_end = time_end_of_day (day_start); + + list = calendar_get_events_in_range (yv->calendar->cal, day_start, day_end); + + qv = quick_view_new (yv->calendar, "Put the date here", list); + + quick_view_do_popup (QUICK_VIEW (qv), event); + + gtk_widget_destroy (qv); + calendar_destroy_event_list (list); +} + /* Event handler for days in the year's month items */ static gint day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) @@ -325,10 +347,7 @@ day_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) break; if (event->button.button == 1) { - gnome_calendar_dayjump (yv->calendar, - time_from_day (mitem->year, - mitem->month, - day)); + do_quick_view_popup (yv, (GdkEventButton *) event, mitem->year, mitem->month, day); return TRUE; } else if (event->button.button == 3) { do_popup_menu (yv, (GdkEventButton *) event, TRUE, TRUE, TRUE, TRUE, -- cgit