Add "copy-target-list" and "paste-target-list" to the ESelectable interface. These are underutilized for the moment, but will eventually be used to help integrate drag-and-drop support into ESelectable. Add cut and paste support to EWebView, along with a new "editable" property and new clipboard signals "copy-clipboard", "cut-clipboard" and "paste-clipboard". In EFocusTracker, listen for "owner-changed" signals from the default clipboard as another trigger to update actions, particularly the Paste action. (Unfortunately this doesn't work for EWebView since GtkHtml implements its own clipboard.) In EMsgComposer, convert GtkhtmlEditor's clipboard methods to empty stubs, since EFocusTracker will now trigger EWebView's clipboard actions. Also, intercept EWebView::paste-clipboard signals and improve the interaction between the HTML editor and the attachment bar based on use cases in bug #603715.
188 lines
4.5 KiB
C
188 lines
4.5 KiB
C
/*
|
|
* e-selectable.c
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) version 3.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with the program; if not, see <http://www.gnu.org/licenses/>
|
|
*
|
|
*
|
|
* Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
|
|
*
|
|
*/
|
|
|
|
#include "e-selectable.h"
|
|
|
|
static void
|
|
selectable_class_init (ESelectableInterface *interface)
|
|
{
|
|
g_object_interface_install_property (
|
|
interface,
|
|
g_param_spec_boxed (
|
|
"copy-target-list",
|
|
"Copy Target List",
|
|
NULL,
|
|
GTK_TYPE_TARGET_LIST,
|
|
G_PARAM_READABLE));
|
|
|
|
g_object_interface_install_property (
|
|
interface,
|
|
g_param_spec_boxed (
|
|
"paste-target-list",
|
|
"Paste Target List",
|
|
NULL,
|
|
GTK_TYPE_TARGET_LIST,
|
|
G_PARAM_READABLE));
|
|
}
|
|
|
|
GType
|
|
e_selectable_get_type (void)
|
|
{
|
|
static GType type = 0;
|
|
|
|
if (G_UNLIKELY (type == 0)) {
|
|
static const GTypeInfo type_info = {
|
|
sizeof (ESelectableInterface),
|
|
(GBaseInitFunc) NULL,
|
|
(GBaseFinalizeFunc) NULL,
|
|
(GClassInitFunc) selectable_class_init,
|
|
(GClassFinalizeFunc) NULL,
|
|
NULL, /* class_data */
|
|
0, /* instance_size */
|
|
0, /* n_preallocs */
|
|
(GInstanceInitFunc) NULL,
|
|
NULL /* value_table */
|
|
};
|
|
|
|
type = g_type_register_static (
|
|
G_TYPE_INTERFACE, "ESelectable", &type_info, 0);
|
|
|
|
g_type_interface_add_prerequisite (type, GTK_TYPE_WIDGET);
|
|
}
|
|
|
|
return type;
|
|
}
|
|
|
|
void
|
|
e_selectable_update_actions (ESelectable *selectable,
|
|
EFocusTracker *focus_tracker,
|
|
GdkAtom *clipboard_targets,
|
|
gint n_clipboard_targets)
|
|
{
|
|
ESelectableInterface *interface;
|
|
|
|
g_return_if_fail (E_IS_SELECTABLE (selectable));
|
|
|
|
interface = E_SELECTABLE_GET_INTERFACE (selectable);
|
|
g_return_if_fail (interface->update_actions != NULL);
|
|
|
|
interface->update_actions (
|
|
selectable, focus_tracker,
|
|
clipboard_targets, n_clipboard_targets);
|
|
}
|
|
|
|
void
|
|
e_selectable_cut_clipboard (ESelectable *selectable)
|
|
{
|
|
ESelectableInterface *interface;
|
|
|
|
g_return_if_fail (E_IS_SELECTABLE (selectable));
|
|
|
|
interface = E_SELECTABLE_GET_INTERFACE (selectable);
|
|
|
|
if (interface->cut_clipboard != NULL)
|
|
interface->cut_clipboard (selectable);
|
|
}
|
|
|
|
void
|
|
e_selectable_copy_clipboard (ESelectable *selectable)
|
|
{
|
|
ESelectableInterface *interface;
|
|
|
|
g_return_if_fail (E_IS_SELECTABLE (selectable));
|
|
|
|
interface = E_SELECTABLE_GET_INTERFACE (selectable);
|
|
|
|
if (interface->copy_clipboard != NULL)
|
|
interface->copy_clipboard (selectable);
|
|
}
|
|
|
|
void
|
|
e_selectable_paste_clipboard (ESelectable *selectable)
|
|
{
|
|
ESelectableInterface *interface;
|
|
|
|
g_return_if_fail (E_IS_SELECTABLE (selectable));
|
|
|
|
interface = E_SELECTABLE_GET_INTERFACE (selectable);
|
|
|
|
if (interface->paste_clipboard != NULL)
|
|
interface->paste_clipboard (selectable);
|
|
}
|
|
|
|
void
|
|
e_selectable_delete_selection (ESelectable *selectable)
|
|
{
|
|
ESelectableInterface *interface;
|
|
|
|
g_return_if_fail (E_IS_SELECTABLE (selectable));
|
|
|
|
interface = E_SELECTABLE_GET_INTERFACE (selectable);
|
|
|
|
if (interface->delete_selection != NULL)
|
|
interface->delete_selection (selectable);
|
|
}
|
|
|
|
void
|
|
e_selectable_select_all (ESelectable *selectable)
|
|
{
|
|
ESelectableInterface *interface;
|
|
|
|
g_return_if_fail (E_IS_SELECTABLE (selectable));
|
|
|
|
interface = E_SELECTABLE_GET_INTERFACE (selectable);
|
|
|
|
if (interface->select_all != NULL)
|
|
interface->select_all (selectable);
|
|
}
|
|
|
|
GtkTargetList *
|
|
e_selectable_get_copy_target_list (ESelectable *selectable)
|
|
{
|
|
GtkTargetList *target_list;
|
|
|
|
g_return_val_if_fail (E_IS_SELECTABLE (selectable), NULL);
|
|
|
|
g_object_get (selectable, "copy-target-list", &target_list, NULL);
|
|
|
|
/* We want to return a borrowed reference to the target
|
|
* list, so undo the reference that g_object_get() added. */
|
|
gtk_target_list_unref (target_list);
|
|
|
|
return target_list;
|
|
}
|
|
|
|
GtkTargetList *
|
|
e_selectable_get_paste_target_list (ESelectable *selectable)
|
|
{
|
|
GtkTargetList *target_list;
|
|
|
|
g_return_val_if_fail (E_IS_SELECTABLE (selectable), NULL);
|
|
|
|
g_object_get (selectable, "paste-target-list", &target_list, NULL);
|
|
|
|
/* We want to return a borrowed reference to the target
|
|
* list, so undo the reference that g_object_get() added. */
|
|
gtk_target_list_unref (target_list);
|
|
|
|
return target_list;
|
|
}
|