summaryrefslogtreecommitdiff
path: root/src/nautilus-file-undo-operations.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nautilus-file-undo-operations.c')
-rw-r--r--src/nautilus-file-undo-operations.c286
1 files changed, 286 insertions, 0 deletions
diff --git a/src/nautilus-file-undo-operations.c b/src/nautilus-file-undo-operations.c
index e88054722..3ec2832f8 100644
--- a/src/nautilus-file-undo-operations.c
+++ b/src/nautilus-file-undo-operations.c
@@ -994,6 +994,292 @@ nautilus_file_undo_info_rename_set_data_post (NautilusFileUndoInfoRename *self,
self->priv->new_file = g_object_ref (new_file);
}
+/* batch rename */
+G_DEFINE_TYPE (NautilusFileUndoInfoBatchRename, nautilus_file_undo_info_batch_rename, NAUTILUS_TYPE_FILE_UNDO_INFO);
+
+struct _NautilusFileUndoInfoBatchRenameDetails {
+ GList *old_files;
+ GList *new_files;
+ GList *old_display_names;
+ GList *new_display_names;
+};
+
+static void
+batch_rename_strings_func (NautilusFileUndoInfo *info,
+ gchar **undo_label,
+ gchar **undo_description,
+ gchar **redo_label,
+ gchar **redo_description)
+{
+ NautilusFileUndoInfoBatchRename *self = NAUTILUS_FILE_UNDO_INFO_BATCH_RENAME (info);
+
+ *undo_description = g_strdup_printf (_("Batch rename '%d' files"),
+ g_list_length (self->priv->new_files));
+ *redo_description = g_strdup_printf (_("Batch rename '%d' files"),
+ g_list_length (self->priv->new_files));
+
+ *undo_label = g_strdup (_("_Undo Batch rename"));
+ *redo_label = g_strdup (_("_Redo Batch rename"));
+}
+
+static void
+batch_rename_redo_func (NautilusFileUndoInfo *info,
+ GtkWindow *parent_window)
+{
+ NautilusFileUndoInfoBatchRename *self = NAUTILUS_FILE_UNDO_INFO_BATCH_RENAME (info);
+
+ GList *l, *files;
+ NautilusFile *file;
+ GFile *old_file;
+ GFile *new_file;
+ GList *l1;
+ GList *l2;
+ GList *l3;
+ GList *l4;
+ GList *l5;
+ GList *l6;
+ GList *l7;
+ gchar *file_name;
+ gchar *old_file_name;
+ GString *new_file_name;
+ GString *new_name;
+ GString *old_name;
+
+ files = NULL;
+
+ for (l = self->priv->old_files; l != NULL; l = l->next) {
+ old_file = l->data;
+
+ file = nautilus_file_get (old_file);
+ files = g_list_append (files, file);
+ }
+
+ for (l1 = self->priv->new_display_names, l2 = files; l1 != NULL && l2 != NULL; l1 = l1->next, l2 = l2->next) {
+ old_file_name = nautilus_file_get_name (NAUTILUS_FILE (l2->data));
+ new_file_name = l1->data;
+
+ for (l3 = files, l4 = self->priv->new_display_names, l5 = self->priv->old_display_names, l6 = self->priv->old_files, l7 = self->priv->new_files;
+ l3 != NULL && l4 != NULL && l5 != NULL && l6 != NULL && l7 != NULL;
+ l3 = l3->next, l4 = l4->next, l5 = l5->next, l6 = l6->next, l7 = l7->next) {
+ file_name = nautilus_file_get_name (NAUTILUS_FILE (l3->data));
+ if (l3 != l2 && g_strcmp0 (file_name, new_file_name->str) == 0) {
+
+ file = NAUTILUS_FILE (l3->data);
+ new_name = l4->data;
+ old_name = l5->data;
+ old_file = l6->data;
+ new_file = l7->data;
+
+ files = g_list_remove_link (files, l3);
+ self->priv->new_display_names = g_list_remove_link (self->priv->new_display_names, l4);
+ self->priv->old_display_names = g_list_remove_link (self->priv->old_display_names, l5);
+ self->priv->old_files = g_list_remove_link (self->priv->old_files, l6);
+ self->priv->new_files = g_list_remove_link (self->priv->new_files, l7);
+
+ files = g_list_prepend (files, file);
+ self->priv->new_display_names = g_list_prepend (self->priv->new_display_names, new_name);
+ self->priv->old_display_names = g_list_prepend (self->priv->old_display_names, old_name);
+ self->priv->old_files = g_list_prepend (self->priv->old_files, old_file);
+ self->priv->new_files = g_list_prepend (self->priv->new_files, new_file);
+
+ g_free (file_name);
+
+ break;
+ }
+
+ g_free (file_name);
+ }
+
+ g_free (old_file_name);
+ }
+
+ nautilus_file_batch_rename (files, self->priv->new_display_names, file_undo_info_operation_callback, self);
+}
+
+static void
+batch_rename_undo_func (NautilusFileUndoInfo *info,
+ GtkWindow *parent_window)
+{
+ NautilusFileUndoInfoBatchRename *self = NAUTILUS_FILE_UNDO_INFO_BATCH_RENAME (info);
+
+ GList *l, *files;
+ NautilusFile *file;
+ GFile *new_file;
+ GFile *old_file;
+ GList *l1;
+ GList *l2;
+ GList *l3;
+ GList *l4;
+ GList *l5;
+ GList *l6;
+ GList *l7;
+ gchar *file_name;
+ gchar *old_file_name;
+ GString *new_file_name;
+ GString *new_name;
+ GString *old_name;
+
+ files = NULL;
+
+ for (l = self->priv->new_files; l != NULL; l = l->next) {
+ new_file = l->data;
+
+ file = nautilus_file_get (new_file);
+ files = g_list_append (files, file);
+ }
+
+ for (l1 = self->priv->old_display_names, l2 = files; l1 != NULL && l2 != NULL; l1 = l1->next, l2 = l2->next) {
+ old_file_name = nautilus_file_get_name (NAUTILUS_FILE (l2->data));
+ new_file_name = l1->data;
+
+ for (l3 = files, l4 = self->priv->old_display_names, l5 = self->priv->new_display_names, l6 = self->priv->old_files, l7 = self->priv->new_files;
+ l3 != NULL && l4 != NULL && l5 != NULL && l6 != NULL && l7 != NULL;
+ l3 = l3->next, l4 = l4->next, l5 = l5->next, l6 = l6->next, l7 = l7->next) {
+ file_name = nautilus_file_get_name (NAUTILUS_FILE (l3->data));
+ if (l3 != l2 && g_strcmp0 (file_name, new_file_name->str) == 0) {
+ file = NAUTILUS_FILE (l3->data);
+ new_name = l4->data;
+ old_name = l5->data;
+ old_file = l6->data;
+ new_file = l7->data;
+
+ files = g_list_remove_link (files, l3);
+ self->priv->old_display_names = g_list_remove_link (self->priv->old_display_names, l4);
+ self->priv->new_display_names = g_list_remove_link (self->priv->new_display_names, l5);
+ self->priv->old_files = g_list_remove_link (self->priv->old_files, l6);
+ self->priv->new_files = g_list_remove_link (self->priv->new_files, l7);
+
+ files = g_list_prepend (files, file);
+ self->priv->old_display_names = g_list_prepend (self->priv->old_display_names, new_name);
+ self->priv->new_display_names = g_list_prepend (self->priv->new_display_names, old_name);
+ self->priv->old_files = g_list_prepend (self->priv->old_files, old_file);
+ self->priv->new_files = g_list_prepend (self->priv->new_files, new_file);
+
+ g_free (file_name);
+
+ break;
+ }
+
+ g_free (file_name);
+ }
+
+ g_free (old_file_name);
+ }
+
+ nautilus_file_batch_rename (files, self->priv->old_display_names, file_undo_info_operation_callback, self);
+}
+
+static void
+nautilus_file_undo_info_batch_rename_init (NautilusFileUndoInfoBatchRename *self)
+{
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, nautilus_file_undo_info_batch_rename_get_type (),
+ NautilusFileUndoInfoBatchRenameDetails);
+}
+
+static void
+nautilus_file_undo_info_batch_rename_finalize (GObject *obj)
+{
+ GList *l;
+ GFile *file;
+ GString *string;
+ NautilusFileUndoInfoBatchRename *self = NAUTILUS_FILE_UNDO_INFO_BATCH_RENAME (obj);
+
+ for (l = self->priv->new_files; l != NULL; l = l->next){
+ file = l->data;
+
+ g_clear_object (&file);
+ }
+
+ for (l = self->priv->old_files; l != NULL; l = l->next){
+ file = l->data;
+
+ g_clear_object (&file);
+ }
+
+ for (l = self->priv->new_display_names; l != NULL; l = l->next) {
+ string = l->data;
+
+ g_string_free (string, TRUE);
+ }
+
+ for (l = self->priv->old_display_names; l != NULL; l = l->next) {
+ string = l->data;
+
+ g_string_free (string, TRUE);
+ }
+
+ g_list_free (self->priv->new_files);
+ g_list_free (self->priv->old_files);
+ g_list_free (self->priv->new_display_names);
+ g_list_free (self->priv->old_display_names);
+
+ G_OBJECT_CLASS (nautilus_file_undo_info_batch_rename_parent_class)->finalize (obj);
+}
+
+static void
+nautilus_file_undo_info_batch_rename_class_init (NautilusFileUndoInfoBatchRenameClass *klass)
+{
+ GObjectClass *oclass = G_OBJECT_CLASS (klass);
+ NautilusFileUndoInfoClass *iclass = NAUTILUS_FILE_UNDO_INFO_CLASS (klass);
+
+ oclass->finalize = nautilus_file_undo_info_batch_rename_finalize;
+
+ iclass->undo_func = batch_rename_undo_func;
+ iclass->redo_func = batch_rename_redo_func;
+ iclass->strings_func = batch_rename_strings_func;
+
+ g_type_class_add_private (klass, sizeof (NautilusFileUndoInfoBatchRenameDetails));
+}
+
+NautilusFileUndoInfo *
+nautilus_file_undo_info_batch_rename_new (gint item_count)
+{
+ return g_object_new (NAUTILUS_TYPE_FILE_UNDO_INFO_BATCH_RENAME,
+ "op-type", NAUTILUS_FILE_UNDO_OP_BATCH_RENAME,
+ "item-count", item_count,
+ NULL);
+}
+
+void
+nautilus_file_undo_info_batch_rename_set_data_pre (NautilusFileUndoInfoBatchRename *self,
+ GList *old_files)
+{
+ GList *l;
+ GString *old_name;
+ GFile *file;
+
+ self->priv->old_files = old_files;
+ self->priv->old_display_names = NULL;
+
+ for (l = old_files; l != NULL; l = l->next) {
+ file = l->data;
+
+ old_name = g_string_new (g_file_get_basename (file));
+
+ self->priv->old_display_names = g_list_append (self->priv->old_display_names, old_name);
+ }
+}
+
+void
+nautilus_file_undo_info_batch_rename_set_data_post (NautilusFileUndoInfoBatchRename *self,
+ GList *new_files)
+{
+ GList *l;
+ GString *new_name;
+ GFile *file;
+
+ self->priv->new_files = new_files;
+ self->priv->new_display_names = NULL;
+
+ for (l = new_files; l != NULL; l = l->next) {
+ file = l->data;
+
+ new_name = g_string_new (g_file_get_basename (file));
+
+ self->priv->new_display_names = g_list_append (self->priv->new_display_names, new_name);
+ }
+}
+
/* trash */
G_DEFINE_TYPE (NautilusFileUndoInfoTrash, nautilus_file_undo_info_trash, NAUTILUS_TYPE_FILE_UNDO_INFO)