Invoke e_folder_dnd_bridge_drop().
* e-storage-set-view.c (impl_tree_drag_drop): Invoke e_folder_dnd_bridge_drop(). * e-folder-dnd-bridge.c (find_matching_target_for_drag_context): New arg @atom_return. Return the GdkAtom associated with the type through it. (e_folder_dnd_bridge_drop): New. svn path=/trunk/; revision=17362
This commit is contained in:
@ -1,3 +1,15 @@
|
||||
2002-07-03 Ettore Perazzoli <ettore@ximian.com>
|
||||
|
||||
[Fixes #27354.]
|
||||
|
||||
* e-storage-set-view.c (impl_tree_drag_drop): Invoke
|
||||
e_folder_dnd_bridge_drop().
|
||||
|
||||
* e-folder-dnd-bridge.c (find_matching_target_for_drag_context):
|
||||
New arg @atom_return. Return the GdkAtom associated with the type
|
||||
through it.
|
||||
(e_folder_dnd_bridge_drop): New.
|
||||
|
||||
2002-07-02 Ettore Perazzoli <ettore@ximian.com>
|
||||
|
||||
* e-shell.c (e_shell_show_settings): Don't set up the settings
|
||||
|
||||
@ -54,6 +54,8 @@ folder_xfer_callback (EStorageSet *storage_set,
|
||||
}
|
||||
|
||||
|
||||
/* Utility functions. */
|
||||
|
||||
static GNOME_Evolution_ShellComponentDnd_ActionSet
|
||||
convert_gdk_drag_action_set_to_corba (GdkDragAction action)
|
||||
{
|
||||
@ -134,7 +136,8 @@ get_component_at_path (EStorageSet *storage_set,
|
||||
static const char *
|
||||
find_matching_target_for_drag_context (EStorageSet *storage_set,
|
||||
const char *path,
|
||||
GdkDragContext *drag_context)
|
||||
GdkDragContext *drag_context,
|
||||
GdkAtom *atom_return)
|
||||
{
|
||||
EFolderTypeRegistry *folder_type_registry;
|
||||
EFolder *folder;
|
||||
@ -150,17 +153,16 @@ find_matching_target_for_drag_context (EStorageSet *storage_set,
|
||||
accepted_types = e_folder_type_registry_get_accepted_dnd_types_for_type (folder_type_registry,
|
||||
e_folder_get_type_string (folder));
|
||||
|
||||
/* FIXME? We might make this more efficient. Currently it takes `n *
|
||||
m' string compares, where `n' is the number of targets in the
|
||||
@drag_context, and `m' is the number of supported types in
|
||||
@folder. */
|
||||
|
||||
for (p = drag_context->targets; p != NULL; p = p->next) {
|
||||
char *possible_type;
|
||||
|
||||
possible_type = gdk_atom_name ((GdkAtom) p->data);
|
||||
possible_type = gdk_atom_name (GPOINTER_TO_INT (p->data));
|
||||
if (strcmp (possible_type, E_FOLDER_DND_PATH_TARGET_TYPE) == 0) {
|
||||
g_free (possible_type);
|
||||
|
||||
if (atom_return != NULL)
|
||||
*atom_return = GPOINTER_TO_INT (p->data);
|
||||
|
||||
return E_FOLDER_DND_PATH_TARGET_TYPE;
|
||||
}
|
||||
|
||||
@ -170,6 +172,10 @@ find_matching_target_for_drag_context (EStorageSet *storage_set,
|
||||
accepted_type = (const char *) q->data;
|
||||
if (strcmp (possible_type, accepted_type) == 0) {
|
||||
g_free (possible_type);
|
||||
|
||||
if (atom_return != NULL)
|
||||
*atom_return = GPOINTER_TO_INT (p->data);
|
||||
|
||||
return accepted_type;
|
||||
}
|
||||
}
|
||||
@ -177,6 +183,9 @@ find_matching_target_for_drag_context (EStorageSet *storage_set,
|
||||
g_free (possible_type);
|
||||
}
|
||||
|
||||
if (atom_return != NULL)
|
||||
*atom_return = 0;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -233,6 +242,8 @@ handle_evolution_path_drag_motion (EStorageSet *storage_set,
|
||||
}
|
||||
|
||||
|
||||
/* Bridge for the DnD motion event. */
|
||||
|
||||
gboolean
|
||||
e_folder_dnd_bridge_motion (GtkWidget *widget,
|
||||
GdkDragContext *context,
|
||||
@ -254,7 +265,7 @@ e_folder_dnd_bridge_motion (GtkWidget *widget,
|
||||
g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), FALSE);
|
||||
g_return_val_if_fail (path != NULL, FALSE);
|
||||
|
||||
dnd_type = find_matching_target_for_drag_context (storage_set, path, context);
|
||||
dnd_type = find_matching_target_for_drag_context (storage_set, path, context, NULL);
|
||||
if (dnd_type == NULL)
|
||||
return FALSE;
|
||||
|
||||
@ -294,6 +305,37 @@ e_folder_dnd_bridge_motion (GtkWidget *widget,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* Bridge for the drop event. */
|
||||
|
||||
gboolean
|
||||
e_folder_dnd_bridge_drop (GtkWidget *widget,
|
||||
GdkDragContext *context,
|
||||
unsigned int time,
|
||||
EStorageSet *storage_set,
|
||||
const char *path)
|
||||
{
|
||||
GdkAtom atom;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
|
||||
g_return_val_if_fail (context != NULL, FALSE);
|
||||
g_return_val_if_fail (E_IS_STORAGE_SET (storage_set), FALSE);
|
||||
g_return_val_if_fail (path != NULL, FALSE);
|
||||
|
||||
if (context->targets == NULL)
|
||||
return FALSE;
|
||||
|
||||
if (find_matching_target_for_drag_context (storage_set, path, context, &atom) == NULL)
|
||||
return FALSE;
|
||||
|
||||
gtk_drag_get_data (widget, context, atom, time);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
/* Bridge for the data_received event. */
|
||||
|
||||
static gboolean
|
||||
handle_data_received_path (GdkDragContext *context,
|
||||
GtkSelectionData *selection_data,
|
||||
@ -419,6 +461,7 @@ e_folder_dnd_bridge_data_received (GtkWidget *widget,
|
||||
target_type = gdk_atom_name (selection_data->target);
|
||||
|
||||
if (strcmp (target_type, E_FOLDER_DND_PATH_TARGET_TYPE) != 0) {
|
||||
g_print ("drop data received -- target_type %s\n", target_type);
|
||||
handled = handle_data_received_non_path (context, selection_data, storage_set,
|
||||
path, target_type);
|
||||
} else {
|
||||
|
||||
@ -40,6 +40,11 @@ gboolean e_folder_dnd_bridge_motion (GtkWidget *widget,
|
||||
unsigned int time,
|
||||
EStorageSet *storage_set,
|
||||
const char *path);
|
||||
gboolean e_folder_dnd_bridge_drop (GtkWidget *widget,
|
||||
GdkDragContext *context,
|
||||
unsigned int time,
|
||||
EStorageSet *storage_set,
|
||||
const char *path);
|
||||
void e_folder_dnd_bridge_data_received (GtkWidget *widget,
|
||||
GdkDragContext *context,
|
||||
GtkSelectionData *selection_data,
|
||||
|
||||
@ -958,15 +958,22 @@ impl_tree_drag_drop (ETree *etree,
|
||||
int y,
|
||||
unsigned int time)
|
||||
{
|
||||
e_tree_drag_unhighlight (etree);
|
||||
if (context->targets != NULL) {
|
||||
gtk_drag_get_data (GTK_WIDGET (etree), context,
|
||||
GPOINTER_TO_INT (context->targets->data),
|
||||
time);
|
||||
return TRUE;
|
||||
}
|
||||
EStorageSetView *storage_set_view;
|
||||
EStorageSetViewPrivate *priv;
|
||||
const char *folder_path;
|
||||
|
||||
return FALSE;
|
||||
storage_set_view = E_STORAGE_SET_VIEW (etree);
|
||||
priv = storage_set_view->priv;
|
||||
|
||||
e_tree_drag_unhighlight (etree);
|
||||
|
||||
folder_path = e_tree_memory_node_get_data (E_TREE_MEMORY (priv->etree_model),
|
||||
e_tree_node_at_row (E_TREE (storage_set_view), row));
|
||||
if (folder_path == NULL)
|
||||
return FALSE;
|
||||
|
||||
return e_folder_dnd_bridge_drop (GTK_WIDGET (etree), context, time,
|
||||
priv->storage_set, folder_path);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
Reference in New Issue
Block a user