aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/e-tasks.c
diff options
context:
space:
mode:
Diffstat (limited to 'calendar/gui/e-tasks.c')
-rw-r--r--calendar/gui/e-tasks.c184
1 files changed, 34 insertions, 150 deletions
diff --git a/calendar/gui/e-tasks.c b/calendar/gui/e-tasks.c
index 29c067783a..9e88a91513 100644
--- a/calendar/gui/e-tasks.c
+++ b/calendar/gui/e-tasks.c
@@ -2,6 +2,7 @@
/* e-tasks.c
*
* Copyright (C) 2001 Helix Code, Inc.
+ * Copyright (C) 2001 Ximian, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@@ -18,8 +19,8 @@
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
- * Authors: Federico Mena Quintero <federico@helixcode.com>
- * Damon Chaplin <damon@helixcode.com>
+ * Authors: Federico Mena Quintero <federico@ximian.com>
+ * Damon Chaplin <damon@ximian.com>
*/
#include <config.h>
@@ -28,32 +29,16 @@
#include <gal/e-table/e-table-scrolled.h>
#include "dialogs/task-editor.h"
#include "e-calendar-table.h"
-#include "alarm-notify.h"
#include "component-factory.h"
#include "e-tasks.h"
-/* States for the calendar loading and creation state machine */
-typedef enum {
- LOAD_STATE_NOT_LOADED,
- LOAD_STATE_WAIT_LOAD,
- LOAD_STATE_WAIT_LOAD_BEFORE_CREATE,
- LOAD_STATE_WAIT_CREATE,
- LOAD_STATE_LOADED
-} LoadState;
-
/* Private part of the GnomeCalendar structure */
struct _ETasksPrivate {
/* The calendar client object we monitor */
CalClient *client;
- /* Loading state; we can be loading or creating a calendar */
- LoadState load_state;
-
- /* URI of the folder being shown. */
- char *folder_uri;
-
/* The ECalendarTable showing the tasks. */
GtkWidget *tasks_view;
@@ -68,7 +53,7 @@ static void e_tasks_init (ETasks *tasks);
static void setup_widgets (ETasks *tasks);
static void e_tasks_destroy (GtkObject *object);
-static void cal_loaded_cb (CalClient *client, CalClientLoadStatus status, gpointer data);
+static void cal_opened_cb (CalClient *client, CalClientOpenStatus status, gpointer data);
static void obj_updated_cb (CalClient *client, const char *uid, gpointer data);
static void obj_removed_cb (CalClient *client, const char *uid, gpointer data);
@@ -115,8 +100,6 @@ e_tasks_init (ETasks *tasks)
priv = g_new0 (ETasksPrivate, 1);
tasks->priv = priv;
- priv->load_state = LOAD_STATE_NOT_LOADED;
-
setup_widgets (tasks);
}
@@ -138,6 +121,7 @@ setup_widgets (ETasks *tasks)
ETasksPrivate *priv;
ETable *etable;
GtkWidget *hbox, *menuitem, *categories_label;
+ CalendarModel *model;
priv = tasks->priv;
@@ -165,13 +149,17 @@ setup_widgets (ETasks *tasks)
priv->tasks_view = e_calendar_table_new ();
+ model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view));
+ calendar_model_set_new_comp_vtype (model, CAL_COMPONENT_TODO);
etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (E_CALENDAR_TABLE (priv->tasks_view)->etable));
e_table_set_state (etable, E_TASKS_TABLE_DEFAULT_STATE);
gtk_table_attach (GTK_TABLE (tasks), priv->tasks_view, 0, 1, 1, 2,
GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
gtk_widget_show (priv->tasks_view);
- gtk_signal_connect (GTK_OBJECT (E_CALENDAR_TABLE (priv->tasks_view)->model), "categories-changed", GTK_SIGNAL_FUNC (e_tasks_on_categories_changed), tasks);
+ gtk_signal_connect (GTK_OBJECT (E_CALENDAR_TABLE (priv->tasks_view)->model),
+ "categories-changed",
+ GTK_SIGNAL_FUNC (e_tasks_on_categories_changed), tasks);
}
@@ -189,14 +177,16 @@ e_tasks_construct (ETasks *tasks)
if (!priv->client)
return NULL;
- gtk_signal_connect (GTK_OBJECT (priv->client), "cal_loaded",
- GTK_SIGNAL_FUNC (cal_loaded_cb), tasks);
+ gtk_signal_connect (GTK_OBJECT (priv->client), "cal_opened",
+ GTK_SIGNAL_FUNC (cal_opened_cb), tasks);
gtk_signal_connect (GTK_OBJECT (priv->client), "obj_updated",
GTK_SIGNAL_FUNC (obj_updated_cb), tasks);
gtk_signal_connect (GTK_OBJECT (priv->client), "obj_removed",
GTK_SIGNAL_FUNC (obj_removed_cb), tasks);
+#if 0
alarm_notify_add_client (priv->client);
+#endif
e_calendar_table_set_cal_client (E_CALENDAR_TABLE (priv->tasks_view),
priv->client);
@@ -241,15 +231,10 @@ e_tasks_destroy (GtkObject *object)
config_filename);
g_free (config_filename);
- priv->load_state = LOAD_STATE_NOT_LOADED;
-
- if (priv->folder_uri) {
- g_free (priv->folder_uri);
- priv->folder_uri = NULL;
- }
-
if (priv->client) {
+#if 0
alarm_notify_remove_client (priv->client);
+#endif
gtk_object_unref (GTK_OBJECT (priv->client));
priv->client = NULL;
}
@@ -264,8 +249,7 @@ e_tasks_destroy (GtkObject *object)
gboolean
e_tasks_open (ETasks *tasks,
- char *file,
- ETasksOpenMode gcom)
+ char *file)
{
ETasksPrivate *priv;
char *config_filename;
@@ -275,21 +259,6 @@ e_tasks_open (ETasks *tasks,
g_return_val_if_fail (file != NULL, FALSE);
priv = tasks->priv;
- g_return_val_if_fail (priv->load_state == LOAD_STATE_NOT_LOADED,
- FALSE);
-
- g_assert (priv->folder_uri == NULL);
-
- priv->folder_uri = g_strdup (file);
-
- if (gcom == E_TASKS_OPEN)
- priv->load_state = LOAD_STATE_WAIT_LOAD;
- else if (gcom == E_TASKS_OPEN_OR_CREATE)
- priv->load_state = LOAD_STATE_WAIT_LOAD_BEFORE_CREATE;
- else {
- g_assert_not_reached ();
- return FALSE;
- }
config_filename = e_tasks_get_config_filename (tasks);
e_calendar_table_load_state (E_CALENDAR_TABLE (priv->tasks_view),
@@ -297,11 +266,7 @@ e_tasks_open (ETasks *tasks,
g_free (config_filename);
- if (!cal_client_load_calendar (priv->client, file)) {
- priv->load_state = LOAD_STATE_NOT_LOADED;
- g_free (priv->folder_uri);
- priv->folder_uri = NULL;
-
+ if (!cal_client_open_calendar (priv->client, file, FALSE)) {
g_message ("e_tasks_open(): Could not issue the request");
return FALSE;
}
@@ -310,19 +275,6 @@ e_tasks_open (ETasks *tasks,
}
-/* Loads the initial data into the calendar; this should be called right after
- * the cal_loaded signal from the client is invoked.
- */
-static void
-initial_load (ETasks *tasks)
-{
- ETasksPrivate *priv;
-
- priv = tasks->priv;
-
- /* FIXME: Do we need to do anything? */
-}
-
/* Displays an error to indicate that loading a calendar failed */
static void
load_error (ETasks *tasks,
@@ -335,19 +287,6 @@ load_error (ETasks *tasks,
g_free (msg);
}
-/* Displays an error to indicate that creating a calendar failed */
-static void
-create_error (ETasks *tasks,
- const char *uri)
-{
- char *msg;
-
- msg = g_strdup_printf (_("Could not create a tasks file in `%s'"),
- uri);
- gnome_error_dialog_parented (msg, GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (tasks))));
- g_free (msg);
-}
-
/* Displays an error to indicate that the specified URI method is not supported */
static void
method_error (ETasks *tasks,
@@ -360,89 +299,34 @@ method_error (ETasks *tasks,
g_free (msg);
}
-/* Callback from the calendar client when a calendar is loaded */
+/* Callback from the calendar client when a calendar is opened */
static void
-cal_loaded_cb (CalClient *client,
- CalClientLoadStatus status,
+cal_opened_cb (CalClient *client,
+ CalClientOpenStatus status,
gpointer data)
{
ETasks *tasks;
ETasksPrivate *priv;
- gboolean free_uri;
tasks = E_TASKS (data);
priv = tasks->priv;
- g_assert (priv->load_state != LOAD_STATE_NOT_LOADED
- && priv->load_state != LOAD_STATE_LOADED);
- g_assert (priv->folder_uri != NULL);
-
- free_uri = TRUE;
-
- switch (priv->load_state) {
- case LOAD_STATE_WAIT_LOAD:
- if (status == CAL_CLIENT_LOAD_SUCCESS) {
- priv->load_state = LOAD_STATE_LOADED;
- initial_load (tasks);
- } else if (status == CAL_CLIENT_LOAD_ERROR) {
- priv->load_state = LOAD_STATE_NOT_LOADED;
- load_error (tasks, priv->folder_uri);
- } else if (status == CAL_CLIENT_LOAD_METHOD_NOT_SUPPORTED) {
- priv->load_state = LOAD_STATE_NOT_LOADED;
- method_error (tasks, priv->folder_uri);
- } else
- g_assert_not_reached ();
+ switch (status) {
+ case CAL_CLIENT_OPEN_SUCCESS:
+ /* Everything is OK */
+ return;
+ case CAL_CLIENT_OPEN_ERROR:
+ load_error (tasks, cal_client_get_uri (client));
break;
- case LOAD_STATE_WAIT_LOAD_BEFORE_CREATE:
- if (status == CAL_CLIENT_LOAD_SUCCESS) {
- priv->load_state = LOAD_STATE_LOADED;
- initial_load (tasks);
- } else if (status == CAL_CLIENT_LOAD_ERROR) {
- priv->load_state = LOAD_STATE_WAIT_CREATE;
- free_uri = FALSE;
-
- if (!cal_client_create_calendar (priv->client,
- priv->folder_uri)) {
- priv->load_state = LOAD_STATE_NOT_LOADED;
- free_uri = TRUE;
- g_message ("cal_loaded_cb(): Could not issue the create request");
- }
- } else if (status == CAL_CLIENT_LOAD_METHOD_NOT_SUPPORTED) {
- priv->load_state = LOAD_STATE_NOT_LOADED;
- method_error (tasks, priv->folder_uri);
- } else
- g_assert_not_reached ();
-
- break;
-
- case LOAD_STATE_WAIT_CREATE:
- if (status == CAL_CLIENT_LOAD_SUCCESS) {
- priv->load_state = LOAD_STATE_LOADED;
- initial_load (tasks);
- } else if (status == CAL_CLIENT_LOAD_ERROR) {
- priv->load_state = LOAD_STATE_NOT_LOADED;
- create_error (tasks, priv->folder_uri);
- } else if (status == CAL_CLIENT_LOAD_IN_USE) {
- /* Someone created the URI while we were issuing the
- * create request, so we just try to reload.
- */
- priv->load_state = LOAD_STATE_WAIT_LOAD;
- free_uri = FALSE;
-
- if (!cal_client_load_calendar (priv->client,
- priv->folder_uri)) {
- priv->load_state = LOAD_STATE_NOT_LOADED;
- free_uri = TRUE;
- g_message ("cal_loaded_cb(): Could not issue the load request");
- }
- } else if (status == CAL_CLIENT_LOAD_METHOD_NOT_SUPPORTED) {
- priv->load_state = LOAD_STATE_NOT_LOADED;
- method_error (tasks, priv->folder_uri);
- } else
- g_assert_not_reached ();
+ case CAL_CLIENT_OPEN_NOT_FOUND:
+ /* bullshit; we did not specify only_if_exists */
+ g_assert_not_reached ();
+ return;
+ case CAL_CLIENT_OPEN_METHOD_NOT_SUPPORTED:
+ method_error (tasks, cal_client_get_uri (client));
break;
default:
@@ -491,7 +375,7 @@ e_tasks_get_config_filename (ETasks *tasks)
priv = tasks->priv;
- url = g_strdup (priv->folder_uri);
+ url = g_strdup (cal_client_get_uri (priv->client));
/* This turns all funny characters into '_', in the string itself. */
e_filename_make_safe (url);