diff -Npur nau.old/src/file-manager/fm-list-view.c nau.new/src/file-manager/fm-list-view.c
--- nau.old/src/file-manager/fm-list-view.c	2007-10-24 14:50:22.000000000 +0800
+++ nau.new/src/file-manager/fm-list-view.c	2007-10-24 14:51:56.000000000 +0800
@@ -111,6 +111,11 @@ struct FMListViewDetails {
 
 	char *original_name;
 	
+	gboolean start_rubber;   
+	gboolean start_outside;
+	gdouble  start_y; 
+	GtkTreePath *start_path; 
+
 	NautilusFile *renaming_file;
 	gboolean rename_done;
 	guint renaming_file_activate_timeout;
@@ -466,6 +471,28 @@ motion_notify_callback (GtkWidget *widge
 		return FALSE;
 	}
 
+	if (view->details->start_rubber) {
+		GtkTreeSelection *selection;
+		GtkTreePath *path;
+		selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget));
+		gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget), 0, event->y, &path, NULL,NULL,NULL);		
+		if (path) {
+			if (gtk_tree_selection_count_selected_rows (selection) == 0 ) {
+				if (view->details->start_path == NULL)
+					view->details->start_path  = path;
+				gtk_tree_selection_select_path (selection,path);
+			} else {
+				gtk_tree_selection_unselect_all (selection);
+				gtk_tree_selection_select_range (selection, view->details->start_path, path);
+				gtk_tree_path_free (path);
+			}
+		} else {
+			if (view->details->start_outside  && view->details->start_y < event->y )	
+				gtk_tree_selection_unselect_all (selection);
+		}
+		return TRUE;
+	}
+	
 	if (click_policy_auto_value == NAUTILUS_CLICK_POLICY_SINGLE) {
 		GtkTreePath *old_hover_path;
 
@@ -527,6 +554,9 @@ leave_notify_callback (GtkWidget *widget
 
 	view = FM_LIST_VIEW (callback_data);
 
+	if (view->details->start_rubber == TRUE)
+		return FALSE;
+	
 	if (click_policy_auto_value == NAUTILUS_CLICK_POLICY_SINGLE &&
 	    view->details->hover_path != NULL) {
 		gtk_tree_path_free (view->details->hover_path);
@@ -599,6 +629,27 @@ button_press_callback (GtkWidget *widget
 		return FALSE;
 	}
 
+/*leave the shift and control key press the default function*/
+	GtkTreeViewColumn *column;
+	if (event->button == 1 && (event->state & GDK_SHIFT_MASK) == 0  && (event->state & GDK_CONTROL_MASK) == 0) {
+		gtk_tree_view_get_path_at_pos (tree_view, event->x,event->y, &view->details->start_path,&column,NULL,NULL); 
+		if ((column && column != view->details->file_name_column) || view->details->start_path == NULL ){
+			view->details->start_rubber = TRUE;
+			view->details->start_y	    = event->y;
+			gtk_tree_selection_unselect_all (gtk_tree_view_get_selection (tree_view));
+			if (view->details->start_path == NULL)
+				view->details->start_outside = TRUE;
+			else
+				view->details->start_outside = FALSE;
+			return TRUE;
+		} else {
+			if (view->details->start_path) {
+				gtk_tree_path_free (view->details->start_path);
+				view->details->start_path = NULL;
+			}
+		}	
+	}
+			
 	fm_list_model_set_drag_view
 		(FM_LIST_MODEL (gtk_tree_view_get_model (tree_view)),
 		 tree_view,
@@ -749,6 +800,14 @@ button_release_callback (GtkWidget *widg
 	FMListView *view;
 	
 	view = FM_LIST_VIEW (callback_data);
+	if (view->details->start_rubber) {
+		view->details->start_rubber = FALSE;
+		if (view->details->start_path) {
+			gtk_tree_path_free (view->details->start_path);
+			view->details->start_path = NULL;
+		}
+		return TRUE;
+	}
 
 	if (event->button == view->details->drag_button) {
 		stop_drag_check (view);
@@ -1271,6 +1330,10 @@ create_and_set_up_tree_view (FMListView 
 	view->details->drag_dest = 
 		nautilus_tree_view_drag_dest_new (view->details->tree_view);
 
+	view->details->start_rubber = FALSE;
+	view->details->start_outside = FALSE;
+	view->details->start_path = NULL;
+	
 	g_signal_connect_object (view->details->drag_dest,
 				 "get_root_uri",
 				 G_CALLBACK (get_root_uri_callback),
