1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* nautilus-file-drag.c - Drag & drop handling code that operated on
NautilusFile objects.
Copyright (C) 2000 Eazel, Inc.
The Gnome Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The Gnome Library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the Gnome Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
Authors: Pavel Cisler <pavel@eazel.com>,
*/
#include <config.h>
#include "nautilus-file-dnd.h"
#include "nautilus-desktop-icon-file.h"
#include "nautilus-dnd.h"
#include "nautilus-directory.h"
#include "nautilus-file-utilities.h"
#include <string.h>
static gboolean
nautilus_drag_can_accept_files (NautilusFile *drop_target_item)
{
NautilusDirectory *directory;
if (nautilus_file_is_directory (drop_target_item)) {
gboolean res;
/* target is a directory, accept if editable */
directory = nautilus_directory_get_for_file (drop_target_item);
res = nautilus_directory_is_editable (directory);
nautilus_directory_unref (directory);
return res;
}
if (NAUTILUS_IS_DESKTOP_ICON_FILE (drop_target_item)) {
return TRUE;
}
/* All Nautilus links are assumed to be links to directories.
* Therefore, they all can accept drags, like all other
* directories to. As with other directories, there can be
* errors when the actual copy is attempted due to
* permissions.
*/
if (nautilus_file_is_nautilus_link (drop_target_item)) {
return TRUE;
}
if (nautilus_is_file_roller_installed () &&
nautilus_file_is_archive (drop_target_item)) {
return TRUE;
}
return FALSE;
}
gboolean
nautilus_drag_can_accept_item (NautilusFile *drop_target_item,
const char *item_uri)
{
if (nautilus_file_matches_uri (drop_target_item, item_uri)) {
/* can't accept itself */
return FALSE;
}
return nautilus_drag_can_accept_files (drop_target_item);
}
gboolean
nautilus_drag_can_accept_items (NautilusFile *drop_target_item,
const GList *items)
{
int max;
if (drop_target_item == NULL)
return FALSE;
g_assert (NAUTILUS_IS_FILE (drop_target_item));
/* Iterate through selection checking if item will get accepted by the
* drop target. If more than 100 items selected, return an over-optimisic
* result
*/
for (max = 100; items != NULL && max >= 0; items = items->next, max--) {
if (!nautilus_drag_can_accept_item (drop_target_item,
((NautilusDragSelectionItem *)items->data)->uri)) {
return FALSE;
}
}
return TRUE;
}
gboolean
nautilus_drag_can_accept_info (NautilusFile *drop_target_item,
NautilusIconDndTargetType drag_type,
const GList *items)
{
switch (drag_type) {
case NAUTILUS_ICON_DND_GNOME_ICON_LIST:
return nautilus_drag_can_accept_items (drop_target_item, items);
case NAUTILUS_ICON_DND_URI_LIST:
case NAUTILUS_ICON_DND_NETSCAPE_URL:
case NAUTILUS_ICON_DND_TEXT:
return nautilus_drag_can_accept_files (drop_target_item);
case NAUTILUS_ICON_DND_XDNDDIRECTSAVE:
case NAUTILUS_ICON_DND_RAW:
return nautilus_drag_can_accept_files (drop_target_item); /* Check if we can accept files at this location */
case NAUTILUS_ICON_DND_ROOTWINDOW_DROP:
return FALSE;
default:
g_assert_not_reached ();
return FALSE;
}
}
|