aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/quick-view.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/quick-view.c')
-rw-r--r--calendar/gui/quick-view.c217
1 files changed, 217 insertions, 0 deletions
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() */
+}