diff options
author | Alex Larsson <alexl@redhat.com> | 2001-09-04 21:16:09 +0000 |
---|---|---|
committer | Alexander Larsson <alexl@src.gnome.org> | 2001-09-04 21:16:09 +0000 |
commit | a4cea258532fafc95ce07ff00193589c9ca757bc (patch) | |
tree | 0b2d030ce669605a863a7f771de0b75eaee8dc44 /src | |
parent | c113f3a2d1a3b3669c82167e0a32f496257fcb35 (diff) | |
download | nautilus-a4cea258532fafc95ce07ff00193589c9ca757bc.tar.gz |
Merge some stuff from the redhat-outstanding-patches branch
2001-09-04 Alex Larsson <alexl@redhat.com>
Merge some stuff from the redhat-outstanding-patches branch
* libnautilus-private/nautilus-icon-container.c:
* libnautilus-private/nautilus-icon-dnd.c:
Change signature of the "handle_uri_list" callback to include the
drag action.
* src/file-manager/fm-icon-view.c (icon_view_handle_uri_list):
Handle uri's more gracefully.
* src/file-manager/fm-desktop-icon-view.c:
(icon_view_handle_uri_list): Remove. Now handled in the
parent class.
Diffstat (limited to 'src')
-rw-r--r-- | src/file-manager/fm-desktop-icon-view.c | 74 | ||||
-rw-r--r-- | src/file-manager/fm-icon-view.c | 249 |
2 files changed, 207 insertions, 116 deletions
diff --git a/src/file-manager/fm-desktop-icon-view.c b/src/file-manager/fm-desktop-icon-view.c index 17c9b1462..1be4875e6 100644 --- a/src/file-manager/fm-desktop-icon-view.c +++ b/src/file-manager/fm-desktop-icon-view.c @@ -109,11 +109,6 @@ static void volume_mounted_callback (NautilusVolum static void volume_unmounted_callback (NautilusVolumeMonitor *monitor, NautilusVolume *volume, FMDesktopIconView *icon_view); -static void icon_view_handle_uri_list (NautilusIconContainer *container, - const char *item_uris, - int x, - int y, - FMDirectoryView *view); static int desktop_icons_compare_callback (NautilusIconContainer *container, NautilusFile *file_a, NautilusFile *file_b, @@ -651,11 +646,6 @@ fm_desktop_icon_view_initialize (FMDesktopIconView *desktop_icon_view) desktop_icon_view, GTK_OBJECT (desktop_icon_view)); - gtk_signal_connect (GTK_OBJECT (icon_container), - "handle_uri_list", - GTK_SIGNAL_FUNC (icon_view_handle_uri_list), - desktop_icon_view); - eel_preferences_add_callback (NAUTILUS_PREFERENCES_HOME_URI, home_uri_changed, desktop_icon_view); @@ -865,70 +855,6 @@ volume_unmounted_callback (NautilusVolumeMonitor *monitor, g_free (link_path); } -static void -icon_view_handle_uri_list (NautilusIconContainer *container, const char *item_uris, - int x, int y, FMDirectoryView *view) -{ - GList *uri_list, *node; - GnomeDesktopEntry *entry; - GdkPoint point; - char *uri, *local_path; - char *stripped_uri; - const char *last_slash, *link_name; - - if (item_uris == NULL) { - return; - } - - point.x = x; - point.y = y; - - uri_list = gnome_uri_list_extract_uris (item_uris); - - for (node = uri_list; node != NULL; node = node->next) { - /* Most of what comes in here is not really URIs, but - * rather paths that have a file: prefix in them. - */ - uri = eel_make_uri_from_half_baked_uri (node->data); - - /* Make a link using the desktop file contents? */ - local_path = gnome_vfs_get_local_path_from_uri (uri); - if (local_path != NULL) { - entry = gnome_desktop_entry_load (local_path); - if (entry != NULL) { - /* FIXME: Handle name conflicts? */ - nautilus_link_local_create_from_gnome_entry (entry, desktop_directory, &point); - gnome_desktop_entry_free (entry); - } - g_free (local_path); - if (entry != NULL) { - continue; - } - } - - /* Make a link from the URI alone. Generate the file - * name by extracting the basename of the URI. - */ - /* FIXME: This should be using eel_uri_get_basename - * instead of a "roll our own" solution. - */ - stripped_uri = eel_str_strip_trailing_chr (uri, '/'); - last_slash = strrchr (stripped_uri, '/'); - link_name = last_slash == NULL ? NULL : last_slash + 1; - - if (!eel_str_is_empty (link_name)) { - /* FIXME: Handle name conflicts? */ - nautilus_link_local_create (desktop_directory, link_name, - "gnome-http-url", uri, - &point, NAUTILUS_LINK_GENERIC); - } - - g_free (stripped_uri); - } - - gnome_uri_list_free_strings (uri_list); -} - /* update_link_and_delete_copies * * Look for a particular type of link on the desktop. If the right diff --git a/src/file-manager/fm-icon-view.c b/src/file-manager/fm-icon-view.c index 8672d3f27..29bbac330 100644 --- a/src/file-manager/fm-icon-view.c +++ b/src/file-manager/fm-icon-view.c @@ -33,7 +33,10 @@ #include <eel/eel-glib-extensions.h> #include <eel/eel-gtk-extensions.h> #include <eel/eel-gtk-macros.h> +#include <eel/eel-stock-dialogs.h> +#include <eel/eel-dnd.h> #include <eel/eel-string.h> +#include <eel/eel-vfs-extensions.h> #include <errno.h> #include <fcntl.h> #include <gtk/gtkmain.h> @@ -45,10 +48,12 @@ #include <libgnome/gnome-i18n.h> #include <libgnome/gnome-config.h> #include <libgnome/gnome-metadata.h> +#include <libgnome/gnome-mime.h> #include <libgnomevfs/gnome-vfs-async-ops.h> #include <libgnomevfs/gnome-vfs-uri.h> #include <libgnomevfs/gnome-vfs-utils.h> #include <libgnomevfs/gnome-vfs-xfer.h> +#include <libgnomevfs/gnome-vfs-mime.h> #include <libnautilus-private/nautilus-audio-player.h> #include <libnautilus-private/nautilus-bonobo-extensions.h> #include <libnautilus-private/nautilus-directory-background.h> @@ -115,48 +120,55 @@ typedef enum { } MenuItemType; /* forward declarations */ -static void create_icon_container (FMIconView *icon_view); -static void fm_icon_view_initialize (FMIconView *icon_view); -static void fm_icon_view_initialize_class (FMIconViewClass *klass); -static gboolean fm_icon_view_is_empty (FMDirectoryView *view); -static void fm_icon_view_set_directory_sort_by (FMIconView *icon_view, - NautilusFile *file, - const char *sort_by); -static void fm_icon_view_set_zoom_level (FMIconView *view, - NautilusZoomLevel new_level, - gboolean always_set_level); -gboolean fm_icon_view_supports_auto_layout (FMIconView *view); -static void fm_icon_view_update_icon_container_fonts (FMIconView *icon_view); -static void fm_icon_view_update_icon_container_smooth_font (FMIconView *icon_view); -static void fm_icon_view_update_icon_container_font_size_table (FMIconView *icon_view); -static void fm_icon_view_update_click_mode (FMIconView *icon_view); -static void fm_icon_view_update_smooth_graphics_mode (FMIconView *icon_view); -static gboolean fm_icon_view_using_tighter_layout (FMIconView *icon_view); -static gboolean fm_icon_view_get_directory_tighter_layout (FMIconView *icon_view, - NautilusFile *file); -static void fm_icon_view_set_directory_tighter_layout (FMIconView *icon_view, - NautilusFile *file, - gboolean tighter_layout); -static gboolean real_supports_auto_layout (FMIconView *view); -static const SortCriterion *get_sort_criterion_by_id (const char *id); -static const SortCriterion *get_sort_criterion_by_sort_type (NautilusFileSortType sort_type); -static void set_sort_criterion_by_id (FMIconView *icon_view, - const char *id); -static gboolean set_sort_reversed (FMIconView *icon_view, - gboolean new_value); -static void switch_to_manual_layout (FMIconView *view); -static void preview_audio (FMIconView *icon_view, - NautilusFile *file, - gboolean start_flag); -static void update_layout_menus (FMIconView *view); -static void default_sort_in_reverse_order_changed_callback (gpointer callback_data); -static void default_sort_order_changed_callback (gpointer callback_data); -static void default_use_tighter_layout_changed_callback (gpointer callback_data); -static void default_use_manual_layout_changed_callback (gpointer callback_data); -static void default_zoom_level_changed_callback (gpointer callback_data); -static void default_zoom_level_font_size_changed_callback (gpointer callback_data); -static void font_changed_callback (gpointer callback_data); -static void smooth_font_changed_callback (gpointer callback_data); +static void create_icon_container (FMIconView *icon_view); +static void fm_icon_view_initialize (FMIconView *icon_view); +static void fm_icon_view_initialize_class (FMIconViewClass *klass); +static gboolean fm_icon_view_is_empty (FMDirectoryView *view); +static void fm_icon_view_set_directory_sort_by (FMIconView *icon_view, + NautilusFile *file, + const char *sort_by); +static void fm_icon_view_set_zoom_level (FMIconView *view, + NautilusZoomLevel new_level, + gboolean always_set_level); +gboolean fm_icon_view_supports_auto_layout (FMIconView *view); +static void fm_icon_view_update_icon_container_fonts (FMIconView *icon_view); +static void fm_icon_view_update_icon_container_smooth_font (FMIconView *icon_view); +static void fm_icon_view_update_icon_container_font_size_table (FMIconView *icon_view); +static void fm_icon_view_update_click_mode (FMIconView *icon_view); +static void fm_icon_view_update_smooth_graphics_mode (FMIconView *icon_view); +static gboolean fm_icon_view_using_tighter_layout (FMIconView *icon_view); +static gboolean fm_icon_view_get_directory_tighter_layout (FMIconView *icon_view, + NautilusFile *file); +static void fm_icon_view_set_directory_tighter_layout (FMIconView *icon_view, + NautilusFile *file, + gboolean tighter_layout); +static gboolean real_supports_auto_layout (FMIconView *view); +static const SortCriterion *get_sort_criterion_by_id (const char *id); +static const SortCriterion *get_sort_criterion_by_sort_type (NautilusFileSortType sort_type); +static void set_sort_criterion_by_id (FMIconView *icon_view, + const char *id); +static gboolean set_sort_reversed (FMIconView *icon_view, + gboolean new_value); +static void switch_to_manual_layout (FMIconView *view); +static void preview_audio (FMIconView *icon_view, + NautilusFile *file, + gboolean start_flag); +static void update_layout_menus (FMIconView *view); +static void default_sort_in_reverse_order_changed_callback (gpointer callback_data); +static void default_sort_order_changed_callback (gpointer callback_data); +static void default_use_tighter_layout_changed_callback (gpointer callback_data); +static void default_use_manual_layout_changed_callback (gpointer callback_data); +static void default_zoom_level_changed_callback (gpointer callback_data); +static void default_zoom_level_font_size_changed_callback (gpointer callback_data); +static void font_changed_callback (gpointer callback_data); +static void smooth_font_changed_callback (gpointer callback_data); +static void icon_view_handle_uri_list (NautilusIconContainer *container, + const char *item_uris, + GdkDragAction action, + int x, + int y, + FMIconView *view); + static int preview_sound_auto_value; @@ -2321,6 +2333,8 @@ fm_icon_view_initialize_class (FMIconViewClass *klass) static void fm_icon_view_initialize (FMIconView *icon_view) { + NautilusIconContainer *icon_container; + g_return_if_fail (GTK_BIN (icon_view)->child == NULL); icon_view->details = g_new0 (FMIconViewDetails, 1); @@ -2329,6 +2343,7 @@ fm_icon_view_initialize (FMIconView *icon_view) icon_view->details->timeout = -1; icon_view->details->audio_preview_file = NULL; create_icon_container (icon_view); + icon_container = get_icon_container (icon_view); eel_preferences_add_callback_while_alive (NAUTILUS_PREFERENCES_ICON_VIEW_FONT, font_changed_callback, @@ -2362,6 +2377,12 @@ fm_icon_view_initialize (FMIconView *icon_view) default_zoom_level_changed_callback, icon_view, GTK_OBJECT (icon_view)); + + gtk_signal_connect (GTK_OBJECT (icon_container), + "handle_uri_list", + GTK_SIGNAL_FUNC (icon_view_handle_uri_list), + icon_view); + } static gboolean @@ -2651,3 +2672,147 @@ create_icon_container (FMIconView *icon_view) gtk_widget_show (GTK_WIDGET (icon_container)); } + +static void +icon_view_handle_uri_list (NautilusIconContainer *container, const char *item_uris, + GdkDragAction action, int x, int y, FMIconView *view) +{ + + GList *uri_list, *node, *real_uri_list = NULL; + GnomeVFSURI *container_uri; + GnomeDesktopEntry *entry; + GdkPoint point; + char *local_path; + char *stripped_uri; + char *container_uri_string; + const char *last_slash, *link_name; + int n_uris; + gboolean all_local; + GArray *points; + + if (item_uris == NULL) { + return; + } + + container_uri_string = fm_directory_view_get_uri (FM_DIRECTORY_VIEW (view)); + container_uri = gnome_vfs_uri_new (container_uri_string); + g_return_if_fail (container_uri != NULL); + + if (!gnome_vfs_uri_is_local (container_uri)) { + eel_show_warning_dialog (_("Drag and drop is only supported to local file systems."), + _("Drag and Drop error"), + fm_directory_view_get_containing_window (FM_DIRECTORY_VIEW (view))); + gnome_vfs_uri_unref (container_uri); + g_free (container_uri_string); + return; + } + + if (action == GDK_ACTION_ASK) { + action = eel_drag_drop_action_ask + (GDK_ACTION_MOVE | GDK_ACTION_COPY | GDK_ACTION_LINK); + } + + /* We don't support GDK_ACTION_ASK or GDK_ACTION_PRIVATE + * and we don't support combinations either. */ + if ((action != GDK_ACTION_DEFAULT) && + (action != GDK_ACTION_COPY) && + (action != GDK_ACTION_MOVE) && + (action != GDK_ACTION_LINK)) { + eel_show_warning_dialog (_("An invalid drag type was used."), + _("Drag and Drop error"), + fm_directory_view_get_containing_window (FM_DIRECTORY_VIEW (view))); + g_free (container_uri); + gnome_vfs_uri_unref (container_uri); + return; + } + + point.x = x; + point.y = y; + + /* Most of what comes in here is not really URIs, but rather paths that + * have a file: prefix in them. We try to sanitize the uri list as a + * result. Additionally, if they are all local files, then we can copy + * them. Otherwise, we just make links. + */ + all_local = TRUE; + n_uris = 0; + uri_list = gnome_uri_list_extract_uris (item_uris); + for (node = uri_list; node != NULL; node = node->next) { + gchar *sanitized_uri; + + sanitized_uri = eel_make_uri_from_half_baked_uri (node->data); + if (sanitized_uri == NULL) + continue; + real_uri_list = g_list_append (real_uri_list, sanitized_uri); + if (strncmp (sanitized_uri, "file", 4) != 0) + all_local = FALSE; + n_uris++; + } + gnome_uri_list_free_strings (uri_list); + + if (all_local == TRUE && + (action == GDK_ACTION_COPY || + action == GDK_ACTION_MOVE)) { + /* Copying files */ + if (n_uris == 1) { + GdkPoint tmp_point = { 0, 0 }; + + /* pass in a 1-item array of icon positions, relative to x, y */ + points = g_array_new (FALSE, TRUE, sizeof (GdkPoint)); + g_array_append_val (points, tmp_point); + } else { + points = NULL; + } + fm_directory_view_move_copy_items (real_uri_list, points, + container_uri_string, + action, x, y, FM_DIRECTORY_VIEW (view)); + + if (points) + g_array_free (points, TRUE); + } else { + for (node = real_uri_list; node != NULL; node = node->next) { + /* Make a link using the desktop file contents? */ + local_path = gnome_vfs_get_local_path_from_uri (node->data); + if (local_path != NULL) { + entry = gnome_desktop_entry_load (local_path); + if (entry != NULL) { + + /* FIXME: Handle name conflicts? */ + nautilus_link_local_create_from_gnome_entry (entry, container_uri_string, &point); + gnome_desktop_entry_free (entry); + } + g_free (local_path); + if (entry != NULL) { + continue; + } + } + + /* Make a link from the URI alone. Generate the file + * name by extracting the basename of the URI. + */ + /* FIXME: This should be using eel_uri_get_basename + * instead of a "roll our own" solution. + */ + stripped_uri = eel_str_strip_trailing_chr ((char *)node->data, '/'); + g_print ("local_path:%s\nstripped_uri:%s\n", (char *)node->data, stripped_uri); + last_slash = strrchr (stripped_uri, '/'); + link_name = last_slash == NULL ? NULL : last_slash + 1; + + if (!eel_str_is_empty (link_name)) { + /* FIXME: Handle name conflicts? */ + nautilus_link_local_create (container_uri_string, link_name, + "gnome-http-url", local_path, + &point, NAUTILUS_LINK_GENERIC); + } + + g_free (stripped_uri); + + break; + } + } + + gnome_uri_list_free_strings (real_uri_list); + gnome_vfs_uri_unref (container_uri); + g_free (container_uri_string); + +} |