aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui')
-rw-r--r--calendar/gui/calendar.c65
-rw-r--r--calendar/gui/calendar.h21
-rw-r--r--calendar/gui/gncal-day-view.c7
-rw-r--r--calendar/gui/gncal-full-day.c62
-rw-r--r--calendar/gui/main.c41
-rw-r--r--calendar/gui/view-utils.c51
6 files changed, 150 insertions, 97 deletions
diff --git a/calendar/gui/calendar.c b/calendar/gui/calendar.c
index dd0a5cca3f..8ad0208ac5 100644
--- a/calendar/gui/calendar.c
+++ b/calendar/gui/calendar.c
@@ -111,6 +111,23 @@ ice (time_t t)
return buffer;
}
+void
+calendar_iterate_on_objects (GList *objects, time_t start, time_t end, calendarfn cb, void *closure)
+{
+ for (; objects; objects = objects->next){
+ iCalObject *object = objects->data;
+
+ if ((start <= object->dtstart) && (object->dtend <= end))
+ (*cb)(object, object->dtstart, object->dtend, closure);
+ }
+}
+
+void
+calendar_iterate (Calendar *cal, time_t start, time_t end, calendarfn cb, void *closure)
+{
+ calendar_iterate_on_objects (cal->events, start, end, cb, closure);
+}
+
GList *
calendar_get_objects_in_range (GList *objects, time_t start, time_t end, GCompareFunc sort_func)
{
@@ -131,12 +148,6 @@ calendar_get_objects_in_range (GList *objects, time_t start, time_t end, GCompar
}
GList *
-calendar_get_events_in_range (Calendar *cal, time_t start, time_t end, GCompareFunc sort_func)
-{
- return calendar_get_objects_in_range (cal->events, start, end, sort_func);
-}
-
-GList *
calendar_get_todo_in_range (Calendar *cal, time_t start, time_t end, GCompareFunc sort_func)
{
return calendar_get_objects_in_range (cal->todo, start, end, sort_func);
@@ -241,3 +252,45 @@ calendar_save (Calendar *cal, char *fname)
cleanStrTbl ();
}
+static void
+calendar_object_compare_by_start (gpointer a, gpointer b)
+{
+ CalendarObject *ca = a;
+ CalendarObject *cb = b;
+ time_t diff;
+
+ diff = ca->ev_start - cb->ev_start;
+ return (diff < 0) ? -1 : (diff > 0) ? 1 : 0;
+}
+
+static void
+assemble_event_list (iCalObject *obj, time_t start, time_t end, void *c)
+{
+ CalendarObject *co;
+ GList **l = c;
+
+ co = g_new (CalendarObject, 1);
+ co->ev_start = start;
+ co->ev_end = end;
+ co->ico = obj;
+ *l = g_list_insert_sorted (*l, co, calendar_object_compare_by_start);
+}
+
+void
+calendar_destroy_event_list (GList *l)
+{
+ GList *p;
+
+ for (p = l; p; p = p->next)
+ g_free (l->data);
+ g_list_free (l);
+}
+
+GList *
+calendar_get_events_in_range (Calendar *cal, time_t start, time_t end)
+{
+ GList *l = 0;
+
+ calendar_iterate (cal, start, end, assemble_event_list, &l);
+ return l;
+}
diff --git a/calendar/gui/calendar.h b/calendar/gui/calendar.h
index a59fec7544..95c92e7fa8 100644
--- a/calendar/gui/calendar.h
+++ b/calendar/gui/calendar.h
@@ -28,17 +28,36 @@ typedef struct {
void *temp;
} Calendar;
+/* This is only used by the calendar_get_events_in_range routine to get
+ * a list of objects that recur on a specific date
+ */
+typedef struct {
+ time_t ev_start;
+ time_t ev_end;
+ iCalObject *ico;
+} CalendarObject;
+
+typedef void (*calendarfn)(iCalObject *obj, time_t start, time_t end, void *closure);
+
Calendar *calendar_new (char *title);
void calendar_load (Calendar *cal, char *fname);
void calendar_add_object (Calendar *cal, iCalObject *obj);
void calendar_remove_object (Calendar *cal, iCalObject *obj);
void calendar_destroy (Calendar *cal);
-GList *calendar_get_events_in_range (Calendar *cal, time_t start, time_t end, GCompareFunc sort_func);
GList *calendar_get_objects_in_range (GList *objects, time_t start, time_t end, GCompareFunc sort_func);
GList *calendar_get_todo_in_range (Calendar *cal, time_t start, time_t end, GCompareFunc sort_func);
GList *calendar_get_journal_in_range (Calendar *cal, time_t start, time_t end, GCompareFunc sort_func);
gint calendar_compare_by_dtstart (gpointer a, gpointer b);
+void calendar_iterate_on_objects (GList *objects, time_t start, time_t end, calendarfn cb, void *closure);
+void calendar_iterate (Calendar *cal, time_t start, time_t end, calendarfn cb, void *closure);
+
+/* Note this routine returns a GList with CalendarObjects */
+GList *calendar_get_events_in_range (Calendar *cal, time_t start, time_t end);
+
+/* Destroy the above list with this method */
+void calendar_destroy_event_list (GList *l);
+
END_GNOME_DECLS
#endif
diff --git a/calendar/gui/gncal-day-view.c b/calendar/gui/gncal-day-view.c
index d338802240..2172810c52 100644
--- a/calendar/gui/gncal-day-view.c
+++ b/calendar/gui/gncal-day-view.c
@@ -94,7 +94,7 @@ gncal_day_view_destroy (GtkObject *object)
if (dview->day_str)
g_free (dview->day_str);
if (dview->events)
- g_list_free (dview->events);
+ calendar_destroy_event_list (dview->events);
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
@@ -303,12 +303,11 @@ gncal_day_view_update (GncalDayView *dview, iCalObject *ico, int flags)
dview->day_str = g_strdup (buf);
if (dview->events)
- g_list_free (dview->events);
+ calendar_destroy_event_list (dview->events);
dview->events = calendar_get_events_in_range (dview->calendar->cal,
dview->lower,
- dview->upper,
- calendar_compare_by_dtstart);
+ dview->upper);
gtk_widget_draw (GTK_WIDGET (dview), NULL);
}
diff --git a/calendar/gui/gncal-full-day.c b/calendar/gui/gncal-full-day.c
index d7aecccfee..028e3657b7 100644
--- a/calendar/gui/gncal-full-day.c
+++ b/calendar/gui/gncal-full-day.c
@@ -31,6 +31,7 @@ typedef struct {
int y;
int width;
int height;
+ time_t start, end;
} Child;
struct layout_row {
@@ -302,7 +303,7 @@ child_range_changed (GncalFullDay *fullday, Child *child)
/* Calc display range for event */
- get_tm_range (fullday, child->ico->dtstart, child->ico->dtend, &start, &end, &lower_row, &rows_used);
+ get_tm_range (fullday, child->start, child->end, &start, &end, &lower_row, &rows_used);
get_tm_range (fullday, fullday->lower, fullday->upper, NULL, NULL, &f_lower_row, NULL);
child->lower_row = lower_row - f_lower_row;
@@ -536,7 +537,7 @@ child_button_press (GtkWidget *widget, GdkEventButton *event, gpointer data)
}
static Child *
-child_new (GncalFullDay *fullday, iCalObject *ico)
+child_new (GncalFullDay *fullday, time_t start, time_t end, iCalObject *ico)
{
Child *child;
@@ -549,7 +550,9 @@ child_new (GncalFullDay *fullday, iCalObject *ico)
child->y = 0;
child->width = 0;
child->height = 0;
-
+ child->start = start;
+ child->end = end;
+
child_range_changed (fullday, child);
/* We set the i-beam cursor and the initial summary text upon realization */
@@ -956,7 +959,7 @@ gncal_full_day_realize (GtkWidget *widget)
gdk_window_set_background (widget->window, &widget->style->bg[GTK_STATE_PRELIGHT]);
fullday->up_down_cursor = gdk_cursor_new (GDK_DOUBLE_ARROW);
- fullday->beam_cursor = gdk_cursor_new (GDK_XTERM);
+ fullday->beam_cursor = gdk_cursor_new (GDK_XTERM);
for (children = fullday->children; children; children = children->next)
child_realize (fullday, children->data);
@@ -1644,8 +1647,8 @@ update_from_drag_info (GncalFullDay *fullday)
widget = GTK_WIDGET (fullday);
get_time_from_rows (fullday, di->child_start_row, di->child_rows_used,
- &di->child->ico->dtstart,
- &di->child->ico->dtend);
+ &di->child->start,
+ &di->child->end);
child_range_changed (fullday, di->child);
@@ -1864,13 +1867,34 @@ gncal_full_day_foreach (GtkContainer *container, GtkCallback callback, gpointer
}
}
+static gint
+child_compare_by_start (gpointer a, gpointer b)
+{
+ Child *ca = a;
+ Child *cb = b;
+ time_t diff;
+
+ diff = ca->start - cb->start;
+ return (diff < 0) ? -1 : (diff > 0) ? 1 : 0;
+}
+
+static void
+fullday_add_children (iCalObject *obj, time_t start, time_t end, void *c)
+{
+ GncalFullDay *fullday = c;
+ Child *child;
+
+ child = child_new (fullday, start, end, obj);
+ fullday->children = g_list_insert_sorted (fullday->children, child, child_compare_by_start);
+}
+
void
gncal_full_day_update (GncalFullDay *fullday, iCalObject *ico, int flags)
{
GList *children;
GList *l_events, *events;
Child *child;
-
+
g_return_if_fail (fullday != NULL);
g_return_if_fail (GNCAL_IS_FULL_DAY (fullday));
@@ -1900,22 +1924,14 @@ gncal_full_day_update (GncalFullDay *fullday, iCalObject *ico, int flags)
g_list_free (fullday->children);
- children = NULL;
-
- l_events = calendar_get_events_in_range (fullday->calendar->cal,
- fullday->lower,
- fullday->upper,
- calendar_compare_by_dtstart);
-
- for (events = l_events; events; events = events->next) {
- child = child_new (fullday, events->data);
- children = g_list_append (children, child);
- }
-
- g_list_free (l_events);
-
- fullday->children = g_list_first (children);
-
+ fullday->children = NULL;
+
+ calendar_iterate (fullday->calendar->cal,
+ fullday->lower,
+ fullday->upper,
+ fullday_add_children,
+ fullday);
+
layout_children (fullday);
/* Realize and map children */
diff --git a/calendar/gui/main.c b/calendar/gui/main.c
index 08bb61fb8b..6075cc0f7d 100644
--- a/calendar/gui/main.c
+++ b/calendar/gui/main.c
@@ -32,6 +32,9 @@ int day_begin, day_end;
/* Number of calendars active */
int active_calendars = 0;
+/* A list of all of the calendars started */
+GList *all_calendars = NULL;
+
void
init_username (void)
{
@@ -90,21 +93,6 @@ init_calendar (void)
}
void
-new_calendar_cmd (GtkWidget *widget, void *data)
-{
-}
-
-void
-open_calendar_cmd (GtkWidget *widget, void *data)
-{
-}
-
-void
-save_calendar_cmd (GtkWidget *widget, void *data)
-{
-}
-
-void
about_calendar_cmd (GtkWidget *widget, void *data)
{
GtkWidget *about;
@@ -170,6 +158,26 @@ today_clicked (GtkWidget *widget, GnomeCalendar *gcal)
gnome_calendar_goto (gcal, time (NULL));
}
+void
+new_calendar_cmd (GtkWidget *widget, void *data)
+{
+}
+
+void
+open_calendar_cmd (GtkWidget *widget, void *data)
+{
+ GtkWidget *filesel;
+
+ filesel = gtk_file_selection_new (_("Open Calendar"));
+ gtk_widget_show (filesel);
+
+}
+
+void
+save_calendar_cmd (GtkWidget *widget, void *data)
+{
+}
+
GnomeUIInfo gnome_cal_file_menu [] = {
{ GNOME_APP_UI_ITEM, N_("New calendar"), NULL, new_calendar_cmd },
@@ -238,6 +246,7 @@ new_calendar (char *full_name, char *calendar_file)
title = g_copy_strings (full_name, "'s calendar", NULL);
toplevel = gnome_calendar_new (title);
+ g_free (title);
setup_menu (toplevel);
if (g_file_exists (calendar_file)){
@@ -248,7 +257,7 @@ new_calendar (char *full_name, char *calendar_file)
gnome_calendar_load (GNOME_CALENDAR (toplevel), "./test.vcf");
}
active_calendars++;
-
+ all_calendars = g_list_prepend (all_calendars, toplevel);
gtk_widget_show (toplevel);
}
diff --git a/calendar/gui/view-utils.c b/calendar/gui/view-utils.c
index 1a5322228d..ccbe125291 100644
--- a/calendar/gui/view-utils.c
+++ b/calendar/gui/view-utils.c
@@ -8,50 +8,6 @@
#include <string.h>
#include "view-utils.h"
-
-/* FIXME: remove this function later */
-
-#if 0
-static GList *
-calendar_get_events_in_range (Calendar *cal, time_t start, time_t end, GCompareFunc sort_func)
-{
- static iCalObject objs[24];
- static int ready = 0;
- int i;
- GList *list;
-
- if (!ready) {
- struct tm tm;
- time_t tim;
-
- ready = 1;
-
- for (i = 0; i < 24; i++) {
- tim = time (NULL);
- tm = *localtime (&tim);
-
- tm.tm_hour = i;
- tm.tm_min = 0;
- tm.tm_sec = 0;
- objs[i].dtstart = mktime (&tm);
-
- tm.tm_hour = i;
- tm.tm_min = 30;
- tm.tm_sec = 0;
- objs[i].dtend = mktime (&tm);
-
- objs[i].summary = "Ir a chingar a tu madre";
- }
- }
-
- list = NULL;
-
- for (i = 0; i < 8; i++)
- list = g_list_append (list, &objs[i]);
-
- return list;
-}
-#endif
void
view_utils_draw_events (GtkWidget *widget, GdkWindow *window, GdkGC *gc, GdkRectangle *area,
int flags, GList *events, time_t start, time_t end)
@@ -72,10 +28,11 @@ view_utils_draw_events (GtkWidget *widget, GdkWindow *window, GdkGC *gc, GdkRect
max_y = area->y + area->height - font_height * ((flags & VIEW_UTILS_DRAW_SPLIT) ? 2 : 1);
for (y = area->y, list = events; (y < max_y) && list; y += font_height, list = list->next) {
- ico = list->data;
+ CalendarObject *co = list->data;
+ ico = co->ico;
- tm_start = *localtime (&ico->dtstart);
- tm_end = *localtime (&ico->dtend);
+ tm_start = *localtime (&co->ev_start);
+ tm_end = *localtime (&co->ev_end);
str = ico->summary;
if (flags & VIEW_UTILS_DRAW_END) {