Blame src/modules/calendar/e-cal-base-shell-sidebar.c.deselect-task-memo-list

Packit 3d4ae9
/*
Packit 3d4ae9
 * Copyright (C) 2014 Red Hat, Inc. (www.redhat.com)
Packit 3d4ae9
 *
Packit 3d4ae9
 * This program is free software; you can redistribute it and/or modify it
Packit 3d4ae9
 * under the terms of the GNU Lesser General Public License as published by
Packit 3d4ae9
 * the Free Software Foundation.
Packit 3d4ae9
 *
Packit 3d4ae9
 * This program is distributed in the hope that it will be useful, but
Packit 3d4ae9
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit 3d4ae9
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
Packit 3d4ae9
 * for more details.
Packit 3d4ae9
 *
Packit 3d4ae9
 * You should have received a copy of the GNU Lesser General Public License
Packit 3d4ae9
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit 3d4ae9
 *
Packit 3d4ae9
 * Authors: Milan Crha <mcrha@redhat.com>
Packit 3d4ae9
 */
Packit 3d4ae9
Packit 3d4ae9
#include "evolution-config.h"
Packit 3d4ae9
Packit 3d4ae9
#include <string.h>
Packit 3d4ae9
#include <glib/gi18n.h>
Packit 3d4ae9
Packit 3d4ae9
#include "e-util/e-util.h"
Packit 3d4ae9
#include "calendar/gui/comp-util.h"
Packit 3d4ae9
Packit 3d4ae9
#include "e-cal-base-shell-view.h"
Packit 3d4ae9
#include "e-cal-base-shell-sidebar.h"
Packit 3d4ae9
Packit 3d4ae9
#define E_CAL_BASE_SHELL_SIDEBAR_GET_PRIVATE(obj) \
Packit 3d4ae9
	(G_TYPE_INSTANCE_GET_PRIVATE \
Packit 3d4ae9
	((obj), E_TYPE_CAL_BASE_SHELL_SIDEBAR, ECalBaseShellSidebarPrivate))
Packit 3d4ae9
Packit 3d4ae9
struct _ECalBaseShellSidebarPrivate {
Packit 3d4ae9
	ECalendar *date_navigator; /* not referenced, is inside itself */
Packit 3d4ae9
	GtkWidget *paned; /* not referenced, is inside itself */
Packit 3d4ae9
	ESourceSelector *selector; /* not referenced, is inside itself */
Packit 3d4ae9
Packit 3d4ae9
	gulong date_navigator_scroll_event_handler_id;
Packit 3d4ae9
Packit 3d4ae9
	GHashTable *selected_uids; /* source UID -> cancellable */
Packit 3d4ae9
};
Packit 3d4ae9
Packit 3d4ae9
enum {
Packit 3d4ae9
	PROP_0,
Packit 3d4ae9
	PROP_DATE_NAVIGATOR,
Packit 3d4ae9
	PROP_SELECTOR
Packit 3d4ae9
};
Packit 3d4ae9
Packit 3d4ae9
enum {
Packit 3d4ae9
	CLIENT_OPENED,
Packit 3d4ae9
	CLIENT_CLOSED,
Packit 3d4ae9
	LAST_SIGNAL
Packit 3d4ae9
};
Packit 3d4ae9
Packit 3d4ae9
static guint signals[LAST_SIGNAL];
Packit 3d4ae9
Packit 3d4ae9
G_DEFINE_DYNAMIC_TYPE (ECalBaseShellSidebar, e_cal_base_shell_sidebar, E_TYPE_SHELL_SIDEBAR)
Packit 3d4ae9
Packit 3d4ae9
static gboolean
Packit 3d4ae9
cal_base_shell_sidebar_map_uid_to_source (GValue *value,
Packit 3d4ae9
					  GVariant *variant,
Packit 3d4ae9
					  gpointer user_data)
Packit 3d4ae9
{
Packit 3d4ae9
	ESourceRegistry *registry;
Packit 3d4ae9
	ESource *source;
Packit 3d4ae9
	const gchar *uid;
Packit 3d4ae9
Packit 3d4ae9
	registry = E_SOURCE_REGISTRY (user_data);
Packit 3d4ae9
	uid = g_variant_get_string (variant, NULL);
Packit 3d4ae9
	if (uid != NULL && *uid != '\0')
Packit 3d4ae9
		source = e_source_registry_ref_source (registry, uid);
Packit 3d4ae9
	else
Packit 3d4ae9
		source = e_source_registry_ref_default_calendar (registry);
Packit 3d4ae9
	g_value_take_object (value, source);
Packit 3d4ae9
Packit 3d4ae9
	return (source != NULL);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static GVariant *
Packit 3d4ae9
cal_base_shell_sidebar_map_source_to_uid (const GValue *value,
Packit 3d4ae9
					  const GVariantType *expected_type,
Packit 3d4ae9
					  gpointer user_data)
Packit 3d4ae9
{
Packit 3d4ae9
	GVariant *variant = NULL;
Packit 3d4ae9
	ESource *source;
Packit 3d4ae9
Packit 3d4ae9
	source = g_value_get_object (value);
Packit 3d4ae9
Packit 3d4ae9
	if (source != NULL) {
Packit 3d4ae9
		const gchar *uid;
Packit 3d4ae9
Packit 3d4ae9
		uid = e_source_get_uid (source);
Packit 3d4ae9
		variant = g_variant_new_string (uid);
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	return variant;
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
cal_base_shell_sidebar_restore_state_cb (EShellWindow *shell_window,
Packit 3d4ae9
					 EShellView *shell_view,
Packit 3d4ae9
					 EShellSidebar *shell_sidebar)
Packit 3d4ae9
{
Packit 3d4ae9
	ECalBaseShellSidebarPrivate *priv;
Packit 3d4ae9
	ESourceRegistry *registry;
Packit 3d4ae9
	ESourceSelector *selector;
Packit 3d4ae9
	GSettings *settings;
Packit 3d4ae9
	const gchar *primary_source_key = NULL;
Packit 3d4ae9
Packit 3d4ae9
	priv = E_CAL_BASE_SHELL_SIDEBAR (shell_sidebar)->priv;
Packit 3d4ae9
Packit 3d4ae9
	g_signal_handlers_disconnect_by_func (
Packit 3d4ae9
		shell_window,
Packit 3d4ae9
		cal_base_shell_sidebar_restore_state_cb, shell_sidebar);
Packit 3d4ae9
Packit 3d4ae9
	switch (e_cal_base_shell_view_get_source_type (shell_view)) {
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_EVENTS:
Packit 3d4ae9
			primary_source_key = "primary-calendar";
Packit 3d4ae9
			break;
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_MEMOS:
Packit 3d4ae9
			primary_source_key = "primary-memos";
Packit 3d4ae9
			break;
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_TASKS:
Packit 3d4ae9
			primary_source_key = "primary-tasks";
Packit 3d4ae9
			break;
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_LAST:
Packit 3d4ae9
			g_warn_if_reached ();
Packit 3d4ae9
			return;
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	selector = E_SOURCE_SELECTOR (priv->selector);
Packit 3d4ae9
	registry = e_source_selector_get_registry (selector);
Packit 3d4ae9
Packit 3d4ae9
	/* Bind GObject properties to settings keys. */
Packit 3d4ae9
Packit 3d4ae9
	settings = e_util_ref_settings ("org.gnome.evolution.calendar");
Packit 3d4ae9
Packit 3d4ae9
	g_settings_bind_with_mapping (
Packit 3d4ae9
		settings, primary_source_key,
Packit 3d4ae9
		selector, "primary-selection",
Packit 3d4ae9
		G_SETTINGS_BIND_DEFAULT,
Packit 3d4ae9
		cal_base_shell_sidebar_map_uid_to_source,
Packit 3d4ae9
		cal_base_shell_sidebar_map_source_to_uid,
Packit 3d4ae9
		g_object_ref (registry),
Packit 3d4ae9
		(GDestroyNotify) g_object_unref);
Packit 3d4ae9
Packit 3d4ae9
	if (priv->date_navigator) {
Packit 3d4ae9
		if (e_shell_window_is_main_instance (shell_window)) {
Packit 3d4ae9
			g_settings_bind (
Packit 3d4ae9
				settings, "date-navigator-pane-position",
Packit 3d4ae9
				priv->paned, "vposition",
Packit 3d4ae9
				G_SETTINGS_BIND_DEFAULT);
Packit 3d4ae9
		} else {
Packit 3d4ae9
			g_settings_bind (
Packit 3d4ae9
				settings, "date-navigator-pane-position-sub",
Packit 3d4ae9
				priv->paned, "vposition",
Packit 3d4ae9
				G_SETTINGS_BIND_DEFAULT |
Packit 3d4ae9
				G_SETTINGS_BIND_GET_NO_CHANGES);
Packit 3d4ae9
		}
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	g_object_unref (settings);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static guint32
Packit 3d4ae9
cal_base_shell_sidebar_check_state (EShellSidebar *shell_sidebar)
Packit 3d4ae9
{
Packit 3d4ae9
	ECalBaseShellSidebar *cal_base_shell_sidebar;
Packit 3d4ae9
	ESourceSelector *selector;
Packit 3d4ae9
	ESourceRegistry *registry;
Packit 3d4ae9
	ESource *source;
Packit 3d4ae9
	gboolean is_writable = FALSE;
Packit 3d4ae9
	gboolean is_removable = FALSE;
Packit 3d4ae9
	gboolean is_remote_creatable = FALSE;
Packit 3d4ae9
	gboolean is_remote_deletable = FALSE;
Packit 3d4ae9
	gboolean in_collection = FALSE;
Packit 3d4ae9
	gboolean refresh_supported = FALSE;
Packit 3d4ae9
	gboolean has_primary_source = FALSE;
Packit 3d4ae9
	guint32 state = 0;
Packit 3d4ae9
Packit 3d4ae9
	cal_base_shell_sidebar = E_CAL_BASE_SHELL_SIDEBAR (shell_sidebar);
Packit 3d4ae9
	selector = e_cal_base_shell_sidebar_get_selector (cal_base_shell_sidebar);
Packit 3d4ae9
	source = e_source_selector_ref_primary_selection (selector);
Packit 3d4ae9
	registry = e_source_selector_get_registry (selector);
Packit 3d4ae9
Packit 3d4ae9
	if (source != NULL) {
Packit 3d4ae9
		EClient *client;
Packit 3d4ae9
		ESource *collection;
Packit 3d4ae9
Packit 3d4ae9
		has_primary_source = TRUE;
Packit 3d4ae9
		is_writable = e_source_get_writable (source);
Packit 3d4ae9
		is_removable = e_source_get_removable (source);
Packit 3d4ae9
		is_remote_creatable = e_source_get_remote_creatable (source);
Packit 3d4ae9
		is_remote_deletable = e_source_get_remote_deletable (source);
Packit 3d4ae9
Packit 3d4ae9
		collection = e_source_registry_find_extension (
Packit 3d4ae9
			registry, source, E_SOURCE_EXTENSION_COLLECTION);
Packit 3d4ae9
		if (collection != NULL) {
Packit 3d4ae9
			in_collection = TRUE;
Packit 3d4ae9
			g_object_unref (collection);
Packit 3d4ae9
		}
Packit 3d4ae9
Packit 3d4ae9
		client = e_client_selector_ref_cached_client (
Packit 3d4ae9
			E_CLIENT_SELECTOR (selector), source);
Packit 3d4ae9
Packit 3d4ae9
		if (client != NULL) {
Packit 3d4ae9
			refresh_supported =
Packit 3d4ae9
				e_client_check_refresh_supported (client);
Packit 3d4ae9
			g_object_unref (client);
Packit 3d4ae9
		}
Packit 3d4ae9
Packit 3d4ae9
		g_object_unref (source);
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	if (e_source_selector_count_total (selector) == e_source_selector_count_selected (selector))
Packit 3d4ae9
		state |= E_CAL_BASE_SHELL_SIDEBAR_ALL_SOURCES_SELECTED;
Packit 3d4ae9
	if (has_primary_source)
Packit 3d4ae9
		state |= E_CAL_BASE_SHELL_SIDEBAR_HAS_PRIMARY_SOURCE;
Packit 3d4ae9
	if (is_writable)
Packit 3d4ae9
		state |= E_CAL_BASE_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_WRITABLE;
Packit 3d4ae9
	if (is_removable)
Packit 3d4ae9
		state |= E_CAL_BASE_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_REMOVABLE;
Packit 3d4ae9
	if (is_remote_creatable)
Packit 3d4ae9
		state |= E_CAL_BASE_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_REMOTE_CREATABLE;
Packit 3d4ae9
	if (is_remote_deletable)
Packit 3d4ae9
		state |= E_CAL_BASE_SHELL_SIDEBAR_PRIMARY_SOURCE_IS_REMOTE_DELETABLE;
Packit 3d4ae9
	if (in_collection)
Packit 3d4ae9
		state |= E_CAL_BASE_SHELL_SIDEBAR_PRIMARY_SOURCE_IN_COLLECTION;
Packit 3d4ae9
	if (refresh_supported)
Packit 3d4ae9
		state |= E_CAL_BASE_SHELL_SIDEBAR_SOURCE_SUPPORTS_REFRESH;
Packit 3d4ae9
Packit 3d4ae9
	return state;
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static gboolean
Packit 3d4ae9
cal_base_shell_sidebar_date_navigator_scroll_event_cb (ECalBaseShellSidebar *cal_base_shell_sidebar,
Packit 3d4ae9
						       GdkEventScroll *event,
Packit 3d4ae9
						       ECalendar *date_navigator)
Packit 3d4ae9
{
Packit 3d4ae9
	ECalendarItem *calitem;
Packit 3d4ae9
	gint year = -1, month = -1;
Packit 3d4ae9
	GdkScrollDirection direction;
Packit 3d4ae9
Packit 3d4ae9
	calitem = e_calendar_get_item (date_navigator);
Packit 3d4ae9
	e_calendar_item_get_first_month (calitem, &year, &month);
Packit 3d4ae9
	if (year == -1 || month == -1)
Packit 3d4ae9
		return FALSE;
Packit 3d4ae9
Packit 3d4ae9
	direction = event->direction;
Packit 3d4ae9
Packit 3d4ae9
	if (direction == GDK_SCROLL_SMOOTH) {
Packit 3d4ae9
		static gdouble total_delta_y = 0.0;
Packit 3d4ae9
Packit 3d4ae9
		total_delta_y += event->delta_y;
Packit 3d4ae9
Packit 3d4ae9
		if (total_delta_y >= 1.0) {
Packit 3d4ae9
			total_delta_y = 0.0;
Packit 3d4ae9
			direction = GDK_SCROLL_DOWN;
Packit 3d4ae9
		} else if (total_delta_y <= -1.0) {
Packit 3d4ae9
			total_delta_y = 0.0;
Packit 3d4ae9
			direction = GDK_SCROLL_UP;
Packit 3d4ae9
		} else {
Packit 3d4ae9
			return FALSE;
Packit 3d4ae9
		}
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	switch (direction) {
Packit 3d4ae9
		case GDK_SCROLL_UP:
Packit 3d4ae9
			month--;
Packit 3d4ae9
			if (month < 0) {
Packit 3d4ae9
				year--;
Packit 3d4ae9
				month += 12;
Packit 3d4ae9
			}
Packit 3d4ae9
			break;
Packit 3d4ae9
Packit 3d4ae9
		case GDK_SCROLL_DOWN:
Packit 3d4ae9
			month++;
Packit 3d4ae9
			if (month >= 12) {
Packit 3d4ae9
				year++;
Packit 3d4ae9
				month -= 12;
Packit 3d4ae9
			}
Packit 3d4ae9
			break;
Packit 3d4ae9
Packit 3d4ae9
		default:
Packit 3d4ae9
			g_return_val_if_reached (FALSE);
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	e_calendar_item_set_first_month (calitem, year, month);
Packit 3d4ae9
Packit 3d4ae9
	return TRUE;
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
typedef struct _OpenClientData {
Packit 3d4ae9
	const gchar *extension_name;
Packit 3d4ae9
	ECalBaseShellSidebar *sidebar;
Packit 3d4ae9
	ESource *source;
Packit 3d4ae9
	EClient *client;
Packit 3d4ae9
} OpenClientData;
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
open_client_data_free (gpointer pdata)
Packit 3d4ae9
{
Packit 3d4ae9
	OpenClientData *data = pdata;
Packit 3d4ae9
Packit 3d4ae9
	if (data) {
Packit 3d4ae9
		if (data->client) {
Packit 3d4ae9
			g_signal_emit (data->sidebar, signals[CLIENT_OPENED], 0, data->client);
Packit 3d4ae9
		} else {
Packit 3d4ae9
			ESourceSelector *selector = e_cal_base_shell_sidebar_get_selector (data->sidebar);
Packit 3d4ae9
			e_source_selector_unselect_source (selector, data->source);
Packit 3d4ae9
		}
Packit 3d4ae9
Packit 3d4ae9
		g_clear_object (&data->sidebar);
Packit 3d4ae9
		g_clear_object (&data->source);
Packit 3d4ae9
		g_clear_object (&data->client);
Packit 3d4ae9
		g_free (data);
Packit 3d4ae9
	}
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
e_cal_base_shell_sidebar_open_client_thread (EAlertSinkThreadJobData *job_data,
Packit 3d4ae9
					     gpointer user_data,
Packit 3d4ae9
					     GCancellable *cancellable,
Packit 3d4ae9
					     GError **error)
Packit 3d4ae9
{
Packit 3d4ae9
	EClientSelector *selector;
Packit 3d4ae9
	OpenClientData *data = user_data;
Packit 3d4ae9
	GError *local_error = NULL;
Packit 3d4ae9
Packit 3d4ae9
	g_return_if_fail (data != NULL);
Packit 3d4ae9
Packit 3d4ae9
	selector = E_CLIENT_SELECTOR (e_cal_base_shell_sidebar_get_selector (data->sidebar));
Packit 3d4ae9
	data->client = e_client_selector_get_client_sync (
Packit 3d4ae9
		selector, data->source, TRUE, (guint32) -1, cancellable, &local_error);
Packit 3d4ae9
Packit 3d4ae9
	e_util_propagate_open_source_job_error (job_data, data->extension_name, local_error, error);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
e_cal_base_shell_sidebar_ensure_source_opened (ECalBaseShellSidebar *sidebar,
Packit 3d4ae9
					       ESource *source)
Packit 3d4ae9
{
Packit 3d4ae9
	OpenClientData *data;
Packit 3d4ae9
	EShellView *shell_view;
Packit 3d4ae9
	EActivity *activity;
Packit 3d4ae9
	gchar *description = NULL, *alert_ident = NULL, *alert_arg_0 = NULL, *display_name;
Packit 3d4ae9
	const gchar *extension_name = NULL;
Packit 3d4ae9
Packit 3d4ae9
	g_return_if_fail (E_IS_CAL_BASE_SHELL_SIDEBAR (sidebar));
Packit 3d4ae9
	g_return_if_fail (E_IS_SOURCE (source));
Packit 3d4ae9
Packit 3d4ae9
	shell_view = e_shell_sidebar_get_shell_view (E_SHELL_SIDEBAR (sidebar));
Packit 3d4ae9
Packit 3d4ae9
	switch (e_cal_base_shell_view_get_source_type (shell_view)) {
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_EVENTS:
Packit 3d4ae9
			extension_name = E_SOURCE_EXTENSION_CALENDAR;
Packit 3d4ae9
			break;
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_MEMOS:
Packit 3d4ae9
			extension_name = E_SOURCE_EXTENSION_MEMO_LIST;
Packit 3d4ae9
			break;
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_TASKS:
Packit 3d4ae9
			extension_name = E_SOURCE_EXTENSION_TASK_LIST;
Packit 3d4ae9
			break;
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_LAST:
Packit 3d4ae9
			g_warn_if_reached ();
Packit 3d4ae9
			return;
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	display_name = e_util_get_source_full_name (e_shell_get_registry (e_shell_backend_get_shell (e_shell_view_get_shell_backend (shell_view))), source);
Packit 3d4ae9
Packit 3d4ae9
	if (!e_util_get_open_source_job_info (extension_name, display_name,
Packit 3d4ae9
		&description, &alert_ident, &alert_arg_0)) {
Packit 3d4ae9
		g_free (display_name);
Packit 3d4ae9
		g_warn_if_reached ();
Packit 3d4ae9
		return;
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	g_free (display_name);
Packit 3d4ae9
Packit 3d4ae9
	data = g_new0 (OpenClientData, 1);
Packit 3d4ae9
	data->extension_name = extension_name; /* no need to copy, it's a static string */
Packit 3d4ae9
	data->sidebar = g_object_ref (sidebar);
Packit 3d4ae9
	data->source = g_object_ref (source);
Packit 3d4ae9
Packit 3d4ae9
	activity = e_shell_view_submit_thread_job (
Packit 3d4ae9
		shell_view, description, alert_ident, alert_arg_0,
Packit 3d4ae9
		e_cal_base_shell_sidebar_open_client_thread, data,
Packit 3d4ae9
		open_client_data_free);
Packit 3d4ae9
Packit 3d4ae9
	if (activity) {
Packit 3d4ae9
		GCancellable *cancellable;
Packit 3d4ae9
Packit 3d4ae9
		cancellable = e_activity_get_cancellable (activity);
Packit 3d4ae9
Packit 3d4ae9
		g_hash_table_insert (sidebar->priv->selected_uids,
Packit 3d4ae9
			g_strdup (e_source_get_uid (source)),
Packit 3d4ae9
			g_object_ref (cancellable));
Packit 3d4ae9
Packit 3d4ae9
		g_object_unref (activity);
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	g_free (description);
Packit 3d4ae9
	g_free (alert_ident);
Packit 3d4ae9
	g_free (alert_arg_0);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
e_cal_base_shell_sidebar_primary_selection_changed_cb (ESourceSelector *selector,
Packit 3d4ae9
						       EShellSidebar *sidebar)
Packit 3d4ae9
{
Packit 3d4ae9
	g_return_if_fail (E_IS_CAL_BASE_SHELL_SIDEBAR (sidebar));
Packit 3d4ae9
Packit 3d4ae9
	e_shell_view_update_actions (e_shell_sidebar_get_shell_view (sidebar));
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
e_cal_base_shell_sidebar_source_selected (ESourceSelector *selector,
Packit 3d4ae9
					  ESource *source,
Packit 3d4ae9
					  ECalBaseShellSidebar *sidebar)
Packit 3d4ae9
{
Packit 3d4ae9
	g_return_if_fail (E_IS_SOURCE_SELECTOR (selector));
Packit 3d4ae9
	g_return_if_fail (E_IS_SOURCE (source));
Packit 3d4ae9
	g_return_if_fail (E_IS_CAL_BASE_SHELL_SIDEBAR (sidebar));
Packit 3d4ae9
Packit 3d4ae9
	if (!g_hash_table_contains (sidebar->priv->selected_uids, e_source_get_uid (source))) {
Packit 3d4ae9
		e_cal_base_shell_sidebar_ensure_source_opened (sidebar, source);
Packit 3d4ae9
	}
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
e_cal_base_shell_sidebar_source_unselected (ESourceSelector *selector,
Packit 3d4ae9
					    ESource *source,
Packit 3d4ae9
					    ECalBaseShellSidebar *sidebar)
Packit 3d4ae9
{
Packit 3d4ae9
	g_return_if_fail (E_IS_SOURCE_SELECTOR (selector));
Packit 3d4ae9
	g_return_if_fail (E_IS_CAL_BASE_SHELL_SIDEBAR (sidebar));
Packit 3d4ae9
Packit 3d4ae9
	if (g_hash_table_remove (sidebar->priv->selected_uids, e_source_get_uid (source)))
Packit 3d4ae9
		g_signal_emit (sidebar, signals[CLIENT_CLOSED], 0, source);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
typedef struct {
Packit 3d4ae9
	ESource *source;
Packit 3d4ae9
	ESource *destination;
Packit 3d4ae9
	gboolean do_copy;
Packit 3d4ae9
	icalcomponent *icalcomp;
Packit 3d4ae9
	EClientSelector *selector;
Packit 3d4ae9
} TransferItemToData;
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
transfer_item_to_data_free (gpointer ptr)
Packit 3d4ae9
{
Packit 3d4ae9
	TransferItemToData *titd = ptr;
Packit 3d4ae9
Packit 3d4ae9
	if (titd) {
Packit 3d4ae9
		g_clear_object (&titd->source);
Packit 3d4ae9
		g_clear_object (&titd->destination);
Packit 3d4ae9
		g_clear_object (&titd->selector);
Packit 3d4ae9
Packit 3d4ae9
		if (titd->icalcomp)
Packit 3d4ae9
			icalcomponent_free (titd->icalcomp);
Packit 3d4ae9
Packit 3d4ae9
		g_free (titd);
Packit 3d4ae9
	}
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
cal_base_shell_sidebar_transfer_thread (EAlertSinkThreadJobData *job_data,
Packit 3d4ae9
					gpointer user_data,
Packit 3d4ae9
					GCancellable *cancellable,
Packit 3d4ae9
					GError **error)
Packit 3d4ae9
{
Packit 3d4ae9
	TransferItemToData *titd = user_data;
Packit 3d4ae9
	EClient *source_client, *destination_client;
Packit 3d4ae9
Packit 3d4ae9
	g_return_if_fail (titd != NULL);
Packit 3d4ae9
	g_return_if_fail (E_IS_SOURCE (titd->source));
Packit 3d4ae9
	g_return_if_fail (E_IS_SOURCE (titd->destination));
Packit 3d4ae9
	g_return_if_fail (E_IS_CLIENT_SELECTOR (titd->selector));
Packit 3d4ae9
	g_return_if_fail (titd->icalcomp != NULL);
Packit 3d4ae9
Packit 3d4ae9
	source_client = e_client_selector_get_client_sync (
Packit 3d4ae9
		titd->selector, titd->source, FALSE, 30, cancellable, error);
Packit 3d4ae9
	if (!source_client)
Packit 3d4ae9
		return;
Packit 3d4ae9
Packit 3d4ae9
	destination_client = e_client_selector_get_client_sync (
Packit 3d4ae9
		titd->selector, titd->destination, FALSE, 30, cancellable, error);
Packit 3d4ae9
	if (!destination_client) {
Packit 3d4ae9
		g_object_unref (source_client);
Packit 3d4ae9
		return;
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	cal_comp_transfer_item_to_sync (E_CAL_CLIENT (source_client), E_CAL_CLIENT (destination_client),
Packit 3d4ae9
		titd->icalcomp, titd->do_copy, cancellable, error);
Packit 3d4ae9
Packit 3d4ae9
	g_clear_object (&source_client);
Packit 3d4ae9
	g_clear_object (&destination_client);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static gboolean
Packit 3d4ae9
e_cal_base_shell_sidebar_selector_data_dropped (ESourceSelector *selector,
Packit 3d4ae9
						GtkSelectionData *selection_data,
Packit 3d4ae9
						ESource *destination,
Packit 3d4ae9
						GdkDragAction action,
Packit 3d4ae9
						guint info,
Packit 3d4ae9
						ECalBaseShellSidebar *sidebar)
Packit 3d4ae9
{
Packit 3d4ae9
	icalcomponent *icalcomp = NULL;
Packit 3d4ae9
	EActivity *activity;
Packit 3d4ae9
	EShellView *shell_view;
Packit 3d4ae9
	ESource *source = NULL;
Packit 3d4ae9
	ESourceRegistry *registry;
Packit 3d4ae9
	gchar **segments;
Packit 3d4ae9
	gchar *source_uid = NULL;
Packit 3d4ae9
	gchar *message = NULL;
Packit 3d4ae9
	gchar *display_name = NULL;
Packit 3d4ae9
	const gchar *alert_ident = NULL;
Packit 3d4ae9
	const guchar *data;
Packit 3d4ae9
	gboolean do_copy;
Packit 3d4ae9
	TransferItemToData *titd;
Packit 3d4ae9
Packit 3d4ae9
	g_return_val_if_fail (E_IS_SOURCE_SELECTOR (selector), FALSE);
Packit 3d4ae9
	g_return_val_if_fail (E_IS_SOURCE (destination), FALSE);
Packit 3d4ae9
	g_return_val_if_fail (E_IS_CAL_BASE_SHELL_SIDEBAR (sidebar), FALSE);
Packit 3d4ae9
Packit 3d4ae9
	data = gtk_selection_data_get_data (selection_data);
Packit 3d4ae9
	g_return_val_if_fail (data != NULL, FALSE);
Packit 3d4ae9
Packit 3d4ae9
	segments = g_strsplit ((const gchar *) data, "\n", 2);
Packit 3d4ae9
	if (g_strv_length (segments) != 2)
Packit 3d4ae9
		goto exit;
Packit 3d4ae9
Packit 3d4ae9
	source_uid = g_strdup (segments[0]);
Packit 3d4ae9
	icalcomp = icalparser_parse_string (segments[1]);
Packit 3d4ae9
Packit 3d4ae9
	if (!icalcomp)
Packit 3d4ae9
		goto exit;
Packit 3d4ae9
Packit 3d4ae9
	registry = e_source_selector_get_registry (selector);
Packit 3d4ae9
	source = e_source_registry_ref_source (registry, source_uid);
Packit 3d4ae9
	if (!source)
Packit 3d4ae9
		goto exit;
Packit 3d4ae9
Packit 3d4ae9
	display_name = e_util_get_source_full_name (registry, destination);
Packit 3d4ae9
	do_copy = action == GDK_ACTION_COPY ? TRUE : FALSE;
Packit 3d4ae9
	shell_view = e_shell_sidebar_get_shell_view (E_SHELL_SIDEBAR (sidebar));
Packit 3d4ae9
Packit 3d4ae9
	switch (e_cal_base_shell_view_get_source_type (shell_view)) {
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_EVENTS:
Packit 3d4ae9
			message = do_copy ?
Packit 3d4ae9
				g_strdup_printf (_("Copying an event into the calendar “%s”"), display_name) :
Packit 3d4ae9
				g_strdup_printf (_("Moving an event into the calendar “%s”"), display_name);
Packit 3d4ae9
			alert_ident = do_copy ? "calendar:failed-copy-event" : "calendar:failed-move-event";
Packit 3d4ae9
			break;
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_MEMOS:
Packit 3d4ae9
			message = do_copy ?
Packit 3d4ae9
				g_strdup_printf (_("Copying a memo into the memo list “%s”"), display_name) :
Packit 3d4ae9
				g_strdup_printf (_("Moving a memo into the memo list “%s”"), display_name);
Packit 3d4ae9
			alert_ident = do_copy ? "calendar:failed-copy-memo" : "calendar:failed-move-memo";
Packit 3d4ae9
			break;
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_TASKS:
Packit 3d4ae9
			message = do_copy ?
Packit 3d4ae9
				g_strdup_printf (_("Copying a task into the task list “%s”"), display_name) :
Packit 3d4ae9
				g_strdup_printf (_("Moving a task into the task list “%s”"), display_name);
Packit 3d4ae9
			alert_ident = do_copy ? "calendar:failed-copy-task" : "calendar:failed-move-task";
Packit 3d4ae9
			break;
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_LAST:
Packit 3d4ae9
			g_warn_if_reached ();
Packit 3d4ae9
			goto exit;
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	titd = g_new0 (TransferItemToData, 1);
Packit 3d4ae9
	titd->source = g_object_ref (source);
Packit 3d4ae9
	titd->destination = g_object_ref (destination);
Packit 3d4ae9
	titd->do_copy = do_copy;
Packit 3d4ae9
	titd->icalcomp = icalcomp;
Packit 3d4ae9
	titd->selector = g_object_ref (selector);
Packit 3d4ae9
Packit 3d4ae9
	icalcomp = NULL;
Packit 3d4ae9
Packit 3d4ae9
	activity = e_shell_view_submit_thread_job (shell_view, message,
Packit 3d4ae9
		alert_ident, display_name, cal_base_shell_sidebar_transfer_thread,
Packit 3d4ae9
		titd, transfer_item_to_data_free);
Packit 3d4ae9
Packit 3d4ae9
	g_clear_object (&activity);
Packit 3d4ae9
Packit 3d4ae9
 exit:
Packit 3d4ae9
	if (icalcomp)
Packit 3d4ae9
		icalcomponent_free (icalcomp);
Packit 3d4ae9
Packit 3d4ae9
	g_clear_object (&source);
Packit 3d4ae9
	g_free (message);
Packit 3d4ae9
	g_free (source_uid);
Packit 3d4ae9
	g_free (display_name);
Packit 3d4ae9
	g_strfreev (segments);
Packit 3d4ae9
Packit 3d4ae9
	return TRUE;
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
cancel_and_unref (gpointer data)
Packit 3d4ae9
{
Packit 3d4ae9
	GCancellable *cancellable = data;
Packit 3d4ae9
Packit 3d4ae9
	if (cancellable) {
Packit 3d4ae9
		g_cancellable_cancel (cancellable);
Packit 3d4ae9
		g_object_unref (cancellable);
Packit 3d4ae9
	}
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
cal_base_shell_sidebar_get_property (GObject *object,
Packit 3d4ae9
				     guint property_id,
Packit 3d4ae9
				     GValue *value,
Packit 3d4ae9
				     GParamSpec *pspec)
Packit 3d4ae9
{
Packit 3d4ae9
	switch (property_id) {
Packit 3d4ae9
		case PROP_DATE_NAVIGATOR:
Packit 3d4ae9
			g_value_set_object (
Packit 3d4ae9
				value,
Packit 3d4ae9
				e_cal_base_shell_sidebar_get_date_navigator (
Packit 3d4ae9
				E_CAL_BASE_SHELL_SIDEBAR (object)));
Packit 3d4ae9
			return;
Packit 3d4ae9
Packit 3d4ae9
		case PROP_SELECTOR:
Packit 3d4ae9
			g_value_set_object (
Packit 3d4ae9
				value,
Packit 3d4ae9
				e_cal_base_shell_sidebar_get_selector (
Packit 3d4ae9
				E_CAL_BASE_SHELL_SIDEBAR (object)));
Packit 3d4ae9
			return;
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
e_cal_base_shell_sidebar_update_calendar_margin_cb (GObject *object,
Packit 3d4ae9
													GParamSpec *pspec,
Packit 3d4ae9
													gpointer *user_data)
Packit 3d4ae9
{
Packit 3d4ae9
	EShellWindow *shell_window;
Packit 3d4ae9
	GtkWidget *calendar;
Packit 3d4ae9
	gboolean switcher_visible;
Packit 3d4ae9
Packit 3d4ae9
	shell_window = E_SHELL_WINDOW (object);
Packit 3d4ae9
	calendar = GTK_WIDGET (user_data);
Packit 3d4ae9
	switcher_visible = e_shell_window_get_switcher_visible (shell_window);
Packit 3d4ae9
Packit 3d4ae9
	if (switcher_visible)
Packit 3d4ae9
		gtk_widget_set_margin_bottom (calendar, 0);
Packit 3d4ae9
	else
Packit 3d4ae9
		gtk_widget_set_margin_bottom (calendar, 6);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
cal_base_shell_sidebar_constructed (GObject *object)
Packit 3d4ae9
{
Packit 3d4ae9
	EShellWindow *shell_window;
Packit 3d4ae9
	EShellView *shell_view;
Packit 3d4ae9
	EShellBackend *shell_backend;
Packit 3d4ae9
	EShell *shell;
Packit 3d4ae9
	EClientCache *client_cache;
Packit 3d4ae9
	const gchar *source_extension = NULL, *selector_name = NULL, *restore_state_signal = NULL;
Packit 3d4ae9
	ECalBaseShellSidebar *cal_base_shell_sidebar;
Packit 3d4ae9
	GtkWidget *container, *widget;
Packit 3d4ae9
	AtkObject *a11y;
Packit 3d4ae9
	gboolean add_navigator = FALSE;
Packit 3d4ae9
Packit 3d4ae9
	/* Chain up to parent's constructed() method. */
Packit 3d4ae9
	G_OBJECT_CLASS (e_cal_base_shell_sidebar_parent_class)->constructed (object);
Packit 3d4ae9
Packit 3d4ae9
	cal_base_shell_sidebar = E_CAL_BASE_SHELL_SIDEBAR (object);
Packit 3d4ae9
	shell_view = e_shell_sidebar_get_shell_view (E_SHELL_SIDEBAR (object));
Packit 3d4ae9
	shell_backend = e_shell_view_get_shell_backend (shell_view);
Packit 3d4ae9
	shell_window = e_shell_view_get_shell_window (shell_view);
Packit 3d4ae9
	shell = e_shell_backend_get_shell (shell_backend);
Packit 3d4ae9
Packit 3d4ae9
	switch (e_cal_base_shell_view_get_source_type (shell_view)) {
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_EVENTS:
Packit 3d4ae9
			source_extension = E_SOURCE_EXTENSION_CALENDAR;
Packit 3d4ae9
			selector_name = _("Calendar Selector");
Packit 3d4ae9
			restore_state_signal = "shell-view-created::calendar";
Packit 3d4ae9
			add_navigator = TRUE;
Packit 3d4ae9
			break;
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_MEMOS:
Packit 3d4ae9
			source_extension = E_SOURCE_EXTENSION_MEMO_LIST;
Packit 3d4ae9
			selector_name = _("Memo List Selector");
Packit 3d4ae9
			restore_state_signal = "shell-view-created::memos";
Packit 3d4ae9
			break;
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_TASKS:
Packit 3d4ae9
			source_extension = E_SOURCE_EXTENSION_TASK_LIST;
Packit 3d4ae9
			selector_name = _("Task List Selector");
Packit 3d4ae9
			restore_state_signal = "shell-view-created::tasks";
Packit 3d4ae9
			break;
Packit 3d4ae9
		case E_CAL_CLIENT_SOURCE_TYPE_LAST:
Packit 3d4ae9
			g_warn_if_reached ();
Packit 3d4ae9
			return;
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	client_cache = e_shell_get_client_cache (shell);
Packit 3d4ae9
Packit 3d4ae9
	container = GTK_WIDGET (object);
Packit 3d4ae9
Packit 3d4ae9
	widget = e_paned_new (GTK_ORIENTATION_VERTICAL);
Packit 3d4ae9
	gtk_container_add (GTK_CONTAINER (container), widget);
Packit 3d4ae9
	cal_base_shell_sidebar->priv->paned = widget;
Packit 3d4ae9
Packit 3d4ae9
	container = widget;
Packit 3d4ae9
Packit 3d4ae9
	widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
Packit 3d4ae9
	gtk_paned_pack1 (GTK_PANED (container), widget, TRUE, TRUE);
Packit 3d4ae9
Packit 3d4ae9
	container = widget;
Packit 3d4ae9
Packit 3d4ae9
	widget = gtk_scrolled_window_new (NULL, NULL);
Packit 3d4ae9
	gtk_scrolled_window_set_policy (
Packit 3d4ae9
		GTK_SCROLLED_WINDOW (widget),
Packit 3d4ae9
		GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
Packit 3d4ae9
	gtk_box_pack_start (GTK_BOX (container), widget, TRUE, TRUE, 0);
Packit 3d4ae9
Packit 3d4ae9
	container = widget;
Packit 3d4ae9
Packit 3d4ae9
	widget = e_client_selector_new (client_cache, source_extension);
Packit 3d4ae9
	a11y = gtk_widget_get_accessible (widget);
Packit 3d4ae9
	atk_object_set_name (a11y, selector_name);
Packit 3d4ae9
	cal_base_shell_sidebar->priv->selector = E_SOURCE_SELECTOR (widget);
Packit 3d4ae9
	gtk_container_add (GTK_CONTAINER (container), widget);
Packit 3d4ae9
Packit 3d4ae9
	e_source_selector_load_groups_setup (cal_base_shell_sidebar->priv->selector,
Packit 3d4ae9
		e_shell_view_get_state_key_file (shell_view));
Packit 3d4ae9
Packit 3d4ae9
	if (add_navigator) {
Packit 3d4ae9
		ECalendarItem *calitem;
Packit 3d4ae9
Packit 3d4ae9
		container = cal_base_shell_sidebar->priv->paned;
Packit 3d4ae9
Packit 3d4ae9
		widget = e_calendar_new ();
Packit 3d4ae9
		gtk_widget_set_margin_top (widget, 6);
Packit 3d4ae9
		gtk_widget_set_margin_start (widget, 6);
Packit 3d4ae9
		gtk_widget_set_margin_end (widget, 6);
Packit 3d4ae9
		calitem = e_calendar_get_item (E_CALENDAR (widget));
Packit 3d4ae9
		e_calendar_item_set_days_start_week_sel (calitem, 9);
Packit 3d4ae9
		e_calendar_item_set_max_days_sel (calitem, 42);
Packit 3d4ae9
		gtk_paned_pack2 (GTK_PANED (container), widget, FALSE, FALSE);
Packit 3d4ae9
		cal_base_shell_sidebar->priv->date_navigator = E_CALENDAR (widget);
Packit 3d4ae9
		gtk_widget_show (widget);
Packit 3d4ae9
Packit 3d4ae9
		gnome_canvas_item_set (
Packit 3d4ae9
			GNOME_CANVAS_ITEM (e_calendar_get_item (cal_base_shell_sidebar->priv->date_navigator)),
Packit 3d4ae9
			"move-selection-when-moving", FALSE,
Packit 3d4ae9
			NULL);
Packit 3d4ae9
Packit 3d4ae9
		cal_base_shell_sidebar->priv->date_navigator_scroll_event_handler_id = g_signal_connect_swapped (
Packit 3d4ae9
			cal_base_shell_sidebar->priv->date_navigator, "scroll-event",
Packit 3d4ae9
			G_CALLBACK (cal_base_shell_sidebar_date_navigator_scroll_event_cb), cal_base_shell_sidebar);
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	gtk_widget_show_all (GTK_WIDGET (object));
Packit 3d4ae9
Packit 3d4ae9
	gtk_drag_dest_set (
Packit 3d4ae9
		GTK_WIDGET (cal_base_shell_sidebar->priv->selector), GTK_DEST_DEFAULT_ALL,
Packit 3d4ae9
		NULL, 0, GDK_ACTION_COPY | GDK_ACTION_MOVE);
Packit 3d4ae9
Packit 3d4ae9
	e_drag_dest_add_calendar_targets (GTK_WIDGET (cal_base_shell_sidebar->priv->selector));
Packit 3d4ae9
Packit 3d4ae9
	g_signal_connect (shell_window,
Packit 3d4ae9
		"notify::switcher-visible", G_CALLBACK (e_cal_base_shell_sidebar_update_calendar_margin_cb),
Packit 3d4ae9
		widget);
Packit 3d4ae9
Packit 3d4ae9
	g_signal_connect (cal_base_shell_sidebar->priv->selector,
Packit 3d4ae9
		"data-dropped", G_CALLBACK (e_cal_base_shell_sidebar_selector_data_dropped),
Packit 3d4ae9
		cal_base_shell_sidebar);
Packit 3d4ae9
Packit 3d4ae9
	g_signal_connect (cal_base_shell_sidebar->priv->selector,
Packit 3d4ae9
		"primary-selection-changed", G_CALLBACK (e_cal_base_shell_sidebar_primary_selection_changed_cb),
Packit 3d4ae9
		cal_base_shell_sidebar);
Packit 3d4ae9
Packit 3d4ae9
	g_signal_connect (cal_base_shell_sidebar->priv->selector,
Packit 3d4ae9
		"source-selected", G_CALLBACK (e_cal_base_shell_sidebar_source_selected),
Packit 3d4ae9
		cal_base_shell_sidebar);
Packit 3d4ae9
Packit 3d4ae9
	g_signal_connect (cal_base_shell_sidebar->priv->selector,
Packit 3d4ae9
		"source-unselected", G_CALLBACK (e_cal_base_shell_sidebar_source_unselected),
Packit 3d4ae9
		cal_base_shell_sidebar);
Packit 3d4ae9
Packit 3d4ae9
	/* Restore widget state from the last session once
Packit 3d4ae9
	 * the shell view is fully initialized and visible. */
Packit 3d4ae9
	g_signal_connect (
Packit 3d4ae9
		shell_window, restore_state_signal,
Packit 3d4ae9
		G_CALLBACK (cal_base_shell_sidebar_restore_state_cb),
Packit 3d4ae9
		cal_base_shell_sidebar);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
cal_base_shell_sidebar_dispose (GObject *object)
Packit 3d4ae9
{
Packit 3d4ae9
	ECalBaseShellSidebar *cal_base_shell_sidebar;
Packit 3d4ae9
Packit 3d4ae9
	cal_base_shell_sidebar = E_CAL_BASE_SHELL_SIDEBAR (object);
Packit 3d4ae9
Packit 3d4ae9
	if (cal_base_shell_sidebar->priv->date_navigator_scroll_event_handler_id > 0 &&
Packit 3d4ae9
	    cal_base_shell_sidebar->priv->date_navigator) {
Packit 3d4ae9
		g_signal_handler_disconnect (cal_base_shell_sidebar->priv->date_navigator,
Packit 3d4ae9
			cal_base_shell_sidebar->priv->date_navigator_scroll_event_handler_id);
Packit 3d4ae9
		cal_base_shell_sidebar->priv->date_navigator_scroll_event_handler_id = 0;
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	cal_base_shell_sidebar->priv->date_navigator = NULL;
Packit 3d4ae9
	cal_base_shell_sidebar->priv->selector = NULL;
Packit 3d4ae9
	cal_base_shell_sidebar->priv->paned = NULL;
Packit 3d4ae9
Packit 3d4ae9
	/* Chain up to parent's method. */
Packit 3d4ae9
	G_OBJECT_CLASS (e_cal_base_shell_sidebar_parent_class)->dispose (object);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
cal_base_shell_sidebar_finalize (GObject *object)
Packit 3d4ae9
{
Packit 3d4ae9
	ECalBaseShellSidebar *cal_base_shell_sidebar;
Packit 3d4ae9
Packit 3d4ae9
	cal_base_shell_sidebar = E_CAL_BASE_SHELL_SIDEBAR (object);
Packit 3d4ae9
Packit 3d4ae9
	g_hash_table_destroy (cal_base_shell_sidebar->priv->selected_uids);
Packit 3d4ae9
	cal_base_shell_sidebar->priv->selected_uids = NULL;
Packit 3d4ae9
Packit 3d4ae9
	/* Chain up to parent's method. */
Packit 3d4ae9
	G_OBJECT_CLASS (e_cal_base_shell_sidebar_parent_class)->finalize (object);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
e_cal_base_shell_sidebar_class_init (ECalBaseShellSidebarClass *class)
Packit 3d4ae9
{
Packit 3d4ae9
	GObjectClass *object_class;
Packit 3d4ae9
	EShellSidebarClass *shell_sidebar_class;
Packit 3d4ae9
Packit 3d4ae9
	g_type_class_add_private (class, sizeof (ECalBaseShellSidebarPrivate));
Packit 3d4ae9
Packit 3d4ae9
	object_class = G_OBJECT_CLASS (class);
Packit 3d4ae9
	object_class->get_property = cal_base_shell_sidebar_get_property;
Packit 3d4ae9
	object_class->constructed = cal_base_shell_sidebar_constructed;
Packit 3d4ae9
	object_class->dispose = cal_base_shell_sidebar_dispose;
Packit 3d4ae9
	object_class->finalize = cal_base_shell_sidebar_finalize;
Packit 3d4ae9
Packit 3d4ae9
	shell_sidebar_class = E_SHELL_SIDEBAR_CLASS (class);
Packit 3d4ae9
	shell_sidebar_class->check_state = cal_base_shell_sidebar_check_state;
Packit 3d4ae9
Packit 3d4ae9
	g_object_class_install_property (
Packit 3d4ae9
		object_class,
Packit 3d4ae9
		PROP_SELECTOR,
Packit 3d4ae9
		g_param_spec_object (
Packit 3d4ae9
			"selector",
Packit 3d4ae9
			"Source Selector Widget",
Packit 3d4ae9
			"This widget displays groups of calendars",
Packit 3d4ae9
			E_TYPE_SOURCE_SELECTOR,
Packit 3d4ae9
			G_PARAM_READABLE));
Packit 3d4ae9
Packit 3d4ae9
	g_object_class_install_property (
Packit 3d4ae9
		object_class,
Packit 3d4ae9
		PROP_DATE_NAVIGATOR,
Packit 3d4ae9
		g_param_spec_object (
Packit 3d4ae9
			"date-navigator",
Packit 3d4ae9
			"Date Navigator Widget",
Packit 3d4ae9
			"This widget displays a miniature calendar",
Packit 3d4ae9
			E_TYPE_CALENDAR,
Packit 3d4ae9
			G_PARAM_READABLE));
Packit 3d4ae9
Packit 3d4ae9
	signals[CLIENT_OPENED] = g_signal_new (
Packit 3d4ae9
		"client-opened",
Packit 3d4ae9
		G_OBJECT_CLASS_TYPE (object_class),
Packit 3d4ae9
		G_SIGNAL_RUN_LAST,
Packit 3d4ae9
		G_STRUCT_OFFSET (ECalBaseShellSidebarClass, client_opened),
Packit 3d4ae9
		NULL, NULL,
Packit 3d4ae9
		g_cclosure_marshal_VOID__OBJECT,
Packit 3d4ae9
		G_TYPE_NONE, 1,
Packit 3d4ae9
		E_TYPE_CAL_CLIENT);
Packit 3d4ae9
Packit 3d4ae9
	signals[CLIENT_CLOSED] = g_signal_new (
Packit 3d4ae9
		"client-closed",
Packit 3d4ae9
		G_OBJECT_CLASS_TYPE (object_class),
Packit 3d4ae9
		G_SIGNAL_RUN_LAST,
Packit 3d4ae9
		G_STRUCT_OFFSET (ECalBaseShellSidebarClass, client_closed),
Packit 3d4ae9
		NULL, NULL,
Packit 3d4ae9
		g_cclosure_marshal_VOID__OBJECT,
Packit 3d4ae9
		G_TYPE_NONE, 1,
Packit 3d4ae9
		E_TYPE_SOURCE);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
e_cal_base_shell_sidebar_class_finalize (ECalBaseShellSidebarClass *class)
Packit 3d4ae9
{
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
static void
Packit 3d4ae9
e_cal_base_shell_sidebar_init (ECalBaseShellSidebar *cal_base_shell_sidebar)
Packit 3d4ae9
{
Packit 3d4ae9
	cal_base_shell_sidebar->priv = E_CAL_BASE_SHELL_SIDEBAR_GET_PRIVATE (cal_base_shell_sidebar);
Packit 3d4ae9
	cal_base_shell_sidebar->priv->selected_uids =
Packit 3d4ae9
		g_hash_table_new_full (g_str_hash, g_str_equal, g_free, cancel_and_unref);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
void
Packit 3d4ae9
e_cal_base_shell_sidebar_type_register (GTypeModule *type_module)
Packit 3d4ae9
{
Packit 3d4ae9
	/* XXX G_DEFINE_DYNAMIC_TYPE declares a static type registration
Packit 3d4ae9
	 *     function, so we have to wrap it with a public function in
Packit 3d4ae9
	 *     order to register types from a separate compilation unit. */
Packit 3d4ae9
	e_cal_base_shell_sidebar_register_type (type_module);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
GtkWidget *
Packit 3d4ae9
e_cal_base_shell_sidebar_new (EShellView *shell_view)
Packit 3d4ae9
{
Packit 3d4ae9
	g_return_val_if_fail (E_IS_SHELL_VIEW (shell_view), NULL);
Packit 3d4ae9
Packit 3d4ae9
	return g_object_new (
Packit 3d4ae9
		E_TYPE_CAL_BASE_SHELL_SIDEBAR,
Packit 3d4ae9
		"shell-view", shell_view, NULL);
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
ECalendar *
Packit 3d4ae9
e_cal_base_shell_sidebar_get_date_navigator (ECalBaseShellSidebar *cal_base_shell_sidebar)
Packit 3d4ae9
{
Packit 3d4ae9
	g_return_val_if_fail (E_IS_CAL_BASE_SHELL_SIDEBAR (cal_base_shell_sidebar), NULL);
Packit 3d4ae9
Packit 3d4ae9
	return cal_base_shell_sidebar->priv->date_navigator;
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
ESourceSelector *
Packit 3d4ae9
e_cal_base_shell_sidebar_get_selector (ECalBaseShellSidebar *cal_base_shell_sidebar)
Packit 3d4ae9
{
Packit 3d4ae9
	g_return_val_if_fail (E_IS_CAL_BASE_SHELL_SIDEBAR (cal_base_shell_sidebar), NULL);
Packit 3d4ae9
Packit 3d4ae9
	return cal_base_shell_sidebar->priv->selector;
Packit 3d4ae9
}
Packit 3d4ae9
Packit 3d4ae9
void
Packit 3d4ae9
e_cal_base_shell_sidebar_ensure_sources_open (ECalBaseShellSidebar *cal_base_shell_sidebar)
Packit 3d4ae9
{
Packit 3d4ae9
	GList *selected, *link;
Packit 3d4ae9
	ESourceSelector *selector;
Packit 3d4ae9
Packit 3d4ae9
	g_return_if_fail (E_IS_CAL_BASE_SHELL_SIDEBAR (cal_base_shell_sidebar));
Packit 3d4ae9
Packit 3d4ae9
	selector = cal_base_shell_sidebar->priv->selector;
Packit 3d4ae9
	g_return_if_fail (E_IS_SOURCE_SELECTOR (selector));
Packit 3d4ae9
Packit 3d4ae9
	selected = e_source_selector_get_selection (selector);
Packit 3d4ae9
	for (link = selected; link; link = g_list_next (link)) {
Packit 3d4ae9
		ESource *source = link->data;
Packit 3d4ae9
Packit 3d4ae9
		e_cal_base_shell_sidebar_ensure_source_opened (cal_base_shell_sidebar, source);
Packit 3d4ae9
	}
Packit 3d4ae9
Packit 3d4ae9
	g_list_free_full (selected, g_object_unref);
Packit 3d4ae9
}