|
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 |
}
|