Fixed bug 2120 (Shouldn't be able to create new files in

search view) and most of bug 2916 (Shouldn't be able to
	create new files in Trash). Also fixed the more general
	but unreported bug: Shouldn't be able to create new
	files in read-only directories.

	* src/file-manager/fm-directory-view.h,
	* src/file-manager/fm-directory-view.c:
	(fm_directory_view_is_read_only): New function, overridable via
	function pointer, that reports whether the contents of a
	directory view are entirely read-only.
	(fm_directory_view_real_is_read_only): Default implementation of
	is_read_only, checks the permissions of the model NautilusDirectory.
	(fm_directory_view_supports_creating_files): New function,
	overridable via function pointer, that reports whether a
	directory supports creating new files inside it
	(fm_directory_view_real_supports_creating_files): Default
	implementation of supports_creating_files, returns TRUE unless
	is_read_only is true or the displayed directory is in the trash.
	The remaining part of bug 2916 is that the NautilusFile for
	"trash:" doesn't think it's in the trash.
	(fm_directory_view_initialize_class): Wire up default function
	pointers.
	(compute_menu_item_info): Make sensitivity of "Move to Trash"
	depend on is_read_only; make sensitivity of "New Folder",
	"Duplicate", and "Create Link" depend on supports_creating_files.
	(fm_directory_view_real_update_menus): Add "New Folder" to the
	set of dynamic ones.
	(get_directory_as_file): New helper function to get a NautilusFile
	object for the displayed directory.
	(showing_trash_directory): New helper function to check whether
	the displayed directory is trash.

	* src/file-manager/fm-icon-view.c:
	(get_stored_icon_position_callback): Removed call to
	fm_directory_view_get_model whose result was not used.
	(tighter_layout_callback): Removed an unnecessary cast.

	* src/file-manager/fm-search-list-view.c:
	(real_supports_creating_files): Overridden to return FALSE.
	(fm_search_list_view_initialize_class): Wire up overridden
	function pointer.
This commit is contained in:
John Sullivan 2000-09-08 20:35:01 +00:00
parent 8979b1d73e
commit 107c02e452
5 changed files with 164 additions and 13 deletions

View file

@ -1,9 +1,54 @@
2000-09-08 John Sullivan <sullivan@eazel.com>
Fixed bug 2120 (Shouldn't be able to create new files in
search view) and most of bug 2916 (Shouldn't be able to
create new files in Trash). Also fixed the more general
but unreported bug: Shouldn't be able to create new
files in read-only directories.
* src/file-manager/fm-directory-view.h,
* src/file-manager/fm-directory-view.c:
(fm_directory_view_is_read_only): New function, overridable via
function pointer, that reports whether the contents of a
directory view are entirely read-only.
(fm_directory_view_real_is_read_only): Default implementation of
is_read_only, checks the permissions of the model NautilusDirectory.
(fm_directory_view_supports_creating_files): New function,
overridable via function pointer, that reports whether a
directory supports creating new files inside it
(fm_directory_view_real_supports_creating_files): Default
implementation of supports_creating_files, returns TRUE unless
is_read_only is true or the displayed directory is in the trash.
The remaining part of bug 2916 is that the NautilusFile for
"trash:" doesn't think it's in the trash.
(fm_directory_view_initialize_class): Wire up default function
pointers.
(compute_menu_item_info): Make sensitivity of "Move to Trash"
depend on is_read_only; make sensitivity of "New Folder",
"Duplicate", and "Create Link" depend on supports_creating_files.
(fm_directory_view_real_update_menus): Add "New Folder" to the
set of dynamic ones.
(get_directory_as_file): New helper function to get a NautilusFile
object for the displayed directory.
(showing_trash_directory): New helper function to check whether
the displayed directory is trash.
* src/file-manager/fm-icon-view.c:
(get_stored_icon_position_callback): Removed call to
fm_directory_view_get_model whose result was not used.
(tighter_layout_callback): Removed an unnecessary cast.
* src/file-manager/fm-search-list-view.c:
(real_supports_creating_files): Overridden to return FALSE.
(fm_search_list_view_initialize_class): Wire up overridden
function pointer.
2000-09-08 Josh Barrow <linuxfan@ionet.net>
* components/hardware/nautilus-hardware-view.c: (setup_form_title),
(setup_overview_form), (setup_CPU_form), (setup_RAM_form),
(setup_IDE_form):
Change all text to aa text using nautilus_label and it's friends.
Change all text to aa text using nautilus_label and its friends.
2000-09-08 Andy Hertzfeld <andy@eazel.com>

View file

@ -144,8 +144,10 @@ static void fm_directory_view_real_create_selection_context_menu_items
GList *files);
static void fm_directory_view_real_merge_menus (FMDirectoryView *view);
static void fm_directory_view_real_update_menus (FMDirectoryView *view);
static gboolean fm_directory_view_real_supports_properties (FMDirectoryView *view);
static gboolean fm_directory_view_real_is_read_only (FMDirectoryView *view);
static gboolean fm_directory_view_real_supports_creating_files (FMDirectoryView *view);
static gboolean fm_directory_view_real_supports_zooming (FMDirectoryView *view);
static gboolean fm_directory_view_real_supports_properties (FMDirectoryView *view);
static GtkMenu * create_selection_context_menu (FMDirectoryView *view);
static GtkMenu * create_background_context_menu (FMDirectoryView *view);
static BonoboControl *get_bonobo_control (FMDirectoryView *view);
@ -282,8 +284,10 @@ fm_directory_view_initialize_class (FMDirectoryViewClass *klass)
klass->get_required_metadata_keys = get_required_metadata_keys;
klass->get_emblem_names_to_exclude = real_get_emblem_names_to_exclude;
klass->start_renaming_item = start_renaming_item;
klass->supports_properties = fm_directory_view_real_supports_properties;
klass->is_read_only = fm_directory_view_real_is_read_only;
klass->supports_creating_files = fm_directory_view_real_supports_creating_files;
klass->supports_zooming = fm_directory_view_real_supports_zooming;
klass->supports_properties = fm_directory_view_real_supports_properties;
/* Function pointers that subclasses must override */
NAUTILUS_ASSIGN_MUST_OVERRIDE_SIGNAL (klass, fm_directory_view, add_file);
@ -2369,22 +2373,23 @@ compute_menu_item_info (FMDirectoryView *directory_view,
}
} else if (strcmp (path, FM_DIRECTORY_VIEW_MENU_PATH_NEW_FOLDER) == 0) {
name = g_strdup (_("New Folder"));
*return_sensitivity = fm_directory_view_supports_creating_files (directory_view);
} else if (strcmp (path, FM_DIRECTORY_VIEW_MENU_PATH_DELETE) == 0) {
name = g_strdup (_("Delete from _Trash"));
*return_sensitivity = selection != NULL;
} else if (strcmp (path, FM_DIRECTORY_VIEW_MENU_PATH_TRASH) == 0) {
name = g_strdup (_("Move to _Trash"));
*return_sensitivity = selection != NULL;
*return_sensitivity = !fm_directory_view_is_read_only (directory_view) && selection != NULL;
} else if (strcmp (path, FM_DIRECTORY_VIEW_MENU_PATH_DUPLICATE) == 0) {
name = g_strdup (_("_Duplicate"));
*return_sensitivity = selection != NULL;
*return_sensitivity = fm_directory_view_supports_creating_files (directory_view) && selection != NULL;
} else if (strcmp (path, FM_DIRECTORY_VIEW_MENU_PATH_CREATE_LINK) == 0) {
if (selection != NULL && !nautilus_g_list_exactly_one_item (selection)) {
name = g_strdup (_("Create _Links"));
} else {
name = g_strdup (_("Create _Link"));
}
*return_sensitivity = selection != NULL;
*return_sensitivity = fm_directory_view_supports_creating_files (directory_view) && selection != NULL;
} else if (strcmp (path, FM_DIRECTORY_VIEW_MENU_PATH_SHOW_PROPERTIES) == 0) {
/* No ellipses here because this command does not require further
* information to be completed.
@ -3214,6 +3219,8 @@ fm_directory_view_real_update_menus (FMDirectoryView *view)
handler = fm_directory_view_get_bonobo_ui_handler (view);
selection = fm_directory_view_get_selection (view);
update_one_menu_item (view, handler, selection,
FM_DIRECTORY_VIEW_MENU_PATH_NEW_FOLDER);
update_one_menu_item (view, handler, selection,
FM_DIRECTORY_VIEW_MENU_PATH_OPEN);
update_one_menu_item (view, handler, selection,
@ -3768,6 +3775,78 @@ fm_directory_view_stop (FMDirectoryView *view)
done_loading (view);
}
gboolean
fm_directory_view_is_read_only (FMDirectoryView *view)
{
g_return_val_if_fail (FM_IS_DIRECTORY_VIEW (view), FALSE);
return NAUTILUS_CALL_VIRTUAL
(FM_DIRECTORY_VIEW_CLASS, view,
is_read_only, (view));
}
static NautilusFile *
get_directory_as_file (FMDirectoryView *view)
{
NautilusDirectory *directory;
NautilusFile *directory_as_file;
char *uri;
directory = fm_directory_view_get_model (view);
uri = nautilus_directory_get_uri (directory);
directory_as_file = nautilus_file_get (uri);
g_free (uri);
return directory_as_file;
}
static gboolean
fm_directory_view_real_is_read_only (FMDirectoryView *view)
{
NautilusFile *directory_as_file;
gboolean result;
directory_as_file = get_directory_as_file (view);
result = !nautilus_file_can_write (directory_as_file);
nautilus_file_unref (directory_as_file);
return result;
}
gboolean
fm_directory_view_supports_creating_files (FMDirectoryView *view)
{
g_return_val_if_fail (FM_IS_DIRECTORY_VIEW (view), FALSE);
return NAUTILUS_CALL_VIRTUAL
(FM_DIRECTORY_VIEW_CLASS, view,
supports_creating_files, (view));
}
static gboolean
showing_trash_directory (FMDirectoryView *view)
{
NautilusFile *directory_as_file;
gboolean result;
directory_as_file = get_directory_as_file (view);
result = nautilus_file_is_in_trash (directory_as_file);
nautilus_file_unref (directory_as_file);
return result;
}
static gboolean
fm_directory_view_real_supports_creating_files (FMDirectoryView *view)
{
g_return_val_if_fail (FM_IS_DIRECTORY_VIEW (view), FALSE);
return !fm_directory_view_is_read_only (view) && !showing_trash_directory (view);
}
gboolean
fm_directory_view_supports_properties (FMDirectoryView *view)

View file

@ -228,6 +228,22 @@ struct FMDirectoryViewClass {
*/
gboolean (* supports_zooming) (FMDirectoryView *view);
/* is_read_only is a function pointer that subclasses may
* override to control whether or not the user is allowed to
* change the contents of the currently viewed directory. The
* default implementation checks the permissions of the
* directory.
*/
gboolean (* is_read_only) (FMDirectoryView *view);
/* supports_creating_files is a function pointer that subclasses may
* override to control whether or not new items can be created.
* be accepted. The default implementation checks whether the
* user has write permissions for the viewed directory, and whether
* the viewed directory is in the trash.
*/
gboolean (* supports_creating_files) (FMDirectoryView *view);
void (* start_renaming_item) (FMDirectoryView *view,
const char *uri);
@ -270,6 +286,8 @@ void fm_directory_view_restore_default_zoom_level (FMDirectory
void fm_directory_view_select_all (FMDirectoryView *view);
void fm_directory_view_set_selection (FMDirectoryView *view,
GList *selection);
gboolean fm_directory_view_is_read_only (FMDirectoryView *view);
gboolean fm_directory_view_supports_creating_files (FMDirectoryView *view);
gboolean fm_directory_view_supports_properties (FMDirectoryView *view);
gboolean fm_directory_view_supports_zooming (FMDirectoryView *view);
void fm_directory_view_move_copy_items (const GList *item_uris,

View file

@ -219,7 +219,6 @@ get_stored_icon_position_callback (NautilusIconContainer *container,
NautilusIconPosition *position,
FMIconView *icon_view)
{
NautilusDirectory *directory;
char *position_string, *scale_string;
gboolean position_good, scale_good;
char *locale;
@ -238,7 +237,6 @@ get_stored_icon_position_callback (NautilusIconContainer *container,
locale = setlocale (LC_NUMERIC, "C");
/* Get the current position of this icon from the metadata. */
directory = fm_directory_view_get_model (FM_DIRECTORY_VIEW (icon_view));
position_string = nautilus_file_get_metadata
(file, NAUTILUS_METADATA_KEY_ICON_POSITION, "");
position_good = sscanf
@ -372,7 +370,7 @@ tighter_layout_callback (gpointer ignored, gpointer view)
return;
icon_container = get_icon_container (FM_ICON_VIEW (view));
directory = NAUTILUS_DIRECTORY (fm_directory_view_get_model (FM_DIRECTORY_VIEW (view)));
directory = fm_directory_view_get_model (FM_DIRECTORY_VIEW (view));
is_tighter_layout = fm_icon_view_get_directory_tighter_layout (FM_ICON_VIEW (view), directory);
fm_icon_view_set_directory_tighter_layout (FM_ICON_VIEW (view), directory, !is_tighter_layout);

View file

@ -73,6 +73,7 @@ static void real_get_column_specification (FMListView *list_view
FMListViewColumn *specification);
static NautilusStringList * real_get_emblem_names_to_exclude (FMDirectoryView *view);
static void real_merge_menus (FMDirectoryView *view);
static gboolean real_supports_creating_files (FMDirectoryView *view);
static gboolean real_supports_properties (FMDirectoryView *view);
static void load_location_callback (NautilusView *nautilus_view,
char *location);
@ -108,14 +109,16 @@ fm_search_list_view_initialize_class (gpointer klass)
fm_list_view_class = FM_LIST_VIEW_CLASS (klass);
fm_directory_view_class->add_file = real_add_file;
fm_directory_view_class->merge_menus = real_merge_menus;
fm_directory_view_class->update_menus = real_update_menus;
fm_directory_view_class->supports_properties =
real_supports_properties;
fm_directory_view_class->create_selection_context_menu_items =
real_create_selection_context_menu_items;
fm_directory_view_class->get_emblem_names_to_exclude =
real_get_emblem_names_to_exclude;
fm_directory_view_class->merge_menus = real_merge_menus;
fm_directory_view_class->supports_creating_files =
real_supports_creating_files;
fm_directory_view_class->supports_properties =
real_supports_properties;
fm_directory_view_class->update_menus = real_update_menus;
fm_list_view_class->adding_file = real_adding_file;
fm_list_view_class->removing_file = real_removing_file;
@ -469,6 +472,14 @@ real_merge_menus (FMDirectoryView *view)
nautilus_file_list_free (selected_files);
}
static gboolean
real_supports_creating_files (FMDirectoryView *view)
{
/* The user is not allowed to modify the contents of a search
* results view.
*/
return FALSE;
}
static gboolean
real_supports_properties (FMDirectoryView *view)