aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--calendar/ChangeLog18
-rw-r--r--calendar/gui/e-calendar-table.c147
-rw-r--r--calendar/gui/e-calendar-table.h5
-rw-r--r--calendar/gui/e-tasks.c56
-rw-r--r--calendar/gui/e-tasks.h4
-rw-r--r--calendar/gui/tasks-control.c42
6 files changed, 213 insertions, 59 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index 62bb518bd7..249a9ae465 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,21 @@
+2001-05-21 Federico Mena Quintero <federico@ximian.com>
+
+ Fix bug #2831; the tasks toolbar and menu now have a button to
+ delete the selected tasks.
+
+ * gui/e-calendar-table.c (e_calendar_table_delete_selected): New
+ function.
+ (delete_cb): Use e_calendar_table_delete_selected().
+ (e_calendar_table_get_table): New function.
+
+ * gui/tasks-control.c (tasks_control_new_task_cmd): Handle the
+ delete command.
+ (selection_changed_cb): Change the sensitivity of the TasksDelete
+ command when the selection in the table changes.
+
+ * gui/e-tasks.c (table_selection_change_cb): Notify upstream when
+ the ETable selection changes.
+
2001-05-18 Federico Mena Quintero <federico@ximian.com>
Fix bug #2829.
diff --git a/calendar/gui/e-calendar-table.c b/calendar/gui/e-calendar-table.c
index 23104866ca..685a56d9f9 100644
--- a/calendar/gui/e-calendar-table.c
+++ b/calendar/gui/e-calendar-table.c
@@ -31,7 +31,6 @@
#include <config.h>
#include <sys/stat.h>
#include <unistd.h>
-#include <gal/e-table/e-table-scrolled.h>
#include <gal/e-table/e-cell-checkbox.h>
#include <gal/e-table/e-cell-toggle.h>
#include <gal/e-table/e-cell-text.h>
@@ -526,60 +525,22 @@ e_calendar_table_set_cal_client (ECalendarTable *cal_table,
CALOBJ_TYPE_TODO);
}
-
-/* Opens a task in the task editor */
-static void
-open_task (ECalendarTable *cal_table, CalComponent *comp)
-{
- TaskEditor *tedit;
-
- tedit = task_editor_new ();
- task_editor_set_cal_client (tedit, calendar_model_get_cal_client (cal_table->model));
- task_editor_set_todo_object (tedit, comp);
- task_editor_focus (tedit);
-}
-
-/* Opens the task in the specified row */
-static void
-open_task_by_row (ECalendarTable *cal_table, int row)
-{
- CalComponent *comp;
-
- comp = calendar_model_get_component (cal_table->model, row);
- open_task (cal_table, comp);
-}
-
-static void
-e_calendar_table_on_double_click (ETable *table,
- gint row,
- gint col,
- GdkEvent *event,
- ECalendarTable *cal_table)
-{
- open_task_by_row (cal_table, row);
-}
-
-/* Used from e_table_selected_row_foreach() */
-static void
-mark_row_complete_cb (int model_row, gpointer data)
-{
- ECalendarTable *cal_table;
-
- cal_table = E_CALENDAR_TABLE (data);
- calendar_model_mark_task_complete (cal_table->model, model_row);
-}
-
-/* Callback used for the "mark tasks as complete" menu item */
-static void
-mark_as_complete_cb (GtkWidget *menuitem, gpointer data)
+/**
+ * e_calendar_table_get_table:
+ * @cal_table: A calendar table.
+ *
+ * Queries the #ETable widget that the calendar table is using.
+ *
+ * Return value: The #ETable widget that the calendar table uses to display its
+ * data.
+ **/
+ETable *
+e_calendar_table_get_table (ECalendarTable *cal_table)
{
- ECalendarTable *cal_table;
- ETable *etable;
-
- cal_table = E_CALENDAR_TABLE (data);
+ g_return_val_if_fail (cal_table != NULL, NULL);
+ g_return_val_if_fail (E_IS_CALENDAR_TABLE (cal_table), NULL);
- etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable));
- e_table_selected_row_foreach (etable, mark_row_complete_cb, cal_table);
+ return e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable));
}
/* Used from e_table_selected_row_foreach(); puts the selected row number in an
@@ -676,16 +637,21 @@ delete_selected_components (ECalendarTable *cal_table)
g_slist_free (uids);
}
-/* Callback for the "delete tasks" menu item */
-static void
-delete_cb (GtkWidget *menuitem, gpointer data)
+/**
+ * e_calendar_table_delete_selected:
+ * @cal_table: A calendar table.
+ *
+ * Deletes the selected components in the table; asks the user first.
+ **/
+void
+e_calendar_table_delete_selected (ECalendarTable *cal_table)
{
- ECalendarTable *cal_table;
ETable *etable;
int n_selected;
CalComponent *comp;
- cal_table = E_CALENDAR_TABLE (data);
+ g_return_if_fail (cal_table != NULL);
+ g_return_if_fail (E_IS_CALENDAR_TABLE (cal_table));
etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable));
@@ -701,6 +667,71 @@ delete_cb (GtkWidget *menuitem, gpointer data)
delete_selected_components (cal_table);
}
+/* Opens a task in the task editor */
+static void
+open_task (ECalendarTable *cal_table, CalComponent *comp)
+{
+ TaskEditor *tedit;
+
+ tedit = task_editor_new ();
+ task_editor_set_cal_client (tedit, calendar_model_get_cal_client (cal_table->model));
+ task_editor_set_todo_object (tedit, comp);
+ task_editor_focus (tedit);
+}
+
+/* Opens the task in the specified row */
+static void
+open_task_by_row (ECalendarTable *cal_table, int row)
+{
+ CalComponent *comp;
+
+ comp = calendar_model_get_component (cal_table->model, row);
+ open_task (cal_table, comp);
+}
+
+static void
+e_calendar_table_on_double_click (ETable *table,
+ gint row,
+ gint col,
+ GdkEvent *event,
+ ECalendarTable *cal_table)
+{
+ open_task_by_row (cal_table, row);
+}
+
+/* Used from e_table_selected_row_foreach() */
+static void
+mark_row_complete_cb (int model_row, gpointer data)
+{
+ ECalendarTable *cal_table;
+
+ cal_table = E_CALENDAR_TABLE (data);
+ calendar_model_mark_task_complete (cal_table->model, model_row);
+}
+
+/* Callback used for the "mark tasks as complete" menu item */
+static void
+mark_as_complete_cb (GtkWidget *menuitem, gpointer data)
+{
+ ECalendarTable *cal_table;
+ ETable *etable;
+
+ cal_table = E_CALENDAR_TABLE (data);
+
+ etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (cal_table->etable));
+ e_table_selected_row_foreach (etable, mark_row_complete_cb, cal_table);
+}
+
+/* Callback for the "delete tasks" menu item */
+static void
+delete_cb (GtkWidget *menuitem, gpointer data)
+{
+ ECalendarTable *cal_table;
+
+ cal_table = E_CALENDAR_TABLE (data);
+ e_calendar_table_delete_selected (cal_table);
+}
+
static GnomeUIInfo tasks_popup_one[] = {
GNOMEUIINFO_ITEM_NONE (N_("Edit this task"), NULL, e_calendar_table_on_open_task),
GNOMEUIINFO_SEPARATOR,
diff --git a/calendar/gui/e-calendar-table.h b/calendar/gui/e-calendar-table.h
index e19ecf82e8..914a0bcd87 100644
--- a/calendar/gui/e-calendar-table.h
+++ b/calendar/gui/e-calendar-table.h
@@ -26,6 +26,7 @@
#define _E_CALENDAR_TABLE_H_
#include <gtk/gtktable.h>
+#include <gal/e-table/e-table-scrolled.h>
#include <widgets/misc/e-cell-date-edit.h>
#include "calendar-model.h"
@@ -98,6 +99,10 @@ CalendarModel *e_calendar_table_get_model (ECalendarTable *cal_table);
void e_calendar_table_set_cal_client (ECalendarTable *cal_table,
CalClient *client);
+ETable *e_calendar_table_get_table (ECalendarTable *cal_table);
+
+void e_calendar_table_delete_selected (ECalendarTable *cal_table);
+
/* These load and save the state of the table (headers shown etc.) to/from
the given file. */
void e_calendar_table_load_state (ECalendarTable *cal_table,
diff --git a/calendar/gui/e-tasks.c b/calendar/gui/e-tasks.c
index e69b2a4037..1686ac793a 100644
--- a/calendar/gui/e-tasks.c
+++ b/calendar/gui/e-tasks.c
@@ -77,8 +77,14 @@ static gint e_tasks_add_menu_item (gpointer key,
gpointer value,
gpointer data);
+/* Signal IDs */
+enum {
+ SELECTION_CHANGED,
+ LAST_SIGNAL
+};
static GtkTableClass *parent_class;
+static guint e_tasks_signals[LAST_SIGNAL] = { 0 };
E_MAKE_TYPE (e_tasks, "ETasks", ETasks,
@@ -96,7 +102,20 @@ e_tasks_class_init (ETasksClass *class)
parent_class = gtk_type_class (GTK_TYPE_TABLE);
+ e_tasks_signals[SELECTION_CHANGED] =
+ gtk_signal_new ("selection_changed",
+ GTK_RUN_FIRST,
+ object_class->type,
+ GTK_SIGNAL_OFFSET (ETasksClass, selection_changed),
+ gtk_marshal_NONE__INT,
+ GTK_TYPE_NONE, 1,
+ GTK_TYPE_INT);
+
+ gtk_object_class_add_signals (object_class, e_tasks_signals, LAST_SIGNAL);
+
object_class->destroy = e_tasks_destroy;
+
+ class->selection_changed = NULL;
}
@@ -112,6 +131,19 @@ e_tasks_init (ETasks *tasks)
setup_widgets (tasks);
}
+/* Callback used when the selection changes in the table. */
+static void
+table_selection_change_cb (ETable *etable, gpointer data)
+{
+ ETasks *tasks;
+ int n_selected;
+
+ tasks = E_TASKS (data);
+
+ n_selected = e_table_selected_count (etable);
+ gtk_signal_emit (GTK_OBJECT (tasks), e_tasks_signals[SELECTION_CHANGED],
+ n_selected);
+}
#define E_TASKS_TABLE_DEFAULT_STATE \
"<?xml version=\"1.0\"?>" \
@@ -170,6 +202,9 @@ setup_widgets (ETasks *tasks)
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 (etable), "selection_change",
+ GTK_SIGNAL_FUNC (table_selection_change_cb), tasks);
}
@@ -445,6 +480,27 @@ e_tasks_new_task (ETasks *tasks)
task_editor_focus (tedit);
}
+/**
+ * e_tasks_delete_selected:
+ * @tasks: A tasks control widget.
+ *
+ * Deletes the selected tasks in the task list.
+ **/
+void
+e_tasks_delete_selected (ETasks *tasks)
+{
+ ETasksPrivate *priv;
+ ECalendarTable *cal_table;
+
+ g_return_if_fail (tasks != NULL);
+ g_return_if_fail (E_IS_TASKS (tasks));
+
+ priv = tasks->priv;
+
+ cal_table = E_CALENDAR_TABLE (priv->tasks_view);
+ e_calendar_table_delete_selected (cal_table);
+}
+
static void
e_tasks_on_filter_selected (GtkMenuShell *menu_shell,
diff --git a/calendar/gui/e-tasks.h b/calendar/gui/e-tasks.h
index 21660c8c7e..ed6fd8199f 100644
--- a/calendar/gui/e-tasks.h
+++ b/calendar/gui/e-tasks.h
@@ -49,6 +49,9 @@ struct _ETasks {
struct _ETasksClass {
GtkTableClass parent_class;
+
+ /* Notification signals */
+ void (* selection_changed) (ETasks *tasks, int n_selected);
};
@@ -63,6 +66,7 @@ gboolean e_tasks_open (ETasks *tasks,
CalClient *e_tasks_get_cal_client (ETasks *tasks);
void e_tasks_new_task (ETasks *tasks);
+void e_tasks_delete_selected (ETasks *tasks);
void e_tasks_setup_menus (ETasks *tasks,
BonoboUIComponent *uic);
diff --git a/calendar/gui/tasks-control.c b/calendar/gui/tasks-control.c
index d3154de0d6..5269f21cdf 100644
--- a/calendar/gui/tasks-control.c
+++ b/calendar/gui/tasks-control.c
@@ -59,7 +59,32 @@ static void tasks_control_deactivate (BonoboControl *control);
static void tasks_control_new_task_cmd (BonoboUIComponent *uic,
gpointer data,
const char *path);
+static void tasks_control_delete_cmd (BonoboUIComponent *uic,
+ gpointer data,
+ const char *path);
+
+/* Callback used when the selection in the table changes */
+static void
+selection_changed_cb (ETasks *tasks, int n_selected, gpointer data)
+{
+ BonoboControl *control;
+ BonoboUIComponent *uic;
+ Bonobo_UIContainer ui_container;
+
+ control = BONOBO_CONTROL (data);
+
+ uic = bonobo_control_get_ui_component (control);
+ g_assert (uic != NULL);
+
+ ui_container = bonobo_ui_component_get_container (uic);
+ if (ui_container == CORBA_OBJECT_NIL)
+ return;
+
+ bonobo_ui_component_set_prop (uic, "/commands/TasksDelete", "sensitive",
+ n_selected == 0 ? "0" : "1",
+ NULL);
+}
BonoboControl *
tasks_control_new (void)
@@ -85,6 +110,9 @@ tasks_control_new (void)
GTK_SIGNAL_FUNC (tasks_control_activate_cb),
tasks);
+ gtk_signal_connect (GTK_OBJECT (tasks), "selection_changed",
+ GTK_SIGNAL_FUNC (selection_changed_cb), control);
+
return control;
}
@@ -180,6 +208,7 @@ tasks_control_activate_cb (BonoboControl *control,
static BonoboUIVerb verbs [] = {
BONOBO_UI_VERB ("TasksNewTask", tasks_control_new_task_cmd),
+ BONOBO_UI_VERB ("TasksDelete", tasks_control_delete_cmd),
BONOBO_UI_VERB_END
};
@@ -236,8 +265,19 @@ tasks_control_new_task_cmd (BonoboUIComponent *uic,
gpointer data,
const char *path)
{
- ETasks *tasks = data;
+ ETasks *tasks;
+ tasks = E_TASKS (data);
e_tasks_new_task (tasks);
}
+static void
+tasks_control_delete_cmd (BonoboUIComponent *uic,
+ gpointer data,
+ const char *path)
+{
+ ETasks *tasks;
+
+ tasks = E_TASKS (data);
+ e_tasks_delete_selected (tasks);
+}