nautilus r14162 - in trunk: . src/file-manager



Author: cneumair
Date: Wed May 14 20:27:06 2008
New Revision: 14162
URL: http://svn.gnome.org/viewvc/nautilus?rev=14162&view=rev

Log:
2008-05-14  Christian Neumair  <cneumair gnome org>

	* src/file-manager/fm-actions.h:
	* src/file-manager/fm-directory-view.c
	(paste_into_clipboard_received_callback), (paste_into),
	(action_paste_files_into_callback),
	(action_location_paste_files_into_callback),
	(clipboard_targets_received), (real_update_location_menu):
	* src/file-manager/nautilus-directory-view-ui.xml:
	Implement "Paste Into" for location context menu. Always request
	clipboard contents in real_update_paste_menu().


Modified:
   trunk/ChangeLog
   trunk/src/file-manager/fm-actions.h
   trunk/src/file-manager/fm-directory-view.c
   trunk/src/file-manager/nautilus-directory-view-ui.xml

Modified: trunk/src/file-manager/fm-actions.h
==============================================================================
--- trunk/src/file-manager/fm-actions.h	(original)
+++ trunk/src/file-manager/fm-actions.h	Wed May 14 20:27:06 2008
@@ -47,6 +47,7 @@
 #define FM_ACTION_LOCATION_COPY "LocationCopy"
 #define FM_ACTION_PASTE "Paste"
 #define FM_ACTION_PASTE_FILES_INTO "Paste Files Into"
+#define FM_ACTION_LOCATION_PASTE_FILES_INTO "LocationPasteFilesInto"
 #define FM_ACTION_NEW_LAUNCHER "New Launcher"
 #define FM_ACTION_RENAME "Rename"
 #define FM_ACTION_DUPLICATE "Duplicate"

Modified: trunk/src/file-manager/fm-directory-view.c
==============================================================================
--- trunk/src/file-manager/fm-directory-view.c	(original)
+++ trunk/src/file-manager/fm-directory-view.c	Wed May 14 20:27:06 2008
@@ -5766,29 +5766,35 @@
 	g_object_unref (view);
 }
 
+typedef struct {
+	FMDirectoryView *view;
+	NautilusFile *target;
+} PasteIntoData;
+
 static void
 paste_into_clipboard_received_callback (GtkClipboard     *clipboard,
 					GtkSelectionData *selection_data,
-					gpointer          data)
+					gpointer          callback_data)
 {
-	GList *selection;
+	PasteIntoData *data;
 	FMDirectoryView *view;
 	char *directory_uri;
 
-	view = FM_DIRECTORY_VIEW (data);
+	data = (PasteIntoData *) callback_data;
 
-	if (view->details->window != NULL) {
-		selection = fm_directory_view_get_selection (view);
+	view = FM_DIRECTORY_VIEW (data->view);
 
-		directory_uri = nautilus_file_get_activation_uri (NAUTILUS_FILE (selection->data));
+	if (view->details->window != NULL) {
+		directory_uri = nautilus_file_get_activation_uri (data->target);
 
 		paste_clipboard_data (view, selection_data, directory_uri);
 
 		g_free (directory_uri);
-		nautilus_file_list_free (selection);
 	}
 
 	g_object_unref (view);
+	nautilus_file_unref (data->target);
+	g_free (data);
 }
 
 static void
@@ -5807,18 +5813,39 @@
 }
 
 static void
+paste_into (FMDirectoryView *view,
+	    NautilusFile *target)
+{
+	PasteIntoData *data;
+
+	g_assert (FM_IS_DIRECTORY_VIEW (view));
+	g_assert (NAUTILUS_IS_FILE (target));
+
+	data = g_new (PasteIntoData, 1);
+
+	data->view = g_object_ref (view);
+	data->target = nautilus_file_ref (target);
+
+	gtk_clipboard_request_contents (get_clipboard (view),
+					copied_files_atom,
+					paste_into_clipboard_received_callback,
+					data);
+}
+
+static void
 action_paste_files_into_callback (GtkAction *action,
 				  gpointer callback_data)
 {
 	FMDirectoryView *view;
+	GList *selection;
 
 	view = FM_DIRECTORY_VIEW (callback_data);
-	
-	g_object_ref (view);
-	gtk_clipboard_request_contents (get_clipboard (view),
-					copied_files_atom,
-					paste_into_clipboard_received_callback,
-					callback_data);
+	selection = fm_directory_view_get_selection (view);
+	if (selection != NULL) {
+		paste_into (view, NAUTILUS_FILE (selection->data));
+		nautilus_file_list_free (selection);
+	}
+
 }
 
 static void
@@ -6299,6 +6326,21 @@
 }
 
 static void
+action_location_paste_files_into_callback (GtkAction *action,
+					   gpointer callback_data)
+{
+	FMDirectoryView *view;
+	NautilusFile *file;
+
+	view = FM_DIRECTORY_VIEW (callback_data);
+
+	file = view->details->location_popup_directory_as_file;
+	g_return_if_fail (file != NULL);
+
+	paste_into (view, file);
+}
+
+static void
 action_location_trash_callback (GtkAction *action,
 				gpointer   callback_data)
 {
@@ -6574,6 +6616,10 @@
   /* label, accelerator */       NULL, "",
   /* tooltip */                  N_("Prepare this folder to be copied with a Paste command"),
                                  G_CALLBACK (action_location_copy_callback) },
+  /* name, stock id */         { FM_ACTION_LOCATION_PASTE_FILES_INTO, GTK_STOCK_PASTE,
+  /* label, accelerator */       N_("_Paste Into Folder"), "",
+  /* tooltip */                  N_("Move or copy files previously selected by a Cut or Copy command into this folder"),
+                                 G_CALLBACK (action_location_paste_files_into_callback) },
 
   /* name, stock id */         { FM_ACTION_LOCATION_TRASH, NAUTILUS_ICON_TRASH,
   /* label, accelerator */       N_("Mo_ve to Trash"), "",
@@ -6804,7 +6850,18 @@
 	gtk_action_set_sensitive (action,
 	                          can_paste && count == 1 &&
 	                          can_paste_into_file (NAUTILUS_FILE (selection->data)));
-	
+
+	action = gtk_action_group_get_action (view->details->dir_action_group,
+					      FM_ACTION_LOCATION_PASTE_FILES_INTO);
+	g_object_set_data (G_OBJECT (action),
+			   "can-paste-according-to-clipboard",
+			   GINT_TO_POINTER (can_paste));
+	gtk_action_set_sensitive (action,
+				  GPOINTER_TO_INT (g_object_get_data (G_OBJECT (action),
+						   "can-paste-according-to-clipboard")) &&
+				  GPOINTER_TO_INT (g_object_get_data (G_OBJECT (action),
+						   "can-paste-according-to-destination")));
+
 	nautilus_file_list_free (selection);
 	
 	g_object_unref (view);
@@ -7100,6 +7157,10 @@
 	gtk_action_set_visible (action, show_format);
 }
 
+/* TODO: we should split out this routine into two functions:
+ * Update on clipboard changes
+ * Update on selection changes
+ */
 static void
 real_update_paste_menu (FMDirectoryView *view,
 			GList *selection,
@@ -7127,14 +7188,13 @@
 					      FM_ACTION_PASTE_FILES_INTO);
 	gtk_action_set_visible (action, can_paste_files_into);
 	gtk_action_set_sensitive (action, !selection_is_read_only);
-	if (!selection_is_read_only || !is_read_only) {
-		/* Ask the clipboard */
-		g_object_ref (view); /* Need to keep the object alive until we get the reply */
-		gtk_clipboard_request_contents (get_clipboard (view),
-						gdk_atom_intern ("TARGETS", FALSE),
-						clipboard_targets_received,
-						view);
-	}
+
+	/* Ask the clipboard */
+	g_object_ref (view); /* Need to keep the object alive until we get the reply */
+	gtk_clipboard_request_contents (get_clipboard (view),
+					gdk_atom_intern ("TARGETS", FALSE),
+					clipboard_targets_received,
+					view);
 }
 
 static void
@@ -7191,6 +7251,17 @@
 					      FM_ACTION_LOCATION_CUT);
 	gtk_action_set_sensitive (action, can_delete_file);
 
+	action = gtk_action_group_get_action (view->details->dir_action_group,
+					      FM_ACTION_LOCATION_PASTE_FILES_INTO);
+	g_object_set_data (G_OBJECT (action),
+			   "can-paste-according-to-destination",
+			   GINT_TO_POINTER (can_paste_into_file (file)));
+	gtk_action_set_sensitive (action,
+				  GPOINTER_TO_INT (g_object_get_data (G_OBJECT (action),
+						   "can-paste-according-to-clipboard")) &&
+				  GPOINTER_TO_INT (g_object_get_data (G_OBJECT (action),
+						   "can-paste-according-to-destination")));
+
 	if (file != NULL &&
 	    nautilus_file_is_in_trash (file)) {
 		label = _("_Delete from Trash");

Modified: trunk/src/file-manager/nautilus-directory-view-ui.xml
==============================================================================
--- trunk/src/file-manager/nautilus-directory-view-ui.xml	(original)
+++ trunk/src/file-manager/nautilus-directory-view-ui.xml	Wed May 14 20:27:06 2008
@@ -175,6 +175,7 @@
 	<placeholder name="Clipboard Actions">
 		<menuitem name="Cut" action="LocationCut"/>
 		<menuitem name="Copy" action="LocationCopy"/>
+		<menuitem name="LocationPasteFilesInto" action="LocationPasteFilesInto"/>
 	</placeholder>
 	<separator name="Location After Clipboard Separator"/>
 	<placeholder name="Dangerous File Actions">



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]