aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui')
-rw-r--r--calendar/gui/event-editor.c251
-rw-r--r--calendar/gui/event-editor.h7
-rw-r--r--calendar/gui/gnome-cal.c73
3 files changed, 193 insertions, 138 deletions
diff --git a/calendar/gui/event-editor.c b/calendar/gui/event-editor.c
index b5a0322af1..6163cb9d12 100644
--- a/calendar/gui/event-editor.c
+++ b/calendar/gui/event-editor.c
@@ -38,9 +38,10 @@ typedef struct {
/* UI handler */
BonoboUIHandler *uih;
- /* Calendar object we are editing; this is an internal copy and is not
- * one of the read-only objects from the parent calendar.
- */
+ /* Client to use */
+ CalClient *client;
+
+ /* Calendar object/uid we are editing; this is an internal copy */
CalComponent *comp;
/* Widgets from the Glade file */
@@ -117,14 +118,6 @@ typedef struct {
-/* Signal IDs */
-enum {
- SAVE_EVENT_OBJECT,
- RELEASED_EVENT_OBJECT,
- EDITOR_CLOSED,
- LAST_SIGNAL
-};
-
static void event_editor_class_init (EventEditorClass *class);
static void event_editor_init (EventEditor *ee);
static void event_editor_destroy (GtkObject *object);
@@ -148,8 +141,6 @@ static void recurrence_exception_added (GtkWidget *widget, EventEditor *ee);
static void recurrence_exception_deleted (GtkWidget *widget, EventEditor *ee);
static void recurrence_exception_changed (GtkWidget *widget, EventEditor *ee);
-static guint event_editor_signals[LAST_SIGNAL];
-
/**
@@ -194,34 +185,6 @@ event_editor_class_init (EventEditorClass *class)
parent_class = gtk_type_class (GTK_TYPE_OBJECT);
- event_editor_signals[SAVE_EVENT_OBJECT] =
- gtk_signal_new ("save_event_object",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EventEditorClass, save_event_object),
- gtk_marshal_NONE__POINTER,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
-
- event_editor_signals[RELEASED_EVENT_OBJECT] =
- gtk_signal_new ("released_event_object",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EventEditorClass, released_event_object),
- gtk_marshal_NONE__STRING,
- GTK_TYPE_NONE, 1,
- GTK_TYPE_POINTER);
-
- event_editor_signals[EDITOR_CLOSED] =
- gtk_signal_new ("editor_closed",
- GTK_RUN_FIRST,
- object_class->type,
- GTK_SIGNAL_OFFSET (EventEditorClass, editor_closed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- gtk_object_class_add_signals (object_class, event_editor_signals, LAST_SIGNAL);
-
object_class->destroy = event_editor_destroy;
}
@@ -260,11 +223,6 @@ event_editor_destroy (GtkObject *object)
}
if (priv->comp) {
- /* We do not emit the "released_event_object" signal here. If
- * the user closed the dialog box, then it has already been
- * released. If the application just destroyed the event
- * editor, then it had better clean up after itself.
- */
gtk_object_unref (GTK_OBJECT (priv->comp));
priv->comp = NULL;
}
@@ -1095,7 +1053,6 @@ dialog_to_comp_object (EventEditor *ee)
cal_component_commit_sequence (comp);
}
-/* Emits the "save_event_object" signal if the event editor is editing an object. */
static void
save_event_object (EventEditor *ee)
{
@@ -1113,8 +1070,8 @@ save_event_object (EventEditor *ee)
gtk_window_set_title (GTK_WINDOW (priv->app), title);
g_free (title);
- gtk_signal_emit (GTK_OBJECT (ee), event_editor_signals[SAVE_EVENT_OBJECT],
- priv->comp);
+ if (!cal_client_update_object (priv->client, priv->comp))
+ g_message ("save_event_object(): Could not update the object!");
}
/* Closes the dialog box and emits the appropriate signals */
@@ -1133,15 +1090,18 @@ close_dialog (EventEditor *ee)
priv->app = NULL;
if (priv->comp) {
- const char *uid;
-
- cal_component_get_uid (priv->comp, &uid);
- gtk_signal_emit (GTK_OBJECT (ee), event_editor_signals[RELEASED_EVENT_OBJECT], uid);
gtk_object_unref (GTK_OBJECT (priv->comp));
priv->comp = NULL;
}
- gtk_signal_emit (GTK_OBJECT (ee), event_editor_signals[EDITOR_CLOSED]);
+ if (priv->client) {
+ gtk_signal_disconnect_by_data (GTK_OBJECT (priv->client), ee);
+ gtk_object_unref (GTK_OBJECT (priv->client));
+ priv->client = NULL;
+ }
+
+
+ gtk_object_destroy (GTK_OBJECT (ee));
}
@@ -1359,47 +1319,46 @@ create_menu (EventEditor *ee)
-/* Toolbar/Save and Close callback */
-static void
-tb_save_and_close_cb (GtkWidget *widget, gpointer data)
-{
- EventEditor *ee;
-
- ee = EVENT_EDITOR (data);
- save_event_object (ee);
- close_dialog (ee);
-}
-
-
-
/* Toolbar */
static GnomeUIInfo toolbar[] = {
- GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Save and Close"),
- N_("Save the appointment and close the dialog box"),
- tb_save_and_close_cb,
+ GNOMEUIINFO_ITEM_STOCK (N_("Save"),
+ N_("Save the appointment"),
+ file_save_cb,
GNOME_STOCK_PIXMAP_SAVE),
+
GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Print..."),
- N_("Print this item"), NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Insert File..."),
- N_("Insert a file as an attachment"), NULL),
- GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Recurrence..."),
- N_("Configure recurrence rules"), NULL),
+
+ GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Print..."),
+ N_("Print this item"), NULL,
+ GNOME_STOCK_PIXMAP_PRINT),
+ GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Insert File..."),
+ N_("Insert a file as an attachment"), NULL,
+ GNOME_STOCK_PIXMAP_ATTACH),
+
GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Invite Attendees..."),
- N_("Invite attendees to a meeting"), NULL),
+
+ GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Invite Attendees..."),
+ N_("Invite attendees to a meeting"), NULL,
+ GNOME_STOCK_PIXMAP_MULTIPLE),
+
GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Delete"),
- N_("Delete this item"), NULL),
+
+ GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Delete"),
+ N_("Delete this item"), NULL,
+ GNOME_STOCK_PIXMAP_TRASH),
+
GNOMEUIINFO_SEPARATOR,
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Previous"),
- N_("Go to the previous item"), NULL),
- GNOMEUIINFO_ITEM_NONE (N_("FIXME: Next"),
- N_("Go to the next item"), NULL),
+
+ GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Previous"),
+ N_("Go to the previous item"), NULL,
+ GNOME_STOCK_PIXMAP_BACK),
+ GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Next"),
+ N_("Go to the next item"), NULL,
+ GNOME_STOCK_PIXMAP_FORWARD),
GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Help"),
- N_("See online help"), NULL, GNOME_STOCK_PIXMAP_HELP),
+ N_("See online help"), NULL,
+ GNOME_STOCK_PIXMAP_HELP),
GNOMEUIINFO_END
};
@@ -1529,6 +1488,109 @@ event_editor_new (void)
return event_editor_construct (EVENT_EDITOR (ee));
}
+/* Brings attention to a window by raising it and giving it focus */
+static void
+raise_and_focus (GtkWidget *widget)
+{
+ g_assert (GTK_WIDGET_REALIZED (widget));
+ gdk_window_show (widget->window);
+ gtk_widget_grab_focus (widget);
+}
+
+/* Callback used when the calendar client tells us that an object changed */
+static void
+obj_updated_cb (CalClient *client, const char *uid, gpointer data)
+{
+ EventEditor *ee;
+ EventEditorPrivate *priv;
+ CalComponent *comp;
+ CalClientGetStatus status;
+ gint day, event_num;
+
+ ee = EVENT_EDITOR (data);
+
+ g_return_if_fail (IS_EVENT_EDITOR (ee));
+
+ priv = ee->priv;
+
+ /* Get the event from the server. */
+ status = cal_client_get_object (priv->client, uid, &comp);
+
+ switch (status) {
+ case CAL_CLIENT_GET_SUCCESS:
+ /* Everything is fine */
+ break;
+
+ case CAL_CLIENT_GET_SYNTAX_ERROR:
+ g_message ("obj_updated_cb(): Syntax error when getting object `%s'", uid);
+ return;
+
+ case CAL_CLIENT_GET_NOT_FOUND:
+ /* The object is no longer in the server, so do nothing */
+ return;
+
+ default:
+ g_assert_not_reached ();
+ return;
+ }
+
+ raise_and_focus (priv->app);
+}
+
+/* Callback used when the calendar client tells us that an object was removed */
+static void
+obj_removed_cb (CalClient *client, const char *uid, gpointer data)
+{
+ EventEditor *ee;
+ EventEditorPrivate *priv;
+
+ ee = EVENT_EDITOR (data);
+
+ g_return_if_fail (ee != NULL);
+ g_return_if_fail (IS_EVENT_EDITOR (ee));
+
+ priv = ee->priv;
+
+ raise_and_focus (priv->app);
+}
+
+void
+event_editor_set_cal_client (EventEditor *ee, CalClient *client)
+{
+ EventEditorPrivate *priv;
+
+ g_return_if_fail (ee != NULL);
+ g_return_if_fail (IS_EVENT_EDITOR (ee));
+
+ priv = ee->priv;
+
+ if (client == priv->client)
+ return;
+
+ if (client)
+ g_return_if_fail (IS_CAL_CLIENT (client));
+
+ if (client)
+ g_return_if_fail (cal_client_is_loaded (client));
+
+ if (client)
+ gtk_object_ref (GTK_OBJECT (client));
+
+ if (priv->client) {
+ gtk_signal_disconnect_by_data (GTK_OBJECT (priv->client), ee);
+ gtk_object_unref (GTK_OBJECT (priv->client));
+ }
+
+ priv->client = client;
+
+ if (priv->client) {
+ gtk_signal_connect (GTK_OBJECT (priv->client), "obj_updated",
+ GTK_SIGNAL_FUNC (obj_updated_cb), ee);
+ gtk_signal_connect (GTK_OBJECT (priv->client), "obj_removed",
+ GTK_SIGNAL_FUNC (obj_removed_cb), ee);
+ }
+}
+
/**
* event_editor_set_event_object:
* @ee: An event editor.
@@ -1540,6 +1602,7 @@ void
event_editor_set_event_object (EventEditor *ee, CalComponent *comp)
{
EventEditorPrivate *priv;
+ CalClientGetStatus status;
char *title;
g_return_if_fail (ee != NULL);
@@ -1548,16 +1611,13 @@ event_editor_set_event_object (EventEditor *ee, CalComponent *comp)
priv = ee->priv;
if (priv->comp) {
- const char *uid;
-
- cal_component_get_uid (priv->comp, &uid);
- gtk_signal_emit (GTK_OBJECT (ee), event_editor_signals[RELEASED_EVENT_OBJECT], uid);
gtk_object_unref (GTK_OBJECT (priv->comp));
priv->comp = NULL;
}
- if (comp)
+ if (comp) {
priv->comp = cal_component_clone (comp);
+ }
title = make_title_from_comp (priv->comp);
gtk_window_set_title (GTK_WINDOW (priv->app), title);
@@ -1566,15 +1626,6 @@ event_editor_set_event_object (EventEditor *ee, CalComponent *comp)
fill_widgets (ee);
}
-/* Brings attention to a window by raising it and giving it focus */
-static void
-raise_and_focus (GtkWidget *widget)
-{
- g_assert (GTK_WIDGET_REALIZED (widget));
- gdk_window_show (widget->window);
- gtk_widget_grab_focus (widget);
-}
-
/**
* event_editor_focus:
* @ee: An event editor.
diff --git a/calendar/gui/event-editor.h b/calendar/gui/event-editor.h
index 1a61934766..009beb4dd5 100644
--- a/calendar/gui/event-editor.h
+++ b/calendar/gui/event-editor.h
@@ -49,12 +49,6 @@ struct _EventEditor {
struct _EventEditorClass {
GtkObjectClass parent_class;
-
- /* Notification signals */
-
- void (* save_event_object) (EventEditor *ee, CalComponent *comp);
- void (* released_event_object) (EventEditor *ee, const char *uid);
- void (* editor_closed) (EventEditor *ee);
};
@@ -63,6 +57,7 @@ EventEditor *event_editor_construct (EventEditor *ee);
EventEditor *event_editor_new (void);
+void event_editor_set_cal_client (EventEditor *ee, CalClient *client);
void event_editor_set_event_object (EventEditor *ee, CalComponent *comp);
void event_editor_focus (EventEditor *ee);
diff --git a/calendar/gui/gnome-cal.c b/calendar/gui/gnome-cal.c
index 2f6a8ddf4a..415d4abec0 100644
--- a/calendar/gui/gnome-cal.c
+++ b/calendar/gui/gnome-cal.c
@@ -1369,19 +1369,6 @@ gnome_calendar_set_selected_time_range (GnomeCalendar *gcal,
gnome_calendar_update_date_navigator (gcal);
}
-
-/* Callback used when an event editor requests that an object be saved */
-static void
-save_event_object_cb (EventEditor *ee, CalComponent *comp, gpointer data)
-{
- GnomeCalendar *gcal;
-
- gcal = GNOME_CALENDAR (data);
- if (!cal_client_update_object (gcal->client, comp))
- g_message ("save_event_object_cb(): Could not update the object!");
-}
-
-
/* Callback used when an event editor finishes editing an object */
static void
released_event_object_cb (EventEditor *ee, const char *uid, gpointer data)
@@ -1403,16 +1390,41 @@ released_event_object_cb (EventEditor *ee, const char *uid, gpointer data)
}
/* Callback used when an event editor dialog is closed */
+struct editor_closure
+{
+ GnomeCalendar *gcal;
+ char *uid;
+};
+
static void
-editor_closed_cb (EventEditor *ee, gpointer data)
+editor_closed_cb (GtkWidget *widget, gpointer data)
{
- gtk_object_unref (GTK_OBJECT (ee));
+ GnomeCalendar *gcal;
+ struct editor_closure *ec;
+ gboolean result;
+ gpointer orig_key;
+ char *orig_uid;
+
+ g_print ("editor_closed_cb ()\n");
+
+ ec = (struct editor_closure *)data;
+ gcal = ec->gcal;
+
+ result = g_hash_table_lookup_extended (gcal->object_editor_hash,
+ ec->uid, &orig_key, NULL);
+ g_assert (result != FALSE);
+
+ orig_uid = orig_key;
+
+ g_hash_table_remove (gcal->object_editor_hash, orig_uid);
+ g_free (orig_uid);
}
void
gnome_calendar_edit_object (GnomeCalendar *gcal, CalComponent *comp)
{
EventEditor *ee;
+ struct editor_closure *ec;
const char *uid;
g_return_if_fail (gcal != NULL);
@@ -1423,29 +1435,24 @@ gnome_calendar_edit_object (GnomeCalendar *gcal, CalComponent *comp)
ee = g_hash_table_lookup (gcal->object_editor_hash, uid);
if (!ee) {
+ ec = g_new0 (struct editor_closure, 1);
+
ee = event_editor_new ();
if (!ee) {
g_message ("gnome_calendar_edit_object(): Could not create the event editor");
return;
}
- /* FIXME: what to do when an event editor wants to switch
- * objects? We would need to know about it as well.
- */
-
- g_hash_table_insert (gcal->object_editor_hash, g_strdup (uid), ee);
-
- gtk_signal_connect (GTK_OBJECT (ee), "save_event_object",
- GTK_SIGNAL_FUNC (save_event_object_cb),
- gcal);
-
- gtk_signal_connect (GTK_OBJECT (ee), "released_event_object",
- GTK_SIGNAL_FUNC (released_event_object_cb),
- gcal);
+ ec->gcal = gcal;
+ ec->uid = g_strdup (uid);
+
+ g_hash_table_insert (gcal->object_editor_hash, ec->uid, ee);
- gtk_signal_connect (GTK_OBJECT (ee), "editor_closed",
- GTK_SIGNAL_FUNC (editor_closed_cb), gcal);
+ gtk_signal_connect (GTK_OBJECT (ee), "destroy",
+ GTK_SIGNAL_FUNC (editor_closed_cb),
+ ec);
+ event_editor_set_cal_client (EVENT_EDITOR (ee), gcal->client);
event_editor_set_event_object (EVENT_EDITOR (ee), comp);
}
@@ -1478,12 +1485,14 @@ gnome_calendar_new_appointment (GnomeCalendar *gcal)
comp = cal_component_new ();
cal_component_set_new_vtype (comp, CAL_COMPONENT_EVENT);
- itt = icaltime_from_timet (dtstart, 0, TRUE);
+ itt = icaltime_from_timet (dtstart, FALSE, FALSE);
cal_component_set_dtstart (comp, &dt);
- itt = icaltime_from_timet (dtend, 0, TRUE);
+ itt = icaltime_from_timet (dtend, FALSE, FALSE);
cal_component_set_dtend (comp, &dt);
+ cal_component_commit_sequence (comp);
+
gnome_calendar_edit_object (gcal, comp);
gtk_object_unref (GTK_OBJECT (comp));