aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--calendar/ChangeLog37
-rw-r--r--calendar/cal-util/calobj.c8
-rw-r--r--calendar/cal-util/calobj.h9
-rw-r--r--calendar/gui/calendar-commands.c27
-rw-r--r--calendar/gui/e-day-view.c47
-rw-r--r--calendar/gui/e-week-view.c51
-rw-r--r--calendar/gui/eventedit.c8
-rw-r--r--calendar/gui/popup-menu.c5
8 files changed, 150 insertions, 42 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index ee62897fd5..62c9088e01 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,40 @@
+2000-05-02 Damon Chaplin <damon@helixcode.com>
+
+ * gui/calendar-commands.c (calendar_control_activate): set the active
+ radio button here. Oops - it wasn't a Bonobo problem after all.
+
+ * gui/popup-menu.c (popup_menu): added call to
+ e_auto_kill_popup_menu_on_hide() to destroy the menu.
+
+ * gui/e-week-view.c (e_week_view_show_popup_menu):
+ * gui/e-day-view.c (e_day_view_on_event_right_click): ico->user_data
+ isn't useful any more, since the event editor keeps its own iCalObject.
+ So for now we make the menu commands available even when the event is
+ being edited in the event editor.
+ Also corrected misspellings of 'occurance' -> 'occurrence'.
+
+ * gui/eventedit.c (event_editor_destroy): destroy the iCalObject.
+ The event editor now uses its own independent iCalObject.
+
+ * gui/e-week-view.c (e_week_view_on_unrecur_appointment):
+ * gui/e-day-view.c (e_day_view_on_unrecur_appointment): create a new
+ uid for the new single instance. I'm not sure what we should do about
+ the creation/last modification times of the objects.
+
+ * gui/e-week-view.c (e_week_view_on_edit_appointment):
+ * gui/e-day-view.c (e_day_view_on_edit_appointment): duplicate the
+ iCalObject before passing it to the event editor, since it will change
+ the fields. If we don't duplicate it we won't know what has changed
+ when we get the "update_event" callback.
+
+ * gui/e-week-view.c (e_week_view_key_press):
+ * gui/e-day-view.c (e_day_view_key_press): set the created and last_mod
+ times of the new iCalObject. We may want to set the default alarm as
+ well.
+
+ * cal-util/calobj.c (ical_gen_uid): made this function public so we
+ can generate new uids if necessary.
+
2000-05-01 Damon Chaplin <damon@helixcode.com>
* gui/gnome-cal.[hc] (gnome_calendar_get_current_time_range): new
diff --git a/calendar/cal-util/calobj.c b/calendar/cal-util/calobj.c
index 1634ec084e..f185c31952 100644
--- a/calendar/cal-util/calobj.c
+++ b/calendar/cal-util/calobj.c
@@ -25,7 +25,7 @@ static gint compare_exdates (gconstpointer a, gconstpointer b);
-static char *
+char *
ical_gen_uid (void)
{
static char *hostname;
@@ -541,7 +541,9 @@ setup_alarm_at (iCalObject *ico, CalendarAlarm *alarm, char *iso_time, VObject *
}
/*
- * Duplicates an iCalObject. Implementation is a grand hack
+ * Duplicates an iCalObject. Implementation is a grand hack.
+ * If you need the new ICalObject to have a new uid, free the current one,
+ * and call ical_gen_uid() to generate a new one.
*/
iCalObject *
ical_object_duplicate (iCalObject *o)
@@ -549,8 +551,6 @@ ical_object_duplicate (iCalObject *o)
VObject *vo;
iCalObject *new;
- /* FIXME!!!!! The UID needs to change!!! */
-
vo = ical_object_to_vobject (o);
switch (o->type){
case ICAL_EVENT:
diff --git a/calendar/cal-util/calobj.h b/calendar/cal-util/calobj.h
index 0fa82ee36e..25954b8098 100644
--- a/calendar/cal-util/calobj.h
+++ b/calendar/cal-util/calobj.h
@@ -247,13 +247,13 @@ typedef enum {
CalObjFindStatus ical_object_find_in_string (const char *uid, const char *vcalobj, iCalObject **ico);
-char *ical_object_to_string (iCalObject *ico);
+char *ical_object_to_string (iCalObject *ico);
/* Returns the first toggled day in a weekday mask -- we do this because we do not support multiple
* days on a monthly-by-pos recurrence. If no days are toggled, it returns -1.
*/
-int ical_object_get_first_weekday (int weekday_mask);
+int ical_object_get_first_weekday (int weekday_mask);
/* Returns the number of seconds configured to trigger the alarm in advance to an event */
int alarm_compute_offset (CalendarAlarm *a);
@@ -261,7 +261,10 @@ int alarm_compute_offset (CalendarAlarm *a);
/* Returns TRUE if the dates of both objects match, including any recurrence
rules. */
-gboolean ical_object_compare_dates (iCalObject *ico1, iCalObject *ico2);
+gboolean ical_object_compare_dates (iCalObject *ico1, iCalObject *ico2);
+
+/* Generates a new uid for a calendar object. Should be g_free'd eventually. */
+char *ical_gen_uid (void);
END_GNOME_DECLS
diff --git a/calendar/gui/calendar-commands.c b/calendar/gui/calendar-commands.c
index d1f88066a9..3b3f0edab0 100644
--- a/calendar/gui/calendar-commands.c
+++ b/calendar/gui/calendar-commands.c
@@ -521,6 +521,8 @@ calendar_control_activate (BonoboControl *control,
GtkWidget *toolbar;
GnomeUIBuilderData uibdata;
BonoboUIHandler *uih = bonobo_control_get_ui_handler (control);
+ gchar *page_name;
+ gint button;
g_assert (uih);
uibdata.connect_func = do_ui_signal_connect;
@@ -529,6 +531,8 @@ calendar_control_activate (BonoboControl *control,
uibdata.relay_func = NULL;
uibdata.destroy_func = NULL;
+ g_print ("In calendar_control_activate\n");
+
remote_uih = bonobo_control_get_remote_ui_handler (control);
bonobo_ui_handler_set_container (uih, remote_uih);
@@ -540,6 +544,26 @@ calendar_control_activate (BonoboControl *control,
/*gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));*/
+ /* Note that these indices should correspond with the button indices
+ in gnome_toolbar_view_buttons. */
+ page_name = gnome_calendar_get_current_view_name (cal);
+ if (!strcmp (page_name, "dayview")) {
+ button = 0;
+ } else if (!strcmp (page_name, "workweekview")) {
+ button = 1;
+ } else if (!strcmp (page_name, "weekview")) {
+ button = 2;
+ } else if (!strcmp (page_name, "monthview")) {
+ button = 3;
+ } else if (!strcmp (page_name, "yearview")) {
+ button = 4;
+ } else {
+ g_warning ("Unknown calendar view: %s", page_name);
+ button = 0;
+ }
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gnome_toolbar_view_buttons[button].widget), TRUE);
+
gtk_widget_show_all (toolbar);
bonobo_ui_handler_dock_add (uih, "/Toolbar",
@@ -611,6 +635,9 @@ calendar_control_deactivate (BonoboControl *control)
{
BonoboUIHandler *uih = bonobo_control_get_ui_handler (control);
g_assert (uih);
+
+ g_print ("In calendar_control_deactivate\n");
+
bonobo_ui_handler_dock_remove (uih, "/Toolbar");
bonobo_ui_handler_unset_container (uih);
}
diff --git a/calendar/gui/e-day-view.c b/calendar/gui/e-day-view.c
index 6fa0ad17c1..6a1383d180 100644
--- a/calendar/gui/e-day-view.c
+++ b/calendar/gui/e-day-view.c
@@ -282,8 +282,8 @@ static void e_day_view_on_new_appointment (GtkWidget *widget,
gpointer data);
static void e_day_view_on_edit_appointment (GtkWidget *widget,
gpointer data);
-static void e_day_view_on_delete_occurance (GtkWidget *widget,
- gpointer data);
+static void e_day_view_on_delete_occurrence (GtkWidget *widget,
+ gpointer data);
static void e_day_view_on_delete_appointment (GtkWidget *widget,
gpointer data);
static void e_day_view_on_unrecur_appointment (GtkWidget *widget,
@@ -2227,10 +2227,10 @@ e_day_view_on_event_right_click (EDayView *day_view,
};
static struct menu_item recur_child_items[] = {
- { N_("Make this appointment movable"), (GtkSignalFunc) e_day_view_on_unrecur_appointment, NULL, TRUE },
{ N_("Edit this appointment..."), (GtkSignalFunc) e_day_view_on_edit_appointment, NULL, TRUE },
- { N_("Delete this occurance"), (GtkSignalFunc) e_day_view_on_delete_occurance, NULL, TRUE },
- { N_("Delete all occurances"), (GtkSignalFunc) e_day_view_on_delete_appointment, NULL, TRUE },
+ { N_("Make this appointment movable"), (GtkSignalFunc) e_day_view_on_unrecur_appointment, NULL, TRUE },
+ { N_("Delete this occurrence"), (GtkSignalFunc) e_day_view_on_delete_occurrence, NULL, TRUE },
+ { N_("Delete all occurrences"), (GtkSignalFunc) e_day_view_on_delete_appointment, NULL, TRUE },
{ NULL, NULL, NULL, TRUE },
{ N_("New appointment..."), (GtkSignalFunc) e_day_view_on_new_appointment, NULL, TRUE }
};
@@ -2250,23 +2250,26 @@ e_day_view_on_event_right_click (EDayView *day_view,
event = &g_array_index (day_view->events[day],
EDayViewEvent, event_num);
- /* Check if the event is being edited in the event editor. */
- not_being_edited = (event->ico->user_data == NULL);
+ /* This used to be set only if the event wasn't being edited
+ in the event editor, but we can't check that at present.
+ We could possibly set up another method of checking it. */
+ not_being_edited = TRUE;
if (event->ico->recur) {
items = 6;
context_menu = &recur_child_items[0];
+ context_menu[0].sensitive = not_being_edited;
+ context_menu[1].sensitive = not_being_edited;
+ context_menu[2].sensitive = not_being_edited;
context_menu[3].sensitive = not_being_edited;
context_menu[5].sensitive = have_selection;
} else {
items = 4;
context_menu = &child_items[0];
+ context_menu[0].sensitive = not_being_edited;
+ context_menu[1].sensitive = not_being_edited;
context_menu[3].sensitive = have_selection;
}
- /* These settings are common for each context sensitive menu */
- context_menu[0].sensitive = not_being_edited;
- context_menu[1].sensitive = not_being_edited;
- context_menu[2].sensitive = not_being_edited;
}
for (i = 0; i < items; i++)
@@ -2303,6 +2306,7 @@ e_day_view_on_edit_appointment (GtkWidget *widget, gpointer data)
EDayView *day_view;
EDayViewEvent *event;
GtkWidget *event_editor;
+ iCalObject *ico;
day_view = E_DAY_VIEW (data);
@@ -2310,13 +2314,17 @@ e_day_view_on_edit_appointment (GtkWidget *widget, gpointer data)
if (event == NULL)
return;
- event_editor = event_editor_new (day_view->calendar, event->ico);
+ /* We must duplicate the iCalObject, since the event editor will
+ change the fields. */
+ ico = ical_object_duplicate (event->ico);
+
+ event_editor = event_editor_new (day_view->calendar, ico);
gtk_widget_show (event_editor);
}
static void
-e_day_view_on_delete_occurance (GtkWidget *widget, gpointer data)
+e_day_view_on_delete_occurrence (GtkWidget *widget, gpointer data)
{
EDayView *day_view;
EDayViewEvent *event;
@@ -2362,16 +2370,21 @@ e_day_view_on_unrecur_appointment (GtkWidget *widget, gpointer data)
if (event == NULL)
return;
- /* New object */
- /* FIXME: generate a new uid. */
+ /* For the unrecurred instance we duplicate the original object,
+ create a new uid for it, get rid of the recurrence rules, and set
+ the start & end times to the instances times. */
ico = ical_object_duplicate (event->ico);
+ g_free (ico->uid);
+ ico->uid = ical_gen_uid ();
g_free (ico->recur);
ico->recur = 0;
ico->dtstart = event->start;
ico->dtend = event->end;
- /* Duplicate, and eliminate the recurrency fields */
+ /* For the recurring object, we add a exception to get rid of the
+ instance. */
ical_object_add_exdate (event->ico, event->start);
+
gnome_calendar_object_changed (day_view->calendar, event->ico,
CHANGE_ALL);
gnome_calendar_add_object (day_view->calendar, ico);
@@ -3745,6 +3758,8 @@ e_day_view_key_press (GtkWidget *widget, GdkEventKey *event)
Note that user_name is a global variable. */
ico = ical_new ("", user_name, "");
ico->new = 1;
+ ico->created = time (NULL);
+ ico->last_mod = ico->created;
e_day_view_get_selected_time_range (day_view, &ico->dtstart,
&ico->dtend);
diff --git a/calendar/gui/e-week-view.c b/calendar/gui/e-week-view.c
index 83eb6e5608..6f371a10c4 100644
--- a/calendar/gui/e-week-view.c
+++ b/calendar/gui/e-week-view.c
@@ -144,8 +144,8 @@ static void e_week_view_on_new_appointment (GtkWidget *widget,
gpointer data);
static void e_week_view_on_edit_appointment (GtkWidget *widget,
gpointer data);
-static void e_week_view_on_delete_occurance (GtkWidget *widget,
- gpointer data);
+static void e_week_view_on_delete_occurrence (GtkWidget *widget,
+ gpointer data);
static void e_week_view_on_delete_appointment (GtkWidget *widget,
gpointer data);
static void e_week_view_on_unrecur_appointment (GtkWidget *widget,
@@ -974,7 +974,7 @@ e_week_view_update_event (EWeekView *week_view,
g_return_if_fail (E_IS_WEEK_VIEW (week_view));
-#if 0
+#if 1
g_print ("In e_week_view_update_event\n");
#endif
@@ -1007,10 +1007,12 @@ e_week_view_update_event (EWeekView *week_view,
update the event fairly easily without changing the events arrays
or computing a new layout. */
if (e_week_view_find_event_from_uid (week_view, uid, &event_num)) {
+ g_print (" updating existing event\n");
event = &g_array_index (week_view->events, EWeekViewEvent,
event_num);
if (ical_object_compare_dates (event->ico, ico)) {
+ g_print (" dates unchanged\n");
e_week_view_foreach_event_with_uid (week_view, uid, e_week_view_update_event_cb, ico);
gtk_widget_queue_draw (week_view->main_canvas);
return;
@@ -1018,6 +1020,7 @@ e_week_view_update_event (EWeekView *week_view,
/* The dates have changed, so we need to remove the
old occurrrences before adding the new ones. */
+ g_print (" dates changed\n");
e_week_view_foreach_event_with_uid (week_view, uid,
e_week_view_remove_event_cb,
NULL);
@@ -2463,6 +2466,8 @@ e_week_view_key_press (GtkWidget *widget, GdkEventKey *event)
Note that user_name is a global variable. */
ico = ical_new ("", user_name, "");
ico->new = 1;
+ ico->created = time (NULL);
+ ico->last_mod = ico->created;
ico->dtstart = week_view->day_starts[week_view->selection_start_day];
ico->dtend = week_view->day_starts[week_view->selection_end_day + 1];
@@ -2510,10 +2515,10 @@ e_week_view_show_popup_menu (EWeekView *week_view,
};
static struct menu_item recur_child_items[] = {
- { N_("Make this appointment movable"), (GtkSignalFunc) e_week_view_on_unrecur_appointment, NULL, TRUE },
{ N_("Edit this appointment..."), (GtkSignalFunc) e_week_view_on_edit_appointment, NULL, TRUE },
- { N_("Delete this occurance"), (GtkSignalFunc) e_week_view_on_delete_occurance, NULL, TRUE },
- { N_("Delete all occurances"), (GtkSignalFunc) e_week_view_on_delete_appointment, NULL, TRUE },
+ { N_("Make this appointment movable"), (GtkSignalFunc) e_week_view_on_unrecur_appointment, NULL, TRUE },
+ { N_("Delete this occurrence"), (GtkSignalFunc) e_week_view_on_delete_occurrence, NULL, TRUE },
+ { N_("Delete all occurrences"), (GtkSignalFunc) e_week_view_on_delete_appointment, NULL, TRUE },
{ NULL, NULL, NULL, TRUE },
{ N_("New appointment..."), (GtkSignalFunc) e_week_view_on_new_appointment, NULL, TRUE }
};
@@ -2529,23 +2534,26 @@ e_week_view_show_popup_menu (EWeekView *week_view,
event = &g_array_index (week_view->events,
EWeekViewEvent, event_num);
- /* Check if the event is being edited in the event editor. */
- not_being_edited = (event->ico->user_data == NULL);
+ /* This used to be set only if the event wasn't being edited
+ in the event editor, but we can't check that at present.
+ We could possibly set up another method of checking it. */
+ not_being_edited = TRUE;
if (event->ico->recur) {
num_items = 6;
context_menu = &recur_child_items[0];
+ context_menu[0].sensitive = not_being_edited;
+ context_menu[1].sensitive = not_being_edited;
+ context_menu[2].sensitive = not_being_edited;
context_menu[3].sensitive = not_being_edited;
context_menu[5].sensitive = have_selection;
} else {
num_items = 4;
context_menu = &child_items[0];
+ context_menu[0].sensitive = not_being_edited;
+ context_menu[1].sensitive = not_being_edited;
context_menu[3].sensitive = have_selection;
}
- /* These settings are common for each context sensitive menu */
- context_menu[0].sensitive = not_being_edited;
- context_menu[1].sensitive = not_being_edited;
- context_menu[2].sensitive = not_being_edited;
}
for (i = 0; i < num_items; i++)
@@ -2581,6 +2589,7 @@ e_week_view_on_edit_appointment (GtkWidget *widget, gpointer data)
EWeekView *week_view;
EWeekViewEvent *event;
GtkWidget *event_editor;
+ iCalObject *ico;
week_view = E_WEEK_VIEW (data);
@@ -2590,13 +2599,17 @@ e_week_view_on_edit_appointment (GtkWidget *widget, gpointer data)
event = &g_array_index (week_view->events, EWeekViewEvent,
week_view->popup_event_num);
- event_editor = event_editor_new (week_view->calendar, event->ico);
+ /* We must duplicate the iCalObject, since the event editor will
+ change the fields. */
+ ico = ical_object_duplicate (event->ico);
+
+ event_editor = event_editor_new (week_view->calendar, ico);
gtk_widget_show (event_editor);
}
static void
-e_week_view_on_delete_occurance (GtkWidget *widget, gpointer data)
+e_week_view_on_delete_occurrence (GtkWidget *widget, gpointer data)
{
EWeekView *week_view;
EWeekViewEvent *event;
@@ -2648,15 +2661,21 @@ e_week_view_on_unrecur_appointment (GtkWidget *widget, gpointer data)
event = &g_array_index (week_view->events, EWeekViewEvent,
week_view->popup_event_num);
- /* New object */
+ /* For the unrecurred instance we duplicate the original object,
+ create a new uid for it, get rid of the recurrence rules, and set
+ the start & end times to the instances times. */
ico = ical_object_duplicate (event->ico);
+ g_free (ico->uid);
+ ico->uid = ical_gen_uid ();
g_free (ico->recur);
ico->recur = 0;
ico->dtstart = event->start;
ico->dtend = event->end;
- /* Duplicate, and eliminate the recurrency fields */
+ /* For the recurring object, we add a exception to get rid of the
+ instance. */
ical_object_add_exdate (event->ico, event->start);
+
gnome_calendar_object_changed (week_view->calendar, event->ico,
CHANGE_ALL);
gnome_calendar_add_object (week_view->calendar, ico);
diff --git a/calendar/gui/eventedit.c b/calendar/gui/eventedit.c
index 3505187035..ae18f485fd 100644
--- a/calendar/gui/eventedit.c
+++ b/calendar/gui/eventedit.c
@@ -1,3 +1,5 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
/*
* EventEditor widget
* Copyright (C) 1998 the Free Software Foundation
@@ -1516,8 +1518,10 @@ event_editor_destroy (GtkObject *object)
ee = EVENT_EDITOR (object);
- if (ee->ical)
- ee->ical->user_data = NULL; /* we are no longer editing it */
+ if (ee->ical) {
+ ical_object_destroy (ee->ical);
+ ee->ical = NULL;
+ }
}
GtkWidget *
diff --git a/calendar/gui/popup-menu.c b/calendar/gui/popup-menu.c
index 3686183146..3b976a9033 100644
--- a/calendar/gui/popup-menu.c
+++ b/calendar/gui/popup-menu.c
@@ -17,7 +17,10 @@ popup_menu (struct menu_item *items, int nitems, GdkEventButton *event)
GtkWidget *item;
int i;
- menu = gtk_menu_new (); /* FIXME: this baby is never freed */
+ menu = gtk_menu_new ();
+
+ /* Make sure the menu is destroyed when it disappears. */
+ e_auto_kill_popup_menu_on_hide (menu);
for (i = 0; i < nitems; i++) {
if (items[i].text) {