aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/modules
diff options
context:
space:
mode:
authorMatthew Barnes <mbarnes@src.gnome.org>2008-09-30 00:14:46 +0800
committerMatthew Barnes <mbarnes@src.gnome.org>2008-09-30 00:14:46 +0800
commit098ea8aad8d3249d9faca5df5b4fe67b94ba660f (patch)
treec39d278f71283c9ebded47c606970404276b020f /calendar/modules
parentcb78b84aecf1c011e0b013cc94a079e2dc0eabbc (diff)
downloadgsoc2013-evolution-098ea8aad8d3249d9faca5df5b4fe67b94ba660f.tar
gsoc2013-evolution-098ea8aad8d3249d9faca5df5b4fe67b94ba660f.tar.gz
gsoc2013-evolution-098ea8aad8d3249d9faca5df5b4fe67b94ba660f.tar.bz2
gsoc2013-evolution-098ea8aad8d3249d9faca5df5b4fe67b94ba660f.tar.lz
gsoc2013-evolution-098ea8aad8d3249d9faca5df5b4fe67b94ba660f.tar.xz
gsoc2013-evolution-098ea8aad8d3249d9faca5df5b4fe67b94ba660f.tar.zst
gsoc2013-evolution-098ea8aad8d3249d9faca5df5b4fe67b94ba660f.zip
Get Memos to come up. Doesn't really work yet, but the widgets are all there.
svn path=/branches/kill-bonobo/; revision=36491
Diffstat (limited to 'calendar/modules')
-rw-r--r--calendar/modules/e-cal-shell-content.c163
-rw-r--r--calendar/modules/e-cal-shell-content.h71
-rw-r--r--calendar/modules/e-cal-shell-module.c11
-rw-r--r--calendar/modules/e-cal-shell-sidebar.c147
-rw-r--r--calendar/modules/e-cal-shell-sidebar.h4
-rw-r--r--calendar/modules/e-cal-shell-view-actions.h52
-rw-r--r--calendar/modules/e-cal-shell-view-private.c249
-rw-r--r--calendar/modules/e-cal-shell-view-private.h27
-rw-r--r--calendar/modules/e-cal-shell-view.c14
-rw-r--r--calendar/modules/e-cal-shell-view.h4
-rw-r--r--calendar/modules/e-memo-shell-content.c28
-rw-r--r--calendar/modules/e-memo-shell-module.c80
-rw-r--r--calendar/modules/e-memo-shell-sidebar.c424
-rw-r--r--calendar/modules/e-memo-shell-sidebar.h14
-rw-r--r--calendar/modules/e-memo-shell-view-actions.c193
-rw-r--r--calendar/modules/e-memo-shell-view-private.c302
-rw-r--r--calendar/modules/e-memo-shell-view-private.h20
-rw-r--r--calendar/modules/e-memo-shell-view.c56
-rw-r--r--calendar/modules/e-task-shell-content.c36
-rw-r--r--calendar/modules/e-task-shell-sidebar.c80
-rw-r--r--calendar/modules/e-task-shell-sidebar.h5
-rw-r--r--calendar/modules/e-task-shell-view-actions.c344
-rw-r--r--calendar/modules/e-task-shell-view-private.c101
-rw-r--r--calendar/modules/e-task-shell-view-private.h2
-rw-r--r--calendar/modules/e-task-shell-view.c16
25 files changed, 1823 insertions, 620 deletions
diff --git a/calendar/modules/e-cal-shell-content.c b/calendar/modules/e-cal-shell-content.c
new file mode 100644
index 0000000000..66113d073a
--- /dev/null
+++ b/calendar/modules/e-cal-shell-content.c
@@ -0,0 +1,163 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* e-cal-shell-content.h
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "e-cal-shell-content.h"
+
+#include <glib/gi18n.h>
+
+#include "e-util/gconf-bridge.h"
+
+#include "calendar/gui/calendar-config.h"
+
+#include "widgets/menus/gal-view-etable.h"
+
+#define E_CAL_SHELL_CONTENT_GET_PRIVATE(obj) \
+ (G_TYPE_INSTANCE_GET_PRIVATE \
+ ((obj), E_TYPE_CAL_SHELL_CONTENT, ECalShellContentPrivate))
+
+struct _ECalShellContentPrivate {
+ gint dummy;
+};
+
+enum {
+ PROP_0
+};
+
+static gpointer parent_class;
+
+static void
+cal_shell_content_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+cal_shell_content_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (property_id) {
+ }
+
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+}
+
+static void
+cal_shell_content_dispose (GObject *object)
+{
+ ECalShellContentPrivate *priv;
+
+ priv = E_CAL_SHELL_CONTENT_GET_PRIVATE (object);
+
+ /* Chain up to parent's dispose() method. */
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+cal_shell_content_finalize (GObject *object)
+{
+ ECalShellContentPrivate *priv;
+
+ priv = E_CAL_SHELL_CONTENT_GET_PRIVATE (object);
+
+ /* Chain up to parent's finalize() method. */
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+cal_shell_content_constructed (GObject *object)
+{
+ ECalShellContentPrivate *priv;
+
+ priv = E_CAL_SHELL_CONTENT_GET_PRIVATE (object);
+
+ /* Chain up to parent's constructed() method. */
+ G_OBJECT_CLASS (parent_class)->constructed (object);
+
+}
+
+static void
+cal_shell_content_class_init (ECalShellContentClass *class)
+{
+ GObjectClass *object_class;
+
+ parent_class = g_type_class_peek_parent (class);
+ g_type_class_add_private (class, sizeof (ECalShellContentPrivate));
+
+ object_class = G_OBJECT_CLASS (class);
+ object_class->set_property = cal_shell_content_set_property;
+ object_class->get_property = cal_shell_content_get_property;
+ object_class->dispose = cal_shell_content_dispose;
+ object_class->finalize = cal_shell_content_finalize;
+ object_class->constructed = cal_shell_content_constructed;
+}
+
+static void
+cal_shell_content_init (ECalShellContent *cal_shell_content)
+{
+ cal_shell_content->priv =
+ E_CAL_SHELL_CONTENT_GET_PRIVATE (cal_shell_content);
+
+ /* Postpone widget construction until we have a shell view. */
+}
+
+GType
+e_cal_shell_content_get_type (void)
+{
+ static GType type = 0;
+
+ if (G_UNLIKELY (type == 0)) {
+ static const GTypeInfo type_info = {
+ sizeof (ECalShellContentClass),
+ (GBaseInitFunc) NULL,
+ (GBaseFinalizeFunc) NULL,
+ (GClassInitFunc) cal_shell_content_class_init,
+ (GClassFinalizeFunc) NULL,
+ NULL, /* class_data */
+ sizeof (ECalShellContent),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) cal_shell_content_init,
+ NULL /* value_table */
+ };
+
+ type = g_type_register_static (
+ E_TYPE_SHELL_CONTENT, "ECalShellContent",
+ &type_info, 0);
+ }
+
+ return type;
+}
+
+GtkWidget *
+e_cal_shell_content_new (EShellView *shell_view)
+{
+ g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
+
+ return g_object_new (
+ E_TYPE_CAL_SHELL_CONTENT,
+ "shell-view", shell_view, NULL);
+}
diff --git a/calendar/modules/e-cal-shell-content.h b/calendar/modules/e-cal-shell-content.h
new file mode 100644
index 0000000000..18317c3652
--- /dev/null
+++ b/calendar/modules/e-cal-shell-content.h
@@ -0,0 +1,71 @@
+/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
+/* e-cal-shell-content.h
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of version 2 of the GNU General Public
+ * License as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef E_CAL_SHELL_CONTENT_H
+#define E_CAL_SHELL_CONTENT_H
+
+#include <shell/e-shell-content.h>
+#include <shell/e-shell-view.h>
+
+#include <widgets/menus/gal-view-instance.h>
+
+/* Standard GObject macros */
+#define E_TYPE_CAL_SHELL_CONTENT \
+ (e_cal_shell_content_get_type ())
+#define E_CAL_SHELL_CONTENT(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST \
+ ((obj), E_TYPE_CAL_SHELL_CONTENT, ECalShellContent))
+#define E_CAL_SHELL_CONTENT_CLASS(cls) \
+ (G_TYPE_CHECK_CLASS_CAST \
+ ((cls), E_TYPE_CAL_SHELL_CONTENT, ECalShellContentClass))
+#define E_IS_CAL_SHELL_CONTENT(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE \
+ ((obj), E_TYPE_CAL_SHELL_CONTENT))
+#define E_IS_CAL_SHELL_CONTENT_CLASS(cls) \
+ (G_TYPE_CHECK_CLASS_TYPE \
+ ((cls), E_TYPE_CAL_SHELL_CONTENT))
+#define E_CAL_SHELL_CONTENT_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS \
+ ((obj), E_TYPE_CAL_SHELL_CONTENT, ECalShellContentClass))
+
+G_BEGIN_DECLS
+
+typedef struct _ECalShellContent ECalShellContent;
+typedef struct _ECalShellContentClass ECalShellContentClass;
+typedef struct _ECalShellContentPrivate ECalShellContentPrivate;
+
+struct _ECalShellContent {
+ EShellContent parent;
+ ECalShellContentPrivate *priv;
+};
+
+struct _ECalShellContentClass {
+ EShellContentClass parent_class;
+};
+
+GType e_cal_shell_content_get_type (void);
+GtkWidget * e_cal_shell_content_new (EShellView *shell_view);
+GalViewInstance *
+ e_cal_shell_content_get_view_instance
+ (ECalShellContent *cal_shell_content);
+
+G_END_DECLS
+
+#endif /* E_CAL_SHELL_CONTENT_H */
diff --git a/calendar/modules/e-cal-shell-module.c b/calendar/modules/e-cal-shell-module.c
index 7df23a92f3..e05bcda600 100644
--- a/calendar/modules/e-cal-shell-module.c
+++ b/calendar/modules/e-cal-shell-module.c
@@ -25,12 +25,13 @@
#include <libedataserver/e-source-list.h>
#include <libedataserver/e-source-group.h>
-#include <e-shell.h>
-#include <e-shell-module.h>
-#include <e-shell-window.h>
+#include "shell/e-shell.h"
+#include "shell/e-shell-module.h"
+#include "shell/e-shell-window.h"
-#include <calendar-config.h>
-#include <e-cal-shell-view.h>
+#include "calendar/gui/calendar-config.h"
+
+#include "e-cal-shell-view.h"
#define MODULE_NAME "calendar"
#define MODULE_ALIASES ""
diff --git a/calendar/modules/e-cal-shell-sidebar.c b/calendar/modules/e-cal-shell-sidebar.c
index 5d14f589f0..10d6f30c05 100644
--- a/calendar/modules/e-cal-shell-sidebar.c
+++ b/calendar/modules/e-cal-shell-sidebar.c
@@ -22,15 +22,12 @@
#include <string.h>
#include <glib/gi18n.h>
-#include <libecal/e-cal-time-util.h>
-#include <libedataserver/e-data-server-util.h>
-#include <libedataserverui/e-source-selector.h>
-#include <e-util/e-util.h>
+#include "e-util/e-util.h"
+#include "calendar/gui/gnome-cal.h"
+#include "calendar/gui/e-calendar-selector.h"
-#include <gnome-cal.h>
-#include <e-cal-shell-view.h>
-#include <e-calendar-selector.h>
+#include "e-cal-shell-view.h"
#define E_CAL_SHELL_SIDEBAR_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE \
@@ -48,127 +45,6 @@ enum {
static gpointer parent_class;
static void
-cal_shell_sidebar_update (EShellSidebar *shell_sidebar)
-{
- EShellView *shell_view;
- GnomeCalendar *calendar;
- GnomeCalendarViewType view;
- time_t start_time, end_time;
- struct tm start_tm, end_tm;
- struct icaltimetype start_tt, end_tt;
- icaltimezone *timezone;
- gchar buffer[512];
- gchar end_buffer[512];
-
- shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
- calendar = e_cal_shell_view_get_calendar (
- E_CAL_SHELL_VIEW (shell_view));
-
- gnome_calendar_get_visible_time_range (
- calendar, &start_time, &end_time);
- timezone = gnome_calendar_get_timezone (calendar);
- view = gnome_calendar_get_view (calendar);
-
- start_tt = icaltime_from_timet_with_zone (start_time, FALSE, timezone);
- start_tm.tm_year = start_tt.year - 1900;
- start_tm.tm_mon = start_tt.month - 1;
- start_tm.tm_mday = start_tt.day;
- start_tm.tm_hour = start_tt.hour;
- start_tm.tm_min = start_tt.minute;
- start_tm.tm_sec = start_tt.second;
- start_tm.tm_isdst = -1;
- start_tm.tm_wday = time_day_of_week (
- start_tt.day, start_tt.month - 1, start_tt.year);
-
- /* Subtract one from end_time so we don't get an extra day. */
- end_tt = icaltime_from_timet_with_zone (end_time - 1, FALSE, timezone);
- end_tm.tm_year = end_tt.year - 1900;
- end_tm.tm_mon = end_tt.month - 1;
- end_tm.tm_mday = end_tt.day;
- end_tm.tm_hour = end_tt.hour;
- end_tm.tm_min = end_tt.minute;
- end_tm.tm_sec = end_tt.second;
- end_tm.tm_isdst = -1;
- end_tm.tm_wday = time_day_of_week (
- end_tt.day, end_tt.month - 1, end_tt.year);
-
- switch (view) {
- case GNOME_CAL_DAY_VIEW:
- case GNOME_CAL_WORK_WEEK_VIEW:
- case GNOME_CAL_WEEK_VIEW:
- if (start_tm.tm_year == end_tm.tm_year &&
- start_tm.tm_mon == end_tm.tm_mon &&
- start_tm.tm_mday == end_tm.tm_mday) {
- e_utf8_strftime (
- buffer, sizeof (buffer),
- _("%A %d %b %Y"), &start_tm);
- } else if (start_tm.tm_year == end_tm.tm_year) {
- e_utf8_strftime (
- buffer, sizeof (buffer),
- _("%a %d %b"), &start_tm);
- e_utf8_strftime (
- end_buffer, sizeof (end_buffer),
- _("%a %d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- } else {
- e_utf8_strftime (
- buffer, sizeof (buffer),
- _("%a %d %b %Y"), &start_tm);
- e_utf8_strftime (
- end_buffer, sizeof (end_buffer),
- _("%a %d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- }
- break;
-
- case GNOME_CAL_MONTH_VIEW:
- case GNOME_CAL_LIST_VIEW:
- if (start_tm.tm_year == end_tm.tm_year) {
- if (start_tm.tm_mon == end_tm.tm_mon) {
- e_utf8_strftime (
- buffer,
- sizeof (buffer),
- "%d", &start_tm);
- e_utf8_strftime (
- end_buffer,
- sizeof (end_buffer),
- _("%d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- } else {
- e_utf8_strftime (
- buffer,
- sizeof (buffer),
- _("%d %b"), &start_tm);
- e_utf8_strftime (
- end_buffer,
- sizeof (end_buffer),
- _("%d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- }
- } else {
- e_utf8_strftime (
- buffer, sizeof (buffer),
- _("%d %b %Y"), &start_tm);
- e_utf8_strftime (
- end_buffer, sizeof (end_buffer),
- _("%d %b %Y"), &end_tm);
- strcat (buffer, " - ");
- strcat (buffer, end_buffer);
- }
- break;
-
- default:
- g_return_if_reached ();
- }
-
- e_shell_sidebar_set_secondary_text (shell_sidebar, buffer);
-}
-
-static void
cal_shell_sidebar_get_property (GObject *object,
guint property_id,
GValue *value,
@@ -211,10 +87,12 @@ cal_shell_sidebar_constructed (GObject *object)
ESourceList *source_list;
GtkContainer *container;
GtkWidget *widget;
- GnomeCalendar *calendar;
priv = E_CAL_SHELL_SIDEBAR_GET_PRIVATE (object);
+ /* Chain up to parent's constructed() method. */
+ G_OBJECT_CLASS (parent_class)->constructed (object);
+
shell_sidebar = E_SHELL_SIDEBAR (object);
shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
cal_shell_view = E_CAL_SHELL_VIEW (shell_view);
@@ -238,17 +116,6 @@ cal_shell_sidebar_constructed (GObject *object)
gtk_container_add (container, widget);
priv->selector = g_object_ref (widget);
gtk_widget_show (widget);
-
- /* Setup signal handlers. */
-
- calendar = e_cal_shell_view_get_calendar (cal_shell_view);
-
- g_signal_connect_swapped (
- calendar, "dates-shown-changed",
- G_CALLBACK (cal_shell_sidebar_update),
- shell_sidebar);
-
- cal_shell_sidebar_update (shell_sidebar);
}
static void
diff --git a/calendar/modules/e-cal-shell-sidebar.h b/calendar/modules/e-cal-shell-sidebar.h
index 89eaee7613..b22805b60c 100644
--- a/calendar/modules/e-cal-shell-sidebar.h
+++ b/calendar/modules/e-cal-shell-sidebar.h
@@ -21,8 +21,8 @@
#ifndef E_CAL_SHELL_SIDEBAR_H
#define E_CAL_SHELL_SIDEBAR_H
-#include <e-shell-sidebar.h>
-#include <e-shell-view.h>
+#include <shell/e-shell-sidebar.h>
+#include <shell/e-shell-view.h>
/* Standard GObject macros */
#define E_TYPE_CAL_SHELL_SIDEBAR \
diff --git a/calendar/modules/e-cal-shell-view-actions.h b/calendar/modules/e-cal-shell-view-actions.h
index 9d935e4263..c74f4c23e5 100644
--- a/calendar/modules/e-cal-shell-view-actions.h
+++ b/calendar/modules/e-cal-shell-view-actions.h
@@ -23,8 +23,58 @@
#include <shell/e-shell-window-actions.h>
+/* Calendar Actions */
+#define E_SHELL_WINDOW_ACTION_CALENDAR_COPY(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-copy")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_DELETE(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-delete")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_GO_BACK(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-go-back")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_GO_FORWARD(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-go-forward")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_GO_TODAY(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-go-today")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_JUMP_TO(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-jump-to")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_NEW(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-new")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_PRINT(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-print")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_PRINT_PREVIEW(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-print-preview")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_PROPERTIES(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-properties")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_PURGE(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-purge")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_VIEW_DAY(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-view-day")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_VIEW_LIST(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-view-list")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_VIEW_MONTH(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-view-month")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_VIEW_WEEK(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-view-week")
+#define E_SHELL_WINDOW_ACTION_CALENDAR_VIEW_WORKWEEK(window) \
+ E_SHELL_WINDOW_ACTION ((window), "calendar-view-workweek")
+
+/* Event Actions */
+#define E_SHELL_WINDOW_ACTION_EVENT_CLIPBOARD_COPY(window) \
+ E_SHELL_WINDOW_ACTION ((window), "event-clipboard-copy")
+#define E_SHELL_WINDOW_ACTION_EVENT_CLIPBOARD_CUT(window) \
+ E_SHELL_WINDOW_ACTION ((window), "event-clipboard-cut")
+#define E_SHELL_WINDOW_ACTION_EVENT_CLIPBOARD_PASTE(window) \
+ E_SHELL_WINDOW_ACTION ((window), "event-clipboard-paste")
+#define E_SHELL_WINDOW_ACTION_EVENT_DELETE(window) \
+ E_SHELL_WINDOW_ACTION ((window), "event-delete")
+#define E_SHELL_WINDOW_ACTION_EVENT_DELETE_OCCURRENCE(window) \
+ E_SHELL_WINDOW_ACTION ((window), "event-delete-occurrence")
+#define E_SHELL_WINDOW_ACTION_EVENT_DELETE_OCCURRENCE_ALL(window) \
+ E_SHELL_WINDOW_ACTION ((window), "event-delete-occurrence-all")
+#define E_SHELL_WINDOW_ACTION_EVENT_OPEN(window) \
+ E_SHELL_WINDOW_ACTION ((window), "event-open")
+
/* Action Groups */
#define E_SHELL_WINDOW_ACTION_GROUP_CALS(window) \
- E_SHELL_WINDOW_ACTION_GROUP ((window), "cals")
+ E_SHELL_WINDOW_ACTION_GROUP ((window), "calendars")
#endif /* E_CAL_SHELL_VIEW_ACTIONS_H */
diff --git a/calendar/modules/e-cal-shell-view-private.c b/calendar/modules/e-cal-shell-view-private.c
index 262e31497c..97aada4a89 100644
--- a/calendar/modules/e-cal-shell-view-private.c
+++ b/calendar/modules/e-cal-shell-view-private.c
@@ -20,6 +20,75 @@
#include "e-cal-shell-view-private.h"
+#include "calendar/gui/calendar-view-factory.h"
+#include "widgets/menus/gal-view-factory-etable.h"
+
+static void
+cal_shell_view_load_view_collection (EShellViewClass *shell_view_class)
+{
+ GalViewCollection *collection;
+ GalViewFactory *factory;
+ ETableSpecification *spec;
+ const gchar *base_dir;
+ gchar *filename;
+
+ collection = shell_view_class->view_collection;
+
+ base_dir = EVOLUTION_ETSPECDIR;
+ spec = e_table_specification_new ();
+ filename = g_build_filename (base_dir, ETSPEC_FILENAME, NULL);
+ if (!e_table_specification_load_from_file (spec, filename))
+ g_critical ("Unable to load ETable specification file "
+ "for calendars");
+ g_free (filename);
+
+ factory = calendar_view_factory_new (GNOME_CAL_DAY_VIEW);
+ gal_view_collection_add_factory (collection, factory);
+ g_object_unref (factory);
+
+ factory = calendar_view_factory_new (GNOME_CAL_WORK_WEEK_VIEW);
+ gal_view_collection_add_factory (collection, factory);
+ g_object_unref (factory);
+
+ factory = calendar_view_factory_new (GNOME_CAL_WEEK_VIEW);
+ gal_view_collection_add_factory (collection, factory);
+ g_object_unref (factory);
+
+ factory = calendar_view_factory_new (GNOME_CAL_MONTH_VIEW);
+ gal_view_collection_add_factory (collection, factory);
+ g_object_unref (factory);
+
+ factory = gal_view_factory_etable_new (spec);
+ gal_view_collection_add_factory (collection, factory);
+ g_object_unref (factory);
+ g_object_unref (spec);
+
+ gal_view_collection_load (collection);
+}
+
+static void
+cal_shell_view_notify_view_id_cb (ECalShellView *cal_shell_view)
+{
+ ECalShellContent *cal_shell_content;
+ GalViewInstance *view_instance;
+ const gchar *view_id;
+
+ cal_shell_content = cal_shell_view->priv->cal_shell_content;
+ view_instance =
+ e_cal_shell_content_get_view_instance (cal_shell_content);
+ view_id = e_shell_view_get_view_id (E_SHELL_VIEW (cal_shell_view));
+
+ /* A NULL view ID implies we're in a custom view. But you can
+ * only get to a custom view via the "Define Views" dialog, which
+ * would have already modified the view instance appropriately.
+ * Furthermore, there's no way to refer to a custom view by ID
+ * anyway, since custom views have no IDs. */
+ if (view_id == NULL)
+ return;
+
+ gal_view_instance_set_current_view_id (view_instance, view_id);
+}
+
void
e_cal_shell_view_private_init (ECalShellView *cal_shell_view,
EShellViewClass *shell_view_class)
@@ -34,6 +103,13 @@ e_cal_shell_view_private_init (ECalShellView *cal_shell_view,
priv->source_list = g_object_ref (source_list);
priv->calendar_actions = gtk_action_group_new ("calendars");
+
+ if (!gal_view_collection_loaded (shell_view_class->view_collection))
+ cal_shell_view_load_view_collection (shell_view_class);
+
+ g_signal_connect (
+ cal_shell_view, "notify::view-id",
+ G_CALLBACK (cal_shell_view_notify_view_id_cb), NULL);
}
void
@@ -43,6 +119,7 @@ e_cal_shell_view_private_constructed (ECalShellView *cal_shell_view)
EShellContent *shell_content;
EShellSidebar *shell_sidebar;
EShellView *shell_view;
+ GnomeCalendar *calendar;
shell_view = E_SHELL_VIEW (cal_shell_view);
shell_content = e_shell_view_get_shell_content (shell_view);
@@ -51,6 +128,16 @@ e_cal_shell_view_private_constructed (ECalShellView *cal_shell_view)
/* Cache these to avoid lots of awkward casting. */
priv->cal_shell_content = g_object_ref (shell_content);
priv->cal_shell_sidebar = g_object_ref (shell_sidebar);
+
+ calendar = e_cal_shell_view_get_calendar (cal_shell_view);
+
+ g_signal_connect_swapped (
+ calendar, "dates-shown-changed",
+ G_CALLBACK (e_cal_shell_view_sidebar_update),
+ cal_shell_view);
+
+ e_shell_view_update_actions (shell_view);
+ e_cal_shell_view_sidebar_update (cal_shell_view);
}
void
@@ -64,10 +151,170 @@ e_cal_shell_view_private_dispose (ECalShellView *cal_shell_view)
DISPOSE (priv->cal_shell_content);
DISPOSE (priv->cal_shell_sidebar);
+
+ if (cal_shell_view->priv->activity != NULL) {
+ /* XXX Activity is not cancellable. */
+ e_activity_complete (cal_shell_view->priv->activity);
+ g_object_unref (cal_shell_view->priv->activity);
+ cal_shell_view->priv->activity = NULL;
+ }
}
void
e_cal_shell_view_private_finalize (ECalShellView *cal_shell_view)
{
- ECalShellViewPrivate *priv = cal_shell_view->priv;
+ /* XXX Nothing to do? */
}
+
+void
+e_cal_shell_view_set_status_message (ECalShellView *cal_shell_view,
+ const gchar *status_message)
+{
+ EActivity *activity;
+ EShellView *shell_view;
+
+ g_return_if_fail (E_IS_CAL_SHELL_VIEW (cal_shell_view));
+
+ activity = cal_shell_view->priv->activity;
+ shell_view = E_SHELL_VIEW (cal_shell_view);
+
+ if (status_message == NULL || *status_message == '\0') {
+ if (activity != NULL) {
+ e_activity_complete (activity);
+ g_object_unref (activity);
+ activity = NULL;
+ }
+
+ } else if (activity == NULL) {
+ activity = e_activity_new (status_message);
+ e_shell_view_add_activity (shell_view, activity);
+
+ } else
+ e_activity_set_primary_text (activity, status_message);
+
+ cal_shell_view->priv->activity = activity;
+}
+
+void
+e_cal_shell_view_sidebar_update (ECalShellView *cal_shell_view)
+{
+ EShellView *shell_view;
+ EShellSidebar *shell_sidebar;
+ GnomeCalendar *calendar;
+ GnomeCalendarViewType view;
+ time_t start_time, end_time;
+ struct tm start_tm, end_tm;
+ struct icaltimetype start_tt, end_tt;
+ icaltimezone *timezone;
+ gchar buffer[512];
+ gchar end_buffer[512];
+
+ shell_view = E_SHELL_VIEW (cal_shell_view);
+ shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
+
+ calendar = e_cal_shell_view_get_calendar (cal_shell_view);
+
+ gnome_calendar_get_visible_time_range (
+ calendar, &start_time, &end_time);
+ timezone = gnome_calendar_get_timezone (calendar);
+ view = gnome_calendar_get_view (calendar);
+
+ start_tt = icaltime_from_timet_with_zone (start_time, FALSE, timezone);
+ start_tm.tm_year = start_tt.year - 1900;
+ start_tm.tm_mon = start_tt.month - 1;
+ start_tm.tm_mday = start_tt.day;
+ start_tm.tm_hour = start_tt.hour;
+ start_tm.tm_min = start_tt.minute;
+ start_tm.tm_sec = start_tt.second;
+ start_tm.tm_isdst = -1;
+ start_tm.tm_wday = time_day_of_week (
+ start_tt.day, start_tt.month - 1, start_tt.year);
+
+ /* Subtract one from end_time so we don't get an extra day. */
+ end_tt = icaltime_from_timet_with_zone (end_time - 1, FALSE, timezone);
+ end_tm.tm_year = end_tt.year - 1900;
+ end_tm.tm_mon = end_tt.month - 1;
+ end_tm.tm_mday = end_tt.day;
+ end_tm.tm_hour = end_tt.hour;
+ end_tm.tm_min = end_tt.minute;
+ end_tm.tm_sec = end_tt.second;
+ end_tm.tm_isdst = -1;
+ end_tm.tm_wday = time_day_of_week (
+ end_tt.day, end_tt.month - 1, end_tt.year);
+
+ switch (view) {
+ case GNOME_CAL_DAY_VIEW:
+ case GNOME_CAL_WORK_WEEK_VIEW:
+ case GNOME_CAL_WEEK_VIEW:
+ if (start_tm.tm_year == end_tm.tm_year &&
+ start_tm.tm_mon == end_tm.tm_mon &&
+ start_tm.tm_mday == end_tm.tm_mday) {
+ e_utf8_strftime (
+ buffer, sizeof (buffer),
+ _("%A %d %b %Y"), &start_tm);
+ } else if (start_tm.tm_year == end_tm.tm_year) {
+ e_utf8_strftime (
+ buffer, sizeof (buffer),
+ _("%a %d %b"), &start_tm);
+ e_utf8_strftime (
+ end_buffer, sizeof (end_buffer),
+ _("%a %d %b %Y"), &end_tm);
+ strcat (buffer, " - ");
+ strcat (buffer, end_buffer);
+ } else {
+ e_utf8_strftime (
+ buffer, sizeof (buffer),
+ _("%a %d %b %Y"), &start_tm);
+ e_utf8_strftime (
+ end_buffer, sizeof (end_buffer),
+ _("%a %d %b %Y"), &end_tm);
+ strcat (buffer, " - ");
+ strcat (buffer, end_buffer);
+ }
+ break;
+
+ case GNOME_CAL_MONTH_VIEW:
+ case GNOME_CAL_LIST_VIEW:
+ if (start_tm.tm_year == end_tm.tm_year) {
+ if (start_tm.tm_mon == end_tm.tm_mon) {
+ e_utf8_strftime (
+ buffer,
+ sizeof (buffer),
+ "%d", &start_tm);
+ e_utf8_strftime (
+ end_buffer,
+ sizeof (end_buffer),
+ _("%d %b %Y"), &end_tm);
+ strcat (buffer, " - ");
+ strcat (buffer, end_buffer);
+ } else {
+ e_utf8_strftime (
+ buffer,
+ sizeof (buffer),
+ _("%d %b"), &start_tm);
+ e_utf8_strftime (
+ end_buffer,
+ sizeof (end_buffer),
+ _("%d %b %Y"), &end_tm);
+ strcat (buffer, " - ");
+ strcat (buffer, end_buffer);
+ }
+ } else {
+ e_utf8_strftime (
+ buffer, sizeof (buffer),
+ _("%d %b %Y"), &start_tm);
+ e_utf8_strftime (
+ end_buffer, sizeof (end_buffer),
+ _("%d %b %Y"), &end_tm);
+ strcat (buffer, " - ");
+ strcat (buffer, end_buffer);
+ }
+ break;
+
+ default:
+ g_return_if_reached ();
+ }
+
+ e_shell_sidebar_set_secondary_text (shell_sidebar, buffer);
+}
+
diff --git a/calendar/modules/e-cal-shell-view-private.h b/calendar/modules/e-cal-shell-view-private.h
index d80d0d2f27..645b514bf4 100644
--- a/calendar/modules/e-cal-shell-view-private.h
+++ b/calendar/modules/e-cal-shell-view-private.h
@@ -23,15 +23,20 @@
#include "e-cal-shell-view.h"
+#include <string.h>
#include <glib/gi18n.h>
+#include <libecal/e-cal-time-util.h>
+#include <libedataserver/e-data-server-util.h>
-#include <e-util/e-util.h>
-#include <shell/e-shell-content.h>
+#include "e-util/e-util.h"
-#include <gnome-cal.h>
-#include <e-cal-shell-content.h>
-#include <e-cal-shell-sidebar.h>
-#include <e-cal-shell-view-actions.h>
+#include "shell/e-shell-content.h"
+
+#include "calendar/gui/gnome-cal.h"
+
+#include "e-cal-shell-content.h"
+#include "e-cal-shell-sidebar.h"
+#include "e-cal-shell-view-actions.h"
#define E_CAL_SHELL_VIEW_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE \
@@ -49,6 +54,9 @@
if ((obj) != NULL) { g_object_unref (obj); (obj) = NULL; } \
} G_STMT_END
+/* ETable Specifications */
+#define ETSPEC_FILENAME "e-calendar-table.etspec"
+
G_BEGIN_DECLS
struct _ECalShellViewPrivate {
@@ -64,6 +72,8 @@ struct _ECalShellViewPrivate {
/* These are just for convenience. */
ECalShellContent *cal_shell_content;
ECalShellSidebar *cal_shell_sidebar;
+
+ EActivity *activity;
};
void e_cal_shell_view_private_init
@@ -80,6 +90,11 @@ void e_cal_shell_view_private_finalize
void e_cal_shell_view_actions_init
(ECalShellView *cal_shell_view);
+void e_cal_shell_view_set_status_message
+ (ECalShellView *cal_shell_view,
+ const gchar *status_message);
+void e_cal_shell_view_sidebar_update
+ (ECalShellView *cal_shell_view);
G_END_DECLS
diff --git a/calendar/modules/e-cal-shell-view.c b/calendar/modules/e-cal-shell-view.c
index 67d32de362..3c4eaaf0d1 100644
--- a/calendar/modules/e-cal-shell-view.c
+++ b/calendar/modules/e-cal-shell-view.c
@@ -73,17 +73,16 @@ cal_shell_view_constructed (GObject *object)
}
static void
-cal_shell_view_changed (EShellView *shell_view)
+cal_shell_view_update_actions (EShellView *shell_view)
{
ECalShellViewPrivate *priv;
- GtkActionGroup *action_group;
- gboolean visible;
+ EShellWindow *shell_window;
priv = E_CAL_SHELL_VIEW_GET_PRIVATE (shell_view);
- action_group = priv->calendar_actions;
- visible = e_shell_view_is_active (shell_view);
- gtk_action_group_set_visible (action_group, visible);
+ shell_window = e_shell_view_get_shell_window (shell_view);
+
+ /* FIXME */
}
static void
@@ -105,10 +104,11 @@ cal_shell_view_class_init (ECalShellView *class,
shell_view_class = E_SHELL_VIEW_CLASS (class);
shell_view_class->label = N_("Cals");
shell_view_class->icon_name = "evolution-cals";
+ shell_view_class->ui_definition = "evolution-calendars.ui";
shell_view_class->search_options = "/calendar-search-options";
shell_view_class->type_module = type_module;
shell_view_class->new_shell_sidebar = e_cal_shell_sidebar_new;
- shell_view_class->changed = cal_shell_view_changed;
+ shell_view_class->update_actions = cal_shell_view_update_actions;
g_object_class_install_property (
object_class,
diff --git a/calendar/modules/e-cal-shell-view.h b/calendar/modules/e-cal-shell-view.h
index 404446f22b..9e21d9dc93 100644
--- a/calendar/modules/e-cal-shell-view.h
+++ b/calendar/modules/e-cal-shell-view.h
@@ -21,8 +21,8 @@
#ifndef E_CAL_SHELL_VIEW_H
#define E_CAL_SHELL_VIEW_H
-#include <gnome-cal.h>
-#include <e-shell-view.h>
+#include <shell/e-shell-view.h>
+#include <calendar/gui/gnome-cal.h>
#include <libedataserver/e-source-list.h>
/* Standard GObject macros */
diff --git a/calendar/modules/e-memo-shell-content.c b/calendar/modules/e-memo-shell-content.c
index a7b50fc967..52055f5146 100644
--- a/calendar/modules/e-memo-shell-content.c
+++ b/calendar/modules/e-memo-shell-content.c
@@ -313,20 +313,6 @@ memo_shell_content_constructed (GObject *object)
shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
view_collection = shell_view_class->view_collection;
- /* Load the view instance. */
-
- view_instance = gal_view_instance_new (view_collection, NULL);
- g_signal_connect_swapped (
- view_instance, "changed",
- G_CALLBACK (memo_shell_content_changed_cb),
- object);
- g_signal_connect_swapped (
- view_instance, "display-view",
- G_CALLBACK (memo_shell_content_display_view_cb),
- object);
- gal_view_instance_load (view_instance);
- priv->view_instance = view_instance;
-
/* Build content widgets. */
container = GTK_WIDGET (object);
@@ -402,6 +388,20 @@ memo_shell_content_constructed (GObject *object)
G_CALLBACK (memo_shell_content_model_row_changed_cb),
object);
+ /* Load the view instance. */
+
+ view_instance = gal_view_instance_new (view_collection, NULL);
+ g_signal_connect_swapped (
+ view_instance, "changed",
+ G_CALLBACK (memo_shell_content_changed_cb),
+ object);
+ g_signal_connect_swapped (
+ view_instance, "display-view",
+ G_CALLBACK (memo_shell_content_display_view_cb),
+ object);
+ gal_view_instance_load (view_instance);
+ priv->view_instance = view_instance;
+
/* Bind GObject properties to GConf keys. */
bridge = gconf_bridge_get ();
diff --git a/calendar/modules/e-memo-shell-module.c b/calendar/modules/e-memo-shell-module.c
index fe8c8fe35a..cf2a9af325 100644
--- a/calendar/modules/e-memo-shell-module.c
+++ b/calendar/modules/e-memo-shell-module.c
@@ -29,8 +29,11 @@
#include "shell/e-shell-module.h"
#include "shell/e-shell-window.h"
+#include "calendar/common/authentication.h"
#include "calendar/gui/calendar-config.h"
+#include "calendar/gui/comp-util.h"
#include "calendar/gui/dialogs/calendar-setup.h"
+#include "calendar/gui/dialogs/memo-editor.h"
#include "e-memo-shell-view.h"
@@ -194,22 +197,83 @@ memo_module_ensure_sources (EShellModule *shell_module)
}
static void
-action_memo_new_cb (GtkAction *action,
- EShellWindow *shell_window)
+memo_module_cal_opened_cb (ECal *cal,
+ ECalendarStatus status,
+ GtkAction *action)
{
+ ECalComponent *comp;
+ CompEditor *editor;
+ CompEditorFlags flags = 0;
+ const gchar *action_name;
+
+ /* XXX Handle errors better. */
+ if (status != E_CALENDAR_STATUS_OK)
+ return;
+
+ action_name = gtk_action_get_name (action);
+
+ flags |= COMP_EDITOR_NEW_ITEM;
+ if (strcmp (action_name, "memo-shared-new") == 0) {
+ flags |= COMP_EDITOR_IS_SHARED;
+ flags |= COMP_EDITOR_USER_ORG;
+ }
+
+ editor = memo_editor_new (cal, flags);
+ comp = cal_comp_memo_new_with_defaults (cal);
+ comp_editor_edit_comp (editor, comp);
+
+ gtk_window_present (GTK_WINDOW (editor));
+
+ g_object_unref (comp);
+ g_object_unref (cal);
}
static void
-action_memo_shared_new_cb (GtkAction *action,
- EShellWindow *shell_window)
+action_memo_new_cb (GtkAction *action,
+ EShellWindow *shell_window)
{
+ ECal *cal = NULL;
+ ECalSourceType source_type;
+ ESourceList *source_list;
+ gchar *uid;
+
+ /* This callback is used for both memos and shared memos. */
+
+ source_type = E_CAL_SOURCE_TYPE_JOURNAL;
+
+ if (!e_cal_get_sources (&source_list, source_type, NULL)) {
+ g_warning ("Could not get memo sources from GConf!");
+ return;
+ }
+
+ uid = calendar_config_get_primary_memos ();
+
+ if (uid != NULL) {
+ ESource *source;
+
+ source = e_source_list_peek_source_by_uid (source_list, uid);
+ if (source != NULL)
+ cal = auth_new_cal_from_source (source, source_type);
+ g_free (uid);
+ }
+
+ if (cal == NULL)
+ cal = auth_new_cal_from_default (source_type);
+
+ g_return_if_fail (cal != NULL);
+
+ g_signal_connect (
+ cal, "cal-opened",
+ G_CALLBACK (memo_module_cal_opened_cb), action);
+
+ e_cal_open_async (cal, FALSE);
}
static void
action_memo_list_new_cb (GtkAction *action,
EShellWindow *shell_window)
{
- calendar_setup_new_memo_list (NULL);
+ calendar_setup_new_memo_list (GTK_WINDOW (shell_window));
}
static GtkActionEntry item_entries[] = {
@@ -217,16 +281,16 @@ static GtkActionEntry item_entries[] = {
{ "memo-new",
"stock_insert-note",
N_("Mem_o"), /* XXX Need C_() here */
- "<Control>o",
+ "<Shift><Control>o",
N_("Create a new memo"),
G_CALLBACK (action_memo_new_cb) },
{ "memo-shared-new",
"stock_insert-note",
N_("_Shared Memo"),
- "<Control>h",
+ "<Shift><Control>h",
N_("Create a new shared memo"),
- G_CALLBACK (action_memo_shared_new_cb) }
+ G_CALLBACK (action_memo_new_cb) }
};
static GtkActionEntry source_entries[] = {
diff --git a/calendar/modules/e-memo-shell-sidebar.c b/calendar/modules/e-memo-shell-sidebar.c
index 23ab9491fa..21948b87ed 100644
--- a/calendar/modules/e-memo-shell-sidebar.c
+++ b/calendar/modules/e-memo-shell-sidebar.c
@@ -20,9 +20,15 @@
#include "e-memo-shell-sidebar.h"
+#include <string.h>
#include <glib/gi18n.h>
+#include <libecal/e-cal.h>
+#include "e-util/e-error.h"
+#include "calendar/common/authentication.h"
+#include "calendar/gui/calendar-config.h"
#include "calendar/gui/e-calendar-selector.h"
+#include "calendar/gui/misc.h"
#include "e-memo-shell-view.h"
@@ -32,6 +38,9 @@
struct _EMemoShellSidebarPrivate {
GtkWidget *selector;
+
+ /* UID -> Client */
+ GHashTable *client_table;
};
enum {
@@ -39,47 +48,181 @@ enum {
PROP_SELECTOR
};
+enum {
+ CLIENT_ADDED,
+ CLIENT_REMOVED,
+ STATUS_MESSAGE,
+ LAST_SIGNAL
+};
+
static gpointer parent_class;
+static guint signals[LAST_SIGNAL];
+
+static void
+memo_shell_sidebar_emit_client_added (EMemoShellSidebar *memo_shell_sidebar,
+ ECal *client)
+{
+ guint signal_id = signals[CLIENT_ADDED];
+
+ g_signal_emit (memo_shell_sidebar, signal_id, 0, client);
+}
+
+static void
+memo_shell_sidebar_emit_client_removed (EMemoShellSidebar *memo_shell_sidebar,
+ ECal *client)
+{
+ guint signal_id = signals[CLIENT_REMOVED];
+
+ g_signal_emit (memo_shell_sidebar, signal_id, 0, client);
+}
+
+static void
+memo_shell_sidebar_emit_status_message (EMemoShellSidebar *memo_shell_sidebar,
+ const gchar *status_message)
+{
+ guint signal_id = signals[STATUS_MESSAGE];
+
+ g_signal_emit (memo_shell_sidebar, signal_id, 0, status_message);
+}
+
+static void
+memo_shell_sidebar_update_timezone (EMemoShellSidebar *memo_shell_sidebar)
+{
+ /* FIXME */
+}
-#if 0 /* MOVE THIS TO EMemoShellView */
static void
-memo_shell_sidebar_update (EShellSidebar *shell_sidebar)
+memo_shell_sidebar_backend_died_cb (EMemoShellSidebar *memo_shell_sidebar,
+ ECal *client)
{
EShellView *shell_view;
- EMemos *memos;
- ETable *table;
- ECalModel *model;
- EMemoTable *memo_table;
- GString *string;
- const gchar *format;
- gint n_rows;
- gint n_selected;
+ EShellWindow *shell_window;
+ EShellSidebar *shell_sidebar;
+ GHashTable *client_table;
+ ESource *source;
+ const gchar *uid;
+
+ client_table = memo_shell_sidebar->priv->client_table;
+ shell_sidebar = E_SHELL_SIDEBAR (memo_shell_sidebar);
shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
- memos = e_memo_shell_view_get_memos (E_MEMO_SHELL_VIEW (shell_view));
- memo_table = e_memos_get_calendar_table (memos);
- model = e_memo_table_get_model (memo_table);
- table = e_memo_table_get_table (memo_table);
+ shell_window = e_shell_view_get_shell_window (shell_view);
- n_rows = e_table_model_get_row_count (model);
- n_selected = e_table_selected_count (table);
+ source = e_cal_get_source (client);
+ uid = e_source_peek_uid (source);
- string = g_string_sized_new (64);
+ g_object_ref (source);
- format = ngettext ("%d memo", "%d memos", n_rows);
- g_string_append_printf (string, format, n_rows);
+ g_hash_table_remove (client_table, uid);
+ memo_shell_sidebar_emit_status_message (memo_shell_sidebar, NULL);
- if (n_selected > 0) {
- format = _("%d selected");
- g_string_append_len (string, ", ", 2);
- g_string_append_printf (string, format, n_selected);
+ e_error_run (
+ GTK_WINDOW (shell_window),
+ "calendar:memos-crashed", NULL);
+
+ g_object_unref (source);
+}
+
+static void
+memo_shell_sidebar_backend_error_cb (EMemoShellSidebar *memo_shell_sidebar,
+ const gchar *message,
+ ECal *client)
+{
+ EShellView *shell_view;
+ EShellWindow *shell_window;
+ EShellSidebar *shell_sidebar;
+ GtkWidget *dialog;
+ const gchar *uri;
+ gchar *uri_no_passwd;
+
+ shell_sidebar = E_SHELL_SIDEBAR (memo_shell_sidebar);
+ shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
+ shell_window = e_shell_view_get_shell_window (shell_view);
+
+ uri = e_cal_get_uri (client);
+ uri_no_passwd = get_uri_without_password (uri);
+
+ dialog = gtk_message_dialog_new (
+ GTK_WINDOW (shell_window),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+ _("Error on %s\n%s"),
+ uri_no_passwd, message);
+
+ gtk_dialog_run (GTK_DIALOG (dialog));
+ gtk_widget_destroy (dialog);
+
+ g_free (uri_no_passwd);
+}
+
+static void
+memo_shell_sidebar_client_opened_cb (EMemoShellSidebar *memo_shell_sidebar,
+ ECalendarStatus status,
+ ECal *client)
+{
+ EShellView *shell_view;
+ EShellWindow *shell_window;
+ EShellSidebar *shell_sidebar;
+ ESource *source;
+
+ source = e_cal_get_source (client);
+
+ shell_sidebar = E_SHELL_SIDEBAR (memo_shell_sidebar);
+ shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
+ shell_window = e_shell_view_get_shell_window (shell_view);
+
+ switch (status) {
+ case E_CALENDAR_STATUS_OK:
+ g_signal_handlers_disconnect_matched (
+ client, G_SIGNAL_MATCH_FUNC, 0, 0, NULL,
+ memo_shell_sidebar_client_opened_cb, NULL);
+
+ memo_shell_sidebar_emit_status_message (
+ memo_shell_sidebar, _("Loading memos"));
+ memo_shell_sidebar_emit_client_added (
+ memo_shell_sidebar, client);
+ memo_shell_sidebar_emit_status_message (
+ memo_shell_sidebar, NULL);
+ break;
+
+ case E_CALENDAR_STATUS_BUSY:
+ break;
+
+ case E_CALENDAR_STATUS_REPOSITORY_OFFLINE:
+ e_error_run (
+ GTK_WINDOW (shell_window),
+ "calendar:prompt-no-contents-offline-memos",
+ NULL);
+ break;
+
+ default:
+ memo_shell_sidebar_emit_client_removed (
+ memo_shell_sidebar, client);
+ break;
}
+}
+
+static void
+memo_shell_sidebar_selection_changed_cb (EMemoShellSidebar *memo_shell_sidebar,
+ ESourceSelector *selector)
+{
+ /* FIXME */
+}
- e_shell_sidebar_set_secondary_text (shell_sidebar, string->str);
+static void
+memo_shell_sidebar_primary_selection_changed_cb (EMemoShellSidebar *memo_shell_sidebar,
+ ESourceSelector *selector)
+{
+ ESource *source;
+ const gchar *uid;
- g_string_free (string, TRUE);
+ source = e_source_selector_peek_primary_selection (selector);
+ if (source == NULL)
+ return;
+
+ uid = e_source_peek_uid (source);
+ calendar_config_set_primary_memos (uid);
}
-#endif
static void
memo_shell_sidebar_get_property (GObject *object,
@@ -110,23 +253,45 @@ memo_shell_sidebar_dispose (GObject *object)
priv->selector = NULL;
}
+ g_hash_table_remove_all (priv->client_table);
+
/* Chain up to parent's dispose() method. */
G_OBJECT_CLASS (parent_class)->dispose (object);
}
static void
+memo_shell_sidebar_finalize (GObject *object)
+{
+ EMemoShellSidebarPrivate *priv;
+
+ priv = E_MEMO_SHELL_SIDEBAR_GET_PRIVATE (object);
+
+ g_hash_table_destroy (priv->client_table);
+
+ /* Chain up to parent's finalize() method. */
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
memo_shell_sidebar_constructed (GObject *object)
{
EMemoShellSidebarPrivate *priv;
EShellView *shell_view;
EShellSidebar *shell_sidebar;
EMemoShellView *memo_shell_view;
+ ESourceSelector *selector;
ESourceList *source_list;
+ ESource *source;
GtkContainer *container;
GtkWidget *widget;
+ GSList *list, *iter;
+ gchar *uid;
priv = E_MEMO_SHELL_SIDEBAR_GET_PRIVATE (object);
+ /* Chain up to parent's constructed() method. */
+ G_OBJECT_CLASS (parent_class)->constructed (object);
+
shell_sidebar = E_SHELL_SIDEBAR (object);
shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
memo_shell_view = E_MEMO_SHELL_VIEW (shell_view);
@@ -151,38 +316,78 @@ memo_shell_sidebar_constructed (GObject *object)
priv->selector = g_object_ref (widget);
gtk_widget_show (widget);
-#if 0 /* MOVE THIS TO EMemoShellView */
+ g_signal_connect_swapped (
+ widget, "selection-changed",
+ G_CALLBACK (memo_shell_sidebar_selection_changed_cb),
+ object);
- /* Setup signal handlers. */
+ g_signal_connect_swapped (
+ widget, "primary-selection-changed",
+ G_CALLBACK (memo_shell_sidebar_primary_selection_changed_cb),
+ object);
- memos = e_memo_shell_view_get_memos (memo_shell_view);
- memo_table = e_memos_get_calendar_table (memos);
- model = e_memo_table_get_model (memo_table);
- table = e_memo_table_get_table (memo_table);
+ /* Restore the primary selection from the last session. */
- g_signal_connect_swapped (
- model, "model-changed",
- G_CALLBACK (memo_shell_sidebar_update),
- shell_sidebar);
+ selector = E_SOURCE_SELECTOR (priv->selector);
+ uid = calendar_config_get_primary_memos ();
+ source = NULL;
- g_signal_connect_swapped (
- model, "model-rows-deleted",
- G_CALLBACK (memo_shell_sidebar_update),
- shell_sidebar);
+ if (uid != NULL)
+ source = e_source_list_peek_source_by_uid (source_list, uid);
+ if (source == NULL)
+ source = e_source_list_peek_source_any (source_list);
+ if (source != NULL)
+ e_source_selector_set_primary_selection (selector, source);
- g_signal_connect_swapped (
- model, "model-rows-inserted",
- G_CALLBACK (memo_shell_sidebar_update),
- shell_sidebar);
+ g_free (uid);
- g_signal_connect_swapped (
- model, "selection-change",
- G_CALLBACK (memo_shell_sidebar_update),
- shell_sidebar);
+ /* Restore the selected sources from last session. */
+
+ list = calendar_config_get_memos_selected ();
+ for (iter = list; iter != NULL; iter = iter->next) {
+ uid = iter->data;
+ source = e_source_list_peek_source_by_uid (source_list, uid);
+ g_free (uid);
- memo_shell_sidebar_update (shell_sidebar);
+ if (source == NULL)
+ continue;
-#endif
+ e_source_selector_select_source (
+ E_SOURCE_SELECTOR (priv->selector), source);
+ }
+ g_slist_free (list);
+}
+
+static void
+memo_shell_sidebar_client_added (EMemoShellSidebar *memo_shell_sidebar,
+ ECal *client)
+{
+ memo_shell_sidebar_update_timezone (memo_shell_sidebar);
+}
+
+static void
+memo_shell_sidebar_client_removed (EMemoShellSidebar *memo_shell_sidebar,
+ ECal *client)
+{
+ ESourceSelector *selector;
+ GHashTable *client_table;
+ ESource *source;
+ const gchar *uid;
+
+ selector = E_SOURCE_SELECTOR (memo_shell_sidebar->priv->selector);
+ client_table = memo_shell_sidebar->priv->client_table;
+
+ g_signal_handlers_disconnect_matched (
+ client, G_SIGNAL_MATCH_DATA, 0, 0,
+ NULL, NULL, memo_shell_sidebar);
+
+ source = e_cal_get_source (client);
+ e_source_selector_unselect_source (selector, source);
+
+ uid = e_source_peek_uid (source);
+ g_hash_table_remove (client_table, uid);
+
+ memo_shell_sidebar_emit_status_message (memo_shell_sidebar, NULL);
}
static void
@@ -196,8 +401,12 @@ memo_shell_sidebar_class_init (EMemoShellSidebarClass *class)
object_class = G_OBJECT_CLASS (class);
object_class->get_property = memo_shell_sidebar_get_property;
object_class->dispose = memo_shell_sidebar_dispose;
+ object_class->finalize = memo_shell_sidebar_finalize;
object_class->constructed = memo_shell_sidebar_constructed;
+ class->client_added = memo_shell_sidebar_client_added;
+ class->client_removed = memo_shell_sidebar_client_removed;
+
g_object_class_install_property (
object_class,
PROP_SELECTOR,
@@ -207,14 +416,53 @@ memo_shell_sidebar_class_init (EMemoShellSidebarClass *class)
_("This widget displays groups of memo lists"),
E_TYPE_SOURCE_SELECTOR,
G_PARAM_READABLE));
+
+ signals[CLIENT_ADDED] = g_signal_new (
+ "client-added",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (EMemoShellSidebarClass, client_added),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1,
+ E_TYPE_CAL);
+
+ signals[CLIENT_REMOVED] = g_signal_new (
+ "client-removed",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (EMemoShellSidebarClass, client_removed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE, 1,
+ E_TYPE_CAL);
+
+ signals[STATUS_MESSAGE] = g_signal_new (
+ "status-message",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET (EMemoShellSidebarClass, status_message),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE, 1,
+ G_TYPE_STRING);
}
static void
memo_shell_sidebar_init (EMemoShellSidebar *memo_shell_sidebar)
{
+ GHashTable *client_table;
+
+ client_table = g_hash_table_new_full (
+ g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) g_object_unref);
+
memo_shell_sidebar->priv =
E_MEMO_SHELL_SIDEBAR_GET_PRIVATE (memo_shell_sidebar);
+ memo_shell_sidebar->priv->client_table = client_table;
+
/* Postpone widget construction until we have a shell view. */
}
@@ -263,3 +511,79 @@ e_memo_shell_sidebar_get_selector (EMemoShellSidebar *memo_shell_sidebar)
return E_SOURCE_SELECTOR (memo_shell_sidebar->priv->selector);
}
+
+void
+e_memo_shell_sidebar_add_source (EMemoShellSidebar *memo_shell_sidebar,
+ ESource *source)
+{
+ ESourceSelector *selector;
+ GHashTable *client_table;
+ ECal *client;
+ const gchar *uid;
+ const gchar *uri;
+ gchar *message;
+
+ g_return_if_fail (E_IS_MEMO_SHELL_SIDEBAR (memo_shell_sidebar));
+ g_return_if_fail (E_IS_SOURCE (source));
+
+ client_table = memo_shell_sidebar->priv->client_table;
+ selector = E_SOURCE_SELECTOR (memo_shell_sidebar->priv->selector);
+
+ uid = e_source_peek_uid (source);
+ client = g_hash_table_lookup (client_table, uid);
+
+ if (client != NULL)
+ return;
+
+ client = auth_new_cal_from_source (source, E_CAL_SOURCE_TYPE_JOURNAL);
+ g_return_if_fail (client != NULL);
+
+ g_signal_connect_swapped (
+ client, "backend-died",
+ G_CALLBACK (memo_shell_sidebar_backend_died_cb),
+ memo_shell_sidebar);
+
+ g_signal_connect_swapped (
+ client, "backend-error",
+ G_CALLBACK (memo_shell_sidebar_backend_error_cb),
+ memo_shell_sidebar);
+
+ g_hash_table_insert (client_table, g_strdup (uid), client);
+ e_source_selector_select_source (selector, source);
+
+ uri = e_cal_get_uri (client);
+ message = g_strdup_printf (_("Opening memos at %s"), uri);
+ memo_shell_sidebar_emit_status_message (memo_shell_sidebar, message);
+ g_free (message);
+
+ g_signal_connect_swapped (
+ client, "cal-opened",
+ G_CALLBACK (memo_shell_sidebar_client_opened_cb),
+ memo_shell_sidebar);
+
+ e_cal_open_async (client, FALSE);
+}
+
+void
+e_memo_shell_sidebar_remove_source (EMemoShellSidebar *memo_shell_sidebar,
+ ESource *source)
+{
+ ESourceSelector *selector;
+ GHashTable *client_table;
+ ECal *client;
+ const gchar *uid;
+
+ g_return_if_fail (E_IS_MEMO_SHELL_SIDEBAR (memo_shell_sidebar));
+ g_return_if_fail (E_IS_SOURCE (source));
+
+ client_table = memo_shell_sidebar->priv->client_table;
+ selector = E_SOURCE_SELECTOR (memo_shell_sidebar->priv->selector);
+
+ uid = e_source_peek_uid (source);
+ client = g_hash_table_lookup (client_table, uid);
+
+ if (client == NULL)
+ return;
+
+ memo_shell_sidebar_emit_client_removed (memo_shell_sidebar, client);
+}
diff --git a/calendar/modules/e-memo-shell-sidebar.h b/calendar/modules/e-memo-shell-sidebar.h
index 47985d3402..106f9dc15d 100644
--- a/calendar/modules/e-memo-shell-sidebar.h
+++ b/calendar/modules/e-memo-shell-sidebar.h
@@ -21,6 +21,7 @@
#ifndef E_MEMO_SHELL_SIDEBAR_H
#define E_MEMO_SHELL_SIDEBAR_H
+#include <libecal/e-cal.h>
#include <libedataserverui/e-source-selector.h>
#include <shell/e-shell-sidebar.h>
@@ -58,6 +59,14 @@ struct _EMemoShellSidebar {
struct _EMemoShellSidebarClass {
EShellSidebarClass parent_class;
+
+ /* Signals */
+ void (*client_added) (EMemoShellSidebar *memo_shell_sidebar,
+ ECal *client);
+ void (*client_removed) (EMemoShellSidebar *memo_shell_sidebar,
+ ECal *client);
+ void (*status_message) (EMemoShellSidebar *memo_shell_sidebar,
+ const gchar *status_message);
};
GType e_memo_shell_sidebar_get_type (void);
@@ -65,6 +74,11 @@ GtkWidget * e_memo_shell_sidebar_new (EShellView *shell_view);
ESourceSelector *
e_memo_shell_sidebar_get_selector
(EMemoShellSidebar *memo_shell_sidebar);
+void e_memo_shell_sidebar_add_source (EMemoShellSidebar *memo_shell_sidebar,
+ ESource *source);
+void e_memo_shell_sidebar_remove_source
+ (EMemoShellSidebar *memo_shell_sidebar,
+ ESource *source);
G_END_DECLS
diff --git a/calendar/modules/e-memo-shell-view-actions.c b/calendar/modules/e-memo-shell-view-actions.c
index 29dacabafc..6b6bac4fab 100644
--- a/calendar/modules/e-memo-shell-view-actions.c
+++ b/calendar/modules/e-memo-shell-view-actions.c
@@ -20,10 +20,6 @@
#include "e-memo-shell-view-private.h"
-#include "e-util/gconf-bridge.h"
-
-#include "calendar/gui/print.h"
-
static void
action_memo_clipboard_copy_cb (GtkAction *action,
EMemoShellView *memo_shell_view)
@@ -114,14 +110,92 @@ static void
action_memo_list_copy_cb (GtkAction *action,
EMemoShellView *memo_shell_view)
{
- /* FIXME */
+ EMemoShellSidebar *memo_shell_sidebar;
+ EShellWindow *shell_window;
+ EShellView *shell_view;
+ ESourceSelector *selector;
+ ESource *source;
+
+ shell_view = E_SHELL_VIEW (memo_shell_view);
+ shell_window = e_shell_view_get_shell_window (shell_view);
+
+ memo_shell_sidebar = memo_shell_view->priv->memo_shell_sidebar;
+ selector = e_memo_shell_sidebar_get_selector (memo_shell_sidebar);
+ source = e_source_selector_peek_primary_selection (selector);
+ g_return_if_fail (source == NULL);
+
+ copy_source_dialog (
+ GTK_WINDOW (shell_window),
+ source, E_CAL_SOURCE_TYPE_JOURNAL);
}
static void
action_memo_list_delete_cb (GtkAction *action,
EMemoShellView *memo_shell_view)
{
- /* FIXME */
+ EMemoShellContent *memo_shell_content;
+ EMemoShellSidebar *memo_shell_sidebar;
+ EShellWindow *shell_window;
+ EShellView *shell_view;
+ EMemoTable *memo_table;
+ ECal *client;
+ ECalModel *model;
+ ESourceSelector *selector;
+ ESourceGroup *source_group;
+ ESourceList *source_list;
+ ESource *source;
+ gint response;
+ gchar *uri;
+ GError *error = NULL;
+
+ shell_view = E_SHELL_VIEW (memo_shell_view);
+ shell_window = e_shell_view_get_shell_window (shell_view);
+
+ memo_shell_content = memo_shell_view->priv->memo_shell_content;
+ memo_table = e_memo_shell_content_get_memo_table (memo_shell_content);
+ model = e_memo_table_get_model (memo_table);
+
+ memo_shell_sidebar = memo_shell_view->priv->memo_shell_sidebar;
+ selector = e_memo_shell_sidebar_get_selector (memo_shell_sidebar);
+ source = e_source_selector_peek_primary_selection (selector);
+ g_return_if_fail (source == NULL);
+
+ /* Ask for confirmation. */
+ response = e_error_run (
+ GTK_WINDOW (shell_window),
+ "calendar:prompt-delete-memo-list",
+ e_source_peek_name (source));
+ if (response != GTK_RESPONSE_YES)
+ return;
+
+ uri = e_source_get_uri (source);
+ client = e_cal_model_get_client_for_uri (model, uri);
+ if (client == NULL)
+ client = e_cal_new_from_uri (uri, E_CAL_SOURCE_TYPE_JOURNAL);
+ g_free (uri);
+
+ g_return_if_fail (client != NULL);
+
+ if (!e_cal_remove (client, &error)) {
+ g_warning ("%s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ if (e_source_selector_source_is_selected (selector, source)) {
+ e_memo_shell_sidebar_remove_source (
+ memo_shell_sidebar, source);
+ e_source_selector_unselect_source (selector, source);
+ }
+
+ source_group = e_source_peek_group (source);
+ e_source_group_remove_source (source_group, source);
+
+ source_list = memo_shell_view->priv->source_list;
+ if (!e_source_list_sync (source_list, &error)) {
+ g_warning ("%s", error->message);
+ g_error_free (error);
+ }
}
static void
@@ -192,6 +266,13 @@ action_memo_list_properties_cb (GtkAction *action,
}
static void
+action_memo_new_cb (GtkAction *action,
+ EMemoShellView *memo_shell_view)
+{
+ /* FIXME */
+}
+
+static void
action_memo_open_cb (GtkAction *action,
EMemoShellView *memo_shell_view)
{
@@ -357,7 +438,7 @@ static GtkActionEntry memo_entries[] = {
{ "memo-forward",
"mail-forward",
N_("_Forward as iCalendar"),
- NULL,
+ "<Control>f",
NULL, /* XXX Add a tooltip! */
G_CALLBACK (action_memo_forward_cb) },
@@ -403,15 +484,22 @@ static GtkActionEntry memo_entries[] = {
NULL, /* XXX Add a tooltip! */
G_CALLBACK (action_memo_list_properties_cb) },
- { "memo-open",
+ { "memo-new",
+ "stock_insert-note",
+ N_("New _Memo"),
NULL,
- N_("Open Memo"),
+ N_("Create a new memo"),
+ G_CALLBACK (action_memo_new_cb) },
+
+ { "memo-open",
+ GTK_STOCK_OPEN,
+ N_("_Open Memo"),
"<Control>o",
N_("View the selected memo"),
G_CALLBACK (action_memo_open_cb) },
{ "memo-open-url",
- NULL,
+ "applications-internet",
N_("Open _Web Page"),
NULL,
NULL, /* XXX Add a tooltip! */
@@ -443,6 +531,30 @@ static GtkToggleActionEntry memo_toggle_entries[] = {
TRUE }
};
+static GtkRadioActionEntry memo_search_entries[] = {
+
+ { "memo-search-any-field-contains",
+ NULL,
+ N_("Any field contains"),
+ NULL,
+ NULL, /* XXX Add a tooltip! */
+ MEMO_SEARCH_ANY_FIELD_CONTAINS },
+
+ { "memo-search-description-contains",
+ NULL,
+ N_("Description contains"),
+ NULL,
+ NULL, /* XXX Add a tooltip! */
+ MEMO_SEARCH_DESCRIPTION_CONTAINS },
+
+ { "memo-search-summary-contains",
+ NULL,
+ N_("Summary contains"),
+ NULL,
+ NULL, /* XXX Add a tooltip! */
+ MEMO_SEARCH_SUMMARY_CONTAINS }
+};
+
void
e_memo_shell_view_actions_init (EMemoShellView *memo_shell_view)
{
@@ -451,6 +563,7 @@ e_memo_shell_view_actions_init (EMemoShellView *memo_shell_view)
GtkActionGroup *action_group;
GtkUIManager *manager;
GConfBridge *bridge;
+ GtkAction *action;
GObject *object;
const gchar *domain;
const gchar *key;
@@ -460,8 +573,6 @@ e_memo_shell_view_actions_init (EMemoShellView *memo_shell_view)
manager = e_shell_window_get_ui_manager (shell_window);
domain = GETTEXT_PACKAGE;
- e_load_ui_definition (manager, "evolution-memos.ui");
-
action_group = memo_shell_view->priv->memo_actions;
gtk_action_group_set_translation_domain (action_group, domain);
gtk_action_group_add_actions (
@@ -470,6 +581,11 @@ e_memo_shell_view_actions_init (EMemoShellView *memo_shell_view)
gtk_action_group_add_toggle_actions (
action_group, memo_toggle_entries,
G_N_ELEMENTS (memo_toggle_entries), memo_shell_view);
+ gtk_action_group_add_radio_actions (
+ action_group, memo_search_entries,
+ G_N_ELEMENTS (memo_search_entries),
+ MEMO_SEARCH_SUMMARY_CONTAINS,
+ NULL, NULL);
gtk_ui_manager_insert_action_group (manager, action_group, 0);
/* Bind GObject properties to GConf keys. */
@@ -479,58 +595,9 @@ e_memo_shell_view_actions_init (EMemoShellView *memo_shell_view)
object = G_OBJECT (ACTION (MEMO_PREVIEW));
key = "/apps/evolution/calendar/display/show_memo_preview";
gconf_bridge_bind_property (bridge, key, object, "active");
-}
-
-void
-e_memo_shell_view_actions_update (EMemoShellView *memo_shell_view)
-{
- EMemoShellContent *memo_shell_content;
- ECal *client;
- ETable *table;
- ECalModel *model;
- EMemoTable *memo_table;
- EShellView *shell_view;
- EShellWindow *shell_window;
- GtkAction *action;
- const gchar *label;
- gboolean read_only = TRUE;
- gboolean sensitive;
- gint n_selected;
-
- shell_view = E_SHELL_VIEW (memo_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- memo_shell_content = memo_shell_view->priv->memo_shell_content;
- memo_table = e_memo_shell_content_get_memo_table (memo_shell_content);
-
- model = e_memo_table_get_model (memo_table);
- client = e_cal_model_get_default_client (model);
-
- table = e_memo_table_get_table (memo_table);
- n_selected = e_table_selected_count (table);
-
- if (client != NULL)
- e_cal_is_read_only (client, &read_only, NULL);
-
- action = ACTION (MEMO_OPEN);
- sensitive = (n_selected == 1);
- gtk_action_set_sensitive (action, sensitive);
-
- action = ACTION (MEMO_CLIPBOARD_COPY);
- sensitive = (n_selected > 0);
- gtk_action_set_sensitive (action, sensitive);
-
- action = ACTION (MEMO_CLIPBOARD_CUT);
- sensitive = (n_selected > 0);
- gtk_action_set_sensitive (action, sensitive);
- action = ACTION (MEMO_CLIPBOARD_PASTE);
- sensitive = !read_only;
- gtk_action_set_sensitive (action, sensitive);
+ /* Fine tuning. */
action = ACTION (MEMO_DELETE);
- sensitive = (n_selected > 0) && !read_only;
- gtk_action_set_sensitive (action, sensitive);
- label = ngettext ("Delete Memo", "Delete Memos", n_selected);
- g_object_set (action, "label", label, NULL);
+ g_object_set (action, "short-label", _("Delete"), NULL);
}
diff --git a/calendar/modules/e-memo-shell-view-private.c b/calendar/modules/e-memo-shell-view-private.c
index 076ed3fc5d..8d8a8e110d 100644
--- a/calendar/modules/e-memo-shell-view-private.c
+++ b/calendar/modules/e-memo-shell-view-private.c
@@ -20,174 +20,78 @@
#include "e-memo-shell-view-private.h"
-#include <widgets/menus/gal-view-factory-etable.h>
+#include "widgets/menus/gal-view-factory-etable.h"
static void
-memo_shell_view_backend_died_cb (EMemoShellView *memo_shell_view,
- ECal *client)
+memo_shell_view_table_popup_event_cb (EShellView *shell_view,
+ GdkEventButton *event)
{
- EShellView *shell_view;
- EShellWindow *shell_window;
- GHashTable *client_table;
- ESource *source;
- const gchar *uid;
-
- shell_view = E_SHELL_VIEW (memo_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- source = e_cal_get_source (client);
- uid = e_source_peek_uid (source);
-
- g_object_ref (source);
-
- g_hash_table_remove (client_table, uid);
- e_memo_shell_view_set_status_message (memo_shell_view, NULL);
-
- e_error_run (
- GTK_WINDOW (shell_window),
- "calendar:memos-crashed", NULL);
+ const gchar *widget_path;
- g_object_unref (source);
+ widget_path = "/memo-popup";
+ e_shell_view_show_popup_menu (shell_view, widget_path, event);
}
static void
-memo_shell_view_backend_error_cb (EMemoShellView *memo_shell_view,
- const gchar *message,
- ECal *client)
+memo_shell_view_table_user_created_cb (EMemoShellView *memo_shell_view,
+ EMemoTable *memo_table)
{
- EShellView *shell_view;
- EShellWindow *shell_window;
- GtkWidget *dialog;
- const gchar *uri;
- gchar *uri_no_passwd;
-
- shell_view = E_SHELL_VIEW (memo_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
-
- uri = e_cal_get_uri (client);
- uri_no_passwd = get_uri_without_password (uri);
+ EMemoShellSidebar *memo_shell_sidebar;
+ ECalModel *model;
+ ECal *client;
+ ESource *source;
- dialog = gtk_message_dialog_new (
- GTK_WINDOW (shell_window),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
- _("Error on %s:\n%s"),
- uri_no_passwd, message);
+ /* This is the "Click to Add" handler. */
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
+ model = e_memo_table_get_model (memo_table);
+ client = e_cal_model_get_default_client (model);
+ source = e_cal_get_source (client);
- g_free (uri_no_passwd);
+ memo_shell_sidebar = memo_shell_view->priv->memo_shell_sidebar;
+ e_memo_shell_sidebar_add_source (memo_shell_sidebar, source);
}
static void
-memo_shell_view_client_opened_cb (EMemoShellView *memo_shell_view,
- ECalendarStatus status,
- ECal *client)
+memo_shell_view_selector_client_added_cb (EMemoShellView *memo_shell_view,
+ ECal *client)
{
- /* FIXME */
-}
-
-static gboolean
-memo_shell_view_add_source (EMemoShellView *memo_shell_view,
- ESource *source)
-{
- GHashTable *client_table;
- ECal *default_client;
- ECal *client;
- const gchar *uid;
- const gchar *uri;
- gchar *status_message;
-
- client_table = memo_shell_view->priv->client_table;
- default_client = memo_shell_view->priv->default_client;
-
- uid = e_source_peek_uid (source);
- client = g_hash_table_lookup (client_table, uid);
-
- if (client != NULL)
- return TRUE;
-
- if (default_client != NULL) {
- ESource *default_source;
- const gchar *default_uid;
-
- default_source = e_cal_get_source (default_client);
- default_uid = e_source_peek_uid (default_source);
-
- if (strcmp (uid, default_uid) == 0)
- client = g_object_ref (default_client);
- }
-
- if (client == NULL)
- client = auth_new_cal_from_source (
- source, E_CAL_SOURCE_TYPE_JOURNAL);
-
- if (client == NULL)
- return FALSE;
-
- g_signal_connect_swapped (
- client, "backend-died",
- G_CALLBACK (memo_shell_view_backend_died_cb),
- memo_shell_view);
-
- g_signal_connect_swapped (
- client, "backend-error",
- G_CALLBACK (memo_shell_view_backend_error_cb),
- memo_shell_view);
-
- g_hash_table_insert (client_table, g_strdup (uid), client);
-
- uri = e_cal_get_uri (client);
-
- status_message = g_strdup_printf (_("Opening memos at %s"), uri);
- e_memo_shell_view_set_status_message (memo_shell_view, status_message);
- g_free (status_message);
-
- g_signal_connect_swapped (
- client, "cal-opened",
- G_CALLBACK (memo_shell_view_client_opened_cb),
- memo_shell_view);
+ EMemoShellContent *memo_shell_content;
+ EMemoTable *memo_table;
+ ECalModel *model;
- e_cal_open_async (client, FALSE);
+ memo_shell_content = memo_shell_view->priv->memo_shell_content;
+ memo_table = e_memo_shell_content_get_memo_table (memo_shell_content);
+ model = e_memo_table_get_model (memo_table);
- return TRUE;
+ e_cal_model_add_client (model, client);
}
static void
-memo_shell_view_table_popup_event_cb (EMemoShellView *memo_shell_view,
- GdkEvent *event)
+memo_shell_view_selector_client_removed_cb (EMemoShellView *memo_shell_view,
+ ECal *client)
{
- EShellView *shell_view;
- EShellWindow *shell_window;
- const gchar *widget_path;
+ EMemoShellContent *memo_shell_content;
+ EMemoTable *memo_table;
+ ECalModel *model;
- shell_view = E_SHELL_VIEW (memo_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
- widget_path = "/memo-popup";
+ memo_shell_content = memo_shell_view->priv->memo_shell_content;
+ memo_table = e_memo_shell_content_get_memo_table (memo_shell_content);
+ model = e_memo_table_get_model (memo_table);
- e_memo_shell_view_actions_update (memo_shell_view);
- e_shell_window_show_popup_menu (shell_window, widget_path, event);
+ e_cal_model_remove_client (model, client);
}
-static void
-memo_shell_view_table_user_created_cb (EMemoShellView *memo_shell_view,
- EMemoTable *memo_table)
+static gboolean
+memo_shell_view_selector_popup_event_cb (EShellView *shell_view,
+ ESource *primary_source,
+ GdkEventButton *event)
{
- ECal *client;
- ESource *source;
-
- if (memo_table->user_created_cal != NULL)
- client = memo_table->user_created_cal;
- else {
- ECalModel *model;
+ const gchar *widget_path;
- model = e_memo_table_get_model (memo_table);
- client = e_cal_model_get_default_client (model);
- }
+ widget_path = "/memo-list-popup";
+ e_shell_view_show_popup_menu (shell_view, widget_path, event);
- source = e_cal_get_source (client);
- memo_shell_view_add_source (memo_shell_view, source);
+ return TRUE;
}
static void
@@ -246,21 +150,14 @@ e_memo_shell_view_private_init (EMemoShellView *memo_shell_view,
{
EMemoShellViewPrivate *priv = memo_shell_view->priv;
ESourceList *source_list;
- GHashTable *client_table;
GObject *object;
object = G_OBJECT (shell_view_class->type_module);
source_list = g_object_get_data (object, "source-list");
g_return_if_fail (E_IS_SOURCE_LIST (source_list));
- client_table = g_hash_table_new_full (
- g_str_hash, g_str_equal,
- (GDestroyNotify) g_free,
- (GDestroyNotify) g_object_unref);
-
priv->source_list = g_object_ref (source_list);
priv->memo_actions = gtk_action_group_new ("memos");
- priv->client_table = client_table;
if (!gal_view_collection_loaded (shell_view_class->view_collection))
memo_shell_view_load_view_collection (shell_view_class);
@@ -274,10 +171,15 @@ void
e_memo_shell_view_private_constructed (EMemoShellView *memo_shell_view)
{
EMemoShellViewPrivate *priv = memo_shell_view->priv;
+ EMemoShellContent *memo_shell_content;
+ EMemoShellSidebar *memo_shell_sidebar;
EShellContent *shell_content;
EShellSidebar *shell_sidebar;
EShellView *shell_view;
EMemoTable *memo_table;
+ ECalModel *model;
+ ETable *table;
+ ESourceSelector *selector;
shell_view = E_SHELL_VIEW (memo_shell_view);
shell_content = e_shell_view_get_shell_content (shell_view);
@@ -287,8 +189,18 @@ e_memo_shell_view_private_constructed (EMemoShellView *memo_shell_view)
priv->memo_shell_content = g_object_ref (shell_content);
priv->memo_shell_sidebar = g_object_ref (shell_sidebar);
- memo_table = e_memo_shell_content_get_memo_table (
- priv->memo_shell_content);
+ memo_shell_content = E_MEMO_SHELL_CONTENT (shell_content);
+ memo_table = e_memo_shell_content_get_memo_table (memo_shell_content);
+ model = e_memo_table_get_model (memo_table);
+ table = e_memo_table_get_table (memo_table);
+
+ memo_shell_sidebar = E_MEMO_SHELL_SIDEBAR (shell_sidebar);
+ selector = e_memo_shell_sidebar_get_selector (memo_shell_sidebar);
+
+ g_signal_connect_swapped (
+ shell_sidebar, "status-message",
+ G_CALLBACK (e_memo_shell_view_set_status_message),
+ memo_shell_view);
g_signal_connect_swapped (
memo_table, "open-component",
@@ -310,7 +222,48 @@ e_memo_shell_view_private_constructed (EMemoShellView *memo_shell_view)
G_CALLBACK (memo_shell_view_table_user_created_cb),
memo_shell_view);
- e_memo_shell_view_actions_update (memo_shell_view);
+ g_signal_connect_swapped (
+ model, "model-changed",
+ G_CALLBACK (e_memo_shell_view_sidebar_update),
+ memo_shell_view);
+
+ g_signal_connect_swapped (
+ model, "model-rows-deleted",
+ G_CALLBACK (e_memo_shell_view_sidebar_update),
+ memo_shell_view);
+
+ g_signal_connect_swapped (
+ model, "model-rows-inserted",
+ G_CALLBACK (e_memo_shell_view_sidebar_update),
+ memo_shell_view);
+
+ g_signal_connect_swapped (
+ table, "selection-change",
+ G_CALLBACK (e_memo_shell_view_sidebar_update),
+ memo_shell_view);
+
+ g_signal_connect_swapped (
+ shell_sidebar, "client-added",
+ G_CALLBACK (memo_shell_view_selector_client_added_cb),
+ memo_shell_view);
+
+ g_signal_connect_swapped (
+ shell_sidebar, "client-removed",
+ G_CALLBACK (memo_shell_view_selector_client_removed_cb),
+ memo_shell_view);
+
+ g_signal_connect_swapped (
+ selector, "popup-event",
+ G_CALLBACK (memo_shell_view_selector_popup_event_cb),
+ memo_shell_view);
+
+ g_signal_connect_swapped (
+ selector, "primary-selection-changed",
+ G_CALLBACK (e_shell_view_update_actions),
+ memo_shell_view);
+
+ e_memo_shell_view_actions_init (memo_shell_view);
+ e_memo_shell_view_sidebar_update (memo_shell_view);
}
void
@@ -325,9 +278,6 @@ e_memo_shell_view_private_dispose (EMemoShellView *memo_shell_view)
DISPOSE (priv->memo_shell_content);
DISPOSE (priv->memo_shell_sidebar);
- g_hash_table_remove_all (priv->client_table);
- DISPOSE (priv->default_client);
-
if (memo_shell_view->priv->activity != NULL) {
/* XXX Activity is not cancellable. */
e_activity_complete (memo_shell_view->priv->activity);
@@ -339,9 +289,7 @@ e_memo_shell_view_private_dispose (EMemoShellView *memo_shell_view)
void
e_memo_shell_view_private_finalize (EMemoShellView *memo_shell_view)
{
- EMemoShellViewPrivate *priv = memo_shell_view->priv;
-
- g_hash_table_destroy (priv->client_table);
+ /* XXX Nothing to do? */
}
void
@@ -410,3 +358,45 @@ e_memo_shell_view_set_status_message (EMemoShellView *memo_shell_view,
memo_shell_view->priv->activity = activity;
}
+
+void
+e_memo_shell_view_sidebar_update (EMemoShellView *memo_shell_view)
+{
+ EMemoShellContent *memo_shell_content;
+ EShellView *shell_view;
+ EShellSidebar *shell_sidebar;
+ EMemoTable *memo_table;
+ ECalModel *model;
+ ETable *table;
+ GString *string;
+ const gchar *format;
+ gint n_rows;
+ gint n_selected;
+
+ shell_view = E_SHELL_VIEW (memo_shell_view);
+ shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
+
+ memo_shell_content = memo_shell_view->priv->memo_shell_content;
+ memo_table = e_memo_shell_content_get_memo_table (memo_shell_content);
+
+ model = e_memo_table_get_model (memo_table);
+ table = e_memo_table_get_table (memo_table);
+
+ n_rows = e_table_model_row_count (E_TABLE_MODEL (model));
+ n_selected = e_table_selected_count (table);
+
+ string = g_string_sized_new (64);
+
+ format = ngettext ("%d memo", "%d memos", n_rows);
+ g_string_append_printf (string, format, n_rows);
+
+ if (n_selected > 0) {
+ format = _("%d selected");
+ g_string_append_len (string, ", ", 2);
+ g_string_append_printf (string, format, n_selected);
+ }
+
+ e_shell_sidebar_set_secondary_text (shell_sidebar, string->str);
+
+ g_string_free (string, TRUE);
+}
diff --git a/calendar/modules/e-memo-shell-view-private.h b/calendar/modules/e-memo-shell-view-private.h
index 7d8958eae7..fd30a14898 100644
--- a/calendar/modules/e-memo-shell-view-private.h
+++ b/calendar/modules/e-memo-shell-view-private.h
@@ -29,12 +29,13 @@
#include "e-util/e-dialog-utils.h"
#include "e-util/e-error.h"
#include "e-util/e-util.h"
+#include "e-util/gconf-bridge.h"
-#include "calendar/common/authentication.h"
-#include "calendar/gui/misc.h"
#include "calendar/gui/e-calendar-selector.h"
#include "calendar/gui/e-memo-preview.h"
+#include "calendar/gui/print.h"
#include "calendar/gui/dialogs/calendar-setup.h"
+#include "calendar/gui/dialogs/copy-source-dialog.h"
#include "calendar/gui/dialogs/memo-editor.h"
#include "e-memo-shell-content.h"
@@ -62,6 +63,13 @@
G_BEGIN_DECLS
+/* List these in the order to be displayed. */
+enum {
+ MEMO_SEARCH_SUMMARY_CONTAINS,
+ MEMO_SEARCH_DESCRIPTION_CONTAINS,
+ MEMO_SEARCH_ANY_FIELD_CONTAINS
+};
+
struct _EMemoShellViewPrivate {
/*** Module Data ***/
@@ -78,10 +86,6 @@ struct _EMemoShellViewPrivate {
EMemoShellContent *memo_shell_content;
EMemoShellSidebar *memo_shell_sidebar;
- /* UID -> Client */
- GHashTable *client_table;
- ECal *default_client;
-
EActivity *activity;
};
@@ -99,14 +103,14 @@ void e_memo_shell_view_private_finalize
void e_memo_shell_view_actions_init
(EMemoShellView *memo_shell_view);
-void e_memo_shell_view_actions_update
- (EMemoShellView *memo_shell_view);
void e_memo_shell_view_open_memo
(EMemoShellView *memo_shell_view,
ECalModelComponent *comp_data);
void e_memo_shell_view_set_status_message
(EMemoShellView *memo_shell_view,
const gchar *status_message);
+void e_memo_shell_view_sidebar_update
+ (EMemoShellView *memo_shell_view);
G_END_DECLS
diff --git a/calendar/modules/e-memo-shell-view.c b/calendar/modules/e-memo-shell-view.c
index f50c877c9a..806389a96f 100644
--- a/calendar/modules/e-memo-shell-view.c
+++ b/calendar/modules/e-memo-shell-view.c
@@ -73,17 +73,58 @@ memo_shell_view_constructed (GObject *object)
}
static void
-memo_shell_view_changed (EShellView *shell_view)
+memo_shell_view_update_actions (EShellView *shell_view)
{
EMemoShellViewPrivate *priv;
- GtkActionGroup *action_group;
- gboolean visible;
+ EMemoShellContent *memo_shell_content;
+ EShellWindow *shell_window;
+ ECal *client;
+ ETable *table;
+ ECalModel *model;
+ EMemoTable *memo_table;
+ GtkAction *action;
+ const gchar *label;
+ gboolean read_only = TRUE;
+ gboolean sensitive;
+ gint n_selected;
priv = E_MEMO_SHELL_VIEW_GET_PRIVATE (shell_view);
- action_group = priv->memo_actions;
- visible = e_shell_view_is_active (shell_view);
- gtk_action_group_set_visible (action_group, visible);
+ shell_window = e_shell_view_get_shell_window (shell_view);
+
+ memo_shell_content = priv->memo_shell_content;
+ memo_table = e_memo_shell_content_get_memo_table (memo_shell_content);
+
+ model = e_memo_table_get_model (memo_table);
+ client = e_cal_model_get_default_client (model);
+
+ table = e_memo_table_get_table (memo_table);
+ n_selected = e_table_selected_count (table);
+
+ if (client != NULL)
+ e_cal_is_read_only (client, &read_only, NULL);
+
+ action = ACTION (MEMO_OPEN);
+ sensitive = (n_selected == 1);
+ gtk_action_set_sensitive (action, sensitive);
+
+ action = ACTION (MEMO_CLIPBOARD_COPY);
+ sensitive = (n_selected > 0);
+ gtk_action_set_sensitive (action, sensitive);
+
+ action = ACTION (MEMO_CLIPBOARD_CUT);
+ sensitive = (n_selected > 0);
+ gtk_action_set_sensitive (action, sensitive);
+
+ action = ACTION (MEMO_CLIPBOARD_PASTE);
+ sensitive = !read_only;
+ gtk_action_set_sensitive (action, sensitive);
+
+ action = ACTION (MEMO_DELETE);
+ sensitive = (n_selected > 0) && !read_only;
+ gtk_action_set_sensitive (action, sensitive);
+ label = ngettext ("Delete Memo", "Delete Memos", n_selected);
+ g_object_set (action, "label", label, NULL);
}
static void
@@ -105,11 +146,12 @@ memo_shell_view_class_init (EMemoShellView *class,
shell_view_class = E_SHELL_VIEW_CLASS (class);
shell_view_class->label = N_("Memos");
shell_view_class->icon_name = "evolution-memos";
+ shell_view_class->ui_definition = "evolution-memos.ui";
shell_view_class->search_options = "/memo-search-options";
shell_view_class->type_module = type_module;
shell_view_class->new_shell_content = e_memo_shell_content_new;
shell_view_class->new_shell_sidebar = e_memo_shell_sidebar_new;
- shell_view_class->changed = memo_shell_view_changed;
+ shell_view_class->update_actions = memo_shell_view_update_actions;
g_object_class_install_property (
object_class,
diff --git a/calendar/modules/e-task-shell-content.c b/calendar/modules/e-task-shell-content.c
index 8f7e45f175..299994af6d 100644
--- a/calendar/modules/e-task-shell-content.c
+++ b/calendar/modules/e-task-shell-content.c
@@ -90,15 +90,13 @@ task_shell_content_display_view_cb (ETaskShellContent *task_shell_content,
GalView *gal_view)
{
ECalendarTable *task_table;
- ETableScrolled *table_scrolled;
ETable *table;
if (!GAL_IS_VIEW_ETABLE (gal_view))
return;
task_table = E_CALENDAR_TABLE (task_shell_content->priv->task_table);
- table_scrolled = E_TABLE_SCROLLED (task_table->etable);
- table = e_table_scrolled_get_table (table_scrolled);
+ table = e_task_table_get_table (task_table);
gal_view_etable_attach_table (GAL_VIEW_ETABLE (gal_view), table);
}
@@ -184,7 +182,6 @@ task_shell_content_model_row_changed_cb (ETaskShellContent *task_shell_content,
{
ECalModelComponent *comp_data;
ETaskTable *task_table;
- ETableScrolled *table_scrolled;
ETable *table;
const gchar *current_uid;
const gchar *uid;
@@ -202,8 +199,7 @@ task_shell_content_model_row_changed_cb (ETaskShellContent *task_shell_content,
return;
task_table = E_TASK_TABLE (task_shell_content->priv->task_table);
- table_scrolled = E_TABLE_SCROLLED (task_table->etable);
- table = e_table_scrolled_get_table (table_scrolled);
+ table = e_task_table_get_table (task_table);
task_shell_content_cursor_change_cb (task_shell_content, 0, table);
}
@@ -317,20 +313,6 @@ task_shell_content_constructed (GObject *object)
shell_view_class = E_SHELL_VIEW_GET_CLASS (shell_view);
view_collection = shell_view_class->view_collection;
- /* Load the view instance. */
-
- view_instance = gal_view_instance_new (view_collection, NULL);
- g_signal_connect_swapped (
- view_instance, "changed",
- G_CALLBACK (task_shell_content_changed_cb),
- object);
- g_signal_connect_swapped (
- view_instance, "display-view",
- G_CALLBACK (task_shell_content_display_view_cb),
- object);
- gal_view_instance_load (view_instance);
- priv->view_instance = view_instance;
-
/* Build content widgets. */
container = GTK_WIDGET (object);
@@ -406,6 +388,20 @@ task_shell_content_constructed (GObject *object)
G_CALLBACK (task_shell_content_model_row_changed_cb),
object);
+ /* Load the view instance. */
+
+ view_instance = gal_view_instance_new (view_collection, NULL);
+ g_signal_connect_swapped (
+ view_instance, "changed",
+ G_CALLBACK (task_shell_content_changed_cb),
+ object);
+ g_signal_connect_swapped (
+ view_instance, "display-view",
+ G_CALLBACK (task_shell_content_display_view_cb),
+ object);
+ gal_view_instance_load (view_instance);
+ priv->view_instance = view_instance;
+
/* Bind GObject properties to GConf keys. */
bridge = gconf_bridge_get ();
diff --git a/calendar/modules/e-task-shell-sidebar.c b/calendar/modules/e-task-shell-sidebar.c
index b3d0c487bc..77cca13288 100644
--- a/calendar/modules/e-task-shell-sidebar.c
+++ b/calendar/modules/e-task-shell-sidebar.c
@@ -41,46 +41,6 @@ enum {
static gpointer parent_class;
-#if 0 /* MOVE THIS TO ETaskShellView */
-static void
-task_shell_sidebar_update (EShellSidebar *shell_sidebar)
-{
- EShellView *shell_view;
- ETasks *tasks;
- ETable *table;
- ECalModel *model;
- ECalendarTable *cal_table;
- GString *string;
- const gchar *format;
- gint n_rows;
- gint n_selected;
-
- shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
- tasks = e_task_shell_view_get_tasks (E_TASK_SHELL_VIEW (shell_view));
- cal_table = e_tasks_get_calendar_table (tasks);
- model = e_calendar_table_get_model (cal_table);
- table = e_calendar_table_get_table (cal_table);
-
- n_rows = e_table_model_get_row_count (model);
- n_selected = e_table_selected_count (table);
-
- string = g_string_sized_new (64);
-
- format = ngettext ("%d task", "%d tasks", n_rows);
- g_string_append_printf (string, format, n_rows);
-
- if (n_selected > 0) {
- format = _("%d selected");
- g_string_append_len (string, ", ", 2);
- g_string_append_printf (string, format, n_selected);
- }
-
- e_shell_sidebar_set_secondary_text (shell_sidebar, string->str);
-
- g_string_free (string, TRUE);
-}
-#endif
-
static void
task_shell_sidebar_get_property (GObject *object,
guint property_id,
@@ -127,6 +87,9 @@ task_shell_sidebar_constructed (GObject *object)
priv = E_TASK_SHELL_SIDEBAR_GET_PRIVATE (object);
+ /* Chain up to parent's constructed() method. */
+ G_OBJECT_CLASS (parent_class)->constructed (object);
+
shell_sidebar = E_SHELL_SIDEBAR (object);
shell_view = e_shell_sidebar_get_shell_view (shell_sidebar);
task_shell_view = E_TASK_SHELL_VIEW (shell_view);
@@ -150,39 +113,6 @@ task_shell_sidebar_constructed (GObject *object)
gtk_container_add (container, widget);
priv->selector = g_object_ref (widget);
gtk_widget_show (widget);
-
-#if 0 /* MOVE THIS TO ETaskShellView */
-
- /* Setup signal handlers. */
-
- tasks = e_task_shell_view_get_tasks (task_shell_view);
- cal_table = e_tasks_get_calendar_table (tasks);
- model = e_calendar_table_get_model (cal_table);
- table = e_calendar_table_get_table (cal_table);
-
- g_signal_connect_swapped (
- model, "model-changed",
- G_CALLBACK (task_shell_sidebar_update),
- shell_sidebar);
-
- g_signal_connect_swapped (
- model, "model-rows-deleted",
- G_CALLBACK (task_shell_sidebar_update),
- shell_sidebar);
-
- g_signal_connect_swapped (
- model, "model-rows-inserted",
- G_CALLBACK (task_shell_sidebar_update),
- shell_sidebar);
-
- g_signal_connect_swapped (
- model, "selection-change",
- G_CALLBACK (task_shell_sidebar_update),
- shell_sidebar);
-
- task_shell_sidebar_update (shell_sidebar);
-
-#endif
}
static void
@@ -255,11 +185,11 @@ e_task_shell_sidebar_new (EShellView *shell_view)
"shell-view", shell_view, NULL);
}
-GtkWidget *
+ESourceSelector *
e_task_shell_sidebar_get_selector (ETaskShellSidebar *task_shell_sidebar)
{
g_return_val_if_fail (
E_IS_TASK_SHELL_SIDEBAR (task_shell_sidebar), NULL);
- return task_shell_sidebar->priv->selector;
+ return E_SOURCE_SELECTOR (task_shell_sidebar->priv->selector);
}
diff --git a/calendar/modules/e-task-shell-sidebar.h b/calendar/modules/e-task-shell-sidebar.h
index 2d992dbc82..411b8588c2 100644
--- a/calendar/modules/e-task-shell-sidebar.h
+++ b/calendar/modules/e-task-shell-sidebar.h
@@ -21,6 +21,8 @@
#ifndef E_TASK_SHELL_SIDEBAR_H
#define E_TASK_SHELL_SIDEBAR_H
+#include <libedataserverui/e-source-selector.h>
+
#include <shell/e-shell-sidebar.h>
#include <shell/e-shell-view.h>
@@ -60,7 +62,8 @@ struct _ETaskShellSidebarClass {
GType e_task_shell_sidebar_get_type (void);
GtkWidget * e_task_shell_sidebar_new (EShellView *shell_view);
-GtkWidget * e_task_shell_sidebar_get_selector
+ESourceSelector *
+ e_task_shell_sidebar_get_selector
(ETaskShellSidebar *task_shell_sidebar);
G_END_DECLS
diff --git a/calendar/modules/e-task-shell-view-actions.c b/calendar/modules/e-task-shell-view-actions.c
index 2668522aee..a29944280f 100644
--- a/calendar/modules/e-task-shell-view-actions.c
+++ b/calendar/modules/e-task-shell-view-actions.c
@@ -24,6 +24,23 @@ static void
action_task_assign_cb (GtkAction *action,
ETaskShellView *task_shell_view)
{
+ ETaskShellContent *task_shell_content;
+ ETaskTable *task_table;
+ ECalModelComponent *comp_data;
+ GSList *list;
+
+ task_shell_content = task_shell_view->priv->task_shell_content;
+ task_table = e_task_shell_content_get_task_table (task_shell_content);
+
+ list = e_task_table_get_selected (task_table);
+ g_return_if_fail (list != NULL);
+ comp_data = list->data;
+ g_slist_free (list);
+
+ /* XXX We only open the first selected task. */
+ e_task_shell_view_open_task (task_shell_view, comp_data);
+
+ /* FIXME Need to actually assign the task. */
}
static void
@@ -87,6 +104,29 @@ static void
action_task_forward_cb (GtkAction *action,
ETaskShellView *task_shell_view)
{
+ ETaskShellContent *task_shell_content;
+ ETaskTable *task_table;
+ ECalModelComponent *comp_data;
+ ECalComponent *comp;
+ icalcomponent *clone;
+ ECalComponentItipMethod method;
+ GSList *list;
+
+ task_shell_content = task_shell_view->priv->task_shell_content;
+ task_table = e_task_shell_content_get_task_table (task_shell_content);
+
+ list = e_task_table_get_selected (task_table);
+ g_return_if_fail (list != NULL);
+ comp_data = list->data;
+ g_slist_free (list);
+
+ /* XXX We only forward the first selected task. */
+ comp = e_cal_component_new ();
+ clone = icalcomponent_new_clone (comp_data->icalcomp);
+ method = E_CAL_COMPONENT_METHOD_PUBLISH;
+ e_cal_component_set_icalcomponent (comp, clone);
+ itip_send_comp (method, comp, comp_data->client, NULL, NULL, NULL);
+ g_object_unref (comp);
}
static void
@@ -110,6 +150,40 @@ action_task_list_new_cb (GtkAction *action,
}
static void
+action_task_list_print_cb (GtkAction *action,
+ ETaskShellView *task_shell_view)
+{
+ ETaskShellContent *task_shell_content;
+ ETaskTable *task_table;
+ ETable *table;
+
+ task_shell_content = task_shell_view->priv->task_shell_content;
+ task_table = e_task_shell_content_get_task_table (task_shell_content);
+ table = e_task_table_get_table (task_table);
+
+ print_table (
+ table, _("Print Tasks"), _("Tasks"),
+ GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
+}
+
+static void
+action_task_list_print_preview_cb (GtkAction *action,
+ ETaskShellView *task_shell_view)
+{
+ ETaskShellContent *task_shell_content;
+ ETaskTable *task_table;
+ ETable *table;
+
+ task_shell_content = task_shell_view->priv->task_shell_content;
+ task_table = e_task_shell_content_get_task_table (task_shell_content);
+ table = e_task_table_get_table (task_table);
+
+ print_table (
+ table, _("Print Tasks"), _("Tasks"),
+ GTK_PRINT_OPERATION_ACTION_PREVIEW);
+}
+
+static void
action_task_list_properties_cb (GtkAction *action,
ETaskShellView *task_shell_view)
{
@@ -119,6 +193,50 @@ static void
action_task_mark_complete_cb (GtkAction *action,
ETaskShellView *task_shell_view)
{
+ ETaskShellContent *task_shell_content;
+ ETaskTable *task_table;
+ ECalModel *model;
+ GSList *list, *iter;
+
+ task_shell_content = task_shell_view->priv->task_shell_content;
+ task_table = e_task_shell_content_get_task_table (task_shell_content);
+ list = e_task_table_get_selected (task_table);
+ model = e_task_table_get_model (task_table);
+
+ for (iter = list; iter != NULL; iter = iter->next) {
+ ECalModelComponent *comp_data = iter->data;
+ e_cal_model_tasks_mark_comp_complete (model, comp_data);
+ }
+
+ g_slist_free (list);
+}
+
+static void
+action_task_mark_incomplete_cb (GtkAction *action,
+ ETaskShellView *task_shell_view)
+{
+ ETaskShellContent *task_shell_content;
+ ETaskTable *task_table;
+ ECalModel *model;
+ GSList *list, *iter;
+
+ task_shell_content = task_shell_view->priv->task_shell_content;
+ task_table = e_task_shell_content_get_task_table (task_shell_content);
+ list = e_task_table_get_selected (task_table);
+ model = e_task_table_get_model (task_table);
+
+ for (iter = list; iter != NULL; iter = iter->next) {
+ ECalModelComponent *comp_data = iter->data;
+ e_cal_model_tasks_mark_comp_incomplete (model, comp_data);
+ }
+
+ g_slist_free (list);
+}
+
+static void
+action_task_new_cb (GtkAction *action,
+ ETaskShellView *task_shell_view)
+{
}
static void
@@ -130,10 +248,46 @@ action_task_open_cb (GtkAction *action,
task_shell_content = task_shell_view->priv->task_shell_content;
task_table = e_task_shell_content_get_task_table (task_shell_content);
+
e_task_table_open_selected (task_table);
}
static void
+action_task_open_url_cb (GtkAction *action,
+ ETaskShellView *task_shell_view)
+{
+ ETaskShellContent *task_shell_content;
+ ETaskTable *task_table;
+ ECalModelComponent *comp_data;
+ icalproperty *prop;
+ GdkScreen *screen;
+ const gchar *uri;
+ GSList *list;
+ GError *error = NULL;
+
+ task_shell_content = task_shell_view->priv->task_shell_content;
+ task_table = e_task_shell_content_get_task_table (task_shell_content);
+
+ list = e_task_table_get_selected (task_table);
+ g_return_if_fail (list != NULL);
+ comp_data = list->data;
+
+ /* XXX We only open the URI of the first selected task. */
+ prop = icalcomponent_get_first_property (
+ comp_data->icalcomp, ICAL_URL_PROPERTY);
+ g_return_if_fail (prop == NULL);
+
+ screen = gtk_widget_get_screen (GTK_WIDGET (task_shell_view));
+ uri = icalproperty_get_url (prop);
+ gtk_show_uri (screen, uri, GDK_CURRENT_TIME, &error);
+
+ if (error != NULL) {
+ g_warning ("%s", error->message);
+ g_error_free (error);
+ }
+}
+
+static void
action_task_preview_cb (GtkToggleAction *action,
ETaskShellView *task_shell_view)
{
@@ -151,38 +305,69 @@ action_task_print_cb (GtkAction *action,
{
ETaskShellContent *task_shell_content;
ETaskTable *task_table;
- ETable *table;
+ ECalModelComponent *comp_data;
+ ECalComponent *comp;
+ icalcomponent *clone;
+ GtkPrintOperationAction print_action;
+ GSList *list;
task_shell_content = task_shell_view->priv->task_shell_content;
- task_table = e_task_shell_content_get_task_table (task_shell_content);
- table = e_task_table_get_table (task_table);
+ task_table = e_memo_shell_content_get_task_table (task_shell_content);
+
+ list = e_task_table_get_selected (task_table);
+ g_return_if_fail (list != NULL);
+ comp_data = list->data;
+ g_slist_free (list);
+
+ /* XXX We only print the first selected task. */
+ comp = e_cal_component_new ();
+ clone = icalcomponent_new_clone (comp_data->icalcomp);
+ print_action = GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG;
+ e_cal_component_set_icalcomponent (comp, clone);
+ print_comp (comp, comp_data->client, print_action);
+ g_object_unref (comp);
+}
- print_table (
- table, _("Print Tasks"), _("Tasks"),
- GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
+static void
+action_task_purge_cb (GtkAction *action,
+ ETaskShellView *task_shell_view)
+{
}
static void
-action_task_print_preview_cb (GtkAction *action,
- ETaskShellView *task_shell_view)
+action_task_save_as_cb (GtkAction *action,
+ ETaskShellView *task_shell_view)
{
ETaskShellContent *task_shell_content;
ETaskTable *task_table;
- ETable *table;
+ ECalModelComponent *comp_data;
+ GSList *list;
+ gchar *filename;
+ gchar *string;
task_shell_content = task_shell_view->priv->task_shell_content;
task_table = e_task_shell_content_get_task_table (task_shell_content);
- table = e_task_table_get_table (task_table);
- print_table (
- table, _("Print Tasks"), _("Tasks"),
- GTK_PRINT_OPERATION_ACTION_PREVIEW);
-}
+ list = e_task_table_get_selected (task_table);
+ g_return_if_fail (list != NULL);
+ comp_data = list->data;
+ g_slist_free (list);
-static void
-action_task_purge_cb (GtkAction *action,
- ETaskShellView *task_shell_view)
-{
+ filename = e_file_dialog_save (_("Save as..."), NULL);
+ if (filename == NULL)
+ return;
+
+ string = e_cal_component_as_string (
+ comp_data->client, comp_data->icalcomp);
+ if (string == NULL) {
+ g_warning ("Could not convert task to a string");
+ return;
+ }
+
+ e_write_file_uri (filename, string);
+
+ g_free (filename);
+ g_free (string);
}
static GtkActionEntry task_entries[] = {
@@ -217,7 +402,7 @@ static GtkActionEntry task_entries[] = {
{ "task-delete",
GTK_STOCK_DELETE,
- NULL,
+ N_("Delete Task"),
NULL,
N_("Delete selected tasks"),
G_CALLBACK (action_task_delete_cb) },
@@ -250,6 +435,20 @@ static GtkActionEntry task_entries[] = {
N_("Create a new task list"),
G_CALLBACK (action_task_list_new_cb) },
+ { "task-list-print",
+ GTK_STOCK_PRINT,
+ NULL,
+ NULL,
+ N_("Print the list of tasks"),
+ G_CALLBACK (action_task_list_print_cb) },
+
+ { "task-list-print-preview",
+ GTK_STOCK_PRINT_PREVIEW,
+ NULL,
+ NULL,
+ N_("Preview the list of tasks to be printed"),
+ G_CALLBACK (action_task_list_print_preview_cb) },
+
{ "task-list-properties",
GTK_STOCK_PROPERTIES,
NULL,
@@ -259,38 +458,52 @@ static GtkActionEntry task_entries[] = {
{ "task-mark-complete",
NULL,
- N_("Mar_k as Complete"),
+ N_("_Mark as Complete"),
"<Control>k",
N_("Mark selected tasks as complete"),
G_CALLBACK (action_task_mark_complete_cb) },
- { "task-open",
+ { "task-new",
+ "stock_task",
+ N_("New _Task"),
NULL,
+ N_("Create a new task"),
+ G_CALLBACK (action_task_new_cb) },
+
+ { "task-open",
+ GTK_STOCK_OPEN,
N_("_Open Task"),
"<Control>o",
N_("View the selected task"),
G_CALLBACK (action_task_open_cb) },
+ { "task-open-url",
+ "applications-internet",
+ N_("Open _Web Page"),
+ NULL,
+ NULL, /* XXX Add a tooltip! */
+ G_CALLBACK (action_task_open_url_cb) },
+
{ "task-print",
GTK_STOCK_PRINT,
NULL,
NULL,
- N_("Print the list of tasks"),
+ N_("Print the selected task"),
G_CALLBACK (action_task_print_cb) },
- { "task-print-preview",
- GTK_STOCK_PRINT_PREVIEW,
- NULL,
- NULL,
- N_("Preview the list of tasks to be printed"),
- G_CALLBACK (action_task_print_preview_cb) },
-
{ "task-purge",
NULL,
N_("Purg_e"),
"<Control>e",
N_("Delete completed tasks"),
- G_CALLBACK (action_task_purge_cb) }
+ G_CALLBACK (action_task_purge_cb) },
+
+ { "task-save-as",
+ GTK_STOCK_SAVE_AS,
+ NULL,
+ NULL,
+ NULL, /* XXX Add a tooltip! */
+ G_CALLBACK (action_task_save_as_cb) }
};
static GtkToggleActionEntry task_toggle_entries[] = {
@@ -311,7 +524,11 @@ e_task_shell_view_actions_init (ETaskShellView *task_shell_view)
EShellWindow *shell_window;
GtkActionGroup *action_group;
GtkUIManager *manager;
+ GConfBridge *bridge;
+ GtkAction *action;
+ GObject *object;
const gchar *domain;
+ const gchar *key;
shell_view = E_SHELL_VIEW (task_shell_view);
shell_window = e_shell_view_get_shell_window (shell_view);
@@ -329,4 +546,71 @@ e_task_shell_view_actions_init (ETaskShellView *task_shell_view)
action_group, task_toggle_entries,
G_N_ELEMENTS (task_toggle_entries), task_shell_view);
gtk_ui_manager_insert_action_group (manager, action_group, 0);
+
+ /* Bind GObject properties to GConf keys. */
+
+ bridge = gconf_bridge_get ();
+
+ object = G_OBJECT (ACTION (TASK_PREVIEW));
+ key = "/apps/evolution/calendar/display/show_task_preview";
+ gconf_bridge_bind_property (bridge, key, object, "active");
+
+ /* Fine tuning. */
+
+ action = ACTION (TASK_DELETE);
+ g_object_set (action, "short-label", _("Delete"), NULL);
+}
+
+void
+e_task_shell_view_actions_update (ETaskShellView *task_shell_view)
+{
+ ETaskShellContent *task_shell_content;
+ ECal *client;
+ ETable *table;
+ ECalModel *model;
+ ETaskTable *task_table;
+ EShellView *shell_view;
+ EShellWindow *shell_window;
+ GtkAction *action;
+ const gchar *label;
+ gboolean read_only = TRUE;
+ gboolean sensitive;
+ gint n_selected;
+
+ shell_view = E_SHELL_VIEW (task_shell_view);
+ shell_window = e_shell_view_get_shell_window (shell_view);
+
+ task_shell_content = task_shell_view->priv->task_shell_content;
+ task_table = e_task_shell_content_get_task_table (task_shell_content);
+
+ model = e_task_table_get_model (task_table);
+ client = e_cal_model_get_default_client (model);
+
+ table = e_task_table_get_table (task_table);
+ n_selected = e_table_selected_count (table);
+
+ if (client != NULL)
+ e_cal_is_read_only (client, &read_only, NULL);
+
+ action = ACTION (TASK_OPEN);
+ sensitive = (n_selected == 1);
+ gtk_action_set_sensitive (action, sensitive);
+
+ action = ACTION (TASK_CLIPBOARD_COPY);
+ sensitive = (n_selected > 0);
+ gtk_action_set_sensitive (action, sensitive);
+
+ action = ACTION (TASK_CLIPBOARD_CUT);
+ sensitive = (n_selected > 0);
+ gtk_action_set_sensitive (action, sensitive);
+
+ action = ACTION (TASK_CLIPBOARD_PASTE);
+ sensitive = (n_selected > 0);
+ gtk_action_set_sensitive (action, sensitive);
+
+ action = ACTION (TASK_DELETE);
+ sensitive = (n_selected > 0) && !read_only;
+ gtk_action_set_sensitive (action, sensitive);
+ label = ngettext ("Delete Task", "Delete Tasks", n_selected);
+ g_object_set (action, "label", label, NULL);
}
diff --git a/calendar/modules/e-task-shell-view-private.c b/calendar/modules/e-task-shell-view-private.c
index b16ac80edb..8e573f538d 100644
--- a/calendar/modules/e-task-shell-view-private.c
+++ b/calendar/modules/e-task-shell-view-private.c
@@ -92,6 +92,8 @@ static gboolean
task_shell_view_add_source (ETaskShellView *task_shell_view,
ESource *source)
{
+ ETaskShellSidebar *task_shell_sidebar;
+ ESourceSelector *selector;
GHashTable *client_table;
ECal *default_client;
ECal *client;
@@ -144,6 +146,10 @@ task_shell_view_add_source (ETaskShellView *task_shell_view,
e_task_shell_view_set_status_message (task_shell_view, status_message);
g_free (status_message);
+ task_shell_sidebar = task_shell_view->priv->task_shell_sidebar;
+ selector = e_task_shell_sidebar_get_selector (task_shell_sidebar);
+ e_source_selector_select_source (selector, source);
+
g_signal_connect_swapped (
client, "cal-opened",
G_CALLBACK (task_shell_view_client_opened_cb),
@@ -156,18 +162,16 @@ task_shell_view_add_source (ETaskShellView *task_shell_view,
static void
task_shell_view_table_popup_event_cb (ETaskShellView *task_shell_view,
- GdkEvent *event)
+ GdkEventButton *event)
{
EShellView *shell_view;
- EShellWindow *shell_window;
const gchar *widget_path;
shell_view = E_SHELL_VIEW (task_shell_view);
- shell_window = e_shell_view_get_shell_window (shell_view);
widget_path = "/task-popup";
e_task_shell_view_actions_update (task_shell_view);
- e_shell_window_show_popup_menu (shell_window, widget_path, event);
+ e_shell_view_show_popup_menu (shell_view, widget_path, event);
}
static void
@@ -274,10 +278,13 @@ void
e_task_shell_view_private_constructed (ETaskShellView *task_shell_view)
{
ETaskShellViewPrivate *priv = task_shell_view->priv;
+ ETaskShellContent *task_shell_content;
EShellContent *shell_content;
EShellSidebar *shell_sidebar;
EShellView *shell_view;
ETaskTable *task_table;
+ ECalModel *model;
+ ETable *table;
shell_view = E_SHELL_VIEW (task_shell_view);
shell_content = e_shell_view_get_shell_content (shell_view);
@@ -287,8 +294,10 @@ e_task_shell_view_private_constructed (ETaskShellView *task_shell_view)
priv->task_shell_content = g_object_ref (shell_content);
priv->task_shell_sidebar = g_object_ref (shell_sidebar);
- task_table = e_task_shell_content_get_task_table (
- priv->task_shell_content);
+ task_shell_content = E_TASK_SHELL_CONTENT (shell_content);
+ task_table = e_task_shell_content_get_task_table (task_shell_content);
+ model = e_task_table_get_model (task_table);
+ table = e_task_table_get_table (task_table);
g_signal_connect_swapped (
task_table, "open-component",
@@ -310,7 +319,28 @@ e_task_shell_view_private_constructed (ETaskShellView *task_shell_view)
G_CALLBACK (task_shell_view_table_user_created_cb),
task_shell_view);
- e_task_shell_view_actions_update (task_shell_view);
+ g_signal_connect_swapped (
+ model, "model-changed",
+ G_CALLBACK (e_task_shell_view_sidebar_update),
+ task_shell_view);
+
+ g_signal_connect_swapped (
+ model, "model-rows-deleted",
+ G_CALLBACK (e_task_shell_view_sidebar_update),
+ task_shell_view);
+
+ g_signal_connect_swapped (
+ model, "model-rows-inserted",
+ G_CALLBACK (e_task_shell_view_sidebar_update),
+ task_shell_view);
+
+ g_signal_connect_swapped (
+ table, "selection-change",
+ G_CALLBACK (e_task_shell_view_sidebar_update),
+ task_shell_view);
+
+ e_task_shell_view_actions_init (task_shell_view);
+ e_task_shell_view_sidebar_update (task_shell_view);
}
void
@@ -352,6 +382,7 @@ e_task_shell_view_open_task (ETaskShellView *task_shell_view,
CompEditorFlags flags = 0;
ECalComponent *comp;
icalcomponent *clone;
+ icalproperty *prop;
const gchar *uid;
g_return_if_fail (E_IS_TASK_SHELL_VIEW (task_shell_view));
@@ -367,14 +398,24 @@ e_task_shell_view_open_task (ETaskShellView *task_shell_view,
clone = icalcomponent_new_clone (comp_data->icalcomp);
e_cal_component_set_icalcomponent (comp, clone);
- /* FIXME Do special stuff if task is assigned. */
+ prop = icalcomponent_get_first_property (
+ comp_data->icalcomp, ICAL_ATTENDEE_PROPERTY);
+ if (prop != NULL)
+ flags |= COMP_EDITOR_IS_ASSIGNED;
+
+ if (itip_organizer_is_user (comp, comp_data->client))
+ flags |= COMP_EDITOR_USER_ORG;
+
+ if (!itip_organizer_has_attendees (comp))
+ flags |= COMP_EDITOR_USER_ORG;
editor = task_editor_new (comp_data->client, flags);
comp_editor_edit_comp (editor, comp);
g_object_ref (comp);
- /* FIXME More special stuff here... */
+ if (flags & COMP_EDITOR_IS_ASSIGNED)
+ task_editor_show_assignment (TASK_EDITOR (editor));
exit:
gtk_window_present (GTK_WINDOW (editor));
@@ -408,3 +449,45 @@ e_task_shell_view_set_status_message (ETaskShellView *task_shell_view,
task_shell_view->priv->activity = activity;
}
+
+void
+e_task_shell_view_sidebar_update (ETaskShellView *task_shell_view)
+{
+ ETaskShellContent *task_shell_content;
+ EShellView *shell_view;
+ EShellSidebar *shell_sidebar;
+ ETaskTable *task_table;
+ ECalModel *model;
+ ETable *table;
+ GString *string;
+ const gchar *format;
+ gint n_rows;
+ gint n_selected;
+
+ shell_view = E_SHELL_VIEW (task_shell_view);
+ shell_sidebar = e_shell_view_get_shell_sidebar (shell_view);
+
+ task_shell_content = task_shell_view->priv->task_shell_content;
+ task_table = e_task_shell_content_get_task_table (task_shell_content);
+
+ model = e_task_table_get_model (task_table);
+ table = e_task_table_get_table (task_table);
+
+ n_rows = e_table_model_row_count (E_TABLE_MODEL (model));
+ n_selected = e_table_selected_count (table);
+
+ string = g_string_sized_new (64);
+
+ format = ngettext ("%d task", "%d tasks", n_rows);
+ g_string_append_printf (string, format, n_rows);
+
+ if (n_selected > 0) {
+ format = _("%d selected");
+ g_string_append_len (string, ", ", 2);
+ g_string_append_printf (string, format, n_selected);
+ }
+
+ e_shell_sidebar_set_secondary_text (shell_sidebar, string->str);
+
+ g_string_free (string, TRUE);
+}
diff --git a/calendar/modules/e-task-shell-view-private.h b/calendar/modules/e-task-shell-view-private.h
index ac6accfbcf..bad511ca20 100644
--- a/calendar/modules/e-task-shell-view-private.h
+++ b/calendar/modules/e-task-shell-view-private.h
@@ -107,6 +107,8 @@ void e_task_shell_view_open_task
void e_task_shell_view_set_status_message
(ETaskShellView *task_shell_view,
const gchar *status_message);
+void e_task_shell_view_sidebar_update
+ (ETaskShellView *task_shell_view);
G_END_DECLS
diff --git a/calendar/modules/e-task-shell-view.c b/calendar/modules/e-task-shell-view.c
index 6b85d1ed45..8ef3c3a9f4 100644
--- a/calendar/modules/e-task-shell-view.c
+++ b/calendar/modules/e-task-shell-view.c
@@ -73,20 +73,6 @@ task_shell_view_constructed (GObject *object)
}
static void
-task_shell_view_changed (EShellView *shell_view)
-{
- ETaskShellViewPrivate *priv;
- GtkActionGroup *action_group;
- gboolean visible;
-
- priv = E_TASK_SHELL_VIEW_GET_PRIVATE (shell_view);
-
- action_group = priv->task_actions;
- visible = e_shell_view_is_active (shell_view);
- gtk_action_group_set_visible (action_group, visible);
-}
-
-static void
task_shell_view_class_init (ETaskShellView *class,
GTypeModule *type_module)
{
@@ -105,10 +91,10 @@ task_shell_view_class_init (ETaskShellView *class,
shell_view_class = E_SHELL_VIEW_CLASS (class);
shell_view_class->label = N_("Tasks");
shell_view_class->icon_name = "evolution-tasks";
+ shell_view_class->ui_definition = "evolution-tasks.ui";
shell_view_class->search_options = "/task-search-options";
shell_view_class->type_module = type_module;
shell_view_class->new_shell_sidebar = e_task_shell_sidebar_new;
- shell_view_class->changed = task_shell_view_changed;
g_object_class_install_property (
object_class,