Blame src/calendar/gui/e-comp-editor.c

Packit Service de44cd
/*
Packit Service de44cd
 * Copyright (C) 2015 Red Hat, Inc. (www.redhat.com)
Packit Service de44cd
 *
Packit Service de44cd
 * This program is free software: you can redistribute it and/or modify it
Packit Service de44cd
 * under the terms of the GNU General Public License as published by
Packit Service de44cd
 * the Free Software Foundation.
Packit Service de44cd
 *
Packit Service de44cd
 * This program is distributed in the hope that it will be useful, but
Packit Service de44cd
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit Service de44cd
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
Packit Service de44cd
 * for more details.
Packit Service de44cd
 *
Packit Service de44cd
 * You should have received a copy of the GNU General Public License
Packit Service de44cd
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Packit Service de44cd
 *
Packit Service de44cd
 */
Packit Service de44cd
Packit Service de44cd
#include "evolution-config.h"
Packit Service de44cd
Packit Service de44cd
#include <glib/gi18n-lib.h>
Packit Service de44cd
#include <gtk/gtk.h>
Packit Service de44cd
Packit Service de44cd
#include <libedataserver/libedataserver.h>
Packit Service de44cd
#include <libecal/libecal.h>
Packit Service de44cd
#include <e-util/e-util.h>
Packit Service de44cd
Packit Service de44cd
#include "calendar-config.h"
Packit Service de44cd
#include "comp-util.h"
Packit Service de44cd
#include "e-cal-dialogs.h"
Packit Service de44cd
#include "itip-utils.h"
Packit Service de44cd
#include "print.h"
Packit Service de44cd
Packit Service de44cd
#include "e-comp-editor-page-general.h"
Packit Service de44cd
#include "e-comp-editor-page-attachments.h"
Packit Service de44cd
#include "e-comp-editor-event.h"
Packit Service de44cd
#include "e-comp-editor-memo.h"
Packit Service de44cd
#include "e-comp-editor-task.h"
Packit Service de44cd
Packit Service de44cd
#include "e-comp-editor.h"
Packit Service de44cd
Packit Service de44cd
struct _ECompEditorPrivate {
Packit Service de44cd
	EAlertBar *alert_bar; /* not referenced */
Packit Service de44cd
	EActivityBar *activity_bar; /* not referenced */
Packit Service de44cd
	GtkNotebook *content; /* not referenced */
Packit Service de44cd
Packit Service de44cd
	EAlert *validation_alert;
Packit Service de44cd
Packit Service de44cd
	EShell *shell;
Packit Service de44cd
	GSettings *calendar_settings;
Packit Service de44cd
	ESource *origin_source;
Packit Service de44cd
	icalcomponent *component;
Packit Service de44cd
	guint32 flags;
Packit Service de44cd
Packit Service de44cd
	EFocusTracker *focus_tracker;
Packit Service de44cd
	GtkUIManager *ui_manager;
Packit Service de44cd
Packit Service de44cd
	GSList *pages; /* ECompEditorPage * */
Packit Service de44cd
	gulong show_attendees_handler_id;
Packit Service de44cd
Packit Service de44cd
	ECompEditorPageGeneral *page_general; /* special page, can be added only once; not referenced */
Packit Service de44cd
Packit Service de44cd
	EActivity *target_client_opening;
Packit Service de44cd
Packit Service de44cd
	ECalClient *source_client;
Packit Service de44cd
	ECalClient *target_client;
Packit Service de44cd
	gchar *cal_email_address;
Packit Service de44cd
	gchar *alarm_email_address;
Packit Service de44cd
	gboolean changed;
Packit Service de44cd
	guint updating;
Packit Service de44cd
	gchar *title_suffix;
Packit Service de44cd
Packit Service de44cd
	ECompEditorPropertyPart *dtstart_part;
Packit Service de44cd
	ECompEditorPropertyPart *dtend_part;
Packit Service de44cd
Packit Service de44cd
	GtkWidget *restore_focus;
Packit Service de44cd
};
Packit Service de44cd
Packit Service de44cd
enum {
Packit Service de44cd
	PROP_0,
Packit Service de44cd
	PROP_ALARM_EMAIL_ADDRESS,
Packit Service de44cd
	PROP_CAL_EMAIL_ADDRESS,
Packit Service de44cd
	PROP_CHANGED,
Packit Service de44cd
	PROP_COMPONENT,
Packit Service de44cd
	PROP_FLAGS,
Packit Service de44cd
	PROP_ORIGIN_SOURCE,
Packit Service de44cd
	PROP_SHELL,
Packit Service de44cd
	PROP_SOURCE_CLIENT,
Packit Service de44cd
	PROP_TARGET_CLIENT,
Packit Service de44cd
	PROP_TITLE_SUFFIX
Packit Service de44cd
};
Packit Service de44cd
Packit Service de44cd
enum {
Packit Service de44cd
	TIMES_CHANGED,
Packit Service de44cd
	OBJECT_CREATED,
Packit Service de44cd
	EDITOR_CLOSED,
Packit Service de44cd
	LAST_SIGNAL
Packit Service de44cd
};
Packit Service de44cd
Packit Service de44cd
static guint signals[LAST_SIGNAL];
Packit Service de44cd
Packit Service de44cd
static GSList *opened_editors = NULL;
Packit Service de44cd
Packit Service de44cd
static void e_comp_editor_alert_sink_iface_init (EAlertSinkInterface *iface);
Packit Service de44cd
Packit Service de44cd
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (ECompEditor, e_comp_editor, GTK_TYPE_WINDOW,
Packit Service de44cd
	G_IMPLEMENT_INTERFACE (E_TYPE_ALERT_SINK, e_comp_editor_alert_sink_iface_init)
Packit Service de44cd
	G_IMPLEMENT_INTERFACE (E_TYPE_EXTENSIBLE, NULL))
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ece_restore_focus (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->restore_focus) {
Packit Service de44cd
		if (GTK_IS_ENTRY (comp_editor->priv->restore_focus))
Packit Service dc8d6a
			gtk_entry_grab_focus_without_selecting (GTK_ENTRY (comp_editor->priv->restore_focus));
Packit Service dc8d6a
		else
Packit Service dc8d6a
			gtk_widget_grab_focus (comp_editor->priv->restore_focus);
Packit Service de44cd
Packit Service de44cd
		comp_editor->priv->restore_focus = NULL;
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_enable (ECompEditor *comp_editor,
Packit Service de44cd
		      gboolean enable)
Packit Service de44cd
{
Packit Service de44cd
	GtkActionGroup *group;
Packit Service de44cd
	GtkWidget *current_focus;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	current_focus = gtk_window_get_focus (GTK_WINDOW (comp_editor));
Packit Service de44cd
Packit Service de44cd
	gtk_widget_set_sensitive (GTK_WIDGET (comp_editor->priv->content), enable);
Packit Service de44cd
Packit Service de44cd
	group = e_comp_editor_get_action_group (comp_editor, "individual");
Packit Service de44cd
	gtk_action_group_set_sensitive (group, enable);
Packit Service de44cd
Packit Service de44cd
	group = e_comp_editor_get_action_group (comp_editor, "core");
Packit Service de44cd
	gtk_action_group_set_sensitive (group, enable);
Packit Service de44cd
Packit Service de44cd
	group = e_comp_editor_get_action_group (comp_editor, "editable");
Packit Service de44cd
	gtk_action_group_set_sensitive (group, enable);
Packit Service de44cd
Packit Service de44cd
	if (enable) {
Packit Service de44cd
		e_comp_editor_sensitize_widgets (comp_editor);
Packit Service de44cd
		ece_restore_focus (comp_editor);
Packit Service de44cd
	} else {
Packit Service de44cd
		comp_editor->priv->restore_focus = current_focus;
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ece_set_attendees_for_delegation (ECalComponent *comp,
Packit Service de44cd
				  const gchar *address)
Packit Service de44cd
{
Packit Service de44cd
	icalproperty *prop;
Packit Service de44cd
	icalparameter *param;
Packit Service de44cd
	icalcomponent *icalcomp;
Packit Service de44cd
	gboolean again;
Packit Service de44cd
Packit Service de44cd
	icalcomp = e_cal_component_get_icalcomponent (comp);
Packit Service de44cd
Packit Service de44cd
	for (prop = icalcomponent_get_first_property (icalcomp, ICAL_ATTENDEE_PROPERTY);
Packit Service de44cd
	     prop;
Packit Service de44cd
	     prop = again ? icalcomponent_get_first_property (icalcomp, ICAL_ATTENDEE_PROPERTY) :
Packit Service de44cd
	     icalcomponent_get_next_property (icalcomp, ICAL_ATTENDEE_PROPERTY)) {
Packit Service de44cd
		const gchar *attendee = icalproperty_get_attendee (prop);
Packit Service de44cd
		const gchar *delfrom = NULL;
Packit Service de44cd
Packit Service de44cd
		again = FALSE;
Packit Service de44cd
		param = icalproperty_get_first_parameter (prop, ICAL_DELEGATEDFROM_PARAMETER);
Packit Service de44cd
		if (param)
Packit Service de44cd
			delfrom = icalparameter_get_delegatedfrom (param);
Packit Service de44cd
		if (!(g_str_equal (itip_strip_mailto (attendee), address) ||
Packit Service de44cd
		     ((delfrom && *delfrom) && g_str_equal (itip_strip_mailto (delfrom), address)))) {
Packit Service de44cd
			icalcomponent_remove_property (icalcomp, prop);
Packit Service de44cd
			icalproperty_free (prop);
Packit Service de44cd
			again = TRUE;
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/* Utility function to get the mime-attachment list from the attachment
Packit Service de44cd
 * bar for sending the comp via itip. The list and its contents must
Packit Service de44cd
 * be freed by the caller.
Packit Service de44cd
 */
Packit Service de44cd
static GSList *
Packit Service de44cd
ece_get_mime_attach_list (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditorPage *page_attachments;
Packit Service de44cd
	EAttachmentStore *store;
Packit Service de44cd
	GtkTreeModel *model;
Packit Service de44cd
	GtkTreeIter iter;
Packit Service de44cd
	struct CalMimeAttach *cal_mime_attach;
Packit Service de44cd
	GSList *attach_list = NULL;
Packit Service de44cd
	gboolean valid;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
Packit Service de44cd
	page_attachments = e_comp_editor_get_page (comp_editor, E_TYPE_COMP_EDITOR_PAGE_ATTACHMENTS);
Packit Service de44cd
	if (!page_attachments)
Packit Service de44cd
		return NULL;
Packit Service de44cd
Packit Service de44cd
	store = e_comp_editor_page_attachments_get_store (E_COMP_EDITOR_PAGE_ATTACHMENTS (page_attachments));
Packit Service de44cd
	if (!store)
Packit Service de44cd
		return NULL;
Packit Service de44cd
Packit Service de44cd
	model = GTK_TREE_MODEL (store);
Packit Service de44cd
	valid = gtk_tree_model_get_iter_first (model, &iter);
Packit Service de44cd
Packit Service de44cd
	while (valid) {
Packit Service de44cd
		EAttachment *attachment;
Packit Service de44cd
		CamelDataWrapper *wrapper;
Packit Service de44cd
		CamelMimePart *mime_part;
Packit Service de44cd
		CamelStream *stream;
Packit Service de44cd
		GByteArray *byte_array;
Packit Service de44cd
		guchar *buffer = NULL;
Packit Service de44cd
		const gchar *description;
Packit Service de44cd
		const gchar *disposition;
Packit Service de44cd
		gint column_id;
Packit Service de44cd
Packit Service de44cd
		column_id = E_ATTACHMENT_STORE_COLUMN_ATTACHMENT;
Packit Service de44cd
		gtk_tree_model_get (model, &iter, column_id, &attachment, -1);
Packit Service de44cd
		mime_part = e_attachment_ref_mime_part (attachment);
Packit Service de44cd
		g_object_unref (attachment);
Packit Service de44cd
Packit Service de44cd
		valid = gtk_tree_model_iter_next (model, &iter);
Packit Service de44cd
Packit Service de44cd
		if (mime_part == NULL)
Packit Service de44cd
			continue;
Packit Service de44cd
Packit Service de44cd
		cal_mime_attach = g_malloc0 (sizeof (struct CalMimeAttach));
Packit Service de44cd
		wrapper = camel_medium_get_content (CAMEL_MEDIUM (mime_part));
Packit Service de44cd
Packit Service de44cd
		byte_array = g_byte_array_new ();
Packit Service de44cd
		stream = camel_stream_mem_new_with_byte_array (byte_array);
Packit Service de44cd
Packit Service de44cd
		camel_data_wrapper_decode_to_stream_sync (
Packit Service de44cd
			wrapper, stream, NULL, NULL);
Packit Service de44cd
		buffer = g_memdup (byte_array->data, byte_array->len);
Packit Service de44cd
Packit Service de44cd
		camel_mime_part_set_content_id (mime_part, NULL);
Packit Service de44cd
Packit Service de44cd
		cal_mime_attach->encoded_data = (gchar *) buffer;
Packit Service de44cd
		cal_mime_attach->length = byte_array->len;
Packit Service de44cd
		cal_mime_attach->filename =
Packit Service de44cd
			g_strdup (camel_mime_part_get_filename (mime_part));
Packit Service de44cd
		description = camel_mime_part_get_description (mime_part);
Packit Service de44cd
		if (description == NULL || *description == '\0')
Packit Service de44cd
			description = _("attachment");
Packit Service de44cd
		cal_mime_attach->description = g_strdup (description);
Packit Service de44cd
		cal_mime_attach->content_type = camel_data_wrapper_get_mime_type (wrapper);
Packit Service de44cd
		cal_mime_attach->content_id = g_strdup (
Packit Service de44cd
			camel_mime_part_get_content_id (mime_part));
Packit Service de44cd
Packit Service de44cd
		disposition = camel_mime_part_get_disposition (mime_part);
Packit Service de44cd
		cal_mime_attach->disposition =
Packit Service de44cd
			(disposition != NULL) &&
Packit Service de44cd
			(g_ascii_strcasecmp (disposition, "inline") == 0);
Packit Service de44cd
Packit Service de44cd
		attach_list = g_slist_append (attach_list, cal_mime_attach);
Packit Service de44cd
Packit Service de44cd
		g_object_unref (mime_part);
Packit Service de44cd
		g_object_unref (stream);
Packit Service de44cd
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	return attach_list;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_set_component (ECompEditor *comp_editor,
Packit Service de44cd
			     const icalcomponent *component)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
	g_return_if_fail (component != NULL);
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->component)
Packit Service de44cd
		icalcomponent_free (comp_editor->priv->component);
Packit Service de44cd
	comp_editor->priv->component = icalcomponent_new_clone ((icalcomponent *) component);
Packit Service de44cd
Packit Service de44cd
	g_warn_if_fail (comp_editor->priv->component != NULL);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
typedef struct _SaveData {
Packit Service de44cd
	ECompEditor *comp_editor;
Packit Service de44cd
	ECalClient *source_client;
Packit Service de44cd
	ECalClient *target_client;
Packit Service de44cd
	icalcomponent *component;
Packit Service de44cd
	gboolean with_send;
Packit Service de44cd
	gboolean close_after_save;
Packit Service de44cd
	ECalObjModType recur_mod;
Packit Service de44cd
	gboolean success;
Packit Service de44cd
	GError *error;
Packit Service de44cd
	gchar *alert_ident;
Packit Service de44cd
	gchar *alert_arg_0;
Packit Service de44cd
Packit Service de44cd
	gboolean object_created;
Packit Service de44cd
	ECalComponentItipMethod first_send;
Packit Service de44cd
	ECalComponentItipMethod second_send;
Packit Service de44cd
	ECalComponent *send_comp;
Packit Service de44cd
	EActivity *send_activity;
Packit Service de44cd
	gboolean strip_alarms;
Packit Service de44cd
	gboolean only_new_attendees;
Packit Service de44cd
	GSList *mime_attach_list;
Packit Service de44cd
} SaveData;
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
save_data_free (SaveData *sd)
Packit Service de44cd
{
Packit Service de44cd
	if (sd) {
Packit Service de44cd
		e_comp_editor_enable (sd->comp_editor, TRUE);
Packit Service de44cd
Packit Service de44cd
		if (sd->success) {
Packit Service de44cd
			if (sd->close_after_save) {
Packit Service de44cd
				g_signal_emit (sd->comp_editor, signals[EDITOR_CLOSED], 0, TRUE, NULL);
Packit Service de44cd
				gtk_widget_destroy (GTK_WIDGET (sd->comp_editor));
Packit Service de44cd
			} else {
Packit Service de44cd
				e_comp_editor_set_component (sd->comp_editor, sd->component);
Packit Service de44cd
Packit Service de44cd
				e_comp_editor_fill_widgets (sd->comp_editor, sd->component);
Packit Service de44cd
Packit Service de44cd
				g_clear_object (&sd->comp_editor->priv->source_client);
Packit Service de44cd
				sd->comp_editor->priv->source_client = g_object_ref (sd->target_client);
Packit Service de44cd
Packit Service de44cd
				sd->comp_editor->priv->flags = sd->comp_editor->priv->flags & (~E_COMP_EDITOR_FLAG_IS_NEW);
Packit Service de44cd
Packit Service de44cd
				e_comp_editor_sensitize_widgets (sd->comp_editor);
Packit Service de44cd
				e_comp_editor_set_changed (sd->comp_editor, FALSE);
Packit Service de44cd
			}
Packit Service de44cd
		} else if (sd->alert_ident) {
Packit Service de44cd
			e_alert_submit (
Packit Service de44cd
				E_ALERT_SINK (sd->comp_editor), sd->alert_ident, sd->alert_arg_0,
Packit Service de44cd
				sd->error ? sd->error->message : _("Unknown error"), NULL);
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		if (sd->send_activity && e_activity_get_state (sd->send_activity) != E_ACTIVITY_CANCELLED)
Packit Service de44cd
			e_activity_set_state (sd->send_activity, E_ACTIVITY_COMPLETED);
Packit Service de44cd
Packit Service de44cd
		g_clear_object (&sd->comp_editor);
Packit Service de44cd
		g_clear_object (&sd->source_client);
Packit Service de44cd
		g_clear_object (&sd->target_client);
Packit Service de44cd
		g_clear_object (&sd->send_comp);
Packit Service de44cd
		g_clear_object (&sd->send_activity);
Packit Service de44cd
		g_clear_error (&sd->error);
Packit Service de44cd
		if (sd->component)
Packit Service de44cd
			icalcomponent_free (sd->component);
Packit Service de44cd
		g_slist_free_full (sd->mime_attach_list, itip_cal_mime_attach_free);
Packit Service de44cd
		g_free (sd->alert_ident);
Packit Service de44cd
		g_free (sd->alert_arg_0);
Packit Service de44cd
		g_free (sd);
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
ece_send_process_method (SaveData *sd,
Packit Service de44cd
			 ECalComponentItipMethod send_method,
Packit Service de44cd
			 ECalComponent *send_comp,
Packit Service de44cd
			 ESourceRegistry *registry,
Packit Service de44cd
			 GCancellable *cancellable,
Packit Service de44cd
			 GAsyncReadyCallback callback,
Packit Service de44cd
			 gpointer user_data)
Packit Service de44cd
{
Packit Service de44cd
	GSList *mime_attach_list = NULL;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (sd != NULL, FALSE);
Packit Service de44cd
	g_return_val_if_fail (E_IS_CAL_COMPONENT (send_comp), FALSE);
Packit Service de44cd
	g_return_val_if_fail (send_method != E_CAL_COMPONENT_METHOD_NONE, FALSE);
Packit Service de44cd
Packit Service de44cd
	if (e_cal_component_has_attachments (send_comp) &&
Packit Service de44cd
	    e_client_check_capability (E_CLIENT (sd->target_client), CAL_STATIC_CAPABILITY_CREATE_MESSAGES)) {
Packit Service de44cd
		/* Clone the component with attachments set to CID:...  */
Packit Service de44cd
		GSList *attach_list = NULL;
Packit Service de44cd
		GSList *attach;
Packit Service de44cd
Packit Service de44cd
		/* mime_attach_list is freed by itip_send_component() */
Packit Service de44cd
		mime_attach_list = sd->mime_attach_list;
Packit Service de44cd
		sd->mime_attach_list = NULL;
Packit Service de44cd
Packit Service de44cd
		for (attach = mime_attach_list; attach; attach = attach->next) {
Packit Service de44cd
			struct CalMimeAttach *cma = (struct CalMimeAttach *) attach->data;
Packit Service de44cd
Packit Service de44cd
			attach_list = g_slist_append (
Packit Service de44cd
				attach_list, g_strconcat (
Packit Service de44cd
				"cid:", cma->content_id, NULL));
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		if (attach_list) {
Packit Service de44cd
			e_cal_component_set_attachment_list (send_comp, attach_list);
Packit Service de44cd
Packit Service de44cd
			g_slist_free_full (attach_list, g_free);
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	itip_send_component (
Packit Service de44cd
		registry, send_method, send_comp, sd->target_client,
Packit Service de44cd
		NULL, mime_attach_list, NULL, sd->strip_alarms,
Packit Service de44cd
		sd->only_new_attendees, FALSE,
Packit Service de44cd
		cancellable, callback, user_data);
Packit Service de44cd
Packit Service de44cd
	return TRUE;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ecep_second_send_processed_cb (GObject *source_object,
Packit Service de44cd
			       GAsyncResult *result,
Packit Service de44cd
			       gpointer user_data)
Packit Service de44cd
{
Packit Service de44cd
	SaveData *sd = user_data;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (sd != NULL);
Packit Service de44cd
Packit Service de44cd
	sd->success = itip_send_component_finish (result, &sd->error);
Packit Service de44cd
Packit Service de44cd
	save_data_free (sd);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ecep_first_send_processed_cb (GObject *source_object,
Packit Service de44cd
			      GAsyncResult *result,
Packit Service de44cd
			      gpointer user_data)
Packit Service de44cd
{
Packit Service de44cd
	SaveData *sd = user_data;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (sd != NULL);
Packit Service de44cd
Packit Service de44cd
	sd->success = itip_send_component_finish (result, &sd->error);
Packit Service de44cd
	if (!sd->success || sd->second_send == E_CAL_COMPONENT_METHOD_NONE) {
Packit Service de44cd
		save_data_free (sd);
Packit Service de44cd
	} else {
Packit Service de44cd
		sd->success = ece_send_process_method (sd, sd->second_send, sd->send_comp,
Packit Service de44cd
			e_shell_get_registry (sd->comp_editor->priv->shell),
Packit Service de44cd
			e_activity_get_cancellable (sd->send_activity),
Packit Service de44cd
			ecep_second_send_processed_cb, sd);
Packit Service de44cd
		if (!sd->success)
Packit Service de44cd
			save_data_free (sd);
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ece_prepare_send_component_done (gpointer ptr)
Packit Service de44cd
{
Packit Service de44cd
	SaveData *sd = ptr;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (sd != NULL);
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (sd->comp_editor));
Packit Service de44cd
	g_return_if_fail (sd->send_activity != NULL);
Packit Service de44cd
Packit Service de44cd
	sd->success = ece_send_process_method (sd, sd->first_send, sd->send_comp,
Packit Service de44cd
		e_shell_get_registry (sd->comp_editor->priv->shell),
Packit Service de44cd
		e_activity_get_cancellable (sd->send_activity),
Packit Service de44cd
		ecep_first_send_processed_cb, sd);
Packit Service de44cd
	if (!sd->success)
Packit Service de44cd
		save_data_free (sd);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ece_prepare_send_component_thread (EAlertSinkThreadJobData *job_data,
Packit Service de44cd
				   gpointer user_data,
Packit Service de44cd
				   GCancellable *cancellable,
Packit Service de44cd
				   GError **error)
Packit Service de44cd
{
Packit Service de44cd
	SaveData *sd = user_data;
Packit Service de44cd
	const gchar *alert_ident;
Packit Service de44cd
	ECalComponent *send_comp = NULL;
Packit Service de44cd
	guint32 flags;
Packit Service de44cd
	ESourceRegistry *registry;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (sd != NULL);
Packit Service de44cd
	g_return_if_fail (E_IS_CAL_CLIENT (sd->target_client));
Packit Service de44cd
	g_return_if_fail (sd->component != NULL);
Packit Service de44cd
Packit Service de44cd
	while (!sd->send_activity) {
Packit Service de44cd
		/* Give the main thread a chance to set this object
Packit Service de44cd
		   and give it a 50 milliseconds delay too */
Packit Service de44cd
		g_thread_yield ();
Packit Service de44cd
		g_usleep (50000);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	switch (icalcomponent_isa (sd->component)) {
Packit Service de44cd
		case ICAL_VEVENT_COMPONENT:
Packit Service de44cd
			alert_ident = "calendar:failed-send-event";
Packit Service de44cd
			break;
Packit Service de44cd
		case ICAL_VJOURNAL_COMPONENT:
Packit Service de44cd
			alert_ident = "calendar:failed-send-memo";
Packit Service de44cd
			break;
Packit Service de44cd
		case ICAL_VTODO_COMPONENT:
Packit Service de44cd
			alert_ident = "calendar:failed-send-task";
Packit Service de44cd
			break;
Packit Service de44cd
		default:
Packit Service de44cd
			g_warning ("%s: Cannot send component of kind %d", G_STRFUNC, icalcomponent_isa (sd->component));
Packit Service de44cd
			sd->success = FALSE;
Packit Service de44cd
			sd->alert_ident = g_strdup ("calendar:failed-send-event");
Packit Service de44cd
			return;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	g_free (sd->alert_ident);
Packit Service de44cd
	sd->alert_ident = g_strdup (alert_ident);
Packit Service de44cd
Packit Service de44cd
	e_alert_sink_thread_job_set_alert_ident (job_data, alert_ident);
Packit Service de44cd
Packit Service de44cd
	flags = e_comp_editor_get_flags (sd->comp_editor);
Packit Service de44cd
	registry = e_shell_get_registry (sd->comp_editor->priv->shell);
Packit Service de44cd
Packit Service de44cd
	if (sd->recur_mod == E_CAL_OBJ_MOD_ALL && e_cal_component_is_instance (sd->send_comp)) {
Packit Service de44cd
		/* Ensure we send the master object, not the instance only */
Packit Service de44cd
		icalcomponent *icalcomp = NULL;
Packit Service de44cd
		const gchar *uid = NULL;
Packit Service de44cd
Packit Service de44cd
		e_cal_component_get_uid (sd->send_comp, &uid);
Packit Service de44cd
		if (e_cal_client_get_object_sync (sd->target_client, uid, NULL, &icalcomp, cancellable, NULL) &&
Packit Service de44cd
		    icalcomp != NULL) {
Packit Service de44cd
			send_comp = e_cal_component_new_from_icalcomponent (icalcomp);
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (!send_comp)
Packit Service de44cd
		send_comp = e_cal_component_clone (sd->send_comp);
Packit Service de44cd
Packit Service de44cd
	cal_comp_util_copy_new_attendees (send_comp, sd->send_comp);
Packit Service de44cd
Packit Service de44cd
	/* The user updates the delegated status to the Organizer,
Packit Service de44cd
	 * so remove all other attendees. */
Packit Service de44cd
	if ((flags & E_COMP_EDITOR_FLAG_DELEGATE) != 0) {
Packit Service de44cd
		gchar *address;
Packit Service de44cd
Packit Service de44cd
		address = itip_get_comp_attendee (registry, send_comp, sd->target_client);
Packit Service de44cd
Packit Service de44cd
		if (address) {
Packit Service de44cd
			ece_set_attendees_for_delegation (send_comp, address);
Packit Service de44cd
			g_free (address);
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	g_clear_object (&sd->send_comp);
Packit Service de44cd
	sd->send_comp = send_comp;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ece_save_component_done (gpointer ptr)
Packit Service de44cd
{
Packit Service de44cd
	SaveData *sd = ptr;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (sd != NULL);
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (sd->comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (sd->success) {
Packit Service de44cd
		ECalComponent *comp;
Packit Service de44cd
		gboolean delegated, is_new_meeting;
Packit Service de44cd
		gboolean only_new_attendees = FALSE;
Packit Service de44cd
		gboolean strip_alarms = TRUE;
Packit Service de44cd
		guint32 flags;
Packit Service de44cd
Packit Service de44cd
		if (sd->object_created)
Packit Service de44cd
			g_signal_emit (sd->comp_editor, signals[OBJECT_CREATED], 0, NULL);
Packit Service de44cd
Packit Service de44cd
		comp = e_cal_component_new_from_icalcomponent (icalcomponent_new_clone (sd->component));
Packit Service de44cd
		if (sd->comp_editor->priv->page_general) {
Packit Service de44cd
			GSList *added_attendees;
Packit Service de44cd
Packit Service de44cd
			added_attendees = e_comp_editor_page_general_get_added_attendees (sd->comp_editor->priv->page_general);
Packit Service de44cd
			cal_comp_util_set_added_attendees_mails (comp, added_attendees);
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		flags = e_comp_editor_get_flags (sd->comp_editor);
Packit Service de44cd
		is_new_meeting = (flags & E_COMP_EDITOR_FLAG_WITH_ATTENDEES) == 0 ||
Packit Service de44cd
			(flags & E_COMP_EDITOR_FLAG_IS_NEW) != 0;
Packit Service de44cd
		delegated = (flags & E_COMP_EDITOR_FLAG_DELEGATE) != 0 &&
Packit Service de44cd
			e_cal_client_check_save_schedules (sd->target_client);
Packit Service de44cd
Packit Service de44cd
		if (delegated || (sd->with_send && e_cal_dialogs_send_component (
Packit Service de44cd
			GTK_WINDOW (sd->comp_editor), sd->target_client, comp,
Packit Service de44cd
			is_new_meeting, &strip_alarms, &only_new_attendees))) {
Packit Service de44cd
			ESourceRegistry *registry;
Packit Service de44cd
			EActivity *activity;
Packit Service de44cd
Packit Service de44cd
			registry = e_shell_get_registry (sd->comp_editor->priv->shell);
Packit Service de44cd
Packit Service de44cd
			if (delegated)
Packit Service de44cd
				only_new_attendees = FALSE;
Packit Service de44cd
Packit Service de44cd
			if ((itip_organizer_is_user (registry, comp, sd->target_client) ||
Packit Service de44cd
			     itip_sentby_is_user (registry, comp, sd->target_client))) {
Packit Service de44cd
				if (e_cal_component_get_vtype (comp) == E_CAL_COMPONENT_JOURNAL)
Packit Service de44cd
					sd->first_send = E_CAL_COMPONENT_METHOD_PUBLISH;
Packit Service de44cd
				else
Packit Service de44cd
					sd->first_send = E_CAL_COMPONENT_METHOD_REQUEST;
Packit Service de44cd
			} else {
Packit Service de44cd
				sd->first_send = E_CAL_COMPONENT_METHOD_REQUEST;
Packit Service de44cd
Packit Service de44cd
				if ((flags & E_COMP_EDITOR_FLAG_DELEGATE) != 0)
Packit Service de44cd
					sd->second_send = E_CAL_COMPONENT_METHOD_REPLY;
Packit Service de44cd
			}
Packit Service de44cd
Packit Service de44cd
			sd->mime_attach_list = ece_get_mime_attach_list (sd->comp_editor);
Packit Service de44cd
			sd->strip_alarms = strip_alarms;
Packit Service de44cd
			sd->only_new_attendees = only_new_attendees;
Packit Service de44cd
			sd->send_comp = comp;
Packit Service de44cd
			sd->success = FALSE;
Packit Service de44cd
			sd->alert_ident = g_strdup ("calendar:failed-send-event");
Packit Service de44cd
			sd->alert_arg_0 = e_util_get_source_full_name (registry, e_client_get_source (E_CLIENT (sd->target_client)));
Packit Service de44cd
Packit Service de44cd
			activity = e_alert_sink_submit_thread_job (E_ALERT_SINK (sd->comp_editor),
Packit Service de44cd
				_("Sending notifications to attendees..."), sd->alert_ident, sd->alert_arg_0,
Packit Service de44cd
				ece_prepare_send_component_thread, sd, ece_prepare_send_component_done);
Packit Service de44cd
Packit Service de44cd
			if (activity)
Packit Service de44cd
				e_activity_bar_set_activity (sd->comp_editor->priv->activity_bar, activity);
Packit Service de44cd
Packit Service de44cd
			/* The thread is waiting for this to be set first */
Packit Service de44cd
			sd->send_activity = activity;
Packit Service de44cd
Packit Service de44cd
			return;
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		g_clear_object (&comp);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	save_data_free (sd);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
ece_save_component_attachments_sync (ECalClient *cal_client,
Packit Service de44cd
				     icalcomponent *component,
Packit Service de44cd
				     GCancellable *cancellable,
Packit Service de44cd
				     GError **error)
Packit Service de44cd
{
Packit Service de44cd
	icalproperty *prop;
Packit Service de44cd
	const gchar *local_store;
Packit Service de44cd
	gchar *target_filename_prefix, *filename_prefix, *tmp;
Packit Service de44cd
	gboolean success = TRUE;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_CAL_CLIENT (cal_client), FALSE);
Packit Service de44cd
	g_return_val_if_fail (component != NULL, FALSE);
Packit Service de44cd
Packit Service de44cd
	tmp = g_strdup (icalcomponent_get_uid (component));
Packit Service de44cd
	e_filename_make_safe (tmp);
Packit Service de44cd
	filename_prefix = g_strconcat (tmp, "-", NULL);
Packit Service de44cd
	g_free (tmp);
Packit Service de44cd
Packit Service de44cd
	local_store = e_cal_client_get_local_attachment_store (cal_client);
Packit Service de44cd
	if (local_store && *local_store &&
Packit Service de44cd
	    g_mkdir_with_parents (local_store, 0700) < 0) {
Packit Service de44cd
		g_debug ("%s: Failed to create local store directory '%s'", G_STRFUNC, local_store);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	target_filename_prefix = g_build_filename (local_store, filename_prefix, NULL);
Packit Service de44cd
Packit Service de44cd
	g_free (filename_prefix);
Packit Service de44cd
Packit Service de44cd
	for (prop = icalcomponent_get_first_property (component, ICAL_ATTACH_PROPERTY);
Packit Service de44cd
	     prop && success;
Packit Service de44cd
	     prop = icalcomponent_get_next_property (component, ICAL_ATTACH_PROPERTY)) {
Packit Service de44cd
		icalattach *attach;
Packit Service de44cd
		gchar *uri = NULL;
Packit Service de44cd
Packit Service de44cd
		attach = icalproperty_get_attach (prop);
Packit Service de44cd
		if (!attach)
Packit Service de44cd
			continue;
Packit Service de44cd
Packit Service de44cd
		if (icalattach_get_is_url (attach)) {
Packit Service de44cd
			const gchar *data;
Packit Service de44cd
			gsize buf_size;
Packit Service de44cd
Packit Service de44cd
			data = icalattach_get_url (attach);
Packit Service de44cd
			buf_size = strlen (data);
Packit Service de44cd
			uri = g_malloc0 (buf_size + 1);
Packit Service de44cd
Packit Service de44cd
			icalvalue_decode_ical_string (data, uri, buf_size);
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		if (uri) {
Packit Service de44cd
			if (g_ascii_strncasecmp (uri, "file://", 7) == 0 &&
Packit Service de44cd
			    !g_str_has_prefix (uri + 7, target_filename_prefix)) {
Packit Service de44cd
				GFile *source, *destination;
Packit Service de44cd
				gchar *decoded_filename;
Packit Service de44cd
				gchar *target_filename;
Packit Service de44cd
Packit Service de44cd
				decoded_filename = g_uri_unescape_string (strrchr (uri, '/') + 1, NULL);
Packit Service de44cd
				target_filename = g_strconcat (target_filename_prefix, decoded_filename, NULL);
Packit Service de44cd
				g_free (decoded_filename);
Packit Service de44cd
Packit Service de44cd
				source = g_file_new_for_uri (uri);
Packit Service de44cd
				destination = g_file_new_for_path (target_filename);
Packit Service de44cd
Packit Service de44cd
				if (source && destination) {
Packit Service de44cd
					success = g_file_copy (source, destination, G_FILE_COPY_OVERWRITE, cancellable, NULL, NULL, error);
Packit Service de44cd
					if (success) {
Packit Service de44cd
						g_free (uri);
Packit Service de44cd
						uri = g_file_get_uri (destination);
Packit Service de44cd
Packit Service de44cd
						if (uri) {
Packit Service de44cd
							icalattach *new_attach;
Packit Service de44cd
							gsize buf_size;
Packit Service de44cd
							gchar *buf;
Packit Service de44cd
Packit Service de44cd
							buf_size = 2 * strlen (uri) + 1;
Packit Service de44cd
							buf = g_malloc0 (buf_size);
Packit Service de44cd
Packit Service de44cd
							icalvalue_encode_ical_string (uri, buf, buf_size);
Packit Service de44cd
							new_attach = icalattach_new_from_url (buf);
Packit Service de44cd
Packit Service de44cd
							icalproperty_set_attach (prop, new_attach);
Packit Service de44cd
Packit Service de44cd
							icalattach_unref (new_attach);
Packit Service de44cd
							g_free (buf);
Packit Service de44cd
						}
Packit Service de44cd
					}
Packit Service de44cd
				}
Packit Service de44cd
Packit Service de44cd
				g_clear_object (&source);
Packit Service de44cd
				g_clear_object (&destination);
Packit Service de44cd
				g_free (target_filename);
Packit Service de44cd
			}
Packit Service de44cd
Packit Service de44cd
			g_free (uri);
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		success = success & !g_cancellable_set_error_if_cancelled (cancellable, error);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	g_free (target_filename_prefix);
Packit Service de44cd
Packit Service de44cd
	return success;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ece_gather_tzids_cb (icalparameter *param,
Packit Service de44cd
		     gpointer user_data)
Packit Service de44cd
{
Packit Service de44cd
	GHashTable *tzids = user_data;
Packit Service de44cd
	const gchar *tzid;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (param != NULL);
Packit Service de44cd
	g_return_if_fail (tzids != NULL);
Packit Service de44cd
Packit Service de44cd
	tzid = icalparameter_get_tzid (param);
Packit Service de44cd
	if (tzid && *tzid && g_ascii_strcasecmp (tzid, "UTC") != 0)
Packit Service de44cd
		g_hash_table_insert (tzids, g_strdup (tzid), NULL);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
ece_save_component_add_timezones_sync (SaveData *sd,
Packit Service de44cd
				       GCancellable *cancellable,
Packit Service de44cd
				       GError **error)
Packit Service de44cd
{
Packit Service de44cd
	GHashTable *tzids;
Packit Service de44cd
	GHashTableIter iter;
Packit Service de44cd
	gpointer key, value;
Packit Service de44cd
	gboolean source_is_target;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (sd != NULL, FALSE);
Packit Service de44cd
	g_return_val_if_fail (sd->component != NULL, FALSE);
Packit Service de44cd
	g_return_val_if_fail (sd->target_client != NULL, FALSE);
Packit Service de44cd
Packit Service de44cd
	sd->success = TRUE;
Packit Service de44cd
Packit Service de44cd
	tzids = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
Packit Service de44cd
	source_is_target = !sd->source_client ||
Packit Service de44cd
		e_source_equal (e_client_get_source (E_CLIENT (sd->target_client)),
Packit Service de44cd
				e_client_get_source (E_CLIENT (sd->source_client)));
Packit Service de44cd
Packit Service de44cd
	icalcomponent_foreach_tzid (sd->component, ece_gather_tzids_cb, tzids);
Packit Service de44cd
Packit Service de44cd
	g_hash_table_iter_init (&iter, tzids);
Packit Service de44cd
	while (sd->success && g_hash_table_iter_next (&iter, &key, &value)) {
Packit Service de44cd
		const gchar *tzid = key;
Packit Service de44cd
		icaltimezone *zone = NULL;
Packit Service de44cd
		GError *local_error = NULL;
Packit Service de44cd
Packit Service de44cd
		if (!e_cal_client_get_timezone_sync (source_is_target ? sd->target_client : sd->source_client,
Packit Service de44cd
			tzid, &zone, cancellable, &local_error)) {
Packit Service de44cd
			zone = icaltimezone_get_builtin_timezone_from_tzid (tzid);
Packit Service de44cd
			if (!zone)
Packit Service de44cd
				zone = icaltimezone_get_builtin_timezone (tzid);
Packit Service de44cd
			if (!zone) {
Packit Service de44cd
				g_propagate_error (error, local_error);
Packit Service de44cd
				local_error = NULL;
Packit Service de44cd
				sd->success = FALSE;
Packit Service de44cd
				break;
Packit Service de44cd
			}
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		sd->success = e_cal_client_add_timezone_sync (sd->target_client, zone, cancellable, error);
Packit Service de44cd
Packit Service de44cd
		g_clear_error (&local_error);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	g_hash_table_destroy (tzids);
Packit Service de44cd
Packit Service de44cd
	return sd->success;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ece_save_component_thread (EAlertSinkThreadJobData *job_data,
Packit Service de44cd
			   gpointer user_data,
Packit Service de44cd
			   GCancellable *cancellable,
Packit Service de44cd
			   GError **error)
Packit Service de44cd
{
Packit Service de44cd
	SaveData *sd = user_data;
Packit Service de44cd
	const gchar *create_alert_ident, *modify_alert_ident, *remove_alert_ident, *get_alert_ident;
Packit Service de44cd
	gchar *orig_uid, *new_uid = NULL;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (sd != NULL);
Packit Service de44cd
	g_return_if_fail (E_IS_CAL_CLIENT (sd->target_client));
Packit Service de44cd
	g_return_if_fail (sd->component != NULL);
Packit Service de44cd
Packit Service de44cd
	switch (icalcomponent_isa (sd->component)) {
Packit Service de44cd
		case ICAL_VEVENT_COMPONENT:
Packit Service de44cd
			create_alert_ident = "calendar:failed-create-event";
Packit Service de44cd
			modify_alert_ident = "calendar:failed-modify-event";
Packit Service de44cd
			remove_alert_ident = "calendar:failed-remove-event";
Packit Service de44cd
			get_alert_ident = "calendar:failed-get-event";
Packit Service de44cd
			break;
Packit Service de44cd
		case ICAL_VJOURNAL_COMPONENT:
Packit Service de44cd
			create_alert_ident = "calendar:failed-create-memo";
Packit Service de44cd
			modify_alert_ident = "calendar:failed-modify-memo";
Packit Service de44cd
			remove_alert_ident = "calendar:failed-remove-memo";
Packit Service de44cd
			get_alert_ident = "calendar:failed-get-memo";
Packit Service de44cd
			break;
Packit Service de44cd
		case ICAL_VTODO_COMPONENT:
Packit Service de44cd
			create_alert_ident = "calendar:failed-create-task";
Packit Service de44cd
			modify_alert_ident = "calendar:failed-modify-task";
Packit Service de44cd
			remove_alert_ident = "calendar:failed-remove-task";
Packit Service de44cd
			get_alert_ident = "calendar:failed-get-task";
Packit Service de44cd
			break;
Packit Service de44cd
		default:
Packit Service de44cd
			g_warning ("%s: Cannot save component of kind %d", G_STRFUNC, icalcomponent_isa (sd->component));
Packit Service de44cd
			return;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	sd->success = ece_save_component_add_timezones_sync (sd, cancellable, error);
Packit Service de44cd
	if (!sd->success) {
Packit Service de44cd
		e_alert_sink_thread_job_set_alert_ident (job_data, "calendar:failed-add-timezone");
Packit Service de44cd
		return;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	sd->success = ece_save_component_attachments_sync (sd->target_client, sd->component, cancellable, error);
Packit Service de44cd
	if (!sd->success) {
Packit Service de44cd
		e_alert_sink_thread_job_set_alert_ident (job_data, "calendar:failed-save-attachments");
Packit Service de44cd
		return;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	orig_uid = g_strdup (icalcomponent_get_uid (sd->component));
Packit Service de44cd
Packit Service de44cd
	if (cal_comp_is_icalcomp_on_server_sync (sd->component, sd->target_client, cancellable, error)) {
Packit Service de44cd
		ECalComponent *comp;
Packit Service de44cd
		gboolean has_recurrences;
Packit Service de44cd
Packit Service de44cd
		e_alert_sink_thread_job_set_alert_ident (job_data, modify_alert_ident);
Packit Service de44cd
Packit Service de44cd
		comp = e_cal_component_new_from_icalcomponent (icalcomponent_new_clone (sd->component));
Packit Service de44cd
		g_return_if_fail (comp != NULL);
Packit Service de44cd
Packit Service de44cd
		has_recurrences = e_cal_util_component_has_recurrences (sd->component);
Packit Service de44cd
Packit Service de44cd
		if (has_recurrences && sd->recur_mod == E_CAL_OBJ_MOD_ALL)
Packit Service de44cd
			sd->success = comp_util_sanitize_recurrence_master_sync (comp, sd->target_client, cancellable, error);
Packit Service de44cd
		else
Packit Service de44cd
			sd->success = TRUE;
Packit Service de44cd
Packit Service de44cd
		if (sd->recur_mod == E_CAL_OBJ_MOD_THIS) {
Packit Service de44cd
			e_cal_component_set_rdate_list (comp, NULL);
Packit Service de44cd
			e_cal_component_set_rrule_list (comp, NULL);
Packit Service de44cd
			e_cal_component_set_exdate_list (comp, NULL);
Packit Service de44cd
			e_cal_component_set_exrule_list (comp, NULL);
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		sd->success = sd->success && e_cal_client_modify_object_sync (
Packit Service de44cd
			sd->target_client, e_cal_component_get_icalcomponent (comp), sd->recur_mod, cancellable, error);
Packit Service de44cd
Packit Service de44cd
		g_clear_object (&comp);
Packit Service de44cd
	} else {
Packit Service de44cd
		e_alert_sink_thread_job_set_alert_ident (job_data, create_alert_ident);
Packit Service de44cd
Packit Service de44cd
		sd->success = e_cal_client_create_object_sync (sd->target_client, sd->component, &new_uid, cancellable, error);
Packit Service de44cd
Packit Service de44cd
		if (sd->success)
Packit Service de44cd
			sd->object_created = TRUE;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (sd->success && sd->source_client &&
Packit Service de44cd
	    !e_source_equal (e_client_get_source (E_CLIENT (sd->target_client)),
Packit Service de44cd
			     e_client_get_source (E_CLIENT (sd->source_client))) &&
Packit Service de44cd
	    cal_comp_is_icalcomp_on_server_sync (sd->component, sd->source_client, cancellable, NULL)) {
Packit Service de44cd
		ECalObjModType recur_mod = E_CAL_OBJ_MOD_THIS;
Packit Service de44cd
Packit Service de44cd
		/* Comp found a new home. Remove it from old one. */
Packit Service de44cd
		if (e_cal_util_component_is_instance (sd->component) ||
Packit Service de44cd
		    e_cal_util_component_has_recurrences (sd->component))
Packit Service de44cd
			recur_mod = E_CAL_OBJ_MOD_ALL;
Packit Service de44cd
Packit Service de44cd
		sd->success = e_cal_client_remove_object_sync (
Packit Service de44cd
			sd->source_client, orig_uid,
Packit Service de44cd
			NULL, recur_mod, cancellable, error);
Packit Service de44cd
Packit Service de44cd
		if (!sd->success) {
Packit Service de44cd
			gchar *source_display_name;
Packit Service de44cd
Packit Service de44cd
			source_display_name = e_util_get_source_full_name (e_shell_get_registry (sd->comp_editor->priv->shell),
Packit Service de44cd
				e_client_get_source (E_CLIENT (sd->source_client)));
Packit Service de44cd
Packit Service de44cd
			e_alert_sink_thread_job_set_alert_ident (job_data, remove_alert_ident);
Packit Service de44cd
			e_alert_sink_thread_job_set_alert_arg_0 (job_data, source_display_name);
Packit Service de44cd
Packit Service de44cd
			g_free (source_display_name);
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (new_uid) {
Packit Service de44cd
		icalcomponent_set_uid (sd->component, new_uid);
Packit Service de44cd
		g_free (new_uid);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	g_free (orig_uid);
Packit Service de44cd
Packit Service de44cd
	if (sd->success && !sd->close_after_save) {
Packit Service de44cd
		icalcomponent *comp = NULL;
Packit Service de44cd
		gchar *uid, *rid = NULL;
Packit Service de44cd
Packit Service de44cd
		uid = g_strdup (icalcomponent_get_uid (sd->component));
Packit Service de44cd
		if (icalcomponent_get_first_property (sd->component, ICAL_RECURRENCEID_PROPERTY)) {
Packit Service de44cd
			struct icaltimetype ridtt;
Packit Service de44cd
Packit Service de44cd
			ridtt = icalcomponent_get_recurrenceid (sd->component);
Packit Service de44cd
			if (icaltime_is_valid_time (ridtt) && !icaltime_is_null_time (ridtt)) {
Packit Service de44cd
				rid = icaltime_as_ical_string_r (ridtt);
Packit Service de44cd
			}
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		sd->success = e_cal_client_get_object_sync (sd->target_client, uid, rid, &comp, cancellable, error);
Packit Service de44cd
		if (sd->success && comp) {
Packit Service de44cd
			icalcomponent_free (sd->component);
Packit Service de44cd
			sd->component = comp;
Packit Service de44cd
		} else {
Packit Service de44cd
			e_alert_sink_thread_job_set_alert_ident (job_data, get_alert_ident);
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		g_free (uid);
Packit Service de44cd
		g_free (rid);
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ece_save_component (ECompEditor *comp_editor,
Packit Service de44cd
		    icalcomponent *component,
Packit Service de44cd
		    gboolean with_send,
Packit Service de44cd
		    gboolean close_after_save)
Packit Service de44cd
{
Packit Service de44cd
	EActivity *activity;
Packit Service de44cd
	const gchar *summary;
Packit Service de44cd
	ECalObjModType recur_mod = E_CAL_OBJ_MOD_THIS;
Packit Service de44cd
	SaveData *sd;
Packit Service de44cd
	gchar *source_display_name;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
	g_return_if_fail (component != NULL);
Packit Service de44cd
Packit Service de44cd
	summary = icalcomponent_get_summary (component);
Packit Service de44cd
	if (!summary || !*summary) {
Packit Service de44cd
		if (!e_cal_dialogs_send_component_prompt_subject (GTK_WINDOW (comp_editor), component)) {
Packit Service de44cd
			return;
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (e_cal_util_component_is_instance (component)) {
Packit Service de44cd
		if (!e_cal_dialogs_recur_icalcomp (comp_editor->priv->target_client,
Packit Service de44cd
			component, &recur_mod, GTK_WINDOW (comp_editor), FALSE)) {
Packit Service de44cd
			return;
Packit Service de44cd
		}
Packit Service de44cd
	} else if (e_cal_util_component_has_recurrences (component)) {
Packit Service de44cd
		recur_mod = E_CAL_OBJ_MOD_ALL;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	e_comp_editor_enable (comp_editor, FALSE);
Packit Service de44cd
Packit Service de44cd
	sd = g_new0 (SaveData, 1);
Packit Service de44cd
	sd->comp_editor = g_object_ref (comp_editor);
Packit Service de44cd
	sd->source_client = comp_editor->priv->source_client ? g_object_ref (comp_editor->priv->source_client) : NULL;
Packit Service de44cd
	sd->target_client = g_object_ref (comp_editor->priv->target_client);
Packit Service de44cd
	sd->component = icalcomponent_new_clone (component);
Packit Service de44cd
	sd->with_send = with_send;
Packit Service de44cd
	sd->close_after_save = close_after_save;
Packit Service de44cd
	sd->recur_mod = recur_mod;
Packit Service de44cd
	sd->first_send = E_CAL_COMPONENT_METHOD_NONE;
Packit Service de44cd
	sd->second_send = E_CAL_COMPONENT_METHOD_NONE;
Packit Service de44cd
	sd->success = FALSE;
Packit Service de44cd
Packit Service de44cd
	source_display_name = e_util_get_source_full_name (e_shell_get_registry (comp_editor->priv->shell),
Packit Service de44cd
		e_client_get_source (E_CLIENT (sd->target_client)));
Packit Service de44cd
Packit Service de44cd
	activity = e_alert_sink_submit_thread_job (E_ALERT_SINK (comp_editor),
Packit Service de44cd
		_("Saving changes..."), "calendar:failed-create-event", source_display_name,
Packit Service de44cd
		ece_save_component_thread, sd, ece_save_component_done);
Packit Service de44cd
Packit Service de44cd
	if (activity)
Packit Service de44cd
		e_activity_bar_set_activity (comp_editor->priv->activity_bar, activity);
Packit Service de44cd
Packit Service de44cd
	g_clear_object (&activity);
Packit Service de44cd
	g_free (source_display_name);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
typedef struct _OpenTargetClientData {
Packit Service de44cd
	ECompEditor *comp_editor;
Packit Service de44cd
	ESource *source;
Packit Service de44cd
	gchar *extension_name;
Packit Service de44cd
	EClient *client;
Packit Service de44cd
	gchar *cal_email_address;
Packit Service de44cd
	gchar *alarm_email_address;
Packit Service de44cd
	gboolean is_target_client_change;
Packit Service de44cd
	EActivity *activity;
Packit Service de44cd
} OpenTargetClientData;
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
open_target_client_data_free (gpointer ptr)
Packit Service de44cd
{
Packit Service de44cd
	OpenTargetClientData *otc = ptr;
Packit Service de44cd
Packit Service de44cd
	if (otc) {
Packit Service de44cd
		if (otc->comp_editor) {
Packit Service de44cd
			if (otc->client) {
Packit Service de44cd
				gboolean previous_changed = e_comp_editor_get_changed (otc->comp_editor);
Packit Service de44cd
Packit Service de44cd
				e_comp_editor_set_alarm_email_address (otc->comp_editor, otc->alarm_email_address);
Packit Service de44cd
				e_comp_editor_set_cal_email_address (otc->comp_editor, otc->cal_email_address);
Packit Service de44cd
				e_comp_editor_set_target_client (otc->comp_editor, E_CAL_CLIENT (otc->client));
Packit Service de44cd
Packit Service de44cd
				if (otc->is_target_client_change)
Packit Service de44cd
					e_comp_editor_set_changed (otc->comp_editor, TRUE);
Packit Service de44cd
				else
Packit Service de44cd
					e_comp_editor_set_changed (otc->comp_editor, previous_changed);
Packit Service de44cd
			}
Packit Service de44cd
Packit Service de44cd
			if (otc->comp_editor->priv->activity_bar && otc->activity) {
Packit Service de44cd
				if (otc->activity == e_activity_bar_get_activity (otc->comp_editor->priv->activity_bar))
Packit Service de44cd
					e_activity_bar_set_activity (otc->comp_editor->priv->activity_bar, NULL);
Packit Service de44cd
Packit Service de44cd
				if (otc->activity == otc->comp_editor->priv->target_client_opening)
Packit Service de44cd
					g_clear_object (&otc->comp_editor->priv->target_client_opening);
Packit Service de44cd
			}
Packit Service de44cd
Packit Service de44cd
			if (otc->source) {
Packit Service de44cd
				EShell *shell;
Packit Service de44cd
				ECredentialsPrompter *credentials_prompter;
Packit Service de44cd
Packit Service de44cd
				shell = e_comp_editor_get_shell (otc->comp_editor);
Packit Service de44cd
				credentials_prompter = e_shell_get_credentials_prompter (shell);
Packit Service de44cd
Packit Service de44cd
				e_credentials_prompter_set_auto_prompt_disabled_for (credentials_prompter, otc->source, TRUE);
Packit Service de44cd
			}
Packit Service de44cd
Packit Service de44cd
			e_comp_editor_sensitize_widgets (otc->comp_editor);
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		g_clear_object (&otc->comp_editor);
Packit Service de44cd
		g_clear_object (&otc->source);
Packit Service de44cd
		g_clear_object (&otc->client);
Packit Service de44cd
		g_clear_object (&otc->activity);
Packit Service de44cd
		g_free (otc->extension_name);
Packit Service de44cd
		g_free (otc->cal_email_address);
Packit Service de44cd
		g_free (otc->alarm_email_address);
Packit Service de44cd
		g_free (otc);
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
comp_editor_open_target_client_thread (EAlertSinkThreadJobData *job_data,
Packit Service de44cd
				       gpointer user_data,
Packit Service de44cd
				       GCancellable *cancellable,
Packit Service de44cd
				       GError **error)
Packit Service de44cd
{
Packit Service de44cd
	OpenTargetClientData *otc = user_data;
Packit Service de44cd
	EClientCache *client_cache;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (otc != NULL);
Packit Service de44cd
Packit Service de44cd
	if (g_cancellable_set_error_if_cancelled (cancellable, error))
Packit Service de44cd
		return;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (otc->comp_editor));
Packit Service de44cd
	g_return_if_fail (E_IS_SOURCE (otc->source));
Packit Service de44cd
	g_return_if_fail (otc->extension_name != NULL);
Packit Service de44cd
Packit Service de44cd
	client_cache = e_shell_get_client_cache (e_comp_editor_get_shell (otc->comp_editor));
Packit Service de44cd
Packit Service de44cd
	otc->client = e_client_cache_get_client_sync (client_cache, otc->source, otc->extension_name,
Packit Service de44cd
		30, cancellable, error);
Packit Service de44cd
Packit Service de44cd
	if (otc->client) {
Packit Service de44cd
		/* Cache some properties which require remote calls */
Packit Service de44cd
Packit Service de44cd
		if (!g_cancellable_is_cancelled (cancellable)) {
Packit Service de44cd
			e_client_get_capabilities (otc->client);
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		if (!g_cancellable_is_cancelled (cancellable)) {
Packit Service de44cd
			e_client_get_backend_property_sync (otc->client,
Packit Service de44cd
				CAL_BACKEND_PROPERTY_CAL_EMAIL_ADDRESS,
Packit Service de44cd
				&otc->cal_email_address,
Packit Service de44cd
				cancellable, error);
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		if (!g_cancellable_is_cancelled (cancellable)) {
Packit Service de44cd
			e_client_get_backend_property_sync (otc->client,
Packit Service de44cd
				CAL_BACKEND_PROPERTY_ALARM_EMAIL_ADDRESS,
Packit Service de44cd
				&otc->alarm_email_address,
Packit Service de44cd
				cancellable, error);
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		if (g_cancellable_is_cancelled (cancellable))
Packit Service de44cd
			g_clear_object (&otc->client);
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
typedef struct _UpdateActivityBarData {
Packit Service de44cd
	ECompEditor *comp_editor;
Packit Service de44cd
	EActivity *activity;
Packit Service de44cd
} UpdateActivityBarData;
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
update_activity_bar_data_free (gpointer ptr)
Packit Service de44cd
{
Packit Service de44cd
	UpdateActivityBarData *uab = ptr;
Packit Service de44cd
Packit Service de44cd
	if (uab) {
Packit Service de44cd
		g_clear_object (&uab->comp_editor);
Packit Service de44cd
		g_clear_object (&uab->activity);
Packit Service de44cd
		g_free (uab);
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
update_activity_bar_cb (gpointer user_data)
Packit Service de44cd
{
Packit Service de44cd
	UpdateActivityBarData *uab = user_data;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (uab != NULL, FALSE);
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (uab->comp_editor), FALSE);
Packit Service de44cd
	g_return_val_if_fail (E_IS_ACTIVITY (uab->activity), FALSE);
Packit Service de44cd
Packit Service de44cd
	if (uab->comp_editor->priv->target_client_opening == uab->activity &&
Packit Service de44cd
	    e_activity_get_state (uab->activity) != E_ACTIVITY_CANCELLED &&
Packit Service de44cd
	    e_activity_get_state (uab->activity) != E_ACTIVITY_COMPLETED) {
Packit Service de44cd
		e_activity_bar_set_activity (uab->comp_editor->priv->activity_bar, uab->activity);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	return FALSE;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_open_target_client (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	OpenTargetClientData *otc;
Packit Service de44cd
	ESource *source;
Packit Service de44cd
	EActivity *activity;
Packit Service de44cd
	ECredentialsPrompter *credentials_prompter;
Packit Service de44cd
	gchar *source_display_name, *description = NULL, *alert_ident = NULL, *alert_arg_0 = NULL;
Packit Service de44cd
	gboolean is_target_client_change;
Packit Service de44cd
	const gchar *extension_name;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
	g_return_if_fail (comp_editor->priv->page_general != NULL);
Packit Service de44cd
Packit Service de44cd
	source = e_comp_editor_page_general_ref_selected_source (comp_editor->priv->page_general);
Packit Service de44cd
	if (!source)
Packit Service de44cd
		return;
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->target_client &&
Packit Service de44cd
	    e_client_get_source (E_CLIENT (comp_editor->priv->target_client)) == source) {
Packit Service de44cd
		g_clear_object (&source);
Packit Service de44cd
		return;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->target_client_opening) {
Packit Service de44cd
		e_activity_cancel (comp_editor->priv->target_client_opening);
Packit Service de44cd
		g_clear_object (&comp_editor->priv->target_client_opening);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	is_target_client_change = comp_editor->priv->target_client != NULL;
Packit Service de44cd
	g_clear_object (&comp_editor->priv->target_client);
Packit Service de44cd
Packit Service de44cd
	extension_name = e_comp_editor_page_general_get_source_extension_name (comp_editor->priv->page_general);
Packit Service de44cd
	source_display_name = e_util_get_source_full_name (
Packit Service de44cd
		e_shell_get_registry (e_comp_editor_get_shell (comp_editor)),
Packit Service de44cd
		source);
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (e_util_get_open_source_job_info (extension_name, source_display_name,
Packit Service de44cd
		&description, &alert_ident, &alert_arg_0));
Packit Service de44cd
Packit Service de44cd
	credentials_prompter = e_shell_get_credentials_prompter (e_comp_editor_get_shell (comp_editor));
Packit Service de44cd
	e_credentials_prompter_set_auto_prompt_disabled_for (credentials_prompter, source, FALSE);
Packit Service de44cd
Packit Service de44cd
	otc = g_new0 (OpenTargetClientData, 1);
Packit Service de44cd
	otc->extension_name = g_strdup (extension_name);
Packit Service de44cd
	otc->comp_editor = g_object_ref (comp_editor);
Packit Service de44cd
	otc->source = g_object_ref (source);
Packit Service de44cd
	otc->is_target_client_change = is_target_client_change;
Packit Service de44cd
Packit Service de44cd
	activity = e_alert_sink_submit_thread_job (
Packit Service de44cd
		E_ALERT_SINK (comp_editor), description, alert_ident, alert_arg_0,
Packit Service de44cd
		comp_editor_open_target_client_thread, otc,
Packit Service de44cd
		open_target_client_data_free);
Packit Service de44cd
Packit Service de44cd
	otc->activity = g_object_ref (activity);
Packit Service de44cd
	comp_editor->priv->target_client_opening = g_object_ref (activity);
Packit Service de44cd
Packit Service de44cd
	/* Close all alerts */
Packit Service de44cd
	while (e_alert_bar_close_alert (comp_editor->priv->alert_bar)) {
Packit Service de44cd
		;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->activity_bar) {
Packit Service de44cd
		UpdateActivityBarData *uab;
Packit Service de44cd
Packit Service de44cd
		uab = g_new0 (UpdateActivityBarData, 1);
Packit Service de44cd
		uab->comp_editor = g_object_ref (comp_editor);
Packit Service de44cd
		uab->activity = g_object_ref (activity);
Packit Service de44cd
Packit Service de44cd
		/* To avoid UI flickering when the source can be opened quickly */
Packit Service de44cd
		g_timeout_add_seconds_full (G_PRIORITY_LOW, 1,
Packit Service de44cd
			update_activity_bar_cb, uab, update_activity_bar_data_free);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	g_free (description);
Packit Service de44cd
	g_free (alert_ident);
Packit Service de44cd
	g_free (alert_arg_0);
Packit Service de44cd
	g_free (source_display_name);
Packit Service de44cd
	g_clear_object (&source);
Packit Service de44cd
	g_clear_object (&activity);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_update_window_title (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditorClass *comp_editor_class;
Packit Service de44cd
	gboolean with_attendees = FALSE;
Packit Service de44cd
	const gchar *format, *title_suffix;
Packit Service de44cd
	gchar *title;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->page_general)
Packit Service de44cd
		with_attendees = e_comp_editor_page_general_get_show_attendees (comp_editor->priv->page_general);
Packit Service de44cd
Packit Service de44cd
	comp_editor_class = E_COMP_EDITOR_GET_CLASS (comp_editor);
Packit Service de44cd
	if (with_attendees)
Packit Service de44cd
		format = comp_editor_class->title_format_with_attendees;
Packit Service de44cd
	else
Packit Service de44cd
		format = comp_editor_class->title_format_without_attendees;
Packit Service de44cd
Packit Service de44cd
	title_suffix = e_comp_editor_get_title_suffix (comp_editor);
Packit Service de44cd
Packit Service de44cd
	title = g_strdup_printf (format, title_suffix && *title_suffix ? title_suffix : _("No Summary"));
Packit Service de44cd
Packit Service de44cd
	gtk_window_set_icon_name (GTK_WINDOW (comp_editor), comp_editor_class->icon_name);
Packit Service de44cd
	gtk_window_set_title (GTK_WINDOW (comp_editor), title);
Packit Service de44cd
Packit Service de44cd
	g_free (title);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_close (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	g_signal_emit (comp_editor, signals[EDITOR_CLOSED], 0, FALSE, NULL);
Packit Service de44cd
Packit Service de44cd
	gtk_widget_destroy (GTK_WIDGET (comp_editor));
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_save_and_close (ECompEditor *comp_editor,
Packit Service de44cd
			      gboolean can_close)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->component) {
Packit Service de44cd
		icalcomponent *component = icalcomponent_new_clone (comp_editor->priv->component);
Packit Service de44cd
		if (component && e_comp_editor_fill_component (comp_editor, component)) {
Packit Service de44cd
			ece_save_component (comp_editor, component, TRUE, can_close);
Packit Service de44cd
			icalcomponent_free (component);
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static GtkResponseType
Packit Service de44cd
ece_save_component_dialog (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	const icalcomponent *component;
Packit Service de44cd
	GtkWindow *parent;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), GTK_RESPONSE_NO);
Packit Service de44cd
	g_return_val_if_fail (e_comp_editor_get_component (comp_editor) != NULL, GTK_RESPONSE_NO);
Packit Service de44cd
Packit Service de44cd
	parent = GTK_WINDOW (comp_editor);
Packit Service de44cd
	component = e_comp_editor_get_component (comp_editor);
Packit Service de44cd
	switch (icalcomponent_isa (component)) {
Packit Service de44cd
		case ICAL_VEVENT_COMPONENT:
Packit Service de44cd
			if (e_comp_editor_page_general_get_show_attendees (comp_editor->priv->page_general))
Packit Service de44cd
				return e_alert_run_dialog_for_args (parent, "calendar:prompt-save-meeting", NULL);
Packit Service de44cd
			else
Packit Service de44cd
				return e_alert_run_dialog_for_args (parent, "calendar:prompt-save-appointment", NULL);
Packit Service de44cd
		case ICAL_VTODO_COMPONENT:
Packit Service de44cd
			return e_alert_run_dialog_for_args (parent, "calendar:prompt-save-task", NULL);
Packit Service de44cd
		case ICAL_VJOURNAL_COMPONENT:
Packit Service de44cd
			return e_alert_run_dialog_for_args (parent, "calendar:prompt-save-memo", NULL);
Packit Service de44cd
		default:
Packit Service de44cd
			return GTK_RESPONSE_NO;
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
e_comp_editor_prompt_and_save_changes (ECompEditor *comp_editor,
Packit Service de44cd
				       gboolean with_send)
Packit Service de44cd
{
Packit Service de44cd
	icalcomponent *component;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), FALSE);
Packit Service de44cd
Packit Service de44cd
	if (!e_comp_editor_get_changed (comp_editor))
Packit Service de44cd
		return TRUE;
Packit Service de44cd
Packit Service de44cd
	switch (ece_save_component_dialog (comp_editor)) {
Packit Service de44cd
	case GTK_RESPONSE_YES: /* Save */
Packit Service de44cd
		if (e_client_is_readonly (E_CLIENT (comp_editor->priv->target_client))) {
Packit Service de44cd
			e_alert_submit (
Packit Service de44cd
				E_ALERT_SINK (comp_editor),
Packit Service de44cd
				"calendar:prompt-read-only-cal-editor",
Packit Service de44cd
				e_source_get_display_name (
Packit Service de44cd
					e_client_get_source (E_CLIENT (comp_editor->priv->target_client))),
Packit Service de44cd
				NULL);
Packit Service de44cd
			/* don't discard changes when selected readonly calendar */
Packit Service de44cd
			return FALSE;
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		if (comp_editor->priv->component &&
Packit Service de44cd
		    e_comp_editor_page_general_get_show_attendees (comp_editor->priv->page_general) &&
Packit Service de44cd
		    icalcomponent_isa (comp_editor->priv->component) == ICAL_VTODO_COMPONENT
Packit Service de44cd
		    && e_client_check_capability (E_CLIENT (comp_editor->priv->target_client), CAL_STATIC_CAPABILITY_NO_TASK_ASSIGNMENT)) {
Packit Service de44cd
			e_alert_submit (
Packit Service de44cd
				E_ALERT_SINK (comp_editor),
Packit Service de44cd
				"calendar:prompt-no-task-assignment-editor",
Packit Service de44cd
				e_source_get_display_name (
Packit Service de44cd
					e_client_get_source (E_CLIENT (comp_editor->priv->target_client))),
Packit Service de44cd
				NULL);
Packit Service de44cd
			return FALSE;
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		component = icalcomponent_new_clone (comp_editor->priv->component);
Packit Service de44cd
		if (!e_comp_editor_fill_component (comp_editor, component)) {
Packit Service de44cd
			icalcomponent_free (component);
Packit Service de44cd
			return FALSE;
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		ece_save_component (comp_editor, component, with_send, TRUE);
Packit Service de44cd
Packit Service de44cd
		return FALSE;
Packit Service de44cd
	case GTK_RESPONSE_NO: /* Discard */
Packit Service de44cd
		return TRUE;
Packit Service de44cd
	case GTK_RESPONSE_CANCEL: /* Cancel */
Packit Service de44cd
	default:
Packit Service de44cd
		return FALSE;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	return FALSE;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
action_close_cb (GtkAction *action,
Packit Service de44cd
                 ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (e_comp_editor_prompt_and_save_changes (comp_editor, TRUE))
Packit Service de44cd
		e_comp_editor_close (comp_editor);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
action_help_cb (GtkAction *action,
Packit Service de44cd
                ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditorClass *klass;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	klass = E_COMP_EDITOR_GET_CLASS (comp_editor);
Packit Service de44cd
	g_return_if_fail (klass->help_section != NULL);
Packit Service de44cd
Packit Service de44cd
	e_display_help (GTK_WINDOW (comp_editor), klass->help_section);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ece_print_or_preview (ECompEditor *comp_editor,
Packit Service de44cd
		      GtkPrintOperationAction print_action)
Packit Service de44cd
{
Packit Service de44cd
	icalcomponent *component;
Packit Service de44cd
	ECalComponent *comp;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
	g_return_if_fail (e_comp_editor_get_component (comp_editor) != NULL);
Packit Service de44cd
Packit Service de44cd
	component = icalcomponent_new_clone (e_comp_editor_get_component (comp_editor));
Packit Service de44cd
	if (!e_comp_editor_fill_component (comp_editor, component)) {
Packit Service de44cd
		icalcomponent_free (component);
Packit Service de44cd
		return;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	comp = e_cal_component_new_from_icalcomponent (component);
Packit Service de44cd
	g_return_if_fail (comp != NULL);
Packit Service de44cd
Packit Service de44cd
	print_comp (comp,
Packit Service de44cd
		e_comp_editor_get_target_client (comp_editor),
Packit Service de44cd
		calendar_config_get_icaltimezone (),
Packit Service de44cd
		calendar_config_get_24_hour_format (),
Packit Service de44cd
		print_action);
Packit Service de44cd
Packit Service de44cd
	g_object_unref (comp);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
action_print_cb (GtkAction *action,
Packit Service de44cd
                 ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	ece_print_or_preview (comp_editor, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
action_print_preview_cb (GtkAction *action,
Packit Service de44cd
                         ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	ece_print_or_preview (comp_editor, GTK_PRINT_OPERATION_ACTION_PREVIEW);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
action_save_cb (GtkAction *action,
Packit Service de44cd
                ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	e_comp_editor_save_and_close (comp_editor, FALSE);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
action_save_and_close_cb (GtkAction *action,
Packit Service de44cd
                          ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	e_comp_editor_save_and_close (comp_editor, TRUE);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
ece_organizer_email_address_is_user (ECompEditor *comp_editor,
Packit Service de44cd
				     EClient *client,
Packit Service de44cd
				     const gchar *email_address,
Packit Service de44cd
				     gboolean is_organizer)
Packit Service de44cd
{
Packit Service de44cd
	ESourceRegistry *registry;
Packit Service de44cd
	const gchar *cal_email_address;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), FALSE);
Packit Service de44cd
	g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
Packit Service de44cd
Packit Service de44cd
	email_address = itip_strip_mailto (email_address);
Packit Service de44cd
Packit Service de44cd
	if (!email_address || !*email_address)
Packit Service de44cd
		return FALSE;
Packit Service de44cd
Packit Service de44cd
	cal_email_address = e_comp_editor_get_cal_email_address (comp_editor);
Packit Service de44cd
	if (cal_email_address && *cal_email_address &&
Packit Service de44cd
	    g_ascii_strcasecmp (cal_email_address, email_address) == 0) {
Packit Service de44cd
		return TRUE;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (is_organizer && e_client_check_capability (client, CAL_STATIC_CAPABILITY_ORGANIZER_NOT_EMAIL_ADDRESS))
Packit Service de44cd
		return FALSE;
Packit Service de44cd
Packit Service de44cd
	registry = e_shell_get_registry (e_comp_editor_get_shell (comp_editor));
Packit Service de44cd
Packit Service de44cd
	return itip_address_is_user (registry, email_address);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
ece_organizer_is_user (ECompEditor *comp_editor,
Packit Service de44cd
		       icalcomponent *component,
Packit Service de44cd
		       EClient *client)
Packit Service de44cd
{
Packit Service de44cd
	icalproperty *prop;
Packit Service de44cd
	const gchar *organizer;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), FALSE);
Packit Service de44cd
	g_return_val_if_fail (component != NULL, FALSE);
Packit Service de44cd
	g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
Packit Service de44cd
Packit Service de44cd
	prop = icalcomponent_get_first_property (component, ICAL_ORGANIZER_PROPERTY);
Packit Service de44cd
	if (!prop || e_client_check_capability (client, CAL_STATIC_CAPABILITY_NO_ORGANIZER))
Packit Service de44cd
		return FALSE;
Packit Service de44cd
Packit Service de44cd
	organizer = itip_strip_mailto (icalproperty_get_organizer (prop));
Packit Service de44cd
	if (!organizer || !*organizer)
Packit Service de44cd
		return FALSE;
Packit Service de44cd
Packit Service de44cd
	return ece_organizer_email_address_is_user (comp_editor, client, organizer, TRUE);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
ece_sentby_is_user (ECompEditor *comp_editor,
Packit Service de44cd
		    icalcomponent *component,
Packit Service de44cd
		    EClient *client)
Packit Service de44cd
{
Packit Service de44cd
	icalproperty *prop;
Packit Service de44cd
	icalparameter *param;
Packit Service de44cd
	const gchar *sentby;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), FALSE);
Packit Service de44cd
	g_return_val_if_fail (component != NULL, FALSE);
Packit Service de44cd
	g_return_val_if_fail (E_IS_CAL_CLIENT (client), FALSE);
Packit Service de44cd
Packit Service de44cd
	prop = icalcomponent_get_first_property (component, ICAL_ORGANIZER_PROPERTY);
Packit Service de44cd
	if (!prop || e_client_check_capability (client, CAL_STATIC_CAPABILITY_NO_ORGANIZER))
Packit Service de44cd
		return FALSE;
Packit Service de44cd
Packit Service de44cd
	param = icalproperty_get_first_parameter (prop, ICAL_SENTBY_PARAMETER);
Packit Service de44cd
	if (!param)
Packit Service de44cd
		return FALSE;
Packit Service de44cd
Packit Service de44cd
	sentby = icalparameter_get_sentby (param);
Packit Service de44cd
Packit Service de44cd
	return ece_organizer_email_address_is_user (comp_editor, client, sentby, FALSE);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ece_emit_times_changed_cb (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	g_signal_emit (comp_editor, signals[TIMES_CHANGED], 0, NULL);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ece_connect_time_parts (ECompEditor *comp_editor,
Packit Service de44cd
			ECompEditorPropertyPart *dtstart_part,
Packit Service de44cd
			ECompEditorPropertyPart *dtend_part)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
#define update_part(x) G_STMT_START { \
Packit Service de44cd
	if (x) \
Packit Service de44cd
		g_object_ref (x); \
Packit Service de44cd
	if (comp_editor->priv->x) { \
Packit Service de44cd
		g_signal_handlers_disconnect_by_func (comp_editor->priv->x, G_CALLBACK (ece_emit_times_changed_cb), comp_editor); \
Packit Service de44cd
		g_clear_object (&comp_editor->priv->x); \
Packit Service de44cd
	} \
Packit Service de44cd
	if (x) { \
Packit Service de44cd
		comp_editor->priv->x = x; \
Packit Service de44cd
		g_signal_connect_swapped (comp_editor->priv->x, "changed", \
Packit Service de44cd
			G_CALLBACK (ece_emit_times_changed_cb), comp_editor); \
Packit Service de44cd
	} \
Packit Service de44cd
	} G_STMT_END
Packit Service de44cd
Packit Service de44cd
	update_part (dtstart_part);
Packit Service de44cd
	update_part (dtend_part);
Packit Service de44cd
Packit Service de44cd
#undef update_part
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ece_sensitize_widgets (ECompEditor *comp_editor,
Packit Service de44cd
		       gboolean force_insensitive)
Packit Service de44cd
{
Packit Service de44cd
	GtkActionGroup *group;
Packit Service de44cd
	GSList *link;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	for (link = comp_editor->priv->pages; link; link = g_slist_next (link)) {
Packit Service de44cd
		ECompEditorPage *page = link->data;
Packit Service de44cd
Packit Service de44cd
		g_warn_if_fail (E_IS_COMP_EDITOR_PAGE (page));
Packit Service de44cd
		if (!E_IS_COMP_EDITOR_PAGE (page))
Packit Service de44cd
			continue;
Packit Service de44cd
Packit Service de44cd
		e_comp_editor_page_sensitize_widgets (page, force_insensitive);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	group = e_comp_editor_get_action_group (comp_editor, "individual");
Packit Service de44cd
	gtk_action_group_set_sensitive (group, !force_insensitive);
Packit Service de44cd
Packit Service de44cd
	group = e_comp_editor_get_action_group (comp_editor, "editable");
Packit Service de44cd
	gtk_action_group_set_sensitive (group, !force_insensitive);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
ece_fill_widgets (ECompEditor *comp_editor,
Packit Service de44cd
		  icalcomponent *component)
Packit Service de44cd
{
Packit Service de44cd
	GSList *link;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
	g_return_if_fail (component != NULL);
Packit Service de44cd
Packit Service de44cd
	for (link = comp_editor->priv->pages; link; link = g_slist_next (link)) {
Packit Service de44cd
		ECompEditorPage *page = link->data;
Packit Service de44cd
Packit Service de44cd
		g_warn_if_fail (E_IS_COMP_EDITOR_PAGE (page));
Packit Service de44cd
		if (!E_IS_COMP_EDITOR_PAGE (page))
Packit Service de44cd
			continue;
Packit Service de44cd
Packit Service de44cd
		e_comp_editor_page_fill_widgets (page, component);
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
ece_fill_component (ECompEditor *comp_editor,
Packit Service de44cd
		    icalcomponent *component)
Packit Service de44cd
{
Packit Service de44cd
	GSList *link;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), FALSE);
Packit Service de44cd
	g_return_val_if_fail (component != NULL, FALSE);
Packit Service de44cd
Packit Service de44cd
	for (link = comp_editor->priv->pages; link; link = g_slist_next (link)) {
Packit Service de44cd
		ECompEditorPage *page = link->data;
Packit Service de44cd
Packit Service de44cd
		g_warn_if_fail (E_IS_COMP_EDITOR_PAGE (page));
Packit Service de44cd
		if (!E_IS_COMP_EDITOR_PAGE (page))
Packit Service de44cd
			continue;
Packit Service de44cd
Packit Service de44cd
		if (!e_comp_editor_page_fill_component (page, component))
Packit Service de44cd
			return FALSE;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	return TRUE;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
comp_editor_realize_cb (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->component) {
Packit Service de44cd
		e_comp_editor_fill_widgets (comp_editor, comp_editor->priv->component);
Packit Service de44cd
		e_comp_editor_set_changed (comp_editor, FALSE);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	e_comp_editor_update_window_title (comp_editor);
Packit Service de44cd
	e_comp_editor_sensitize_widgets (comp_editor);
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->page_general && comp_editor->priv->origin_source) {
Packit Service de44cd
		e_comp_editor_page_general_set_selected_source (
Packit Service de44cd
			comp_editor->priv->page_general,
Packit Service de44cd
			comp_editor->priv->origin_source);
Packit Service de44cd
		e_comp_editor_set_changed (comp_editor, FALSE);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->page_general) {
Packit Service de44cd
		e_comp_editor_page_general_update_view (comp_editor->priv->page_general);
Packit Service de44cd
Packit Service de44cd
		if (!comp_editor->priv->show_attendees_handler_id) {
Packit Service de44cd
			comp_editor->priv->show_attendees_handler_id =
Packit Service de44cd
				e_signal_connect_notify_swapped (comp_editor->priv->page_general,
Packit Service de44cd
					"notify::show-attendees",
Packit Service de44cd
					G_CALLBACK (e_comp_editor_update_window_title), comp_editor);
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (!comp_editor->priv->target_client)
Packit Service de44cd
		e_comp_editor_open_target_client (comp_editor);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
comp_editor_unrealize_cb (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->page_general) {
Packit Service de44cd
		e_signal_disconnect_notify_handler (comp_editor->priv->page_general,
Packit Service de44cd
			&comp_editor->priv->show_attendees_handler_id);
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
comp_editor_delete_event (GtkWidget *widget,
Packit Service de44cd
			  GdkEventAny *event)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditor *comp_editor;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (widget), FALSE);
Packit Service de44cd
Packit Service de44cd
	comp_editor = E_COMP_EDITOR (widget);
Packit Service de44cd
Packit Service de44cd
	/* It's disabled when the component is being saved */
Packit Service de44cd
	if (gtk_widget_get_sensitive (GTK_WIDGET (comp_editor->priv->content)))
Packit Service de44cd
		action_close_cb (NULL, comp_editor);
Packit Service de44cd
Packit Service de44cd
	return TRUE;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
comp_editor_key_press_event (GtkWidget *widget,
Packit Service de44cd
			     GdkEventKey *event)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditor *comp_editor;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (widget), FALSE);
Packit Service de44cd
Packit Service de44cd
	comp_editor = E_COMP_EDITOR (widget);
Packit Service de44cd
Packit Service de44cd
	if (event->keyval == GDK_KEY_Escape &&
Packit Service de44cd
	    !e_alert_bar_close_alert (comp_editor->priv->alert_bar)) {
Packit Service de44cd
		GtkAction *action;
Packit Service de44cd
Packit Service de44cd
		action = e_comp_editor_get_action (comp_editor, "close");
Packit Service de44cd
		gtk_action_activate (action);
Packit Service de44cd
Packit Service de44cd
		return TRUE;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	/* Chain up to parent's method. */
Packit Service de44cd
	return GTK_WIDGET_CLASS (e_comp_editor_parent_class)->key_press_event (widget, event);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
comp_editor_selected_source_notify_cb (ECompEditorPageGeneral *page_general,
Packit Service de44cd
				       GParamSpec *param,
Packit Service de44cd
				       ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR_PAGE_GENERAL (page_general));
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
	g_return_if_fail (comp_editor->priv->page_general == page_general);
Packit Service de44cd
Packit Service de44cd
	e_comp_editor_open_target_client (comp_editor);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_submit_alert (EAlertSink *alert_sink,
Packit Service de44cd
			    EAlert *alert)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditor *comp_editor;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (alert_sink));
Packit Service de44cd
	g_return_if_fail (E_IS_ALERT (alert));
Packit Service de44cd
Packit Service de44cd
	comp_editor = E_COMP_EDITOR (alert_sink);
Packit Service de44cd
Packit Service de44cd
	e_alert_bar_submit_alert (comp_editor->priv->alert_bar, alert);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_set_origin_source (ECompEditor *comp_editor,
Packit Service de44cd
				 ESource *origin_source)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
	if (origin_source)
Packit Service de44cd
		g_return_if_fail (E_IS_SOURCE (origin_source));
Packit Service de44cd
Packit Service de44cd
	g_clear_object (&comp_editor->priv->origin_source);
Packit Service de44cd
	if (origin_source)
Packit Service de44cd
		comp_editor->priv->origin_source = g_object_ref (origin_source);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_set_shell (ECompEditor *comp_editor,
Packit Service de44cd
			 EShell *shell)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
	g_return_if_fail (E_IS_SHELL (shell));
Packit Service de44cd
Packit Service de44cd
	g_clear_object (&comp_editor->priv->shell);
Packit Service de44cd
	comp_editor->priv->shell = g_object_ref (shell);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_set_property (GObject *object,
Packit Service de44cd
			    guint property_id,
Packit Service de44cd
			    const GValue *value,
Packit Service de44cd
			    GParamSpec *pspec)
Packit Service de44cd
{
Packit Service de44cd
	switch (property_id) {
Packit Service de44cd
		case PROP_ALARM_EMAIL_ADDRESS:
Packit Service de44cd
			e_comp_editor_set_alarm_email_address (
Packit Service de44cd
				E_COMP_EDITOR (object),
Packit Service de44cd
				g_value_get_string (value));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_CAL_EMAIL_ADDRESS:
Packit Service de44cd
			e_comp_editor_set_cal_email_address (
Packit Service de44cd
				E_COMP_EDITOR (object),
Packit Service de44cd
				g_value_get_string (value));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_CHANGED:
Packit Service de44cd
			e_comp_editor_set_changed (
Packit Service de44cd
				E_COMP_EDITOR (object),
Packit Service de44cd
				g_value_get_boolean (value));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_COMPONENT:
Packit Service de44cd
			e_comp_editor_set_component (
Packit Service de44cd
				E_COMP_EDITOR (object),
Packit Service de44cd
				g_value_get_pointer (value));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_FLAGS:
Packit Service de44cd
			e_comp_editor_set_flags (
Packit Service de44cd
				E_COMP_EDITOR (object),
Packit Service de44cd
				g_value_get_uint (value));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_ORIGIN_SOURCE:
Packit Service de44cd
			e_comp_editor_set_origin_source (
Packit Service de44cd
				E_COMP_EDITOR (object),
Packit Service de44cd
				g_value_get_object (value));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_SHELL:
Packit Service de44cd
			e_comp_editor_set_shell (
Packit Service de44cd
				E_COMP_EDITOR (object),
Packit Service de44cd
				g_value_get_object (value));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_SOURCE_CLIENT:
Packit Service de44cd
			e_comp_editor_set_source_client (
Packit Service de44cd
				E_COMP_EDITOR (object),
Packit Service de44cd
				g_value_get_object (value));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_TARGET_CLIENT:
Packit Service de44cd
			e_comp_editor_set_target_client (
Packit Service de44cd
				E_COMP_EDITOR (object),
Packit Service de44cd
				g_value_get_object (value));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_TITLE_SUFFIX:
Packit Service de44cd
			e_comp_editor_set_title_suffix (
Packit Service de44cd
				E_COMP_EDITOR (object),
Packit Service de44cd
				g_value_get_string (value));
Packit Service de44cd
			return;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_get_property (GObject *object,
Packit Service de44cd
			    guint property_id,
Packit Service de44cd
			    GValue *value,
Packit Service de44cd
			    GParamSpec *pspec)
Packit Service de44cd
{
Packit Service de44cd
	switch (property_id) {
Packit Service de44cd
		case PROP_ALARM_EMAIL_ADDRESS:
Packit Service de44cd
			g_value_set_string (
Packit Service de44cd
				value,
Packit Service de44cd
				e_comp_editor_get_alarm_email_address (
Packit Service de44cd
				E_COMP_EDITOR (object)));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_CAL_EMAIL_ADDRESS:
Packit Service de44cd
			g_value_set_string (
Packit Service de44cd
				value,
Packit Service de44cd
				e_comp_editor_get_cal_email_address (
Packit Service de44cd
				E_COMP_EDITOR (object)));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_CHANGED:
Packit Service de44cd
			g_value_set_boolean (
Packit Service de44cd
				value,
Packit Service de44cd
				e_comp_editor_get_changed (
Packit Service de44cd
				E_COMP_EDITOR (object)));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_COMPONENT:
Packit Service de44cd
			g_value_set_pointer (
Packit Service de44cd
				value,
Packit Service de44cd
				e_comp_editor_get_component (
Packit Service de44cd
				E_COMP_EDITOR (object)));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_FLAGS:
Packit Service de44cd
			g_value_set_uint (
Packit Service de44cd
				value,
Packit Service de44cd
				e_comp_editor_get_flags (
Packit Service de44cd
				E_COMP_EDITOR (object)));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_ORIGIN_SOURCE:
Packit Service de44cd
			g_value_set_object (
Packit Service de44cd
				value,
Packit Service de44cd
				e_comp_editor_get_origin_source (
Packit Service de44cd
				E_COMP_EDITOR (object)));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_SHELL:
Packit Service de44cd
			g_value_set_object (
Packit Service de44cd
				value,
Packit Service de44cd
				e_comp_editor_get_shell (
Packit Service de44cd
				E_COMP_EDITOR (object)));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_SOURCE_CLIENT:
Packit Service de44cd
			g_value_set_object (
Packit Service de44cd
				value,
Packit Service de44cd
				e_comp_editor_get_source_client (
Packit Service de44cd
				E_COMP_EDITOR (object)));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_TARGET_CLIENT:
Packit Service de44cd
			g_value_set_object (
Packit Service de44cd
				value,
Packit Service de44cd
				e_comp_editor_get_target_client (
Packit Service de44cd
				E_COMP_EDITOR (object)));
Packit Service de44cd
			return;
Packit Service de44cd
Packit Service de44cd
		case PROP_TITLE_SUFFIX:
Packit Service de44cd
			g_value_set_string (
Packit Service de44cd
				value,
Packit Service de44cd
				e_comp_editor_get_title_suffix (
Packit Service de44cd
				E_COMP_EDITOR (object)));
Packit Service de44cd
			return;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_constructed (GObject *object)
Packit Service de44cd
{
Packit Service de44cd
	const gchar *ui =
Packit Service de44cd
		"<ui>"
Packit Service de44cd
		"  <menubar action='main-menu'>"
Packit Service de44cd
		"    <menu action='file-menu'>"
Packit Service de44cd
		"      <menuitem action='save'/>"
Packit Service de44cd
		"      <menuitem action='save-and-close'/>"
Packit Service de44cd
		"      <separator/>"
Packit Service de44cd
		"      <placeholder name='custom-actions-placeholder'/>"
Packit Service de44cd
		"      <separator/>"
Packit Service de44cd
		"      <menuitem action='print-preview'/>"
Packit Service de44cd
		"      <menuitem action='print'/>"
Packit Service de44cd
		"      <separator/>"
Packit Service de44cd
		"      <menuitem action='close'/>"
Packit Service de44cd
		"    </menu>"
Packit Service de44cd
		"    <menu action='edit-menu'>"
Packit Service de44cd
		"      <menuitem action='undo'/>"
Packit Service de44cd
		"      <menuitem action='redo'/>"
Packit Service de44cd
		"      <separator/>"
Packit Service de44cd
		"      <menuitem action='cut-clipboard'/>"
Packit Service de44cd
		"      <menuitem action='copy-clipboard'/>"
Packit Service de44cd
		"      <menuitem action='paste-clipboard'/>"
Packit Service de44cd
		"      <menuitem action='delete-selection'/>"
Packit Service de44cd
		"      <separator/>"
Packit Service de44cd
		"      <menuitem action='select-all'/>"
Packit Service de44cd
		"    </menu>"
Packit Service de44cd
		"    <menu action='view-menu'>"
Packit Service de44cd
		"      <placeholder name='parts'/>"
Packit Service de44cd
		"      <separator />"
Packit Service de44cd
		"      <placeholder name='columns'/>"
Packit Service de44cd
		"    </menu>"
Packit Service de44cd
		"    <menu action='insert-menu'/>"
Packit Service de44cd
		"    <menu action='options-menu'>"
Packit Service de44cd
		"      <placeholder name='tabs'/>"
Packit Service de44cd
		"      <placeholder name='toggles'/>"
Packit Service de44cd
		"    </menu>"
Packit Service de44cd
		"    <menu action='help-menu'>"
Packit Service de44cd
		"      <menuitem action='help'/>"
Packit Service de44cd
		"    </menu>"
Packit Service de44cd
		"  </menubar>"
Packit Service de44cd
		"  <toolbar name='main-toolbar'>"
Packit Service de44cd
		"    <toolitem action='save-and-close'/>\n"
Packit Service de44cd
		"    <toolitem action='save'/>"
Packit Service de44cd
		"    <toolitem action='print'/>"
Packit Service de44cd
		"    <separator/>"
Packit Service de44cd
		"    <toolitem action='undo'/>"
Packit Service de44cd
		"    <toolitem action='redo'/>"
Packit Service de44cd
		"    <separator/>"
Packit Service de44cd
		"    <placeholder name='content'/>"
Packit Service de44cd
		"    <placeholder name='after-content'/>"
Packit Service de44cd
		"  </toolbar>"
Packit Service de44cd
		"</ui>";
Packit Service de44cd
Packit Service de44cd
	GtkActionEntry core_entries[] = {
Packit Service de44cd
Packit Service de44cd
		{ "close",
Packit Service de44cd
		  "window-close",
Packit Service de44cd
		  N_("_Close"),
Packit Service de44cd
		  "<Control>w",
Packit Service de44cd
		  N_("Close the current window"),
Packit Service de44cd
		  G_CALLBACK (action_close_cb) },
Packit Service de44cd
Packit Service de44cd
		{ "copy-clipboard",
Packit Service de44cd
		  "edit-copy",
Packit Service de44cd
		  N_("_Copy"),
Packit Service de44cd
		  "<Control>c",
Packit Service de44cd
		  N_("Copy the selection"),
Packit Service de44cd
		  NULL },  /* Handled by EFocusTracker */
Packit Service de44cd
Packit Service de44cd
		{ "cut-clipboard",
Packit Service de44cd
		  "edit-cut",
Packit Service de44cd
		  N_("Cu_t"),
Packit Service de44cd
		  "<Control>x",
Packit Service de44cd
		  N_("Cut the selection"),
Packit Service de44cd
		  NULL },  /* Handled by EFocusTracker */
Packit Service de44cd
Packit Service de44cd
		{ "delete-selection",
Packit Service de44cd
		  "edit-delete",
Packit Service de44cd
		  N_("_Delete"),
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  N_("Delete the selection"),
Packit Service de44cd
		  NULL },  /* Handled by EFocusTracker */
Packit Service de44cd
Packit Service de44cd
		{ "help",
Packit Service de44cd
		  "help-browser",
Packit Service de44cd
		  N_("_Help"),
Packit Service de44cd
		  "F1",
Packit Service de44cd
		  N_("View help"),
Packit Service de44cd
		  G_CALLBACK (action_help_cb) },
Packit Service de44cd
Packit Service de44cd
		{ "paste-clipboard",
Packit Service de44cd
		  "edit-paste",
Packit Service de44cd
		  N_("_Paste"),
Packit Service de44cd
		  "<Control>v",
Packit Service de44cd
		  N_("Paste the clipboard"),
Packit Service de44cd
		  NULL },  /* Handled by EFocusTracker */
Packit Service de44cd
Packit Service de44cd
		{ "print",
Packit Service de44cd
		  "document-print",
Packit Service de44cd
		  N_("_Print..."),
Packit Service de44cd
		  "<Control>p",
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  G_CALLBACK (action_print_cb) },
Packit Service de44cd
Packit Service de44cd
		{ "print-preview",
Packit Service de44cd
		  "document-print-preview",
Packit Service de44cd
		  N_("Pre_view..."),
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  G_CALLBACK (action_print_preview_cb) },
Packit Service de44cd
Packit Service de44cd
		{ "select-all",
Packit Service de44cd
		  "edit-select-all",
Packit Service de44cd
		  N_("Select _All"),
Packit Service de44cd
		  "<Control>a",
Packit Service de44cd
		  N_("Select all text"),
Packit Service de44cd
		  NULL },  /* Handled by EFocusTracker */
Packit Service de44cd
Packit Service de44cd
		{ "undo",
Packit Service de44cd
		  "edit-undo",
Packit Service de44cd
		  N_("_Undo"),
Packit Service de44cd
		  "<Control>z",
Packit Service de44cd
		  N_("Undo"),
Packit Service de44cd
		  NULL },  /* Handled by EFocusTracker */
Packit Service de44cd
Packit Service de44cd
		{ "redo",
Packit Service de44cd
		  "edit-redo",
Packit Service de44cd
		  N_("_Redo"),
Packit Service de44cd
		  "<Control>y",
Packit Service de44cd
		  N_("Redo"),
Packit Service de44cd
		  NULL },  /* Handled by EFocusTracker */
Packit Service de44cd
Packit Service de44cd
		/* Menus */
Packit Service de44cd
Packit Service de44cd
		{ "classification-menu",
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  N_("_Classification"),
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL },
Packit Service de44cd
Packit Service de44cd
		{ "edit-menu",
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  N_("_Edit"),
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL },
Packit Service de44cd
Packit Service de44cd
		{ "file-menu",
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  N_("_File"),
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL },
Packit Service de44cd
Packit Service de44cd
		{ "help-menu",
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  N_("_Help"),
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL },
Packit Service de44cd
Packit Service de44cd
		{ "insert-menu",
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  N_("_Insert"),
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL },
Packit Service de44cd
Packit Service de44cd
		{ "options-menu",
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  N_("_Options"),
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL },
Packit Service de44cd
Packit Service de44cd
		{ "view-menu",
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  N_("_View"),
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  NULL }
Packit Service de44cd
	};
Packit Service de44cd
Packit Service de44cd
	GtkActionEntry editable_entries[] = {
Packit Service de44cd
Packit Service de44cd
		{ "save",
Packit Service de44cd
		  "document-save",
Packit Service de44cd
		  N_("_Save"),
Packit Service de44cd
		  "<Control>s",
Packit Service de44cd
		  N_("Save current changes"),
Packit Service de44cd
		  G_CALLBACK (action_save_cb) },
Packit Service de44cd
Packit Service de44cd
		{ "save-and-close",
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  N_("Save and Close"),
Packit Service de44cd
		  NULL,
Packit Service de44cd
		  N_("Save current changes and close editor"),
Packit Service de44cd
		  G_CALLBACK (action_save_and_close_cb) }
Packit Service de44cd
	};
Packit Service de44cd
Packit Service de44cd
	ECompEditor *comp_editor = E_COMP_EDITOR (object);
Packit Service de44cd
	GtkWidget *widget;
Packit Service de44cd
	GtkBox *vbox;
Packit Service de44cd
	GtkAction *action;
Packit Service de44cd
	GtkActionGroup *action_group;
Packit Service de44cd
	EFocusTracker *focus_tracker;
Packit Service de44cd
	GError *error = NULL;
Packit Service de44cd
Packit Service de44cd
	G_OBJECT_CLASS (e_comp_editor_parent_class)->constructed (object);
Packit Service de44cd
Packit Service de44cd
	g_signal_connect (comp_editor, "key-press-event",
Packit Service de44cd
		G_CALLBACK (e_util_check_gtk_bindings_in_key_press_event_cb), NULL);
Packit Service de44cd
Packit Service de44cd
	comp_editor->priv->calendar_settings = e_util_ref_settings ("org.gnome.evolution.calendar");
Packit Service de44cd
	comp_editor->priv->ui_manager = gtk_ui_manager_new ();
Packit Service de44cd
Packit Service de44cd
	gtk_window_add_accel_group (
Packit Service de44cd
		GTK_WINDOW (comp_editor),
Packit Service de44cd
		gtk_ui_manager_get_accel_group (comp_editor->priv->ui_manager));
Packit Service de44cd
Packit Service de44cd
	/* Setup Action Groups */
Packit Service de44cd
Packit Service de44cd
	action_group = gtk_action_group_new ("individual");
Packit Service de44cd
	gtk_action_group_set_translation_domain (
Packit Service de44cd
		action_group, GETTEXT_PACKAGE);
Packit Service de44cd
	gtk_ui_manager_insert_action_group (
Packit Service de44cd
		comp_editor->priv->ui_manager, action_group, 0);
Packit Service de44cd
	g_object_unref (action_group);
Packit Service de44cd
Packit Service de44cd
	action_group = gtk_action_group_new ("core");
Packit Service de44cd
	gtk_action_group_set_translation_domain (
Packit Service de44cd
		action_group, GETTEXT_PACKAGE);
Packit Service de44cd
	gtk_action_group_add_actions (
Packit Service de44cd
		action_group, core_entries,
Packit Service de44cd
		G_N_ELEMENTS (core_entries), comp_editor);
Packit Service de44cd
	gtk_ui_manager_insert_action_group (
Packit Service de44cd
		comp_editor->priv->ui_manager, action_group, 0);
Packit Service de44cd
	g_object_unref (action_group);
Packit Service de44cd
Packit Service de44cd
	action_group = gtk_action_group_new ("editable");
Packit Service de44cd
	gtk_action_group_set_translation_domain (
Packit Service de44cd
		action_group, GETTEXT_PACKAGE);
Packit Service de44cd
	gtk_action_group_add_actions (
Packit Service de44cd
		action_group, editable_entries,
Packit Service de44cd
		G_N_ELEMENTS (editable_entries), comp_editor);
Packit Service de44cd
	gtk_ui_manager_insert_action_group (
Packit Service de44cd
		comp_editor->priv->ui_manager, action_group, 0);
Packit Service de44cd
	g_object_unref (action_group);
Packit Service de44cd
Packit Service de44cd
	action = gtk_action_group_get_action (action_group, "save-and-close");
Packit Service de44cd
	if (action) {
Packit Service de44cd
		GtkAction *save_action;
Packit Service de44cd
		GIcon *icon;
Packit Service de44cd
		GIcon *emblemed_icon;
Packit Service de44cd
		GEmblem *emblem;
Packit Service de44cd
Packit Service de44cd
		icon = g_themed_icon_new ("window-close");
Packit Service de44cd
		emblemed_icon = g_themed_icon_new ("document-save");
Packit Service de44cd
		emblem = g_emblem_new (emblemed_icon);
Packit Service de44cd
		g_object_unref (emblemed_icon);
Packit Service de44cd
Packit Service de44cd
		emblemed_icon = g_emblemed_icon_new (icon, emblem);
Packit Service de44cd
		g_object_unref (emblem);
Packit Service de44cd
		g_object_unref (icon);
Packit Service de44cd
Packit Service de44cd
		gtk_action_set_gicon (action, emblemed_icon);
Packit Service de44cd
Packit Service de44cd
		g_object_unref (emblemed_icon);
Packit Service de44cd
Packit Service de44cd
		save_action = gtk_action_group_get_action (action_group, "save");
Packit Service de44cd
		e_binding_bind_property (
Packit Service de44cd
			save_action, "sensitive",
Packit Service de44cd
			action, "sensitive",
Packit Service de44cd
			G_BINDING_SYNC_CREATE);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	gtk_ui_manager_add_ui_from_string (comp_editor->priv->ui_manager, ui, -1, &error);
Packit Service de44cd
	if (error != NULL) {
Packit Service de44cd
		g_warning ("%s: %s", G_STRFUNC, error->message);
Packit Service de44cd
		g_error_free (error);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	widget = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
Packit Service de44cd
	g_object_set (G_OBJECT (widget),
Packit Service de44cd
		"hexpand", TRUE,
Packit Service de44cd
		"halign", GTK_ALIGN_FILL,
Packit Service de44cd
		"vexpand", TRUE,
Packit Service de44cd
		"valign", GTK_ALIGN_FILL,
Packit Service de44cd
		NULL);
Packit Service de44cd
	gtk_widget_show (widget);
Packit Service de44cd
Packit Service de44cd
	vbox = GTK_BOX (widget);
Packit Service de44cd
Packit Service de44cd
	gtk_container_add (GTK_CONTAINER (comp_editor), widget);
Packit Service de44cd
Packit Service de44cd
	widget = e_comp_editor_get_managed_widget (comp_editor, "/main-menu");
Packit Service de44cd
	gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
Packit Service de44cd
	gtk_widget_set_visible (widget, TRUE);
Packit Service de44cd
Packit Service de44cd
	widget = e_comp_editor_get_managed_widget (comp_editor, "/main-toolbar");
Packit Service de44cd
	gtk_box_pack_start (GTK_BOX (vbox), widget, FALSE, FALSE, 0);
Packit Service de44cd
	gtk_widget_show (widget);
Packit Service de44cd
Packit Service de44cd
	gtk_style_context_add_class (
Packit Service de44cd
		gtk_widget_get_style_context (widget),
Packit Service de44cd
		GTK_STYLE_CLASS_PRIMARY_TOOLBAR);
Packit Service de44cd
Packit Service de44cd
	widget = e_alert_bar_new ();
Packit Service de44cd
	g_object_set (G_OBJECT (widget),
Packit Service de44cd
		"hexpand", FALSE,
Packit Service de44cd
		"halign", GTK_ALIGN_FILL,
Packit Service de44cd
		"vexpand", FALSE,
Packit Service de44cd
		"valign", GTK_ALIGN_START,
Packit Service de44cd
		NULL);
Packit Service de44cd
Packit Service de44cd
	comp_editor->priv->alert_bar = E_ALERT_BAR (widget);
Packit Service de44cd
Packit Service de44cd
	gtk_box_pack_start (vbox, widget, FALSE, FALSE, 0);
Packit Service de44cd
Packit Service de44cd
	widget = e_activity_bar_new ();
Packit Service de44cd
	g_object_set (G_OBJECT (widget),
Packit Service de44cd
		"hexpand", FALSE,
Packit Service de44cd
		"halign", GTK_ALIGN_FILL,
Packit Service de44cd
		"vexpand", FALSE,
Packit Service de44cd
		"valign", GTK_ALIGN_START,
Packit Service de44cd
		NULL);
Packit Service de44cd
Packit Service de44cd
	comp_editor->priv->activity_bar = E_ACTIVITY_BAR (widget);
Packit Service de44cd
Packit Service de44cd
	gtk_box_pack_start (vbox, widget, FALSE, FALSE, 0);
Packit Service de44cd
Packit Service de44cd
	widget = gtk_notebook_new ();
Packit Service de44cd
	g_object_set (G_OBJECT (widget),
Packit Service de44cd
		"hexpand", TRUE,
Packit Service de44cd
		"halign", GTK_ALIGN_FILL,
Packit Service de44cd
		"vexpand", TRUE,
Packit Service de44cd
		"valign", GTK_ALIGN_FILL,
Packit Service de44cd
		"show-tabs", TRUE,
Packit Service de44cd
		"show-border", FALSE,
Packit Service de44cd
		NULL);
Packit Service de44cd
	gtk_widget_show (widget);
Packit Service de44cd
Packit Service de44cd
	comp_editor->priv->content = GTK_NOTEBOOK (widget);
Packit Service de44cd
Packit Service de44cd
	gtk_box_pack_start (vbox, widget, TRUE, TRUE, 0);
Packit Service de44cd
Packit Service de44cd
	/* Configure an EFocusTracker to manage selection actions. */
Packit Service de44cd
Packit Service de44cd
	focus_tracker = e_focus_tracker_new (GTK_WINDOW (comp_editor));
Packit Service de44cd
Packit Service de44cd
	action = e_comp_editor_get_action (comp_editor, "cut-clipboard");
Packit Service de44cd
	e_focus_tracker_set_cut_clipboard_action (focus_tracker, action);
Packit Service de44cd
Packit Service de44cd
	action = e_comp_editor_get_action (comp_editor, "copy-clipboard");
Packit Service de44cd
	e_focus_tracker_set_copy_clipboard_action (focus_tracker, action);
Packit Service de44cd
Packit Service de44cd
	action = e_comp_editor_get_action (comp_editor, "paste-clipboard");
Packit Service de44cd
	e_focus_tracker_set_paste_clipboard_action (focus_tracker, action);
Packit Service de44cd
Packit Service de44cd
	action = e_comp_editor_get_action (comp_editor, "delete-selection");
Packit Service de44cd
	e_focus_tracker_set_delete_selection_action (focus_tracker, action);
Packit Service de44cd
Packit Service de44cd
	action = e_comp_editor_get_action (comp_editor, "select-all");
Packit Service de44cd
	e_focus_tracker_set_select_all_action (focus_tracker, action);
Packit Service de44cd
Packit Service de44cd
	action = e_comp_editor_get_action (comp_editor, "undo");
Packit Service de44cd
	e_focus_tracker_set_undo_action (focus_tracker, action);
Packit Service de44cd
Packit Service de44cd
	action = e_comp_editor_get_action (comp_editor, "redo");
Packit Service de44cd
	e_focus_tracker_set_redo_action (focus_tracker, action);
Packit Service de44cd
Packit Service de44cd
	comp_editor->priv->focus_tracker = focus_tracker;
Packit Service de44cd
Packit Service de44cd
	/* Desensitize the "save" action. */
Packit Service de44cd
	action = e_comp_editor_get_action (comp_editor, "save");
Packit Service de44cd
	gtk_action_set_sensitive (action, FALSE);
Packit Service de44cd
Packit Service de44cd
	e_binding_bind_property (comp_editor, "changed", action, "sensitive", 0);
Packit Service de44cd
Packit Service de44cd
	g_signal_connect (comp_editor, "realize", G_CALLBACK (comp_editor_realize_cb), NULL);
Packit Service de44cd
	g_signal_connect (comp_editor, "unrealize", G_CALLBACK (comp_editor_unrealize_cb), NULL);
Packit Service de44cd
Packit Service de44cd
	gtk_application_add_window (GTK_APPLICATION (comp_editor->priv->shell), GTK_WINDOW (comp_editor));
Packit Service de44cd
Packit Service de44cd
	e_extensible_load_extensions (E_EXTENSIBLE (comp_editor));
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_dispose (GObject *object)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditor *comp_editor = E_COMP_EDITOR (object);
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->page_general) {
Packit Service de44cd
		g_signal_handlers_disconnect_by_func (comp_editor->priv->page_general,
Packit Service de44cd
			G_CALLBACK (comp_editor_selected_source_notify_cb), comp_editor);
Packit Service de44cd
		comp_editor->priv->page_general = NULL;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->target_client_opening) {
Packit Service de44cd
		e_activity_cancel (comp_editor->priv->target_client_opening);
Packit Service de44cd
		g_clear_object (&comp_editor->priv->target_client_opening);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	g_slist_free_full (comp_editor->priv->pages, g_object_unref);
Packit Service de44cd
	comp_editor->priv->pages = NULL;
Packit Service de44cd
Packit Service de44cd
	g_free (comp_editor->priv->alarm_email_address);
Packit Service de44cd
	comp_editor->priv->alarm_email_address = NULL;
Packit Service de44cd
Packit Service de44cd
	g_free (comp_editor->priv->cal_email_address);
Packit Service de44cd
	comp_editor->priv->cal_email_address = NULL;
Packit Service de44cd
Packit Service de44cd
	g_free (comp_editor->priv->title_suffix);
Packit Service de44cd
	comp_editor->priv->title_suffix = NULL;
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->component) {
Packit Service de44cd
		icalcomponent_free (comp_editor->priv->component);
Packit Service de44cd
		comp_editor->priv->component = NULL;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	ece_connect_time_parts (comp_editor, NULL, NULL);
Packit Service de44cd
Packit Service de44cd
	g_clear_object (&comp_editor->priv->origin_source);
Packit Service de44cd
	g_clear_object (&comp_editor->priv->shell);
Packit Service de44cd
	g_clear_object (&comp_editor->priv->focus_tracker);
Packit Service de44cd
	g_clear_object (&comp_editor->priv->ui_manager);
Packit Service de44cd
	g_clear_object (&comp_editor->priv->source_client);
Packit Service de44cd
	g_clear_object (&comp_editor->priv->target_client);
Packit Service de44cd
	g_clear_object (&comp_editor->priv->calendar_settings);
Packit Service de44cd
	g_clear_object (&comp_editor->priv->validation_alert);
Packit Service de44cd
Packit Service de44cd
	comp_editor->priv->activity_bar = NULL;
Packit Service de44cd
Packit Service de44cd
	opened_editors = g_slist_remove (opened_editors, comp_editor);
Packit Service de44cd
Packit Service de44cd
	G_OBJECT_CLASS (e_comp_editor_parent_class)->dispose (object);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_init (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	comp_editor->priv = G_TYPE_INSTANCE_GET_PRIVATE (comp_editor, E_TYPE_COMP_EDITOR, ECompEditorPrivate);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_alert_sink_iface_init (EAlertSinkInterface *iface)
Packit Service de44cd
{
Packit Service de44cd
	iface->submit_alert = e_comp_editor_submit_alert;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static void
Packit Service de44cd
e_comp_editor_class_init (ECompEditorClass *klass)
Packit Service de44cd
{
Packit Service de44cd
	GtkWidgetClass *widget_class;
Packit Service de44cd
	GObjectClass *object_class;
Packit Service de44cd
Packit Service de44cd
	g_type_class_add_private (klass, sizeof (ECompEditorPrivate));
Packit Service de44cd
Packit Service de44cd
	klass->sensitize_widgets = ece_sensitize_widgets;
Packit Service de44cd
	klass->fill_widgets = ece_fill_widgets;
Packit Service de44cd
	klass->fill_component = ece_fill_component;
Packit Service de44cd
Packit Service de44cd
	widget_class = GTK_WIDGET_CLASS (klass);
Packit Service de44cd
	widget_class->delete_event = comp_editor_delete_event;
Packit Service de44cd
	widget_class->key_press_event = comp_editor_key_press_event;
Packit Service de44cd
Packit Service de44cd
	object_class = G_OBJECT_CLASS (klass);
Packit Service de44cd
	object_class->set_property = e_comp_editor_set_property;
Packit Service de44cd
	object_class->get_property = e_comp_editor_get_property;
Packit Service de44cd
	object_class->constructed = e_comp_editor_constructed;
Packit Service de44cd
	object_class->dispose = e_comp_editor_dispose;
Packit Service de44cd
Packit Service de44cd
	g_object_class_install_property (
Packit Service de44cd
		object_class,
Packit Service de44cd
		PROP_ALARM_EMAIL_ADDRESS,
Packit Service de44cd
		g_param_spec_string (
Packit Service de44cd
			"alarm-email-address",
Packit Service de44cd
			"Alarm Email Address",
Packit Service de44cd
			"Target client's alarm email address",
Packit Service de44cd
			NULL,
Packit Service de44cd
			G_PARAM_READWRITE |
Packit Service de44cd
			G_PARAM_STATIC_STRINGS));
Packit Service de44cd
Packit Service de44cd
	g_object_class_install_property (
Packit Service de44cd
		object_class,
Packit Service de44cd
		PROP_CAL_EMAIL_ADDRESS,
Packit Service de44cd
		g_param_spec_string (
Packit Service de44cd
			"cal-email-address",
Packit Service de44cd
			"Calendar Email Address",
Packit Service de44cd
			"Target client's calendar email address",
Packit Service de44cd
			NULL,
Packit Service de44cd
			G_PARAM_READWRITE |
Packit Service de44cd
			G_PARAM_STATIC_STRINGS));
Packit Service de44cd
Packit Service de44cd
	g_object_class_install_property (
Packit Service de44cd
		object_class,
Packit Service de44cd
		PROP_CHANGED,
Packit Service de44cd
		g_param_spec_boolean (
Packit Service de44cd
			"changed",
Packit Service de44cd
			"Changed",
Packit Service de44cd
			"Whether the editor content changed",
Packit Service de44cd
			FALSE,
Packit Service de44cd
			G_PARAM_READWRITE |
Packit Service de44cd
			G_PARAM_STATIC_STRINGS));
Packit Service de44cd
Packit Service de44cd
	g_object_class_install_property (
Packit Service de44cd
		object_class,
Packit Service de44cd
		PROP_COMPONENT,
Packit Service de44cd
		g_param_spec_pointer (
Packit Service de44cd
			"component",
Packit Service de44cd
			"Component",
Packit Service de44cd
			"icalcomponent currently edited",
Packit Service de44cd
			G_PARAM_READWRITE |
Packit Service de44cd
			G_PARAM_CONSTRUCT_ONLY |
Packit Service de44cd
			G_PARAM_STATIC_STRINGS));
Packit Service de44cd
Packit Service de44cd
	g_object_class_install_property (
Packit Service de44cd
		object_class,
Packit Service de44cd
		PROP_FLAGS,
Packit Service de44cd
		g_param_spec_uint (
Packit Service de44cd
			"flags",
Packit Service de44cd
			"Flags",
Packit Service de44cd
			"Editor flags",
Packit Service de44cd
			0, G_MAXUINT, 0,
Packit Service de44cd
			G_PARAM_READWRITE |
Packit Service de44cd
			G_PARAM_CONSTRUCT_ONLY |
Packit Service de44cd
			G_PARAM_STATIC_STRINGS));
Packit Service de44cd
Packit Service de44cd
	g_object_class_install_property (
Packit Service de44cd
		object_class,
Packit Service de44cd
		PROP_ORIGIN_SOURCE,
Packit Service de44cd
		g_param_spec_object (
Packit Service de44cd
			"origin-source",
Packit Service de44cd
			"Origin Source",
Packit Service de44cd
			"ESource of an ECalClient the component is stored in",
Packit Service de44cd
			E_TYPE_SOURCE,
Packit Service de44cd
			G_PARAM_READWRITE |
Packit Service de44cd
			G_PARAM_CONSTRUCT_ONLY |
Packit Service de44cd
			G_PARAM_STATIC_STRINGS));
Packit Service de44cd
Packit Service de44cd
	g_object_class_install_property (
Packit Service de44cd
		object_class,
Packit Service de44cd
		PROP_SHELL,
Packit Service de44cd
		g_param_spec_object (
Packit Service de44cd
			"shell",
Packit Service de44cd
			"Shell",
Packit Service de44cd
			"EShell",
Packit Service de44cd
			E_TYPE_SHELL,
Packit Service de44cd
			G_PARAM_READWRITE |
Packit Service de44cd
			G_PARAM_CONSTRUCT_ONLY |
Packit Service de44cd
			G_PARAM_STATIC_STRINGS));
Packit Service de44cd
Packit Service de44cd
	g_object_class_install_property (
Packit Service de44cd
		object_class,
Packit Service de44cd
		PROP_SOURCE_CLIENT,
Packit Service de44cd
		g_param_spec_object (
Packit Service de44cd
			"source-client",
Packit Service de44cd
			"Source Client",
Packit Service de44cd
			"ECalClient, the source calendar for the component",
Packit Service de44cd
			E_TYPE_CAL_CLIENT,
Packit Service de44cd
			G_PARAM_READWRITE |
Packit Service de44cd
			G_PARAM_STATIC_STRINGS));
Packit Service de44cd
Packit Service de44cd
	g_object_class_install_property (
Packit Service de44cd
		object_class,
Packit Service de44cd
		PROP_TARGET_CLIENT,
Packit Service de44cd
		g_param_spec_object (
Packit Service de44cd
			"target-client",
Packit Service de44cd
			"Target Client",
Packit Service de44cd
			"ECalClient currently set as the target calendar for the component",
Packit Service de44cd
			E_TYPE_CAL_CLIENT,
Packit Service de44cd
			G_PARAM_READWRITE |
Packit Service de44cd
			G_PARAM_STATIC_STRINGS));
Packit Service de44cd
Packit Service de44cd
	g_object_class_install_property (
Packit Service de44cd
		object_class,
Packit Service de44cd
		PROP_TITLE_SUFFIX,
Packit Service de44cd
		g_param_spec_string (
Packit Service de44cd
			"title-suffix",
Packit Service de44cd
			"Title Suffix",
Packit Service de44cd
			"Window title suffix, usually summary of the component",
Packit Service de44cd
			NULL,
Packit Service de44cd
			G_PARAM_READWRITE |
Packit Service de44cd
			G_PARAM_STATIC_STRINGS));
Packit Service de44cd
Packit Service de44cd
	signals[TIMES_CHANGED] = g_signal_new (
Packit Service de44cd
		"times-changed",
Packit Service de44cd
		G_TYPE_FROM_CLASS (klass),
Packit Service de44cd
		G_SIGNAL_RUN_FIRST,
Packit Service de44cd
		G_STRUCT_OFFSET (ECompEditorClass, times_changed),
Packit Service de44cd
		NULL, NULL, NULL,
Packit Service de44cd
		G_TYPE_NONE, 0,
Packit Service de44cd
		G_TYPE_NONE);
Packit Service de44cd
Packit Service de44cd
	signals[OBJECT_CREATED] = g_signal_new (
Packit Service de44cd
		"object-created",
Packit Service de44cd
		G_TYPE_FROM_CLASS (klass),
Packit Service de44cd
		G_SIGNAL_RUN_FIRST,
Packit Service de44cd
		G_STRUCT_OFFSET (ECompEditorClass, object_created),
Packit Service de44cd
		NULL, NULL, NULL,
Packit Service de44cd
		G_TYPE_NONE, 0,
Packit Service de44cd
		G_TYPE_NONE);
Packit Service de44cd
Packit Service de44cd
	signals[EDITOR_CLOSED] = g_signal_new (
Packit Service de44cd
		"editor-closed",
Packit Service de44cd
		G_TYPE_FROM_CLASS (klass),
Packit Service de44cd
		G_SIGNAL_RUN_LAST,
Packit Service de44cd
		G_STRUCT_OFFSET (ECompEditorClass, editor_closed),
Packit Service de44cd
		NULL, NULL,
Packit Service de44cd
		g_cclosure_marshal_VOID__BOOLEAN,
Packit Service de44cd
		G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_sensitize_widgets (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditorClass *comp_editor_class;
Packit Service de44cd
	gboolean force_insensitive;
Packit Service de44cd
	GtkWidget *current_focus;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	comp_editor_class = E_COMP_EDITOR_GET_CLASS (comp_editor);
Packit Service de44cd
	g_return_if_fail (comp_editor_class != NULL);
Packit Service de44cd
	g_return_if_fail (comp_editor_class->sensitize_widgets != NULL);
Packit Service de44cd
Packit Service de44cd
	current_focus = gtk_window_get_focus (GTK_WINDOW (comp_editor));
Packit Service de44cd
Packit Service de44cd
	force_insensitive = !comp_editor->priv->component;
Packit Service de44cd
Packit Service de44cd
	if (!force_insensitive) {
Packit Service de44cd
		ECalClient *target_client;
Packit Service de44cd
Packit Service de44cd
		target_client = e_comp_editor_get_target_client (comp_editor);
Packit Service de44cd
		if (target_client) {
Packit Service de44cd
			EClient *client = E_CLIENT (target_client);
Packit Service de44cd
Packit Service de44cd
			if (e_client_is_readonly (client)) {
Packit Service de44cd
				force_insensitive = TRUE;
Packit Service de44cd
			} else {
Packit Service de44cd
				if (!e_cal_util_component_has_organizer (comp_editor->priv->component) ||
Packit Service de44cd
				    ece_organizer_is_user (comp_editor, comp_editor->priv->component, client) ||
Packit Service de44cd
				    ece_sentby_is_user (comp_editor, comp_editor->priv->component, client)) {
Packit Service de44cd
					comp_editor->priv->flags = comp_editor->priv->flags | E_COMP_EDITOR_FLAG_ORGANIZER_IS_USER;
Packit Service de44cd
				} else {
Packit Service de44cd
					comp_editor->priv->flags = comp_editor->priv->flags & (~E_COMP_EDITOR_FLAG_ORGANIZER_IS_USER);
Packit Service de44cd
				}
Packit Service de44cd
			}
Packit Service de44cd
		} else {
Packit Service de44cd
			force_insensitive = TRUE;
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	comp_editor_class->sensitize_widgets (comp_editor, force_insensitive);
Packit Service de44cd
Packit Service de44cd
	if (force_insensitive)
Packit Service de44cd
		comp_editor->priv->restore_focus = current_focus;
Packit Service de44cd
	else
Packit Service de44cd
		ece_restore_focus (comp_editor);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_fill_widgets (ECompEditor *comp_editor,
Packit Service de44cd
			    icalcomponent *component)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditorClass *comp_editor_class;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
	g_return_if_fail (component != NULL);
Packit Service de44cd
Packit Service de44cd
	comp_editor_class = E_COMP_EDITOR_GET_CLASS (comp_editor);
Packit Service de44cd
	g_return_if_fail (comp_editor_class != NULL);
Packit Service de44cd
	g_return_if_fail (comp_editor_class->fill_widgets != NULL);
Packit Service de44cd
Packit Service de44cd
	e_comp_editor_set_updating (comp_editor, TRUE);
Packit Service de44cd
Packit Service de44cd
	comp_editor_class->fill_widgets (comp_editor, component);
Packit Service de44cd
Packit Service de44cd
	e_comp_editor_set_updating (comp_editor, FALSE);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
gboolean
Packit Service de44cd
e_comp_editor_fill_component (ECompEditor *comp_editor,
Packit Service de44cd
			      icalcomponent *component)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditorClass *comp_editor_class;
Packit Service dc8d6a
	GtkWidget *focused_widget;
Packit Service de44cd
	gboolean is_valid;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), FALSE);
Packit Service de44cd
	g_return_val_if_fail (component != NULL, FALSE);
Packit Service de44cd
Packit Service de44cd
	comp_editor_class = E_COMP_EDITOR_GET_CLASS (comp_editor);
Packit Service de44cd
	g_return_val_if_fail (comp_editor_class != NULL, FALSE);
Packit Service de44cd
	g_return_val_if_fail (comp_editor_class->fill_component != NULL, FALSE);
Packit Service de44cd
Packit Service dc8d6a
	focused_widget = gtk_window_get_focus (GTK_WINDOW (comp_editor));
Packit Service dc8d6a
	if (focused_widget) {
Packit Service dc8d6a
		GtkWidget *parent, *ce_widget = GTK_WIDGET (comp_editor);
Packit Service dc8d6a
Packit Service dc8d6a
		/* When a cell-renderer is focused and editing the cell content,
Packit Service dc8d6a
		   then unfocus it may mean to free the currently focused widget,
Packit Service dc8d6a
		   thus get the GtkTreeView in such cases. */
Packit Service dc8d6a
		parent = focused_widget;
Packit Service dc8d6a
		while (parent = gtk_widget_get_parent (parent), parent && parent != ce_widget) {
Packit Service dc8d6a
			if (GTK_IS_TREE_VIEW (parent)) {
Packit Service dc8d6a
				focused_widget = parent;
Packit Service dc8d6a
				break;
Packit Service dc8d6a
			}
Packit Service dc8d6a
		}
Packit Service dc8d6a
Packit Service dc8d6a
		/* Save any pending changes */
Packit Service dc8d6a
		gtk_window_set_focus (GTK_WINDOW (comp_editor), NULL);
Packit Service dc8d6a
	}
Packit Service dc8d6a
Packit Service de44cd
	is_valid = comp_editor_class->fill_component (comp_editor, component);
Packit Service de44cd
Packit Service dc8d6a
	if (focused_widget) {
Packit Service dc8d6a
		if (GTK_IS_ENTRY (focused_widget))
Packit Service dc8d6a
			gtk_entry_grab_focus_without_selecting (GTK_ENTRY (focused_widget));
Packit Service dc8d6a
		else
Packit Service dc8d6a
			gtk_widget_grab_focus (focused_widget);
Packit Service dc8d6a
	}
Packit Service dc8d6a
Packit Service de44cd
	if (is_valid && comp_editor->priv->validation_alert) {
Packit Service de44cd
		e_alert_response (comp_editor->priv->validation_alert, GTK_RESPONSE_CLOSE);
Packit Service de44cd
		g_clear_object (&comp_editor->priv->validation_alert);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (is_valid) {
Packit Service de44cd
		ECalClient *target_client;
Packit Service de44cd
		EClient *client = NULL;
Packit Service de44cd
Packit Service de44cd
		target_client = e_comp_editor_get_target_client (comp_editor);
Packit Service de44cd
		if (target_client)
Packit Service de44cd
			client = E_CLIENT (target_client);
Packit Service de44cd
Packit Service de44cd
		if (!e_cal_util_component_has_organizer (component) || (client && (
Packit Service de44cd
		    ece_organizer_is_user (comp_editor, component, client) ||
Packit Service de44cd
		    ece_sentby_is_user (comp_editor, component, client)))) {
Packit Service de44cd
			gint sequence;
Packit Service de44cd
Packit Service de44cd
			sequence = icalcomponent_get_sequence (component);
Packit Service de44cd
			icalcomponent_set_sequence (component, sequence + 1);
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	return is_valid;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_set_validation_error (ECompEditor *comp_editor,
Packit Service de44cd
				    ECompEditorPage *error_page,
Packit Service de44cd
				    GtkWidget *error_widget,
Packit Service de44cd
				    const gchar *error_message)
Packit Service de44cd
{
Packit Service de44cd
	EAlert *alert, *previous_alert;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
	g_return_if_fail (error_message != NULL);
Packit Service de44cd
Packit Service de44cd
	/* Ignore validation errors when the inner editor is currently updating. */
Packit Service de44cd
	if (e_comp_editor_get_updating (comp_editor))
Packit Service de44cd
		return;
Packit Service de44cd
Packit Service de44cd
	alert = e_alert_new ("calendar:comp-editor-failed-validate", error_message, NULL);
Packit Service de44cd
Packit Service de44cd
	e_alert_bar_add_alert (comp_editor->priv->alert_bar, alert);
Packit Service de44cd
Packit Service de44cd
	previous_alert = comp_editor->priv->validation_alert;
Packit Service de44cd
	comp_editor->priv->validation_alert = alert;
Packit Service de44cd
Packit Service de44cd
	if (previous_alert) {
Packit Service de44cd
		e_alert_response (previous_alert, GTK_RESPONSE_CLOSE);
Packit Service de44cd
		g_clear_object (&previous_alert);
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (error_page)
Packit Service de44cd
		e_comp_editor_select_page (comp_editor, error_page);
Packit Service de44cd
Packit Service de44cd
	if (error_widget)
Packit Service de44cd
		gtk_widget_grab_focus (error_widget);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
EShell *
Packit Service de44cd
e_comp_editor_get_shell (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->shell;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
GSettings *
Packit Service de44cd
e_comp_editor_get_settings (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->calendar_settings;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
ESource *
Packit Service de44cd
e_comp_editor_get_origin_source (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->origin_source;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
icalcomponent *
Packit Service de44cd
e_comp_editor_get_component (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->component;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
guint32
Packit Service de44cd
e_comp_editor_get_flags (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), 0);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->flags;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_set_flags (ECompEditor *comp_editor,
Packit Service de44cd
			 guint32 flags)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (comp_editor->priv->flags == flags)
Packit Service de44cd
		return;
Packit Service de44cd
Packit Service de44cd
	comp_editor->priv->flags = flags;
Packit Service de44cd
Packit Service de44cd
	g_object_notify (G_OBJECT (comp_editor), "flags");
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
EFocusTracker *
Packit Service de44cd
e_comp_editor_get_focus_tracker (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->focus_tracker;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
GtkUIManager *
Packit Service de44cd
e_comp_editor_get_ui_manager (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->ui_manager;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
GtkAction *
Packit Service de44cd
e_comp_editor_get_action (ECompEditor *comp_editor,
Packit Service de44cd
			  const gchar *action_name)
Packit Service de44cd
{
Packit Service de44cd
	GtkUIManager *ui_manager;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
	g_return_val_if_fail (action_name != NULL, NULL);
Packit Service de44cd
Packit Service de44cd
	ui_manager = e_comp_editor_get_ui_manager (comp_editor);
Packit Service de44cd
Packit Service de44cd
	return e_lookup_action (ui_manager, action_name);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
GtkActionGroup *
Packit Service de44cd
e_comp_editor_get_action_group (ECompEditor *comp_editor,
Packit Service de44cd
				const gchar *group_name)
Packit Service de44cd
{
Packit Service de44cd
	GtkUIManager *ui_manager;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
	g_return_val_if_fail (group_name != NULL, NULL);
Packit Service de44cd
Packit Service de44cd
	ui_manager = e_comp_editor_get_ui_manager (comp_editor);
Packit Service de44cd
Packit Service de44cd
	return e_lookup_action_group (ui_manager, group_name);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
GtkWidget *
Packit Service de44cd
e_comp_editor_get_managed_widget (ECompEditor *comp_editor,
Packit Service de44cd
				  const gchar *widget_path)
Packit Service de44cd
{
Packit Service de44cd
	GtkUIManager *ui_manager;
Packit Service de44cd
	GtkWidget *widget;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
	g_return_val_if_fail (widget_path != NULL, NULL);
Packit Service de44cd
Packit Service de44cd
	ui_manager = e_comp_editor_get_ui_manager (comp_editor);
Packit Service de44cd
	widget = gtk_ui_manager_get_widget (ui_manager, widget_path);
Packit Service de44cd
	g_return_val_if_fail (widget != NULL, NULL);
Packit Service de44cd
Packit Service de44cd
	return widget;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
const gchar *
Packit Service de44cd
e_comp_editor_get_alarm_email_address (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->alarm_email_address;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_set_alarm_email_address (ECompEditor *comp_editor,
Packit Service de44cd
				       const gchar *alarm_email_address)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (g_strcmp0 (alarm_email_address, comp_editor->priv->alarm_email_address) == 0)
Packit Service de44cd
		return;
Packit Service de44cd
Packit Service de44cd
	g_free (comp_editor->priv->alarm_email_address);
Packit Service de44cd
	comp_editor->priv->alarm_email_address = g_strdup (alarm_email_address);
Packit Service de44cd
Packit Service de44cd
	g_object_notify (G_OBJECT (comp_editor), "alarm-email-address");
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
const gchar *
Packit Service de44cd
e_comp_editor_get_cal_email_address (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->cal_email_address;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_set_cal_email_address (ECompEditor *comp_editor,
Packit Service de44cd
				     const gchar *cal_email_address)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (g_strcmp0 (cal_email_address, comp_editor->priv->cal_email_address) == 0)
Packit Service de44cd
		return;
Packit Service de44cd
Packit Service de44cd
	g_free (comp_editor->priv->cal_email_address);
Packit Service de44cd
	comp_editor->priv->cal_email_address = g_strdup (cal_email_address);
Packit Service de44cd
Packit Service de44cd
	g_object_notify (G_OBJECT (comp_editor), "cal-email-address");
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
gboolean
Packit Service de44cd
e_comp_editor_get_changed (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), FALSE);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->changed;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_set_changed (ECompEditor *comp_editor,
Packit Service de44cd
			   gboolean changed)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if ((changed ? 1 : 0) == (comp_editor->priv->changed ? 1 : 0))
Packit Service de44cd
		return;
Packit Service de44cd
Packit Service de44cd
	comp_editor->priv->changed = changed;
Packit Service de44cd
Packit Service de44cd
	g_object_notify (G_OBJECT (comp_editor), "changed");
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_ensure_changed (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	e_comp_editor_set_changed (comp_editor, TRUE);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
gboolean
Packit Service de44cd
e_comp_editor_get_updating (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), FALSE);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->updating > 0;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_set_updating (ECompEditor *comp_editor,
Packit Service de44cd
			    gboolean updating)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (updating) {
Packit Service de44cd
		comp_editor->priv->updating++;
Packit Service de44cd
	} else if (comp_editor->priv->updating > 0) {
Packit Service de44cd
		comp_editor->priv->updating--;
Packit Service de44cd
	} else {
Packit Service de44cd
		g_warn_if_reached ();
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
ECalClient *
Packit Service de44cd
e_comp_editor_get_source_client (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->source_client;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_set_source_client (ECompEditor *comp_editor,
Packit Service de44cd
				 ECalClient *client)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (client == comp_editor->priv->source_client)
Packit Service de44cd
		return;
Packit Service de44cd
Packit Service de44cd
	if (client)
Packit Service de44cd
		g_object_ref (client);
Packit Service de44cd
	g_clear_object (&comp_editor->priv->source_client);
Packit Service de44cd
	comp_editor->priv->source_client = client;
Packit Service de44cd
Packit Service de44cd
	g_object_notify (G_OBJECT (comp_editor), "source-client");
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
ECalClient *
Packit Service de44cd
e_comp_editor_get_target_client (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->target_client;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_set_target_client (ECompEditor *comp_editor,
Packit Service de44cd
				 ECalClient *client)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (client == comp_editor->priv->target_client)
Packit Service de44cd
		return;
Packit Service de44cd
Packit Service de44cd
	if (client)
Packit Service de44cd
		g_object_ref (client);
Packit Service de44cd
	g_clear_object (&comp_editor->priv->target_client);
Packit Service de44cd
	comp_editor->priv->target_client = client;
Packit Service de44cd
Packit Service de44cd
	g_object_notify (G_OBJECT (comp_editor), "target-client");
Packit Service de44cd
Packit Service de44cd
	if (client && !comp_editor->priv->source_client && comp_editor->priv->origin_source &&
Packit Service de44cd
	    e_source_equal (e_client_get_source (E_CLIENT (client)), comp_editor->priv->origin_source))
Packit Service de44cd
		e_comp_editor_set_source_client (comp_editor, client);
Packit Service de44cd
Packit Service de44cd
	e_comp_editor_sensitize_widgets (comp_editor);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
const gchar *
Packit Service de44cd
e_comp_editor_get_title_suffix (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
Packit Service de44cd
	return comp_editor->priv->title_suffix;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_set_title_suffix (ECompEditor *comp_editor,
Packit Service de44cd
				const gchar *title_suffix)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (g_strcmp0 (title_suffix, comp_editor->priv->title_suffix) == 0)
Packit Service de44cd
		return;
Packit Service de44cd
Packit Service de44cd
	g_free (comp_editor->priv->title_suffix);
Packit Service de44cd
	comp_editor->priv->title_suffix = g_strdup (title_suffix);
Packit Service de44cd
Packit Service de44cd
	g_object_notify (G_OBJECT (comp_editor), "title-suffix");
Packit Service de44cd
Packit Service de44cd
	e_comp_editor_update_window_title (comp_editor);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_set_time_parts (ECompEditor *comp_editor,
Packit Service de44cd
			      ECompEditorPropertyPart *dtstart_part,
Packit Service de44cd
			      ECompEditorPropertyPart *dtend_part)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (dtstart_part)
Packit Service de44cd
		g_return_if_fail (E_IS_COMP_EDITOR_PROPERTY_PART_DATETIME (dtstart_part));
Packit Service de44cd
	if (dtend_part)
Packit Service de44cd
		g_return_if_fail (E_IS_COMP_EDITOR_PROPERTY_PART_DATETIME (dtend_part));
Packit Service de44cd
Packit Service de44cd
	ece_connect_time_parts (comp_editor, dtstart_part, dtend_part);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_get_time_parts (ECompEditor *comp_editor,
Packit Service de44cd
			      ECompEditorPropertyPart **out_dtstart_part,
Packit Service de44cd
			      ECompEditorPropertyPart **out_dtend_part)
Packit Service de44cd
{
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
Packit Service de44cd
	if (out_dtstart_part)
Packit Service de44cd
		*out_dtstart_part = comp_editor->priv->dtstart_part;
Packit Service de44cd
	if (out_dtend_part)
Packit Service de44cd
		*out_dtend_part = comp_editor->priv->dtend_part;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/* This consumes the @page. */
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_add_page (ECompEditor *comp_editor,
Packit Service de44cd
			const gchar *label,
Packit Service de44cd
			ECompEditorPage *page)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditor *pages_comp_editor;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
	g_return_if_fail (label != NULL);
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR_PAGE (page));
Packit Service de44cd
Packit Service de44cd
	pages_comp_editor = e_comp_editor_page_ref_editor (page);
Packit Service de44cd
	if (pages_comp_editor != comp_editor) {
Packit Service de44cd
		g_warn_if_fail (pages_comp_editor == comp_editor);
Packit Service de44cd
		g_clear_object (&pages_comp_editor);
Packit Service de44cd
		return;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	g_clear_object (&pages_comp_editor);
Packit Service de44cd
Packit Service de44cd
	/* One reference uses the GtkNotebook, the other the pages GSList */
Packit Service de44cd
	gtk_notebook_append_page (comp_editor->priv->content,
Packit Service de44cd
		GTK_WIDGET (page),
Packit Service de44cd
		gtk_label_new_with_mnemonic (label));
Packit Service de44cd
Packit Service de44cd
	comp_editor->priv->pages = g_slist_append (comp_editor->priv->pages, g_object_ref (page));
Packit Service de44cd
Packit Service de44cd
	g_signal_connect_swapped (page, "changed", G_CALLBACK (e_comp_editor_ensure_changed), comp_editor);
Packit Service de44cd
Packit Service de44cd
	if (E_IS_COMP_EDITOR_PAGE_GENERAL (page)) {
Packit Service de44cd
		ECompEditorPageGeneral *page_general;
Packit Service de44cd
Packit Service de44cd
		g_return_if_fail (comp_editor->priv->page_general == NULL);
Packit Service de44cd
Packit Service de44cd
		page_general = E_COMP_EDITOR_PAGE_GENERAL (page);
Packit Service de44cd
Packit Service de44cd
		g_signal_connect (page_general, "notify::selected-source",
Packit Service de44cd
			G_CALLBACK (comp_editor_selected_source_notify_cb), comp_editor);
Packit Service de44cd
Packit Service de44cd
		comp_editor->priv->page_general = page_general;
Packit Service de44cd
Packit Service de44cd
		if ((comp_editor->priv->flags & E_COMP_EDITOR_FLAG_WITH_ATTENDEES) != 0) {
Packit Service de44cd
			e_comp_editor_page_general_set_show_attendees (page_general, TRUE);
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/* The returned pointer is owned by the @comp_editor; returns the first instance,
Packit Service de44cd
   in order of the addition. */
Packit Service de44cd
ECompEditorPage *
Packit Service de44cd
e_comp_editor_get_page (ECompEditor *comp_editor,
Packit Service de44cd
			GType page_type)
Packit Service de44cd
{
Packit Service de44cd
	GSList *link;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
	g_return_val_if_fail (g_type_is_a (page_type, E_TYPE_COMP_EDITOR_PAGE), NULL);
Packit Service de44cd
	g_return_val_if_fail (page_type != E_TYPE_COMP_EDITOR_PAGE, NULL);
Packit Service de44cd
Packit Service de44cd
	for (link = comp_editor->priv->pages; link; link = g_slist_next (link)) {
Packit Service de44cd
		ECompEditorPage *page = link->data;
Packit Service de44cd
Packit Service de44cd
		if (G_TYPE_CHECK_INSTANCE_TYPE (page, page_type))
Packit Service de44cd
			return page;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	return NULL;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/* Free the returned GSList with g_slist_free(), the memebers are owned by the comp_editor */
Packit Service de44cd
GSList *
Packit Service de44cd
e_comp_editor_get_pages (ECompEditor *comp_editor)
Packit Service de44cd
{
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
Packit Service de44cd
	return g_slist_copy (comp_editor->priv->pages);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_select_page (ECompEditor *comp_editor,
Packit Service de44cd
			   ECompEditorPage *page)
Packit Service de44cd
{
Packit Service de44cd
	gint page_num;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR_PAGE (page));
Packit Service de44cd
Packit Service de44cd
	page_num = gtk_notebook_page_num (comp_editor->priv->content, GTK_WIDGET (page));
Packit Service de44cd
	g_return_if_fail (page_num != -1);
Packit Service de44cd
Packit Service de44cd
	gtk_notebook_set_current_page (comp_editor->priv->content, page_num);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/* Unref returned pointer when done with it. */
Packit Service de44cd
static EAlert *
Packit Service de44cd
e_comp_editor_add_alert (ECompEditor *comp_editor,
Packit Service de44cd
			 const gchar *alert_id,
Packit Service de44cd
			 const gchar *primary_text,
Packit Service de44cd
			 const gchar *secondary_text)
Packit Service de44cd
{
Packit Service de44cd
	EAlert *alert;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), NULL);
Packit Service de44cd
	g_return_val_if_fail (alert_id != NULL, NULL);
Packit Service de44cd
	g_return_val_if_fail (primary_text != NULL || secondary_text != NULL, NULL);
Packit Service de44cd
Packit Service de44cd
	alert = e_alert_new (alert_id,
Packit Service de44cd
		primary_text ? primary_text : "",
Packit Service de44cd
		secondary_text ? secondary_text : "",
Packit Service de44cd
		NULL);
Packit Service de44cd
Packit Service de44cd
	e_alert_bar_add_alert (comp_editor->priv->alert_bar, alert);
Packit Service de44cd
Packit Service de44cd
	return alert;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/* Unref returned pointer when done with it. */
Packit Service de44cd
EAlert *
Packit Service de44cd
e_comp_editor_add_information (ECompEditor *comp_editor,
Packit Service de44cd
			       const gchar *primary_text,
Packit Service de44cd
			       const gchar *secondary_text)
Packit Service de44cd
{
Packit Service de44cd
	return e_comp_editor_add_alert (comp_editor, "calendar:comp-editor-information", primary_text, secondary_text);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/* Unref returned pointer when done with it. */
Packit Service de44cd
EAlert *
Packit Service de44cd
e_comp_editor_add_warning (ECompEditor *comp_editor,
Packit Service de44cd
			   const gchar *primary_text,
Packit Service de44cd
			   const gchar *secondary_text)
Packit Service de44cd
{
Packit Service de44cd
	return e_comp_editor_add_alert (comp_editor, "calendar:comp-editor-warning", primary_text, secondary_text);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
/* Unref returned pointer when done with it. */
Packit Service de44cd
EAlert *
Packit Service de44cd
e_comp_editor_add_error (ECompEditor *comp_editor,
Packit Service de44cd
			 const gchar *primary_text,
Packit Service de44cd
			 const gchar *secondary_text)
Packit Service de44cd
{
Packit Service de44cd
	return e_comp_editor_add_alert (comp_editor, "calendar:comp-editor-error", primary_text, secondary_text);
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
ece_check_start_before_end (ECompEditor *comp_editor,
Packit Service de44cd
			    struct icaltimetype *start_tt,
Packit Service de44cd
			    struct icaltimetype *end_tt,
Packit Service de44cd
			    gboolean adjust_end_time)
Packit Service de44cd
{
Packit Service de44cd
	struct icaltimetype end_tt_copy;
Packit Service de44cd
	icaltimezone *start_zone, *end_zone;
Packit Service de44cd
	gint duration = -1;
Packit Service de44cd
	gint cmp;
Packit Service de44cd
Packit Service de44cd
	if ((e_comp_editor_get_flags (comp_editor) & E_COMP_EDITOR_FLAG_IS_NEW) == 0) {
Packit Service de44cd
		icalcomponent *icomp;
Packit Service de44cd
Packit Service de44cd
		icomp = e_comp_editor_get_component (comp_editor);
Packit Service de44cd
		if (icomp &&
Packit Service de44cd
		    icalcomponent_get_first_property (icomp, ICAL_DTSTART_PROPERTY) &&
Packit Service de44cd
		    (icalcomponent_get_first_property (icomp, ICAL_DTEND_PROPERTY) ||
Packit Service de44cd
		     icalcomponent_get_first_property (icomp, ICAL_DUE_PROPERTY))) {
Packit Service de44cd
			struct icaltimetype orig_start, orig_end;
Packit Service de44cd
Packit Service de44cd
			orig_start = icalcomponent_get_dtstart (icomp);
Packit Service de44cd
			orig_end = icalcomponent_get_dtend (icomp);
Packit Service de44cd
Packit Service de44cd
			if (icaltime_is_valid_time (orig_start) &&
Packit Service de44cd
			    icaltime_is_valid_time (orig_end)) {
Packit Service de44cd
				duration = icaltime_as_timet (orig_end) - icaltime_as_timet (orig_start);
Packit Service de44cd
			}
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	start_zone = (icaltimezone *) start_tt->zone;
Packit Service de44cd
	end_zone = (icaltimezone *) end_tt->zone;
Packit Service de44cd
Packit Service de44cd
	/* Convert the end time to the same timezone as the start time. */
Packit Service de44cd
	end_tt_copy = *end_tt;
Packit Service de44cd
Packit Service de44cd
	if (start_zone && end_zone && start_zone != end_zone)
Packit Service de44cd
		icaltimezone_convert_time (&end_tt_copy, end_zone, start_zone);
Packit Service de44cd
Packit Service de44cd
	/* Now check if the start time is after the end time. If it is,
Packit Service de44cd
	 * we need to modify one of the times. */
Packit Service de44cd
	cmp = icaltime_compare (*start_tt, end_tt_copy);
Packit Service de44cd
	if (cmp > 0) {
Packit Service de44cd
		if (adjust_end_time) {
Packit Service de44cd
			/* Try to switch only the date */
Packit Service de44cd
			end_tt->year = start_tt->year;
Packit Service de44cd
			end_tt->month = start_tt->month;
Packit Service de44cd
			end_tt->day = start_tt->day;
Packit Service de44cd
Packit Service de44cd
			end_tt_copy = *end_tt;
Packit Service de44cd
			if (start_zone && end_zone && start_zone != end_zone)
Packit Service de44cd
				icaltimezone_convert_time (&end_tt_copy, end_zone, start_zone);
Packit Service de44cd
Packit Service de44cd
			if (duration > 0)
Packit Service de44cd
				icaltime_adjust (&end_tt_copy, 0, 0, 0, -duration);
Packit Service de44cd
Packit Service de44cd
			if (icaltime_compare (*start_tt, end_tt_copy) >= 0) {
Packit Service de44cd
				*end_tt = *start_tt;
Packit Service de44cd
Packit Service de44cd
				if (duration >= 0) {
Packit Service de44cd
					icaltime_adjust (end_tt, 0, 0, 0, duration);
Packit Service de44cd
				} else {
Packit Service de44cd
					/* Modify the end time, to be the start + 1 hour/day. */
Packit Service de44cd
					icaltime_adjust (end_tt, 0, start_tt->is_date ? 24 : 1, 0, 0);
Packit Service de44cd
				}
Packit Service de44cd
Packit Service de44cd
				if (start_zone && end_zone && start_zone != end_zone)
Packit Service de44cd
					icaltimezone_convert_time (end_tt, start_zone, end_zone);
Packit Service de44cd
			}
Packit Service de44cd
		} else {
Packit Service de44cd
			/* Try to switch only the date */
Packit Service de44cd
			start_tt->year = end_tt->year;
Packit Service de44cd
			start_tt->month = end_tt->month;
Packit Service de44cd
			start_tt->day = end_tt->day;
Packit Service de44cd
Packit Service de44cd
			if (icaltime_compare (*start_tt, end_tt_copy) >= 0) {
Packit Service de44cd
				*start_tt = *end_tt;
Packit Service de44cd
Packit Service de44cd
				if (duration >= 0) {
Packit Service de44cd
					icaltime_adjust (start_tt, 0, 0, 0, -duration);
Packit Service de44cd
				} else {
Packit Service de44cd
					/* Modify the start time, to be the end - 1 hour/day. */
Packit Service de44cd
					icaltime_adjust (start_tt, 0, start_tt->is_date ? -24 : -1, 0, 0);
Packit Service de44cd
				}
Packit Service de44cd
Packit Service de44cd
				if (start_zone && end_zone && start_zone != end_zone)
Packit Service de44cd
					icaltimezone_convert_time (start_tt, end_zone, start_zone);
Packit Service de44cd
			}
Packit Service de44cd
		}
Packit Service de44cd
Packit Service de44cd
		return TRUE;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	return FALSE;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
void
Packit Service de44cd
e_comp_editor_ensure_start_before_end (ECompEditor *comp_editor,
Packit Service de44cd
				       ECompEditorPropertyPart *start_datetime,
Packit Service de44cd
				       ECompEditorPropertyPart *end_datetime,
Packit Service de44cd
				       gboolean change_end_datetime)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditorPropertyPartDatetime *start_dtm, *end_dtm;
Packit Service de44cd
	struct icaltimetype start_tt, end_tt;
Packit Service de44cd
	gboolean set_dtstart = FALSE, set_dtend = FALSE;
Packit Service de44cd
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR (comp_editor));
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR_PROPERTY_PART_DATETIME (start_datetime));
Packit Service de44cd
	g_return_if_fail (E_IS_COMP_EDITOR_PROPERTY_PART_DATETIME (end_datetime));
Packit Service de44cd
Packit Service de44cd
	start_dtm = E_COMP_EDITOR_PROPERTY_PART_DATETIME (start_datetime);
Packit Service de44cd
	end_dtm = E_COMP_EDITOR_PROPERTY_PART_DATETIME (end_datetime);
Packit Service de44cd
Packit Service de44cd
	start_tt = e_comp_editor_property_part_datetime_get_value (start_dtm);
Packit Service de44cd
	end_tt = e_comp_editor_property_part_datetime_get_value (end_dtm);
Packit Service de44cd
Packit Service de44cd
	if (icaltime_is_null_time (start_tt) ||
Packit Service de44cd
	    icaltime_is_null_time (end_tt) ||
Packit Service de44cd
	    !icaltime_is_valid_time (start_tt) ||
Packit Service de44cd
	    !icaltime_is_valid_time (end_tt))
Packit Service de44cd
		return;
Packit Service de44cd
Packit Service de44cd
	if (start_tt.is_date || end_tt.is_date) {
Packit Service de44cd
		/* All Day Events are simple. We just compare the dates and if
Packit Service de44cd
		 * start > end we copy one of them to the other. */
Packit Service de44cd
		gint cmp;
Packit Service de44cd
Packit Service de44cd
		start_tt.is_date = TRUE;
Packit Service de44cd
		end_tt.is_date = TRUE;
Packit Service de44cd
Packit Service de44cd
		cmp = icaltime_compare_date_only (start_tt, end_tt);
Packit Service de44cd
Packit Service de44cd
		if (cmp > 0) {
Packit Service de44cd
			if (change_end_datetime) {
Packit Service de44cd
				end_tt = start_tt;
Packit Service de44cd
				set_dtend = TRUE;
Packit Service de44cd
			} else {
Packit Service de44cd
				start_tt = end_tt;
Packit Service de44cd
				set_dtstart = TRUE;
Packit Service de44cd
			}
Packit Service de44cd
		}
Packit Service de44cd
	} else {
Packit Service de44cd
		if (ece_check_start_before_end (comp_editor, &start_tt, &end_tt, change_end_datetime)) {
Packit Service de44cd
			if (change_end_datetime)
Packit Service de44cd
				set_dtend = TRUE;
Packit Service de44cd
			else
Packit Service de44cd
				set_dtstart = TRUE;
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	if (set_dtstart || set_dtend) {
Packit Service de44cd
		e_comp_editor_set_updating (comp_editor, TRUE);
Packit Service de44cd
Packit Service de44cd
		if (set_dtstart)
Packit Service de44cd
			e_comp_editor_property_part_datetime_set_value (start_dtm, start_tt);
Packit Service de44cd
Packit Service de44cd
		if (set_dtend)
Packit Service de44cd
			e_comp_editor_property_part_datetime_set_value (end_dtm, end_tt);
Packit Service de44cd
Packit Service de44cd
		e_comp_editor_set_updating (comp_editor, FALSE);
Packit Service de44cd
	}
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
static gboolean
Packit Service de44cd
e_comp_editor_holds_component (ECompEditor *comp_editor,
Packit Service de44cd
			       ESource *origin_source,
Packit Service de44cd
			       const icalcomponent *component)
Packit Service de44cd
{
Packit Service de44cd
	const gchar *component_uid, *editor_uid;
Packit Service de44cd
	gboolean equal;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_COMP_EDITOR (comp_editor), FALSE);
Packit Service de44cd
	g_return_val_if_fail (component != NULL, FALSE);
Packit Service de44cd
Packit Service de44cd
	if (!origin_source || !comp_editor->priv->origin_source ||
Packit Service de44cd
	    !e_source_equal (origin_source, comp_editor->priv->origin_source))
Packit Service de44cd
		return FALSE;
Packit Service de44cd
Packit Service de44cd
	component_uid = icalcomponent_get_uid ((icalcomponent *) component);
Packit Service de44cd
	editor_uid = icalcomponent_get_uid (comp_editor->priv->component);
Packit Service de44cd
Packit Service de44cd
	if (!component_uid || !editor_uid)
Packit Service de44cd
		return FALSE;
Packit Service de44cd
Packit Service de44cd
	equal = g_strcmp0 (component_uid, editor_uid) == 0;
Packit Service de44cd
	if (equal) {
Packit Service de44cd
		struct icaltimetype component_rid, editor_rid;
Packit Service de44cd
Packit Service de44cd
		component_rid = icalcomponent_get_recurrenceid ((icalcomponent *) component);
Packit Service de44cd
		editor_rid = icalcomponent_get_recurrenceid (comp_editor->priv->component);
Packit Service de44cd
Packit Service de44cd
		if (icaltime_is_null_time (component_rid)) {
Packit Service de44cd
			equal = icaltime_is_null_time (editor_rid);
Packit Service de44cd
		} else if (!icaltime_is_null_time (editor_rid)) {
Packit Service de44cd
			equal = icaltime_compare (component_rid, editor_rid) == 0;
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	return equal;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
ECompEditor *
Packit Service de44cd
e_comp_editor_open_for_component (GtkWindow *parent,
Packit Service de44cd
				  EShell *shell,
Packit Service de44cd
				  ESource *origin_source,
Packit Service de44cd
				  const icalcomponent *component,
Packit Service de44cd
				  guint32 flags /* bit-or of ECompEditorFlags */)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditor *comp_editor;
Packit Service de44cd
	GType comp_editor_type;
Packit Service de44cd
Packit Service de44cd
	g_return_val_if_fail (E_IS_SHELL (shell), NULL);
Packit Service de44cd
	if (origin_source)
Packit Service de44cd
		g_return_val_if_fail (E_IS_SOURCE (origin_source), NULL);
Packit Service de44cd
	g_return_val_if_fail (component != NULL, NULL);
Packit Service de44cd
Packit Service de44cd
	comp_editor = e_comp_editor_find_existing_for (origin_source, component);
Packit Service de44cd
	if (comp_editor) {
Packit Service de44cd
		gtk_window_present (GTK_WINDOW (comp_editor));
Packit Service de44cd
		return comp_editor;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	switch (icalcomponent_isa (component)) {
Packit Service de44cd
		case ICAL_VEVENT_COMPONENT:
Packit Service de44cd
			comp_editor_type = E_TYPE_COMP_EDITOR_EVENT;
Packit Service de44cd
			break;
Packit Service de44cd
		case ICAL_VTODO_COMPONENT:
Packit Service de44cd
			comp_editor_type = E_TYPE_COMP_EDITOR_TASK;
Packit Service de44cd
			break;
Packit Service de44cd
		case ICAL_VJOURNAL_COMPONENT:
Packit Service de44cd
			comp_editor_type = E_TYPE_COMP_EDITOR_MEMO;
Packit Service de44cd
			break;
Packit Service de44cd
		default:
Packit Service de44cd
			g_warn_if_reached ();
Packit Service de44cd
			return NULL;
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	comp_editor = g_object_new (comp_editor_type,
Packit Service de44cd
		"shell", shell,
Packit Service de44cd
		"origin-source", origin_source,
Packit Service de44cd
		"component", component,
Packit Service de44cd
		"flags", flags,
Packit Service de44cd
		NULL);
Packit Service de44cd
Packit Service de44cd
	opened_editors = g_slist_prepend (opened_editors, comp_editor);
Packit Service de44cd
Packit Service de44cd
	gtk_widget_show (GTK_WIDGET (comp_editor));
Packit Service de44cd
Packit Service de44cd
	return comp_editor;
Packit Service de44cd
}
Packit Service de44cd
Packit Service de44cd
ECompEditor *
Packit Service de44cd
e_comp_editor_find_existing_for (ESource *origin_source,
Packit Service de44cd
				 const icalcomponent *component)
Packit Service de44cd
{
Packit Service de44cd
	ECompEditor *comp_editor;
Packit Service de44cd
	GSList *link;
Packit Service de44cd
Packit Service de44cd
	if (origin_source)
Packit Service de44cd
		g_return_val_if_fail (E_IS_SOURCE (origin_source), NULL);
Packit Service de44cd
	g_return_val_if_fail (component != NULL, NULL);
Packit Service de44cd
Packit Service de44cd
	for (link = opened_editors; link; link = g_slist_next (link)) {
Packit Service de44cd
		comp_editor = link->data;
Packit Service de44cd
Packit Service de44cd
		if (!comp_editor)
Packit Service de44cd
			continue;
Packit Service de44cd
Packit Service de44cd
		if (e_comp_editor_holds_component (comp_editor, origin_source, component)) {
Packit Service de44cd
			gtk_window_present (GTK_WINDOW (comp_editor));
Packit Service de44cd
			return comp_editor;
Packit Service de44cd
		}
Packit Service de44cd
	}
Packit Service de44cd
Packit Service de44cd
	return NULL;
Packit Service de44cd
}