Index: src/file-manager/fm-properties-window.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/fm-properties-window.c,v
retrieving revision 1.218
diff -u -p -r1.218 fm-properties-window.c
--- src/file-manager/fm-properties-window.c	12 Aug 2005 22:05:23 -0000	1.218
+++ src/file-manager/fm-properties-window.c	27 Aug 2005 08:33:40 -0000
@@ -87,13 +87,13 @@ struct FMPropertiesWindowDetails {	
 	GList *target_files;
 	
 	GtkNotebook *notebook;
-	GtkWidget *remove_image_button;
-	GtkWidget *icon_selector_window;
 	
 	GtkTable *basic_table;
 	GtkTable *permissions_table;
 
+	GtkWidget *icon_button;
 	GtkWidget *icon_image;
+	GtkWidget *icon_chooser;
 
 	GtkWidget *name_label;
 	GtkWidget *name_field;
@@ -195,9 +195,7 @@ static void parent_widget_destroyed_call
 						   gpointer            callback_data);
 static void select_image_button_callback          (GtkWidget          *widget,
 						   FMPropertiesWindow *properties_window);
-static void set_icon_callback                     (const char         *icon_path,
-						   FMPropertiesWindow *properties_window);
-static void remove_image_button_callback          (GtkWidget          *widget,
+static void set_icon                              (const char         *icon_path,
 						   FMPropertiesWindow *properties_window);
 static void remove_pending                        (StartupData        *data,
 						   gboolean            cancel_call_when_ready,
@@ -478,8 +476,6 @@ reset_icon (FMPropertiesWindow *properti
 					    NAUTILUS_METADATA_KEY_CUSTOM_ICON,
 					    NULL, NULL);
 	}
-	
-	gtk_widget_set_sensitive (properties_window->details->remove_image_button, FALSE);
 }
 
 
@@ -490,6 +486,7 @@ fm_properties_window_drag_data_received 
 					 guint info, guint time)
 {
 	char **uris;
+	char *path;
 	gboolean exactly_one;
 	GtkImage *image;
  	GtkWindow *window; 
@@ -515,8 +512,9 @@ fm_properties_window_drag_data_received 
 			 window);
 	} else {		
 		if (uri_is_local_image (uris[0])) {			
-			set_icon_callback (gnome_vfs_get_local_path_from_uri (uris[0]), 
-					   FM_PROPERTIES_WINDOW (window));
+			path = gnome_vfs_get_local_path_from_uri (uris[0]);
+			set_icon (path,  FM_PROPERTIES_WINDOW (window));
+			g_free (path);
 		} else {	
 			if (eel_is_remote_uri (uris[0])) {
 				eel_show_error_dialog
@@ -539,17 +537,23 @@ fm_properties_window_drag_data_received 
 
 static GtkWidget *
 create_image_widget (FMPropertiesWindow *window,
-		     gboolean is_drag_dest)
+		     gboolean is_customizable)
 {
- 	GtkWidget *image;
+ 	GtkWidget *button;
+	GtkWidget *image;
 	GdkPixbuf *pixbuf;
 	
 	pixbuf = get_pixbuf_for_properties_window (window);
 	
+
 	image = gtk_image_new ();
-	window->details->icon_image = image;
+	gtk_widget_show (image);
+
+	button = NULL;
+	if (is_customizable) {
+		button = gtk_button_new ();
+		gtk_container_add (GTK_CONTAINER (button), image);
 
-	if (is_drag_dest) {
 		/* prepare the image to receive dropped objects to assign custom images */
 		gtk_drag_dest_set (GTK_WIDGET (image),
 				   GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP, 
@@ -558,6 +562,8 @@ create_image_widget (FMPropertiesWindow 
 
 		g_signal_connect (image, "drag_data_received",
 				  G_CALLBACK (fm_properties_window_drag_data_received), NULL);
+		g_signal_connect (button, "clicked",
+				  G_CALLBACK (select_image_button_callback), window);
 	}
 
 	gtk_image_set_from_pixbuf (GTK_IMAGE (image), pixbuf);
@@ -572,7 +578,10 @@ create_image_widget (FMPropertiesWindow 
 				 G_CALLBACK (update_properties_window_icon),
 				 image, G_CONNECT_SWAPPED);
 
-	return image;
+	window->details->icon_image = image;
+	window->details->icon_button = button;
+
+	return button != NULL ? button : image;
 }
 
 static void
@@ -2346,13 +2355,15 @@ create_basic_page (FMPropertiesWindow *w
 	icon_pixmap_widget = create_image_widget (
 		window, should_show_custom_icon_buttons (window));
 	gtk_widget_show (icon_pixmap_widget);
-	
+
 	icon_aligner = gtk_alignment_new (1, 0.5, 0, 0);
 	gtk_widget_show (icon_aligner);
 	
 	gtk_container_add (GTK_CONTAINER (icon_aligner), icon_pixmap_widget);
 	gtk_box_pack_start (GTK_BOX (hbox), icon_aligner, TRUE, TRUE, 0);
 
+	window->details->icon_chooser = NULL;
+
 	/* Name label */
 	name_label = gtk_label_new_with_mnemonic (ngettext ("_Name:", "_Names:",
 							    get_not_gone_original_file_count (window)));
@@ -2434,47 +2445,6 @@ create_basic_page (FMPropertiesWindow *w
 					 _("--"),
 					 FALSE);
 	}
-
-	if (should_show_custom_icon_buttons (window)) {
-		GtkWidget *button_box;
-		GtkWidget *temp_button;
-		GList *l;
-		
-		/* add command buttons for setting and clearing custom icons */
-		button_box = gtk_hbox_new (FALSE, 0);
-		gtk_widget_show (button_box);
-		gtk_box_pack_end (GTK_BOX(container), button_box, FALSE, FALSE, 4);  
-		
-	 	temp_button = gtk_button_new_with_mnemonic (_("_Select Custom Icon..."));
-		gtk_widget_show (temp_button);
-		gtk_box_pack_start (GTK_BOX (button_box), temp_button, FALSE, FALSE, 4);  
-
-		g_signal_connect_object (temp_button, "clicked", G_CALLBACK (select_image_button_callback), window, 0);
-	 	
-	 	temp_button = gtk_button_new_with_mnemonic (_("_Remove Custom Icon"));
-		gtk_widget_show (temp_button);
-		gtk_box_pack_start (GTK_BOX(button_box), temp_button, FALSE, FALSE, 4);  
-
-	 	g_signal_connect_object (temp_button, "clicked", G_CALLBACK (remove_image_button_callback), window, 0);
-
-		window->details->remove_image_button = temp_button;
-		
-		/* de-sensitize the remove button if there isn't a custom image */
-		
-		gtk_widget_set_sensitive (temp_button, FALSE);
-		for (l = window->details->original_files; l != NULL; l = l->next) {
-			char *image_uri = nautilus_file_get_metadata 
-				(NAUTILUS_FILE (l->data), 
-				 NAUTILUS_METADATA_KEY_CUSTOM_ICON, NULL);
-			if (image_uri) {
-				gtk_widget_set_sensitive (temp_button, TRUE);
-			}
-			
-			g_free (image_uri);
-		}
-
-		window->details->icon_selector_window = NULL;
-	}
 }
 
 static GHashTable *
@@ -3802,7 +3772,7 @@ real_finalize (GObject *object)
 
 /* icon selection callback to set the image of the file object to the selected file */
 static void
-set_icon_callback (const char* icon_path, FMPropertiesWindow *properties_window)
+set_icon (const char* icon_path, FMPropertiesWindow *properties_window)
 {
 	NautilusFile *file;
 	char *icon_uri;
@@ -3844,45 +3814,72 @@ set_icon_callback (const char* icon_path
 
 		}
 		g_free (icon_uri);	
-		
-		/* re-enable the property window's clear image button */ 
-		gtk_widget_set_sensitive (properties_window->details->remove_image_button, TRUE);
 	}
 }
 
-/* handle the "select icon" button */
 static void
-select_image_button_callback (GtkWidget *widget, FMPropertiesWindow *properties_window)
+select_image_button_callback (GtkWidget *widget,
+			      FMPropertiesWindow *window)
 {
 	GtkWidget *dialog;
+	GtkFileFilter *filter;
+	GList *l;
+	NautilusFile *file;
+	char *image_path;
+	gboolean revert_is_sensitive;
 
-	g_assert (FM_IS_PROPERTIES_WINDOW (properties_window));
+	g_assert (FM_IS_PROPERTIES_WINDOW (window));
 
-	dialog = properties_window->details->icon_selector_window;
+	dialog = window->details->icon_chooser;
 
-	if (dialog) {
-		gtk_window_present (GTK_WINDOW (dialog));
-	} else {
-		dialog = eel_gnome_icon_selector_new (_("Select an icon"),
-						      NULL,
-					 	      GTK_WINDOW (properties_window),
-						      (EelIconSelectionFunction) set_icon_callback,
-						      properties_window);
-		
+	if (dialog == NULL) {
+		dialog = gtk_file_chooser_dialog_new (_("Select Custom Icon"), GTK_WINDOW (window),
+						      GTK_FILE_CHOOSER_ACTION_OPEN,
+						      _("_Revert"), GTK_RESPONSE_NO,
+						      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+						      GTK_STOCK_OPEN, GTK_RESPONSE_OK,
+						      NULL);
+		gtk_file_chooser_add_shortcut_folder (GTK_FILE_CHOOSER (dialog), "/usr/share/pixmaps", NULL);
 		gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
 
-		properties_window->details->icon_selector_window = dialog;
+		filter = gtk_file_filter_new ();
+		gtk_file_filter_add_pixbuf_formats (filter);
+		gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filter);
 
-		eel_add_weak_pointer (&properties_window->details->icon_selector_window);
+		window->details->icon_chooser = dialog;
+
+		eel_add_weak_pointer (&window->details->icon_chooser);
 	}
-}
 
-static void
-remove_image_button_callback (GtkWidget *widget, FMPropertiesWindow *properties_window)
-{
-	g_return_if_fail (FM_IS_PROPERTIES_WINDOW (properties_window));
+	revert_is_sensitive = FALSE;
+	for (l = window->details->original_files; l != NULL; l = l->next) {
+		file = NAUTILUS_FILE (l->data);
+		image_path = nautilus_file_get_metadata (file, NAUTILUS_METADATA_KEY_CUSTOM_ICON, NULL);
+		revert_is_sensitive = (image_path != NULL);
+		g_free (image_path);
+
+		if (revert_is_sensitive) {
+			break;
+		}
+	}
+	gtk_dialog_set_response_sensitive (GTK_DIALOG (dialog), GTK_RESPONSE_NO, revert_is_sensitive);
+
+	switch (gtk_dialog_run (GTK_DIALOG (dialog))) {
+	case GTK_RESPONSE_NO:
+		reset_icon (window);
+		break;
+
+	case GTK_RESPONSE_OK:
+		image_path = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+		set_icon (image_path, window);
+		g_free (image_path);
+		break;
+
+	default:
+		break;
+	}
 
-	reset_icon (properties_window);
+	gtk_widget_hide (dialog);
 }
 
 static void
