aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui')
-rw-r--r--calendar/gui/Makefile.am2
-rw-r--r--calendar/gui/gnome-cal.h4
-rw-r--r--calendar/gui/quick-view.c217
-rw-r--r--calendar/gui/quick-view.h59
-rw-r--r--calendar/gui/year-view.c27
5 files changed, 302 insertions, 7 deletions
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 <libgnome/gnome-defs.h>
-#include <libgnomeui/gnome-app.h>
-#include <libgnomeui/gtkcalendar.h>
+#include <gnome.h>
#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 <federico@nuclecu.unam.mx
+ */
+
+#include <config.h>
+#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 <federico@nuclecu.unam.mx
+ */
+
+#ifndef QUICK_VIEW_H
+#define QUICK_VIEW_H
+
+#include <libgnome/gnome-defs.h>
+#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,