[nautilus] batch-rename-dialog: major refactoring



commit 66693775d91eb8278bc7f9d0c5674cdccbc3dd0b
Author: Carlos Soriano <csoriano gnome org>
Date:   Fri Sep 9 23:09:08 2016 +0200

    batch-rename-dialog: major refactoring
    
    This is a refactoring that is difficult to split in several pieces.
    
    This patch implements the following changes:
    - Use loops instead of serie of if/elses.
    - Use enums and static arrays to define a static serie of tag types
    and properties.
    - Use enums for ordering and retrieval of properties of tags instead of
    searching.
    - Merge common code.
    - Extract common code in functions.
    - Mark for translation some strings.
    - Plug some leaks.
    - Fix some free-after-free.
    - Fix issue with condition for unavailable metadata, that was
    exacerbated with this refactoring.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=770586

 src/nautilus-batch-rename-dialog.c               | 1475 ++++------------------
 src/nautilus-batch-rename-dialog.h               |  193 +++-
 src/nautilus-batch-rename-utilities.c            |  630 ++++------
 src/nautilus-batch-rename-utilities.h            |    2 +
 src/resources/ui/nautilus-batch-rename-dialog.ui |    6 +-
 5 files changed, 641 insertions(+), 1665 deletions(-)
---
diff --git a/src/nautilus-batch-rename-dialog.c b/src/nautilus-batch-rename-dialog.c
index 21d09cc..837bd32 100644
--- a/src/nautilus-batch-rename-dialog.c
+++ b/src/nautilus-batch-rename-dialog.c
@@ -118,64 +118,18 @@ typedef struct
     gint new_position;
     /* if the tag was just added, then we shouldn't update it's position */
     gboolean just_added;
+    TagConstants tag_constants;
 } TagData;
 
-typedef struct
-{
-    const gchar *action_target_name;
-    const gchar *tag_text_represencation;
-    const gchar *label;
-} TagConstants;
-
-typedef struct
-{
-    const gchar *action_target_name;
-    const gchar *label;
-    const SortMode sort_mode;
-} SortConstants;
-
-static const SortConstants sorts_constants[] =
-{
-    {
-        "name-ascending",
-        N_("Original Name (Ascending)"),
-        ORIGINAL_ASCENDING,
-    },
-    {
-        "name-descending",
-        N_("Original Name (Descending)"),
-        ORIGINAL_DESCENDING,
-    },
-    {
-        "first-modified",
-        N_("First Modified"),
-        FIRST_MODIFIED,
-    },
-    {
-        "last-modified",
-        N_("Last Modified"),
-        LAST_MODIFIED,
-    },
-    {
-        "first-created",
-        N_("First Created"),
-        FIRST_CREATED,
-    },
-    {
-        "last-created",
-        N_("Last Created"),
-        LAST_CREATED,
-    },
-};
 
 static void     update_display_text (NautilusBatchRenameDialog *dialog);
 
 G_DEFINE_TYPE (NautilusBatchRenameDialog, nautilus_batch_rename_dialog, GTK_TYPE_DIALOG);
 
 static void
-add_numbering_order (GSimpleAction *action,
-                     GVariant      *value,
-                     gpointer       user_data)
+change_numbering_order (GSimpleAction *action,
+                        GVariant      *value,
+                        gpointer       user_data)
 {
     NautilusBatchRenameDialog *dialog;
     const gchar *target_name;
@@ -194,6 +148,7 @@ add_numbering_order (GSimpleAction *action,
             dialog->selection = nautilus_batch_rename_dialog_sort (dialog->selection,
                                                                    sorts_constants[i].sort_mode,
                                                                    NULL);
+          break;
         }
     }
 
@@ -205,190 +160,75 @@ add_numbering_order (GSimpleAction *action,
 }
 
 static void
-add_original_file_name_tag (GSimpleAction *action,
-                            GVariant      *value,
-                            gpointer       user_data)
+enable_action (NautilusBatchRenameDialog *self,
+               const gchar               *action_name)
 {
-    NautilusBatchRenameDialog *dialog;
-    gint cursor_position;
-    TagData *tag_data;
-
-    dialog = NAUTILUS_BATCH_RENAME_DIALOG (user_data);
-
-    g_object_get (dialog->name_entry, "cursor-position", &cursor_position, NULL);
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, ORIGINAL_FILE_NAME);
-    tag_data->set = TRUE;
-    tag_data->just_added = TRUE;
-    tag_data->position = cursor_position;
-
-    gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry),
-                              ORIGINAL_FILE_NAME,
-                              g_utf8_strlen (ORIGINAL_FILE_NAME, -1),
-                              &cursor_position);
-
-    gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position);
-
-    gtk_entry_grab_focus_without_selecting (GTK_ENTRY (dialog->name_entry));
+    GAction *action;
 
-    g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
+    action = g_action_map_lookup_action (G_ACTION_MAP (self->action_group),
+                                         action_name);
+    g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
 }
 
 static void
-disable_action (NautilusBatchRenameDialog *dialog,
-                gchar                     *action_name)
+disable_action (NautilusBatchRenameDialog *self,
+                const gchar               *action_name)
 {
     GAction *action;
 
-    action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
+    action = g_action_map_lookup_action (G_ACTION_MAP (self->action_group),
                                          action_name);
     g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
 }
 
 static void
-add_metadata_tag (GSimpleAction *action,
-                  GVariant      *value,
-                  gpointer       user_data)
+add_tag (NautilusBatchRenameDialog *self,
+         TagConstants               tag_constants)
 {
-    NautilusBatchRenameDialog *dialog;
-    const gchar *action_name;
+    g_autofree gchar *tag_text_representation = NULL;
     gint cursor_position;
     TagData *tag_data;
 
-    dialog = NAUTILUS_BATCH_RENAME_DIALOG (user_data);
-
-    action_name = g_action_get_name (G_ACTION (action));
-    g_object_get (dialog->name_entry, "cursor-position", &cursor_position, NULL);
-
-    if (g_strrstr (action_name, "creation-date"))
-    {
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, CREATION_DATE);
-        tag_data->available = TRUE;
-        tag_data->set = TRUE;
-        tag_data->just_added = TRUE;
-        tag_data->position = cursor_position;
-
-        gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry),
-                                  CREATION_DATE,
-                                  g_utf8_strlen (CREATION_DATE, -1),
-                                  &cursor_position);
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position);
-        disable_action (dialog, "add-creation-date-tag");
-    }
-
-    if (g_strrstr (action_name, "equipment"))
-    {
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, CAMERA_MODEL);
-        tag_data->available = TRUE;
-        tag_data->set = TRUE;
-        tag_data->just_added = TRUE;
-        tag_data->position = cursor_position;
-
-        gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry),
-                                  CAMERA_MODEL,
-                                  g_utf8_strlen (CAMERA_MODEL, -1),
-                                  &cursor_position);
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position);
-        disable_action (dialog, "add-equipment-tag");
-    }
-
-    if (g_strrstr (action_name, "season"))
-    {
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, SEASON_NUMBER);
-        tag_data->available = TRUE;
-        tag_data->set = TRUE;
-        tag_data->just_added = TRUE;
-        tag_data->position = cursor_position;
-
-        gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry),
-                                  SEASON_NUMBER,
-                                  g_utf8_strlen (SEASON_NUMBER, -1),
-                                  &cursor_position);
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position);
-        disable_action (dialog, "add-season-tag");
-    }
-
-    if (g_strrstr (action_name, "episode"))
-    {
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, EPISODE_NUMBER);
-        tag_data->available = TRUE;
-        tag_data->set = TRUE;
-        tag_data->just_added = TRUE;
-        tag_data->position = cursor_position;
-
-        gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry),
-                                  EPISODE_NUMBER,
-                                  g_utf8_strlen (EPISODE_NUMBER, -1),
-                                  &cursor_position);
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position);
-        disable_action (dialog, "add-episode-tag");
-    }
-
-    if (g_strrstr (action_name, "track"))
-    {
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, TRACK_NUMBER);
-        tag_data->available = TRUE;
-        tag_data->set = TRUE;
-        tag_data->just_added = TRUE;
-        tag_data->position = cursor_position;
+    g_object_get (self->name_entry, "cursor-position", &cursor_position, NULL);
 
-        gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry),
-                                  TRACK_NUMBER,
-                                  g_utf8_strlen (TRACK_NUMBER, -1),
-                                  &cursor_position);
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position);
-        disable_action (dialog, "add-track-number-tag");
-    }
+    tag_text_representation = batch_rename_get_tag_text_representation (tag_constants);
+    tag_data = g_hash_table_lookup (self->tag_info_table, tag_text_representation);
+    tag_data->available = TRUE;
+    tag_data->set = TRUE;
+    tag_data->just_added = TRUE;
+    tag_data->position = cursor_position;
 
-    if (g_strrstr (action_name, "artist"))
-    {
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, ARTIST_NAME);
-        tag_data->available = TRUE;
-        tag_data->set = TRUE;
-        tag_data->just_added = TRUE;
-        tag_data->position = cursor_position;
+    gtk_editable_insert_text (GTK_EDITABLE (self->name_entry),
+                              tag_text_representation,
+                              g_utf8_strlen (tag_text_representation, -1),
+                              &cursor_position);
+    gtk_editable_set_position (GTK_EDITABLE (self->name_entry), cursor_position);
 
-        gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry),
-                                  ARTIST_NAME,
-                                  g_utf8_strlen (ARTIST_NAME, -1),
-                                  &cursor_position);
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position);
-        disable_action (dialog, "add-artist-name-tag");
-    }
+    gtk_entry_grab_focus_without_selecting (GTK_ENTRY (self->name_entry));
+}
 
-    if (g_strrstr (action_name, "title"))
-    {
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, TITLE);
-        tag_data->available = TRUE;
-        tag_data->set = TRUE;
-        tag_data->just_added = TRUE;
-        tag_data->position = cursor_position;
+static void
+add_metadata_tag (GSimpleAction *action,
+                  GVariant      *value,
+                  gpointer       user_data)
+{
+    NautilusBatchRenameDialog *self;
+    const gchar *action_name;
+    guint i;
 
-        gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry),
-                                  TITLE,
-                                  g_utf8_strlen (TITLE, -1),
-                                  &cursor_position);
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position);
-        disable_action (dialog, "add-title-tag");
-    }
+    self = NAUTILUS_BATCH_RENAME_DIALOG (user_data);
+    action_name = g_action_get_name (G_ACTION (action));
 
-    if (g_strrstr (action_name, "album"))
+    for (i = 0; i < G_N_ELEMENTS (metadata_tags_constants); i++)
     {
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, ALBUM_NAME);
-        tag_data->available = TRUE;
-        tag_data->set = TRUE;
-        tag_data->just_added = TRUE;
-        tag_data->position = cursor_position;
+        if (g_strcmp0 (metadata_tags_constants[i].action_name, action_name) == 0)
+        {
+            add_tag (self, metadata_tags_constants[i]);
+            disable_action (self, metadata_tags_constants[i].action_name);
 
-        gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry),
-                                  ALBUM_NAME,
-                                  g_utf8_strlen (ALBUM_NAME, -1),
-                                  &cursor_position);
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position);
-        disable_action (dialog, "add-album-name-tag");
+            break;
+        }
     }
-
-    gtk_entry_grab_focus_without_selecting (GTK_ENTRY (dialog->name_entry));
 }
 
 static void
@@ -396,84 +236,36 @@ add_numbering_tag (GSimpleAction *action,
                    GVariant      *value,
                    gpointer       user_data)
 {
-    NautilusBatchRenameDialog *dialog;
+    NautilusBatchRenameDialog *self;
     const gchar *action_name;
-    gint cursor_position;
-    GAction *add_numbering_action;
-    TagData *tag_data;
-
-    dialog = NAUTILUS_BATCH_RENAME_DIALOG (user_data);
+    guint i;
 
+    self = NAUTILUS_BATCH_RENAME_DIALOG (user_data);
     action_name = g_action_get_name (G_ACTION (action));
-    g_object_get (dialog->name_entry, "cursor-position", &cursor_position, NULL);
-
-    if (g_strrstr (action_name, "zero"))
-    {
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING);
-        tag_data->set = TRUE;
-        tag_data->just_added = TRUE;
-        tag_data->position = cursor_position;
-
-        gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry),
-                                  NUMBERING,
-                                  g_utf8_strlen (NUMBERING, -1),
-                                  &cursor_position);
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position);
-    }
-
-    if (g_strrstr (action_name, "one"))
-    {
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING0);
-        tag_data->set = TRUE;
-        tag_data->just_added = TRUE;
-        tag_data->position = cursor_position;
-
-        gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry),
-                                  NUMBERING0,
-                                  g_utf8_strlen (NUMBERING0, -1),
-                                  &cursor_position);
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position);
-    }
 
-    if (g_strrstr (action_name, "two"))
+    for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++)
     {
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING00);
-        tag_data->set = TRUE;
-        tag_data->just_added = TRUE;
-        tag_data->position = cursor_position;
-
-        gtk_editable_insert_text (GTK_EDITABLE (dialog->name_entry),
-                                  NUMBERING00,
-                                  g_utf8_strlen (NUMBERING00, -1),
-                                  &cursor_position);
-        gtk_editable_set_position (GTK_EDITABLE (dialog->name_entry), cursor_position);
+        if (g_strcmp0 (numbering_tags_constants[i].action_name, action_name) == 0)
+        {
+            add_tag (self, numbering_tags_constants[i]);
+        }
+        /* We want to allow only one tag of numbering type, so we disable all
+         * of them */
+        disable_action (self, numbering_tags_constants[i].action_name);
     }
-
-    add_numbering_action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                       "add-numbering-tag-zero");
-    g_simple_action_set_enabled (G_SIMPLE_ACTION (add_numbering_action), FALSE);
-    add_numbering_action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                       "add-numbering-tag-one");
-    g_simple_action_set_enabled (G_SIMPLE_ACTION (add_numbering_action), FALSE);
-
-    add_numbering_action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                       "add-numbering-tag-two");
-    g_simple_action_set_enabled (G_SIMPLE_ACTION (add_numbering_action), FALSE);
-
-    gtk_entry_grab_focus_without_selecting (GTK_ENTRY (dialog->name_entry));
 }
 
 const GActionEntry dialog_entries[] =
 {
-    { "numbering-order-changed", NULL, "s", "'name-ascending'", add_numbering_order },
-    { "add-original-file-name-tag", add_original_file_name_tag },
-    { "add-numbering-tag-zero", add_numbering_tag },
-    { "add-numbering-tag-one", add_numbering_tag },
-    { "add-numbering-tag-two", add_numbering_tag },
+    { "numbering-order-changed", NULL, "s", "'name-ascending'", change_numbering_order },
+    { "add-numbering-no-zero-pad-tag", add_numbering_tag },
+    { "add-numbering-one-zero-pad-tag", add_numbering_tag },
+    { "add-numbering-two-zero-pad-tag", add_numbering_tag },
+    { "add-original-file-name-tag", add_metadata_tag },
     { "add-creation-date-tag", add_metadata_tag },
     { "add-equipment-tag", add_metadata_tag },
-    { "add-season-tag", add_metadata_tag },
-    { "add-episode-tag", add_metadata_tag },
+    { "add-season-number-tag", add_metadata_tag },
+    { "add-episode-number-tag", add_metadata_tag },
     { "add-video-album-tag", add_metadata_tag },
     { "add-track-number-tag", add_metadata_tag },
     { "add-artist-name-tag", add_metadata_tag },
@@ -543,12 +335,14 @@ compare_tag_position (gconstpointer a,
  * For instance, "[1, 2, 3]Paris[Creation date]" would result in:
  * "[1, 2, 3]", "Paris", "[Creation date]" */
 static GList *
-split_entry_text (NautilusBatchRenameDialog *dialog,
+split_entry_text (NautilusBatchRenameDialog *self,
                   gchar                     *entry_text)
 {
     GString *normal_text;
     GString *tag;
     GArray *tag_positions;
+    g_autoptr (GList) tag_info_keys = NULL;
+    GList *l;
     gint tags;
     gint i;
     gchar *substring;
@@ -560,88 +354,16 @@ split_entry_text (NautilusBatchRenameDialog *dialog,
     tag_end_position = 0;
     tag_positions = g_array_new (FALSE, FALSE, sizeof (gint));
 
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING);
-    if (tag_data->set)
-    {
-        g_array_append_val (tag_positions, tag_data->position);
-        tags++;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING0);
-    if (tag_data->set)
-    {
-        g_array_append_val (tag_positions, tag_data->position);
-        tags++;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING00);
-    if (tag_data->set)
-    {
-        g_array_append_val (tag_positions, tag_data->position);
-        tags++;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, ORIGINAL_FILE_NAME);
-    if (tag_data->set)
-    {
-        g_array_append_val (tag_positions, tag_data->position);
-        tags++;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, CREATION_DATE);
-    if (tag_data->set)
-    {
-        g_array_append_val (tag_positions, tag_data->position);
-        tags++;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, CAMERA_MODEL);
-    if (tag_data->set)
-    {
-        g_array_append_val (tag_positions, tag_data->position);
-        tags++;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, SEASON_NUMBER);
-    if (tag_data->set)
-    {
-        g_array_append_val (tag_positions, tag_data->position);
-        tags++;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, EPISODE_NUMBER);
-    if (tag_data->set)
-    {
-        g_array_append_val (tag_positions, tag_data->position);
-        tags++;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, TRACK_NUMBER);
-    if (tag_data->set)
-    {
-        g_array_append_val (tag_positions, tag_data->position);
-        tags++;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, ARTIST_NAME);
-    if (tag_data->set)
-    {
-        g_array_append_val (tag_positions, tag_data->position);
-        tags++;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, TITLE);
-    if (tag_data->set)
-    {
-        g_array_append_val (tag_positions, tag_data->position);
-        tags++;
-    }
+    tag_info_keys = g_hash_table_get_keys (self->tag_info_table);
 
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, ALBUM_NAME);
-    if (tag_data->set)
+    for (l = tag_info_keys; l != NULL; l = l->next)
     {
-        g_array_append_val (tag_positions, tag_data->position);
-        tags++;
+        tag_data = g_hash_table_lookup (self->tag_info_table, l->data);
+        if (tag_data->set)
+        {
+            g_array_append_val (tag_positions, tag_data->position);
+            tags++;
+        }
     }
 
     g_array_sort (tag_positions, compare_tag_position);
@@ -660,96 +382,25 @@ split_entry_text (NautilusBatchRenameDialog *dialog,
             result = g_list_prepend (result, normal_text);
         }
 
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, ORIGINAL_FILE_NAME);
-        if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position)
+        for (l = tag_info_keys; l != NULL; l = l->next)
         {
-            tag_end_position = g_array_index (tag_positions, gint, i) +
-                               g_utf8_strlen (ORIGINAL_FILE_NAME, -1);
-            tag = g_string_append (tag, ORIGINAL_FILE_NAME);
-        }
+            g_autofree gchar *tag_text_representation = NULL;
 
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING);
-        if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position)
-        {
-            tag_end_position = g_array_index (tag_positions, gint, i) +
-                               g_utf8_strlen (NUMBERING, -1);
-            tag = g_string_append (tag, NUMBERING);
-        }
-
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING0);
-        if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position)
-        {
-            tag_end_position = g_array_index (tag_positions, gint, i) +
-                               g_utf8_strlen (NUMBERING0, -1);
-            tag = g_string_append (tag, NUMBERING0);
-        }
+            tag_data = g_hash_table_lookup (self->tag_info_table, l->data);
+            if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position)
+            {
+                tag_text_representation = batch_rename_get_tag_text_representation (tag_data->tag_constants);
+                tag_end_position = g_array_index (tag_positions, gint, i) +
+                                   g_utf8_strlen (tag_text_representation, -1);
+                tag = g_string_append (tag, tag_text_representation);
 
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING00);
-        if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position)
-        {
-            tag_end_position = g_array_index (tag_positions, gint, i) +
-                               g_utf8_strlen (NUMBERING00, -1);
-            tag = g_string_append (tag, NUMBERING00);
-        }
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, CREATION_DATE);
-        if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position)
-        {
-            tag_end_position = g_array_index (tag_positions, gint, i) +
-                               g_utf8_strlen (CREATION_DATE, -1);
-            tag = g_string_append (tag, CREATION_DATE);
-        }
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, CAMERA_MODEL);
-        if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position)
-        {
-            tag_end_position = g_array_index (tag_positions, gint, i) +
-                               g_utf8_strlen (CAMERA_MODEL, -1);
-            tag = g_string_append (tag, CAMERA_MODEL);
-        }
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, SEASON_NUMBER);
-        if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position)
-        {
-            tag_end_position = g_array_index (tag_positions, gint, i) +
-                               g_utf8_strlen (SEASON_NUMBER, -1);
-            tag = g_string_append (tag, SEASON_NUMBER);
-        }
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, EPISODE_NUMBER);
-        if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position)
-        {
-            tag_end_position = g_array_index (tag_positions, gint, i) +
-                               g_utf8_strlen (EPISODE_NUMBER, -1);
-            tag = g_string_append (tag, EPISODE_NUMBER);
-        }
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, TRACK_NUMBER);
-        if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position)
-        {
-            tag_end_position = g_array_index (tag_positions, gint, i) +
-                               g_utf8_strlen (TRACK_NUMBER, -1);
-            tag = g_string_append (tag, TRACK_NUMBER);
-        }
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, ARTIST_NAME);
-        if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position)
-        {
-            tag_end_position = g_array_index (tag_positions, gint, i) +
-                               g_utf8_strlen (ARTIST_NAME, -1);
-            tag = g_string_append (tag, ARTIST_NAME);
-        }
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, TITLE);
-        if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position)
-        {
-            tag_end_position = g_array_index (tag_positions, gint, i) +
-                               g_utf8_strlen (TITLE, -1);
-            tag = g_string_append (tag, TITLE);
-        }
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, ALBUM_NAME);
-        if (tag_data->set && g_array_index (tag_positions, gint, i) == tag_data->position)
-        {
-            tag_end_position = g_array_index (tag_positions, gint, i) +
-                               g_utf8_strlen (ALBUM_NAME, -1);
-            tag = g_string_append (tag, ALBUM_NAME);
+                break;
+            }
         }
 
         result = g_list_prepend (result, tag);
     }
+
     normal_text = g_string_new (g_utf8_offset_to_pointer (entry_text, tag_end_position));
 
     if (g_strcmp0 (normal_text->str, "") != 0)
@@ -1708,6 +1359,8 @@ update_tags (NautilusBatchRenameDialog *dialog)
 {
     TagData *tag_data;
     const gchar *entry_text;
+    g_autoptr (GList) tag_info_keys = NULL;
+    GList *l;
     gint character_difference;
     gint cursor_position;
 
@@ -1731,159 +1384,20 @@ update_tags (NautilusBatchRenameDialog *dialog)
     character_difference = g_utf8_strlen (entry_text, -1) - dialog->name_entry_characters;
     dialog->name_entry_characters = g_utf8_strlen (entry_text, -1);
 
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, ORIGINAL_FILE_NAME);
-    if (tag_data->just_added)
-    {
-        tag_data->just_added = FALSE;
-    }
-    else
-    {
-        if (tag_data->set && cursor_position <= tag_data->position)
-        {
-            tag_data->position += character_difference;
-        }
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, CREATION_DATE);
-    if (tag_data->just_added)
-    {
-        tag_data->just_added = FALSE;
-    }
-    else
-    {
-        if (tag_data->set && cursor_position <= tag_data->position)
-        {
-            tag_data->position += character_difference;
-        }
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, CAMERA_MODEL);
-    if (tag_data->just_added)
-    {
-        tag_data->just_added = FALSE;
-    }
-    else
-    {
-        if (tag_data->set && cursor_position <= tag_data->position)
-        {
-            tag_data->position += character_difference;
-        }
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, SEASON_NUMBER);
-    if (tag_data->just_added)
-    {
-        tag_data->just_added = FALSE;
-    }
-    else
-    {
-        if (tag_data->set && cursor_position <= tag_data->position)
-        {
-            tag_data->position += character_difference;
-        }
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, EPISODE_NUMBER);
-    if (tag_data->just_added)
-    {
-        tag_data->just_added = FALSE;
-    }
-    else
-    {
-        if (tag_data->set && cursor_position <= tag_data->position)
-        {
-            tag_data->position += character_difference;
-        }
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, TRACK_NUMBER);
-    if (tag_data->just_added)
-    {
-        tag_data->just_added = FALSE;
-    }
-    else
-    {
-        if (tag_data->set && cursor_position <= tag_data->position)
-        {
-            tag_data->position += character_difference;
-        }
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, ARTIST_NAME);
-    if (tag_data->just_added)
-    {
-        tag_data->just_added = FALSE;
-    }
-    else
-    {
-        if (tag_data->set && cursor_position <= tag_data->position)
-        {
-            tag_data->position += character_difference;
-        }
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, TITLE);
-    if (tag_data->just_added)
-    {
-        tag_data->just_added = FALSE;
-    }
-    else
-    {
-        if (tag_data->set && cursor_position <= tag_data->position)
-        {
-            tag_data->position += character_difference;
-        }
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, ALBUM_NAME);
-    if (tag_data->just_added)
-    {
-        tag_data->just_added = FALSE;
-    }
-    else
-    {
-        if (tag_data->set && cursor_position <= tag_data->position)
-        {
-            tag_data->position += character_difference;
-        }
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING);
-    if (tag_data->just_added)
-    {
-        tag_data->just_added = FALSE;
-    }
-    else
+    tag_info_keys = g_hash_table_get_keys (dialog->tag_info_table);
+    for (l = tag_info_keys; l != NULL; l = l->next)
     {
-        if (tag_data->set && cursor_position <= tag_data->position)
+        tag_data = g_hash_table_lookup (dialog->tag_info_table, l->data);
+        if (tag_data->just_added)
         {
-            tag_data->position += character_difference;
+            tag_data->just_added = FALSE;
         }
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING0);
-    if (tag_data->just_added)
-    {
-        tag_data->just_added = FALSE;
-    }
-    else
-    {
-        if (tag_data->set && cursor_position <= tag_data->position)
-        {
-            tag_data->position += character_difference;
-        }
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING00);
-    if (tag_data->just_added)
-    {
-        tag_data->just_added = FALSE;
-    }
-    else
-    {
-        if (tag_data->set && cursor_position <= tag_data->position)
+        else
         {
-            tag_data->position += character_difference;
+            if (tag_data->set && cursor_position <= tag_data->position)
+            {
+                tag_data->position += character_difference;
+            }
         }
     }
 }
@@ -1902,8 +1416,6 @@ have_unallowed_character (NautilusBatchRenameDialog *dialog)
     have_unallowed_character_dot = FALSE;
     have_unallowed_character_dotdot = FALSE;
 
-
-
     if (dialog->mode == NAUTILUS_BATCH_RENAME_DIALOG_FORMAT)
     {
         entry_text = gtk_entry_get_text (GTK_ENTRY (dialog->name_entry));
@@ -1990,17 +1502,30 @@ have_unallowed_character (NautilusBatchRenameDialog *dialog)
     }
 }
 
-static void
-update_display_text (NautilusBatchRenameDialog *dialog)
+static gboolean
+numbering_tag_is_some_added (NautilusBatchRenameDialog *self)
 {
+    guint i;
     TagData *tag_data;
-    TagData *tag_data0;
-    TagData *tag_data00;
 
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING);
-    tag_data0 = g_hash_table_lookup (dialog->tag_info_table, NUMBERING0);
-    tag_data00 = g_hash_table_lookup (dialog->tag_info_table, NUMBERING00);
+    for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++)
+    {
+        g_autofree gchar *tag_text_representation = NULL;
+
+        tag_text_representation = batch_rename_get_tag_text_representation (numbering_tags_constants[i]);
+        tag_data = g_hash_table_lookup (self->tag_info_table, tag_text_representation);
+        if (tag_data->set)
+        {
+          return TRUE;
+        }
+    }
+
+    return FALSE;
+}
 
+static void
+update_display_text (NautilusBatchRenameDialog *dialog)
+{
     if (dialog->conflict_cancellable != NULL)
     {
         g_cancellable_cancel (dialog->conflict_cancellable);
@@ -2024,7 +1549,7 @@ update_display_text (NautilusBatchRenameDialog *dialog)
         g_list_free_full (dialog->new_names, string_free);
     }
 
-    if (!tag_data->set && !tag_data0->set && !tag_data00->set)
+    if (!numbering_tag_is_some_added (dialog))
     {
         gtk_label_set_label (GTK_LABEL (dialog->numbering_label), "");
         gtk_widget_hide (dialog->numbering_order_button);
@@ -2121,8 +1646,12 @@ nautilus_batch_rename_dialog_query_finished (NautilusBatchRenameDialog *dialog,
 {
     GMenuItem *first_created;
     GMenuItem *last_created;
-    FileMetadata *metadata;
+    FileMetadata *file_metadata;
+    MetadataType metadata_type;
+    gboolean is_metadata;
     TagData *tag_data;
+    g_autoptr (GList) tag_info_keys = NULL;
+    GList *l;
 
     /* for files with no metadata */
     if (hash_table != NULL && g_hash_table_size (hash_table) == 0)
@@ -2155,94 +1684,25 @@ nautilus_batch_rename_dialog_query_finished (NautilusBatchRenameDialog *dialog,
     }
 
     dialog->selection_metadata = selection_metadata;
-    metadata = selection_metadata->data;
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, CREATION_DATE);
-    if (metadata->creation_date == NULL || g_strcmp0 (metadata->creation_date->str, "") == 0)
-    {
-        disable_action (dialog, "add-creation-date-tag");
-        tag_data->available = FALSE;
-    }
-    else
-    {
-        tag_data->set = FALSE;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, CAMERA_MODEL);
-    if (metadata->equipment == NULL || g_strcmp0 (metadata->equipment->str, "") == 0)
-    {
-        disable_action (dialog, "add-equipment-tag");
-        tag_data->available = FALSE;
-    }
-    else
-    {
-        tag_data->set = FALSE;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, SEASON_NUMBER);
-    if (metadata->season == NULL || g_strcmp0 (metadata->season->str, "") == 0)
-    {
-        disable_action (dialog, "add-season-tag");
-        tag_data->available = FALSE;
-    }
-    else
-    {
-        tag_data->set = FALSE;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, EPISODE_NUMBER);
-    if (metadata->episode_number == NULL || g_strcmp0 (metadata->episode_number->str, "") == 0)
-    {
-        disable_action (dialog, "add-episode-tag");
-        tag_data->available = FALSE;
-    }
-    else
-    {
-        tag_data->set = FALSE;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, TRACK_NUMBER);
-    if (metadata->track_number == NULL || g_strcmp0 (metadata->track_number->str, "") == 0)
-    {
-        disable_action (dialog, "add-track-number-tag");
-        tag_data->available = FALSE;
-    }
-    else
-    {
-        tag_data->set = FALSE;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, ARTIST_NAME);
-    if (metadata->artist_name == NULL || g_strcmp0 (metadata->artist_name->str, "") == 0)
-    {
-        disable_action (dialog, "add-artist-name-tag");
-        tag_data->available = FALSE;
-    }
-    else
-    {
-        tag_data->set = FALSE;
-    }
-
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, TITLE);
-    if (metadata->title == NULL || g_strcmp0 (metadata->title->str, "") == 0)
-    {
-        disable_action (dialog, "add-title-tag");
-        tag_data->available = FALSE;
-    }
-    else
+    file_metadata = selection_metadata->data;
+    tag_info_keys = g_hash_table_get_keys (dialog->tag_info_table);
+    for (l = tag_info_keys; l != NULL; l = l->next)
     {
-        tag_data->set = FALSE;
-    }
+        /* Only metadata has to be handled here. */
+        tag_data = g_hash_table_lookup (dialog->tag_info_table, l->data);
+        is_metadata = tag_data->tag_constants.is_metadata;
+        if (!is_metadata)
+        {
+            continue;
+        }
 
-    tag_data = g_hash_table_lookup (dialog->tag_info_table, ALBUM_NAME);
-    if (metadata->album_name == NULL || g_strcmp0 (metadata->album_name->str, "") == 0)
-    {
-        disable_action (dialog, "add-album-name-tag");
-        tag_data->available = FALSE;
-    }
-    else
-    {
-        tag_data->set = FALSE;
+        metadata_type = tag_data->tag_constants.metadata_type;
+        if (file_metadata->metadata[metadata_type] == NULL ||
+            file_metadata->metadata[metadata_type]->len <= 0)
+        {
+            disable_action (dialog, tag_data->tag_constants.action_name);
+            tag_data->available = FALSE;
+        }
     }
 }
 
@@ -2359,7 +1819,7 @@ nautilus_batch_rename_dialog_initialize_actions (NautilusBatchRenameDialog *dial
                                     G_ACTION_GROUP (dialog->action_group));
 
     action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                         "add-original-file-name-tag");
+                                         metadata_tags_constants[ORIGINAL_FILE_NAME].action_name);
     g_simple_action_set_enabled (G_SIMPLE_ACTION (action), FALSE);
 
     check_metadata_for_selection (dialog, dialog->selection);
@@ -2373,8 +1833,8 @@ file_names_widget_on_activate (NautilusBatchRenameDialog *dialog)
 
 static gboolean
 remove_tag (NautilusBatchRenameDialog *dialog,
-            gchar                     *tag_name,
-            gchar                     *action_name,
+            const gchar               *tag_name,
+            const gchar               *action_name,
             gint                       keyval,
             gboolean                   is_modifier)
 {
@@ -2388,9 +1848,7 @@ remove_tag (NautilusBatchRenameDialog *dialog,
     delete_tag = FALSE;
 
     g_object_get (dialog->name_entry, "cursor-position", &cursor_position, NULL);
-
     tag_data = g_hash_table_lookup (dialog->tag_info_table, tag_name);
-
     entry_text = g_string_new (gtk_entry_get_text (GTK_ENTRY (dialog->name_entry)));
 
     if (!tag_data->set)
@@ -2466,8 +1924,8 @@ remove_tag (NautilusBatchRenameDialog *dialog,
 static GString *
 remove_tag_selection (NautilusBatchRenameDialog *dialog,
                       GString                   *old_entry_text,
-                      gchar                     *action_name,
-                      gchar                     *tag_name,
+                      const gchar               *action_name,
+                      const gchar               *tag_name,
                       gint                       start,
                       gint                       end)
 {
@@ -2506,7 +1964,7 @@ remove_tag_selection (NautilusBatchRenameDialog *dialog,
 
 static void
 update_tag_position (NautilusBatchRenameDialog *dialog,
-                     gchar                     *tag_name,
+                     const gchar               *tag_name,
                      GString                   *new_entry_text)
 {
     TagData *tag_data;
@@ -2534,17 +1992,17 @@ on_key_press_event (GtkWidget   *widget,
     gboolean entry_has_selection;
     gint start;
     gint end;
+    g_autoptr (GList) tag_info_keys = NULL;
+    GList *l;
     gboolean tag_removed = FALSE;
     TagData *tag_data;
+    const gchar *action_name;
     gint minimum_tag_position;
-    GAction *action;
 
     gdk_event = (GdkEvent *) event;
-
     dialog = NAUTILUS_BATCH_RENAME_DIALOG (user_data);
-
     keyval = event->keyval;
-
+    tag_info_keys = g_hash_table_get_keys (dialog->tag_info_table);
     entry_has_selection = (gtk_editable_get_selection_bounds (GTK_EDITABLE (dialog->name_entry),
                                                               &start,
                                                               &end));
@@ -2554,6 +2012,7 @@ on_key_press_event (GtkWidget   *widget,
         return GDK_EVENT_PROPAGATE;
     }
 
+
     if (entry_has_selection &&
         ((keyval == GDK_KEY_Delete || keyval == GDK_KEY_BackSpace) ||
          (!gdk_event->key.is_modifier &&
@@ -2569,317 +2028,45 @@ on_key_press_event (GtkWidget   *widget,
 
         minimum_tag_position = G_MAXINT;
 
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, ORIGINAL_FILE_NAME);
-        if (tag_data->set)
-        {
-            update_tag_position (dialog, ORIGINAL_FILE_NAME, old_entry_text);
-            new_entry_text = remove_tag_selection (dialog,
-                                                   old_entry_text,
-                                                   "add-original-file-name-tag",
-                                                   ORIGINAL_FILE_NAME,
-                                                   start,
-                                                   end);
-
-            if (!g_string_equal (new_entry_text, old_entry_text))
-            {
-                if (tag_data->position < minimum_tag_position)
-                {
-                    minimum_tag_position = tag_data->position;
-                }
-
-                tag_removed = TRUE;
-            }
-            g_string_free (old_entry_text, TRUE);
-            old_entry_text = new_entry_text;
-        }
-
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, CREATION_DATE);
-        if (tag_data->set)
-        {
-            update_tag_position (dialog, CREATION_DATE, old_entry_text);
-            new_entry_text = remove_tag_selection (dialog,
-                                                   old_entry_text,
-                                                   "add-creation-date-tag",
-                                                   CREATION_DATE,
-                                                   start,
-                                                   end);
-
-            if (!g_string_equal (new_entry_text, old_entry_text))
-            {
-                if (tag_data->position < minimum_tag_position)
-                {
-                    minimum_tag_position = tag_data->position;
-                }
-
-                tag_removed = TRUE;
-            }
-
-            g_string_free (old_entry_text, TRUE);
-            old_entry_text = new_entry_text;
-        }
-
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING);
-        if (tag_data->set)
-        {
-            update_tag_position (dialog, NUMBERING, old_entry_text);
-            new_entry_text = remove_tag_selection (dialog,
-                                                   old_entry_text,
-                                                   "add-numbering-tag-zero",
-                                                   NUMBERING,
-                                                   start,
-                                                   end);
-
-            action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                 "add-numbering-tag-one");
-            g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-
-            action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                 "add-numbering-tag-two");
-            g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-
-            if (!g_string_equal (new_entry_text, old_entry_text))
-            {
-                if (tag_data->position < minimum_tag_position)
-                {
-                    minimum_tag_position = tag_data->position;
-                }
-
-                tag_removed = TRUE;
-            }
-            g_string_free (old_entry_text, TRUE);
-            old_entry_text = new_entry_text;
-        }
-
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING0);
-        if (tag_data->set)
-        {
-            update_tag_position (dialog, NUMBERING0, old_entry_text);
-            new_entry_text = remove_tag_selection (dialog,
-                                                   old_entry_text,
-                                                   "add-numbering-tag-one",
-                                                   NUMBERING0,
-                                                   start,
-                                                   end);
-
-            action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                 "add-numbering-tag-zero");
-            g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-
-            action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                 "add-numbering-tag-two");
-            g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-
-            if (!g_string_equal (new_entry_text, old_entry_text))
-            {
-                if (tag_data->position < minimum_tag_position)
-                {
-                    minimum_tag_position = tag_data->position;
-                }
-
-                tag_removed = TRUE;
-            }
-            g_string_free (old_entry_text, TRUE);
-            old_entry_text = new_entry_text;
-        }
-
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, NUMBERING00);
-        if (tag_data->set)
-        {
-            update_tag_position (dialog, NUMBERING00, old_entry_text);
-            new_entry_text = remove_tag_selection (dialog,
-                                                   old_entry_text,
-                                                   "add-numbering-tag-two",
-                                                   NUMBERING0,
-                                                   start,
-                                                   end);
-
-            action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                 "add-numbering-tag-one");
-            g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-
-            action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                 "add-numbering-tag-zero");
-            g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-
-            if (!g_string_equal (new_entry_text, old_entry_text))
-            {
-                if (tag_data->position < minimum_tag_position)
-                {
-                    minimum_tag_position = tag_data->position;
-                }
-
-                tag_removed = TRUE;
-            }
-            g_string_free (old_entry_text, TRUE);
-            old_entry_text = new_entry_text;
-        }
-
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, CAMERA_MODEL);
-        if (tag_data->set)
-        {
-            update_tag_position (dialog, CAMERA_MODEL, old_entry_text);
-            new_entry_text = remove_tag_selection (dialog,
-                                                   old_entry_text,
-                                                   "add-equipment-tag",
-                                                   CAMERA_MODEL,
-                                                   start,
-                                                   end);
-
-            if (!g_string_equal (new_entry_text, old_entry_text))
-            {
-                if (tag_data->position < minimum_tag_position)
-                {
-                    minimum_tag_position = tag_data->position;
-                }
-
-                tag_removed = TRUE;
-            }
-            g_string_free (old_entry_text, TRUE);
-            old_entry_text = new_entry_text;
-        }
-
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, TRACK_NUMBER);
-        if (tag_data->set)
-        {
-            update_tag_position (dialog, TRACK_NUMBER, old_entry_text);
-            new_entry_text = remove_tag_selection (dialog,
-                                                   old_entry_text,
-                                                   "add-track-number-tag",
-                                                   TRACK_NUMBER,
-                                                   start,
-                                                   end);
-
-            if (!g_string_equal (new_entry_text, old_entry_text))
-            {
-                if (tag_data->position < minimum_tag_position)
-                {
-                    minimum_tag_position = tag_data->position;
-                }
-
-                tag_removed = TRUE;
-            }
-            g_string_free (old_entry_text, TRUE);
-            old_entry_text = new_entry_text;
-        }
-
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, SEASON_NUMBER);
-        if (tag_data->set)
+        for (l = tag_info_keys; l != NULL; l = l->next)
         {
-            update_tag_position (dialog, SEASON_NUMBER, old_entry_text);
-            new_entry_text = remove_tag_selection (dialog,
-                                                   old_entry_text,
-                                                   "add-season-tag",
-                                                   SEASON_NUMBER,
-                                                   start,
-                                                   end);
-
-            if (!g_string_equal (new_entry_text, old_entry_text))
-            {
-                if (tag_data->position < minimum_tag_position)
-                {
-                    minimum_tag_position = tag_data->position;
-                }
-
-                tag_removed = TRUE;
-            }
-            g_string_free (old_entry_text, TRUE);
-            old_entry_text = new_entry_text;
-        }
+            g_autofree gchar *tag_text_representation = NULL;
 
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, EPISODE_NUMBER);
-        if (tag_data->set)
-        {
-            update_tag_position (dialog, EPISODE_NUMBER, old_entry_text);
-            new_entry_text = remove_tag_selection (dialog,
-                                                   old_entry_text,
-                                                   "add-episode-tag",
-                                                   EPISODE_NUMBER,
-                                                   start,
-                                                   end);
-
-            if (!g_string_equal (new_entry_text, old_entry_text))
+            tag_data = g_hash_table_lookup (dialog->tag_info_table, l->data);
+            tag_text_representation = batch_rename_get_tag_text_representation (tag_data->tag_constants);
+            if (tag_data->set)
             {
-                if (tag_data->position < minimum_tag_position)
+                update_tag_position (dialog, tag_text_representation, old_entry_text);
+                new_entry_text = remove_tag_selection (dialog,
+                                                       old_entry_text,
+                                                       tag_data->tag_constants.action_name,
+                                                       tag_text_representation,
+                                                       start,
+                                                       end);
+
+                if (!g_string_equal (new_entry_text, old_entry_text))
                 {
-                    minimum_tag_position = tag_data->position;
-                }
+                    if (tag_data->position < minimum_tag_position)
+                    {
+                        minimum_tag_position = tag_data->position;
+                    }
 
-                tag_removed = TRUE;
-            }
-            g_string_free (old_entry_text, TRUE);
-            old_entry_text = new_entry_text;
-        }
-
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, ARTIST_NAME);
-        if (tag_data->set)
-        {
-            update_tag_position (dialog, ARTIST_NAME, old_entry_text);
-            new_entry_text = remove_tag_selection (dialog,
-                                                   old_entry_text,
-                                                   "add-artist-name-tag",
-                                                   ARTIST_NAME,
-                                                   start,
-                                                   end);
-
-            if (!g_string_equal (new_entry_text, old_entry_text))
-            {
-                if (tag_data->position < minimum_tag_position)
-                {
-                    minimum_tag_position = tag_data->position;
+                    tag_removed = TRUE;
                 }
-
-                tag_removed = TRUE;
+                g_string_free (old_entry_text, TRUE);
+                old_entry_text = new_entry_text;
             }
-            g_string_free (old_entry_text, TRUE);
-            old_entry_text = new_entry_text;
         }
 
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, TITLE);
-        if (tag_data->set)
+        /* If we removed the numbering tag, we want to enable all numbering actions */
+        if (!numbering_tag_is_some_added (dialog))
         {
-            update_tag_position (dialog, TITLE, old_entry_text);
-            new_entry_text = remove_tag_selection (dialog,
-                                                   old_entry_text,
-                                                   "add-title-tag",
-                                                   TITLE,
-                                                   start,
-                                                   end);
-
-            if (!g_string_equal (new_entry_text, old_entry_text))
-            {
-                if (tag_data->position < minimum_tag_position)
-                {
-                    minimum_tag_position = tag_data->position;
-                }
-
-                tag_removed = TRUE;
-            }
-            g_string_free (old_entry_text, TRUE);
-            old_entry_text = new_entry_text;
-        }
+            guint i;
 
-        tag_data = g_hash_table_lookup (dialog->tag_info_table, ALBUM_NAME);
-        if (tag_data->set)
-        {
-            update_tag_position (dialog, ALBUM_NAME, old_entry_text);
-            new_entry_text = remove_tag_selection (dialog,
-                                                   old_entry_text,
-                                                   "add-album-name-tag",
-                                                   ALBUM_NAME,
-                                                   start,
-                                                   end);
-
-            if (!g_string_equal (new_entry_text, old_entry_text))
+            for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++)
             {
-                if (tag_data->position < minimum_tag_position)
-                {
-                    minimum_tag_position = tag_data->position;
-                }
-
-                tag_removed = TRUE;
+                enable_action (dialog, numbering_tags_constants[i].action_name);
             }
-            g_string_free (old_entry_text, TRUE);
-            old_entry_text = new_entry_text;
         }
 
         if (minimum_tag_position != G_MAXINT)
@@ -2894,148 +2081,40 @@ on_key_press_event (GtkWidget   *widget,
 
             g_string_free (new_entry_text, TRUE);
         }
-
-        if ((keyval == GDK_KEY_Delete || keyval == GDK_KEY_BackSpace) &&
-            tag_removed)
-        {
-            return GDK_EVENT_STOP;
-        }
     }
     else
     {
-        if (remove_tag (dialog,
-                        ORIGINAL_FILE_NAME,
-                        "add-original-file-name-tag",
-                        keyval,
-                        gdk_event->key.is_modifier))
-        {
-            tag_removed = TRUE;
-        }
-
-        if (!tag_removed && remove_tag (dialog,
-                                        CREATION_DATE,
-                                        "add-creation-date-tag",
-                                        keyval,
-                                        gdk_event->key.is_modifier))
-        {
-            tag_removed = TRUE;
-        }
-
-        if (!tag_removed && remove_tag (dialog,
-                                        NUMBERING,
-                                        "add-numbering-tag-zero",
-                                        keyval,
-                                        gdk_event->key.is_modifier))
+        for (l = tag_info_keys; l != NULL; l = l->next)
         {
-            tag_removed = TRUE;
-            action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                 "add-numbering-tag-one");
-            g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-
-            action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                 "add-numbering-tag-two");
-            g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-        }
-
-        if (!tag_removed && remove_tag (dialog,
-                                        NUMBERING0,
-                                        "add-numbering-tag-one",
-                                        keyval,
-                                        gdk_event->key.is_modifier))
-        {
-            tag_removed = TRUE;
-            action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                 "add-numbering-tag-zero");
-            g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-
-            action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                 "add-numbering-tag-two");
-            g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-        }
-
-        if (!tag_removed && remove_tag (dialog,
-                                        NUMBERING00,
-                                        "add-numbering-tag-two",
-                                        keyval,
-                                        gdk_event->key.is_modifier))
-        {
-            tag_removed = TRUE;
-            action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                 "add-numbering-tag-one");
-            g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-
-            action = g_action_map_lookup_action (G_ACTION_MAP (dialog->action_group),
-                                                 "add-numbering-tag-zero");
-            g_simple_action_set_enabled (G_SIMPLE_ACTION (action), TRUE);
-        }
-
-        if (!tag_removed && remove_tag (dialog,
-                                        CAMERA_MODEL,
-                                        "add-equipment-tag",
-                                        keyval,
-                                        gdk_event->key.is_modifier))
-        {
-            tag_removed = TRUE;
-        }
-
-        if (!tag_removed && remove_tag (dialog,
-                                        SEASON_NUMBER,
-                                        "add-season-tag",
-                                        keyval,
-                                        gdk_event->key.is_modifier))
-        {
-            tag_removed = TRUE;
-        }
-
-        if (!tag_removed && remove_tag (dialog,
-                                        EPISODE_NUMBER,
-                                        "add-episode-tag",
-                                        keyval,
-                                        gdk_event->key.is_modifier))
-        {
-            tag_removed = TRUE;
-        }
+            g_autofree gchar *tag_text_representation = NULL;
 
-        if (!tag_removed && remove_tag (dialog,
-                                        TRACK_NUMBER,
-                                        "add-track-number-tag",
-                                        keyval,
-                                        gdk_event->key.is_modifier))
-        {
-            tag_removed = TRUE;
-        }
+            tag_data = g_hash_table_lookup (dialog->tag_info_table, l->data);
+            action_name = tag_data->tag_constants.action_name;
+            tag_text_representation = batch_rename_get_tag_text_representation (tag_data->tag_constants);
+            if (remove_tag (dialog, tag_text_representation, action_name,
+                            keyval, gdk_event->key.is_modifier))
+            {
+                tag_removed = TRUE;
 
-        if (!tag_removed && remove_tag (dialog,
-                                        ARTIST_NAME,
-                                        "add-artist-name-tag",
-                                        keyval,
-                                        gdk_event->key.is_modifier))
-        {
-            tag_removed = TRUE;
+                break;
+            }
         }
 
-        if (!tag_removed && remove_tag (dialog,
-                                        TITLE,
-                                        "add-title-tag",
-                                        keyval,
-                                        gdk_event->key.is_modifier))
+        /* If we removed the numbering tag, we want to enable all numbering actions */
+        if (!numbering_tag_is_some_added (dialog))
         {
-            tag_removed = TRUE;
-        }
+            guint i;
 
-        if (!tag_removed && remove_tag (dialog,
-                                        ALBUM_NAME,
-                                        "add-album-name-tag",
-                                        keyval,
-                                        gdk_event->key.is_modifier))
-        {
-            tag_removed = TRUE;
+            for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++)
+            {
+                enable_action (dialog, numbering_tags_constants[i].action_name);
+            }
         }
+    }
 
-        if (tag_removed && (keyval == GDK_KEY_Delete || keyval == GDK_KEY_BackSpace))
-        {
-            return GDK_EVENT_STOP;
-        }
+    if ((keyval == GDK_KEY_Delete || keyval == GDK_KEY_BackSpace) && tag_removed)
+    {
+        return GDK_EVENT_STOP;
     }
 
     return GDK_EVENT_PROPAGATE;
@@ -3046,6 +2125,7 @@ nautilus_batch_rename_dialog_finalize (GObject *object)
 {
     NautilusBatchRenameDialog *dialog;
     GList *l;
+    guint i;
 
     dialog = NAUTILUS_BATCH_RENAME_DIALOG (object);
 
@@ -3064,42 +2144,18 @@ nautilus_batch_rename_dialog_finalize (GObject *object)
 
     for (l = dialog->selection_metadata; l != NULL; l = l->next)
     {
-        FileMetadata *metadata;
-
-        metadata = l->data;
+        FileMetadata *file_metadata;
 
-        if (metadata->file_name != NULL)
+        file_metadata = l->data;
+        for (i = 0; i < G_N_ELEMENTS (file_metadata->metadata); i++)
         {
-            g_string_free (metadata->file_name, TRUE);
-        }
-        if (metadata->creation_date != NULL)
-        {
-            g_string_free (metadata->creation_date, TRUE);
-        }
-        if (metadata->equipment != NULL)
-        {
-            g_string_free (metadata->equipment, TRUE);
-        }
-        if (metadata->season != NULL)
-        {
-            g_string_free (metadata->season, TRUE);
-        }
-        if (metadata->episode_number != NULL)
-        {
-            g_string_free (metadata->episode_number, TRUE);
-        }
-        if (metadata->track_number != NULL)
-        {
-            g_string_free (metadata->track_number, TRUE);
-        }
-        if (metadata->artist_name != NULL)
-        {
-            g_string_free (metadata->artist_name, TRUE);
-        }
-        if (metadata->album_name != NULL)
-        {
-            g_string_free (metadata->album_name, TRUE);
+            if (file_metadata->metadata[i])
+            {
+                g_string_free (file_metadata->metadata[i], TRUE);
+            }
         }
+
+        g_free (file_metadata);
     }
 
     if (dialog->create_date != NULL)
@@ -3226,6 +2282,7 @@ static void
 nautilus_batch_rename_dialog_init (NautilusBatchRenameDialog *self)
 {
     TagData *tag_data;
+    guint i;
 
     gtk_widget_init_template (GTK_WIDGET (self));
 
@@ -3267,80 +2324,42 @@ nautilus_batch_rename_dialog_init (NautilusBatchRenameDialog *self)
                                                   g_str_equal,
                                                   (GDestroyNotify) g_free,
                                                   (GDestroyNotify) g_free);
-    tag_data = g_new (TagData, 1);
-    tag_data->available = TRUE;
-    tag_data->set = TRUE;
-    tag_data->position = 0;
-    g_hash_table_insert (self->tag_info_table, g_strdup (ORIGINAL_FILE_NAME), tag_data);
 
-    tag_data = g_new (TagData, 1);
-    tag_data->available = TRUE;
-    tag_data->set = FALSE;
-    tag_data->position = 0;
-    g_hash_table_insert (self->tag_info_table, g_strdup (NUMBERING), tag_data);
+    for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++)
+    {
+        g_autofree gchar *tag_text_representation = NULL;
 
-    tag_data = g_new (TagData, 1);
-    tag_data->available = TRUE;
-    tag_data->set = FALSE;
-    tag_data->position = 0;
-    g_hash_table_insert (self->tag_info_table, g_strdup (NUMBERING0), tag_data);
+        tag_text_representation = batch_rename_get_tag_text_representation (numbering_tags_constants[i]);
+        tag_data = g_new (TagData, 1);
+        tag_data->available = TRUE;
+        tag_data->set = FALSE;
+        tag_data->position = 0;
+        tag_data->tag_constants = numbering_tags_constants[i];
+        g_hash_table_insert (self->tag_info_table, g_strdup (tag_text_representation), tag_data);
+    }
 
-    tag_data = g_new (TagData, 1);
-    tag_data->available = TRUE;
-    tag_data->set = FALSE;
-    tag_data->position = 0;
-    g_hash_table_insert (self->tag_info_table, g_strdup (NUMBERING00), tag_data);
-
-    tag_data = g_new (TagData, 1);
-    tag_data->available = FALSE;
-    tag_data->set = FALSE;
-    tag_data->position = 0;
-    g_hash_table_insert (self->tag_info_table, g_strdup (CREATION_DATE), tag_data);
-
-    tag_data = g_new (TagData, 1);
-    tag_data->available = FALSE;
-    tag_data->set = FALSE;
-    tag_data->position = 0;
-    g_hash_table_insert (self->tag_info_table, g_strdup (CAMERA_MODEL), tag_data);
-
-    tag_data = g_new (TagData, 1);
-    tag_data->available = FALSE;
-    tag_data->set = FALSE;
-    tag_data->position = 0;
-    g_hash_table_insert (self->tag_info_table, g_strdup (SEASON_NUMBER), tag_data);
-
-    tag_data = g_new (TagData, 1);
-    tag_data->available = FALSE;
-    tag_data->set = FALSE;
-    tag_data->position = 0;
-    g_hash_table_insert (self->tag_info_table, g_strdup (EPISODE_NUMBER), tag_data);
-
-    tag_data = g_new (TagData, 1);
-    tag_data->available = FALSE;
-    tag_data->set = FALSE;
-    tag_data->position = 0;
-    g_hash_table_insert (self->tag_info_table, g_strdup (TRACK_NUMBER), tag_data);
-
-    tag_data = g_new (TagData, 1);
-    tag_data->available = FALSE;
-    tag_data->set = FALSE;
-    tag_data->position = 0;
-    g_hash_table_insert (self->tag_info_table, g_strdup (ARTIST_NAME), tag_data);
-
-    tag_data = g_new (TagData, 1);
-    tag_data->available = FALSE;
-    tag_data->set = FALSE;
-    tag_data->position = 0;
-    g_hash_table_insert (self->tag_info_table, g_strdup (TITLE), tag_data);
-
-    tag_data = g_new (TagData, 1);
-    tag_data->available = FALSE;
-    tag_data->set = FALSE;
-    tag_data->position = 0;
-    g_hash_table_insert (self->tag_info_table, g_strdup (ALBUM_NAME), tag_data);
-
-    gtk_entry_set_text (GTK_ENTRY (self->name_entry), ORIGINAL_FILE_NAME);
-    self->name_entry_characters = g_utf8_strlen (ORIGINAL_FILE_NAME, -1);
+    for (i = 0; i < G_N_ELEMENTS (metadata_tags_constants); i++)
+    {
+        gboolean is_original_name;
+        g_autofree gchar *tag_text_representation = NULL;
+
+        /* Only the original name is available and set at the start */
+        is_original_name = metadata_tags_constants[i].metadata_type == ORIGINAL_FILE_NAME;
+        tag_text_representation = batch_rename_get_tag_text_representation (metadata_tags_constants[i]);
+
+        tag_data = g_new (TagData, 1);
+        tag_data->available = is_original_name;
+        tag_data->set = is_original_name;
+        tag_data->position = 0;
+        tag_data->tag_constants = metadata_tags_constants[i];
+        g_hash_table_insert (self->tag_info_table, g_strdup (tag_text_representation), tag_data);
+
+        if (is_original_name)
+        {
+            gtk_entry_set_text (GTK_ENTRY (self->name_entry), tag_text_representation);
+            self->name_entry_characters = g_utf8_strlen (tag_text_representation, -1);
+        }
+    }
 
     self->row_height = -1;
 
diff --git a/src/nautilus-batch-rename-dialog.h b/src/nautilus-batch-rename-dialog.h
index e5084c3..41863d4 100644
--- a/src/nautilus-batch-rename-dialog.h
+++ b/src/nautilus-batch-rename-dialog.h
@@ -21,23 +21,33 @@
 
 #include <glib.h>
 #include <glib/gprintf.h>
+#include <glib/gi18n.h>
 #include <gtk/gtk.h>
 #include "nautilus-files-view.h"
 
 G_BEGIN_DECLS
 
-#define ORIGINAL_FILE_NAME "[Original file name]"
-#define NUMBERING "[1, 2, 3]"
-#define NUMBERING0 "[01, 02, 03]"
-#define NUMBERING00 "[001, 002, 003]"
-#define CAMERA_MODEL "[Camera model]"
-#define CREATION_DATE "[Creation date]"
-#define SEASON_NUMBER "[Season number]"
-#define EPISODE_NUMBER "[Episode number]"
-#define TRACK_NUMBER "[Track number]"
-#define ARTIST_NAME "[Artist name]"
-#define TITLE "[Title]"
-#define ALBUM_NAME "[Album name]"
+typedef enum
+{
+    EQUIPMENT,
+    CREATION_DATE,
+    SEASON_NUMBER,
+    EPISODE_NUMBER,
+    TRACK_NUMBER,
+    ARTIST_NAME,
+    TITLE,
+    ALBUM_NAME,
+    ORIGINAL_FILE_NAME,
+    METADATA_INVALID,
+} MetadataType;
+
+typedef enum
+{
+    NUMBERING_NO_ZERO_PAD,
+    NUMBERING_ONE_ZERO_PAD,
+    NUMBERING_TWO_ZERO_PAD,
+    NUMBERING_INVALID,
+} NumberingType;
 
 typedef enum {
     NAUTILUS_BATCH_RENAME_DIALOG_APPEND = 0,
@@ -57,26 +67,155 @@ typedef enum {
 
 typedef struct
 {
+    const gchar *action_name;
+    const gchar *label;
+    MetadataType metadata_type;
+    NumberingType numbering_type;
+    gboolean is_metadata;
+} TagConstants;
+
+typedef struct
+{
+    const gchar *action_target_name;
+    const gchar *label;
+    const SortMode sort_mode;
+} SortConstants;
+
+static const SortConstants sorts_constants[] =
+{
+    {
+        "name-ascending",
+        N_("Original Name (Ascending)"),
+        ORIGINAL_ASCENDING,
+    },
+    {
+        "name-descending",
+        N_("Original Name (Descending)"),
+        ORIGINAL_DESCENDING,
+    },
+    {
+        "first-modified",
+        N_("First Modified"),
+        FIRST_MODIFIED,
+    },
+    {
+        "last-modified",
+        N_("Last Modified"),
+        LAST_MODIFIED,
+    },
+    {
+        "first-created",
+        N_("First Created"),
+        FIRST_CREATED,
+    },
+    {
+        "last-created",
+        N_("Last Created"),
+        LAST_CREATED,
+    },
+};
+
+static const TagConstants metadata_tags_constants[] =
+{
+    {
+        "add-equipment-tag",
+        N_("Camera model"),
+        EQUIPMENT,
+        NUMBERING_INVALID,
+        TRUE,
+    },
+    {
+        "add-creation-date-tag",
+        N_("Creation date"),
+        CREATION_DATE,
+        NUMBERING_INVALID,
+        TRUE,
+    },
+    {
+        "add-season-number-tag",
+        N_("Season number"),
+        SEASON_NUMBER,
+        NUMBERING_INVALID,
+        TRUE,
+    },
+    {
+        "add-episode-number-tag",
+        N_("Episode number"),
+        EPISODE_NUMBER,
+        NUMBERING_INVALID,
+        TRUE,
+    },
+    {
+        "add-track-number-tag",
+        N_("Track number"),
+        TRACK_NUMBER,
+        NUMBERING_INVALID,
+        TRUE,
+    },
+    {
+        "add-artist-name-tag",
+        N_("Artist name"),
+        ARTIST_NAME,
+        NUMBERING_INVALID,
+        TRUE,
+    },
+    {
+        "add-title-tag",
+        N_("Title"),
+        TITLE,
+        NUMBERING_INVALID,
+        TRUE,
+    },
+    {
+        "add-album-name-tag",
+        N_("Album name"),
+        ALBUM_NAME,
+        NUMBERING_INVALID,
+        TRUE,
+    },
+    {
+        "add-original-file-name-tag",
+        N_("Original file name"),
+        ORIGINAL_FILE_NAME,
+        NUMBERING_INVALID,
+        TRUE,
+    },
+};
+
+static const TagConstants numbering_tags_constants[] =
+{
+    {
+        "add-numbering-no-zero-pad-tag",
+        N_("1, 2, 3"),
+        METADATA_INVALID,
+        NUMBERING_NO_ZERO_PAD,
+        FALSE,
+    },
+    {
+        "add-numbering-one-zero-pad-tag",
+        N_("01, 02, 03"),
+        METADATA_INVALID,
+        NUMBERING_ONE_ZERO_PAD,
+        FALSE,
+    },
+    {
+        "add-numbering-two-zero-pad-tag",
+        N_("001, 002, 003"),
+        METADATA_INVALID,
+        NUMBERING_TWO_ZERO_PAD,
+        FALSE,
+    },
+};
+
+typedef struct
+{
     gchar *name;
     gint index;
 } ConflictData;
 
 typedef struct {
-        GString *file_name;
-
-        /* Photo */
-        GString *creation_date;
-        GString *equipment;
-
-        /* Video */
-        GString *season;
-        GString *episode_number;
-
-        /* Music */
-        GString *track_number;
-        GString *artist_name;
-        GString *title;
-        GString *album_name;
+    GString *file_name;
+    GString *metadata [G_N_ELEMENTS (metadata_tags_constants)];
 } FileMetadata;
 
 #define NAUTILUS_TYPE_BATCH_RENAME_DIALOG (nautilus_batch_rename_dialog_get_type())
diff --git a/src/nautilus-batch-rename-utilities.c b/src/nautilus-batch-rename-utilities.c
index c8826b3..3a855ac 100644
--- a/src/nautilus-batch-rename-utilities.c
+++ b/src/nautilus-batch-rename-utilities.c
@@ -35,18 +35,11 @@ typedef struct
 typedef struct
 {
     NautilusBatchRenameDialog *dialog;
-    GHashTable *hash_table;
+    GHashTable *date_order_hash_table;
 
     GList *selection_metadata;
 
-    gboolean have_creation_date;
-    gboolean have_equipment;
-    gboolean have_season;
-    gboolean have_episode_number;
-    gboolean have_track_number;
-    gboolean have_artist_name;
-    gboolean have_title;
-    gboolean have_album_name;
+    gboolean has_metadata[G_N_ELEMENTS (metadata_tags_constants)];
 } QueryData;
 
 enum
@@ -90,6 +83,12 @@ conflict_data_free (gpointer mem)
     g_free (conflict_data);
 }
 
+gchar*
+batch_rename_get_tag_text_representation (TagConstants tag_constants)
+{
+    return g_strdup_printf ("[%s]", gettext (tag_constants.label));
+}
+
 static GString *
 batch_rename_replace (gchar *string,
                       gchar *substring,
@@ -197,77 +196,30 @@ batch_rename_replace_label_text (gchar       *label,
 }
 
 static gchar *
-get_metadata (GList *selection_metadata,
-              gchar *file_name,
-              gchar *metadata)
+get_metadata (GList        *selection_metadata,
+              gchar        *file_name,
+              MetadataType  metadata_type)
 {
     GList *l;
     FileMetadata *file_metadata;
+    gchar *metadata = NULL;
 
     for (l = selection_metadata; l != NULL; l = l->next)
     {
         file_metadata = l->data;
         if (g_strcmp0 (file_name, file_metadata->file_name->str) == 0)
         {
-            if (g_strcmp0 (metadata, "creation_date") == 0 &&
-                file_metadata->creation_date != NULL &&
-                file_metadata->creation_date->len != 0)
-            {
-                return file_metadata->creation_date->str;
-            }
-
-            if (g_strcmp0 (metadata, "equipment") == 0 &&
-                file_metadata->equipment != NULL &&
-                file_metadata->equipment->len != 0)
-            {
-                return file_metadata->equipment->str;
-            }
-
-            if (g_strcmp0 (metadata, "season") == 0 &&
-                file_metadata->season != NULL &&
-                file_metadata->season->len != 0)
-            {
-                return file_metadata->season->str;
-            }
-
-            if (g_strcmp0 (metadata, "episode_number") == 0 &&
-                file_metadata->episode_number != NULL &&
-                file_metadata->episode_number->len != 0)
-            {
-                return file_metadata->episode_number->str;
-            }
-
-            if (g_strcmp0 (metadata, "track_number") == 0 &&
-                file_metadata->track_number != NULL &&
-                file_metadata->track_number->len != 0)
+            if (file_metadata->metadata[metadata_type] &&
+                file_metadata->metadata[metadata_type]->len > 0)
             {
-                return file_metadata->track_number->str;
+                metadata = file_metadata->metadata[metadata_type]->str;
             }
 
-            if (g_strcmp0 (metadata, "artist_name") == 0 &&
-                file_metadata->artist_name != NULL &&
-                file_metadata->artist_name->len != 0)
-            {
-                return file_metadata->artist_name->str;
-            }
-
-            if (g_strcmp0 (metadata, "title") == 0 &&
-                file_metadata->title != NULL &&
-                file_metadata->title->len != 0)
-            {
-                return file_metadata->title->str;
-            }
-
-            if (g_strcmp0 (metadata, "album_name") == 0 &&
-                file_metadata->album_name != NULL &&
-                file_metadata->album_name->len != 0)
-            {
-                return file_metadata->album_name->str;
-            }
+            break;
         }
     }
 
-    return NULL;
+    return metadata;
 }
 
 static GString *
@@ -277,11 +229,13 @@ batch_rename_format (NautilusFile *file,
                      gint          count)
 {
     GList *l;
-    GString *tag;
+    GString *tag_string;
     GString *new_name;
     gboolean added_tag;
+    MetadataType metadata_type;
     g_autofree gchar *file_name = NULL;
     g_autofree gchar *extension = NULL;
+    gint i;
     gchar *metadata;
     gchar *base_name;
 
@@ -292,130 +246,99 @@ batch_rename_format (NautilusFile *file,
 
     for (l = text_chunks; l != NULL; l = l->next)
     {
-        tag = l->data;
         added_tag = FALSE;
+        tag_string = l->data;
 
-        if (!added_tag && g_strcmp0 (tag->str, ORIGINAL_FILE_NAME) == 0)
+        for (i = 0; i < G_N_ELEMENTS (numbering_tags_constants); i++)
         {
-            base_name = eel_filename_strip_extension (file_name);
-
-            new_name = g_string_append (new_name, base_name);
-
-            added_tag = TRUE;
-            g_free (base_name);
-        }
-
-        if (!added_tag && g_strcmp0 (tag->str, NUMBERING) == 0)
-        {
-            g_string_append_printf (new_name, "%d", count);
-            added_tag = TRUE;
-        }
+            g_autofree gchar *tag_text_representation = NULL;
 
-        if (!added_tag && g_strcmp0 (tag->str, NUMBERING0) == 0)
-        {
-            g_string_append_printf (new_name, "%02d", count);
-
-            added_tag = TRUE;
-        }
-
-        if (!added_tag && g_strcmp0 (tag->str, NUMBERING00) == 0)
-        {
-            g_string_append_printf (new_name, "%03d", count);
-
-            added_tag = TRUE;
-        }
-
-        if (!added_tag && g_strcmp0 (tag->str, CAMERA_MODEL) == 0)
-        {
-            metadata = get_metadata (selection_metadata, file_name, "equipment");
-
-            if (metadata != NULL)
+            tag_text_representation = batch_rename_get_tag_text_representation (numbering_tags_constants[i]);
+            if (g_strcmp0 (tag_string->str, tag_text_representation) == 0)
             {
-                new_name = g_string_append (new_name, metadata);
-                added_tag = TRUE;
-            }
-        }
-
-        if (!added_tag && g_strcmp0 (tag->str, CREATION_DATE) == 0)
-        {
-            metadata = get_metadata (selection_metadata, file_name, "creation_date");
-
-            if (metadata != NULL)
-            {
-                new_name = g_string_append (new_name, metadata);
-                added_tag = TRUE;
-            }
-        }
-
-        if (!added_tag && g_strcmp0 (tag->str, SEASON_NUMBER) == 0)
-        {
-            metadata = get_metadata (selection_metadata, file_name, "season");
-
-            if (metadata != NULL)
-            {
-                new_name = g_string_append (new_name, metadata);
-                added_tag = TRUE;
-            }
-        }
-
-        if (!added_tag && g_strcmp0 (tag->str, EPISODE_NUMBER) == 0)
-        {
-            metadata = get_metadata (selection_metadata, file_name, "episode_number");
+                switch (numbering_tags_constants[i].numbering_type)
+                {
+                    case NUMBERING_NO_ZERO_PAD:
+                    {
+                        g_string_append_printf (new_name, "%d", count);
+                    }
+                    break;
+                    case NUMBERING_ONE_ZERO_PAD:
+                    {
+                        g_string_append_printf (new_name, "%02d", count);
+                    }
+                    break;
+                    case NUMBERING_TWO_ZERO_PAD:
+                    {
+                        g_string_append_printf (new_name, "%03d", count);
+                    }
+                    break;
+                    default:
+                    {
+                         g_warn_if_reached ();
+                    }
+                    break;
+                }
 
-            if (metadata != NULL)
-            {
-                new_name = g_string_append (new_name, metadata);
                 added_tag = TRUE;
+                break;
             }
         }
 
-        if (!added_tag && g_strcmp0 (tag->str, TRACK_NUMBER) == 0)
+        if (added_tag)
         {
-            metadata = get_metadata (selection_metadata, file_name, "track_number");
-
-            if (metadata != NULL)
-            {
-                g_string_append_printf (new_name, "%02d", atoi (metadata));
-                added_tag = TRUE;
-            }
+            continue;
         }
 
-        if (!added_tag && g_strcmp0 (tag->str, ARTIST_NAME) == 0)
+        for (i = 0; i < G_N_ELEMENTS (metadata_tags_constants); i++)
         {
-            metadata = get_metadata (selection_metadata, file_name, "artist_name");
+            g_autofree gchar *tag_text_representation = NULL;
 
-            if (metadata != NULL)
+            tag_text_representation = batch_rename_get_tag_text_representation (metadata_tags_constants[i]);
+            if (g_strcmp0 (tag_string->str, tag_text_representation) == 0)
             {
-                new_name = g_string_append (new_name, metadata);
-                added_tag = TRUE;
-            }
-        }
+                metadata_type = metadata_tags_constants[i].metadata_type;
+                metadata = get_metadata (selection_metadata, file_name, metadata_type);
 
-        if (!added_tag && g_strcmp0 (tag->str, TITLE) == 0)
-        {
-            metadata = get_metadata (selection_metadata, file_name, "title");
-
-            if (metadata != NULL)
-            {
-                new_name = g_string_append (new_name, metadata);
-                added_tag = TRUE;
-            }
-        }
+                /* TODO: This is a hack, we should provide a cancellable for checking
+                 * the metadata, and if that is happening don't enter here. We can
+                 * special case original file name upper in the call stack */
+                if (!metadata && metadata_type != ORIGINAL_FILE_NAME)
+                {
+                    g_warning ("Metadata not present in one file, it shouldn't have been added. File name: 
%s, Metadata: %s",
+                               file_name, metadata_tags_constants[i].label);
+                    continue;
+                }
 
-        if (!added_tag && g_strcmp0 (tag->str, ALBUM_NAME) == 0)
-        {
-            metadata = get_metadata (selection_metadata, file_name, "album_name");
+                switch (metadata_type)
+                {
+                    case ORIGINAL_FILE_NAME:
+                    {
+                        base_name = eel_filename_strip_extension (file_name);
+
+                        new_name = g_string_append (new_name, base_name);
+                    }
+                    break;
+                    case TRACK_NUMBER:
+                    {
+                        g_string_append_printf (new_name, "%02d", atoi (metadata));
+                    }
+                    break;
+                    default:
+                    {
+                        new_name = g_string_append (new_name, metadata);
+                    }
+                    break;
+                }
 
-            if (metadata != NULL)
-            {
-                new_name = g_string_append (new_name, metadata);
                 added_tag = TRUE;
+                break;
             }
         }
 
         if (!added_tag)
         {
-            new_name = g_string_append (new_name, tag->str);
+            new_name = g_string_append (new_name, tag_string->str);
         }
     }
 
@@ -458,9 +381,8 @@ batch_rename_dialog_get_new_names_list (NautilusBatchRenameDialogMode  mode,
     {
         file = NAUTILUS_FILE (l->data);
 
-        file_name = g_string_new ("");
         name = nautilus_file_get_name (file);
-        g_string_append (file_name, name);
+        file_name = g_string_new (name);
 
         /* get the new name here and add it to the list*/
         if (mode == NAUTILUS_BATCH_RENAME_DIALOG_FORMAT)
@@ -705,20 +627,59 @@ cursor_next (QueryData           *query_data,
 }
 
 static void
+remove_metadata (QueryData    *query_data,
+                 MetadataType  metadata_type)
+{
+    GList *l;
+    FileMetadata *metadata_to_delete;
+
+    for (l = query_data->selection_metadata; l != NULL; l = l->next)
+    {
+        metadata_to_delete = l->data;
+        if (metadata_to_delete->metadata[metadata_type])
+        {
+            g_string_free (metadata_to_delete->metadata[metadata_type], TRUE);
+            metadata_to_delete->metadata[metadata_type] = NULL;
+        }
+    }
+
+    query_data->has_metadata[metadata_type] = FALSE;
+}
+
+static GString*
+format_date_time (GDateTime *date_time)
+{
+    g_autofree gchar *date = NULL;
+    GString *formated_date;
+
+    date = g_date_time_format (date_time, "%x");
+    if (strstr (date, "/") != NULL)
+    {
+        formated_date = batch_rename_replace (date, "/", "-");
+    }
+    else
+    {
+        formated_date = g_string_new (date);
+    }
+
+    return formated_date;
+}
+
+static void
 on_cursor_callback (GObject      *object,
                     GAsyncResult *result,
                     gpointer      user_data)
 {
-    GHashTable *hash_table;
     TrackerSparqlCursor *cursor;
     gboolean success;
     QueryData *query_data;
+    MetadataType metadata_type;
     GError *error;
     GList *l;
-    FileMetadata *metadata;
-    FileMetadata *metadata_clear;
-    GDateTime *datetime;
-    gchar *date;
+    FileMetadata *file_metadata;
+    GDateTime *date_time;
+    guint i;
+    const gchar *current_metadata;
     const gchar *file_name;
     const gchar *creation_date;
     const gchar *year;
@@ -736,11 +697,10 @@ on_cursor_callback (GObject      *object,
     const gchar *album_name;
 
     error = NULL;
-    metadata = NULL;
+    file_metadata = NULL;
 
     cursor = TRACKER_SPARQL_CURSOR (object);
     query_data = user_data;
-    hash_table = query_data->hash_table;
 
     success = tracker_sparql_cursor_next_finish (cursor, result, &error);
     if (!success)
@@ -754,7 +714,7 @@ on_cursor_callback (GObject      *object,
         g_clear_object (&cursor);
 
         nautilus_batch_rename_dialog_query_finished (query_data->dialog,
-                                                     query_data->hash_table,
+                                                     query_data->date_order_hash_table,
                                                      query_data->selection_metadata);
 
         return;
@@ -776,245 +736,115 @@ on_cursor_callback (GObject      *object,
     title = tracker_sparql_cursor_get_string (cursor, TITLE_INDEX, NULL);
     album_name = tracker_sparql_cursor_get_string (cursor, ALBUM_NAME_INDEX, NULL);
 
-    /* creation date used for sorting criteria */
-    if (creation_date == NULL)
-    {
-        if (hash_table != NULL)
-        {
-            g_hash_table_destroy (hash_table);
-        }
-
-        query_data->hash_table = NULL;
-        query_data->have_creation_date = FALSE;
-    }
-    else
-    {
-        if (query_data->have_creation_date)
-        {
-            g_hash_table_insert (hash_table,
-                                 g_strdup (tracker_sparql_cursor_get_string (cursor, 0, NULL)),
-                                 GINT_TO_POINTER (g_hash_table_size (hash_table)));
-        }
-    }
+    /* Search for the metadata object corresponding to the file name */
     file_name = tracker_sparql_cursor_get_string (cursor, FILE_NAME_INDEX, NULL);
     for (l = query_data->selection_metadata; l != NULL; l = l->next)
     {
-        metadata = l->data;
+        file_metadata = l->data;
 
-        if (g_strcmp0 (file_name, metadata->file_name->str) == 0)
+        if (g_strcmp0 (file_name, file_metadata->file_name->str) == 0)
         {
             break;
         }
     }
 
-    /* Metadata to be used in file name
-     * creation date */
-    if (query_data->have_creation_date)
+    /* Set metadata when available, and delete for the whole selection when not */
+    for (i = 0; i < G_N_ELEMENTS (metadata_tags_constants); i++)
     {
-        if (!creation_date)
+        if (query_data->has_metadata[i])
         {
-            query_data->have_creation_date = FALSE;
-
-            for (l = query_data->selection_metadata; l != NULL; l = l->next)
+            metadata_type = metadata_tags_constants[i].metadata_type;
+            current_metadata = NULL;
+            switch (metadata_type)
             {
-                metadata_clear = l->data;
-
-                if (metadata_clear->creation_date != NULL)
+                case ORIGINAL_FILE_NAME:
                 {
-                    g_string_free (metadata_clear->creation_date, TRUE);
-                    metadata_clear->creation_date = NULL;
+                    current_metadata = file_name;
                 }
-            }
-        }
-        else
-        {
-            datetime = g_date_time_new_local (atoi (year),
-                                              atoi (month),
-                                              atoi (day),
-                                              atoi (hours),
-                                              atoi (minutes),
-                                              atoi (seconds));
-
-            date = g_date_time_format (datetime, "%x");
-
-            if (strstr (date, "/") != NULL)
-            {
-                metadata->creation_date = batch_rename_replace (date, "/", "-");
-            }
-            else
-            {
-                metadata->creation_date = g_string_new (date);
-            }
-
-            g_free (date);
-        }
-    }
-
-    /* equipment */
-    if (query_data->have_equipment)
-    {
-        if (equipment == NULL)
-        {
-            query_data->have_equipment = FALSE;
-
-            for (l = query_data->selection_metadata; l != NULL; l = l->next)
-            {
-                metadata_clear = l->data;
-
-                if (metadata_clear->equipment != NULL)
+                break;
+                case CREATION_DATE:
                 {
-                    g_string_free (metadata_clear->equipment, TRUE);
-                    metadata_clear->equipment = NULL;
+                    current_metadata = creation_date;
                 }
-            }
-        }
-        else
-        {
-            metadata->equipment = g_string_new (equipment);
-        }
-    }
-
-    /* season number */
-    if (query_data->have_season)
-    {
-        if (season_number == NULL)
-        {
-            query_data->have_season = FALSE;
-
-            for (l = query_data->selection_metadata; l != NULL; l = l->next)
-            {
-                metadata_clear = l->data;
-
-                if (metadata_clear->season != NULL)
+                break;
+                case EQUIPMENT:
                 {
-                    g_string_free (metadata_clear->season, TRUE);
-                    metadata_clear->season = NULL;
+                    current_metadata = equipment;
                 }
-            }
-        }
-        else
-        {
-            metadata->season = g_string_new (season_number);
-        }
-    }
-
-    /* episode number */
-    if (query_data->have_episode_number)
-    {
-        if (episode_number == NULL)
-        {
-            query_data->have_episode_number = FALSE;
-
-            for (l = query_data->selection_metadata; l != NULL; l = l->next)
-            {
-                metadata_clear = l->data;
-
-                if (metadata_clear->episode_number != NULL)
+                break;
+                case SEASON_NUMBER:
                 {
-                    g_string_free (metadata_clear->episode_number, TRUE);
-                    metadata_clear->episode_number = NULL;
+                    current_metadata = season_number;
                 }
-            }
-        }
-        else
-        {
-            metadata->episode_number = g_string_new (episode_number);
-        }
-    }
-
-    /* track number */
-    if (query_data->have_track_number)
-    {
-        if (track_number == NULL)
-        {
-            query_data->have_track_number = FALSE;
-            for (l = query_data->selection_metadata; l != NULL; l = l->next)
-            {
-                metadata_clear = l->data;
-
-                if (metadata_clear->track_number != NULL)
+                break;
+                case EPISODE_NUMBER:
                 {
-                    g_string_free (metadata_clear->track_number, TRUE);
-                    metadata_clear->track_number = NULL;
+                    current_metadata = episode_number;
                 }
-            }
-        }
-        else
-        {
-            metadata->track_number = g_string_new (track_number);
-        }
-    }
-
-    /* artist name */
-    if (query_data->have_artist_name)
-    {
-        if (artist_name == NULL)
-        {
-            query_data->have_artist_name = FALSE;
-
-            for (l = query_data->selection_metadata; l != NULL; l = l->next)
-            {
-                metadata_clear = l->data;
-
-                if (metadata_clear->artist_name != NULL)
+                break;
+                case ARTIST_NAME:
+                {
+                    current_metadata = artist_name;
+                }
+                break;
+                case ALBUM_NAME:
+                {
+                    current_metadata = album_name;
+                }
+                break;
+                case TITLE:
                 {
-                    g_string_free (metadata_clear->artist_name, TRUE);
-                    metadata_clear->artist_name = NULL;
+                    current_metadata = title;
                 }
+                break;
+                case TRACK_NUMBER:
+                {
+                    current_metadata = track_number;
+                }
+                break;
+                default:
+                {
+                     g_warn_if_reached();
+                }
+                break;
             }
-        }
-        else
-        {
-            metadata->artist_name = g_string_new (artist_name);
-        }
-    }
-
-    /* title */
-    if (query_data->have_title)
-    {
-        if (title == NULL)
-        {
-            query_data->have_title = FALSE;
 
-            for (l = query_data->selection_metadata; l != NULL; l = l->next)
+            if (!current_metadata)
             {
-                metadata_clear = l->data;
+                remove_metadata (query_data,
+                                 metadata_type);
 
-                if (metadata_clear->title != NULL)
+                if (metadata_type == CREATION_DATE &&
+                    query_data->date_order_hash_table)
                 {
-                    g_string_free (metadata_clear->title, TRUE);
-                    metadata_clear->title = NULL;
+                       g_hash_table_destroy (query_data->date_order_hash_table);
+                       query_data->date_order_hash_table = NULL;
                 }
             }
-        }
-        else
-        {
-            metadata->title = g_string_new (title);
-        }
-    }
-
-    /* album name */
-    if (query_data->have_album_name)
-    {
-        if (album_name == NULL)
-        {
-            query_data->have_album_name = FALSE;
-
-            for (l = query_data->selection_metadata; l != NULL; l = l->next)
+            else
             {
-                metadata_clear = l->data;
-
-                if (metadata_clear->album_name != NULL)
+                if (metadata_type == CREATION_DATE)
                 {
-                    g_string_free (metadata_clear->album_name, TRUE);
-                    metadata_clear->album_name = NULL;
+                    /* Add the sort order to the order hash table */
+                    g_hash_table_insert (query_data->date_order_hash_table,
+                                         g_strdup (tracker_sparql_cursor_get_string (cursor, 0, NULL)),
+                                         GINT_TO_POINTER (g_hash_table_size 
(query_data->date_order_hash_table)));
+
+                    date_time = g_date_time_new_local (atoi (year),
+                                                       atoi (month),
+                                                       atoi (day),
+                                                       atoi (hours),
+                                                       atoi (minutes),
+                                                       atoi (seconds));
+
+                    file_metadata->metadata[metadata_type] = format_date_time (date_time);
+                }
+                else
+                {
+                    file_metadata->metadata[metadata_type] = g_string_new (current_metadata);
                 }
             }
         }
-        else
-        {
-            metadata->album_name = g_string_new (album_name);
-        }
     }
 
     /* Get next */
@@ -1046,7 +876,7 @@ batch_rename_dialog_query_callback (GObject      *object,
         g_error_free (error);
 
         nautilus_batch_rename_dialog_query_finished (query_data->dialog,
-                                                     query_data->hash_table,
+                                                     query_data->date_order_hash_table,
                                                      query_data->selection_metadata);
     }
     else
@@ -1061,14 +891,14 @@ check_metadata_for_selection (NautilusBatchRenameDialog *dialog,
 {
     TrackerSparqlConnection *connection;
     GString *query;
-    GHashTable *hash_table;
     GList *l;
     NautilusFile *file;
     GError *error;
     QueryData *query_data;
     gchar *file_name;
-    FileMetadata *metadata;
+    FileMetadata *file_metadata;
     GList *selection_metadata;
+    guint i;
 
     error = NULL;
     selection_metadata = NULL;
@@ -1119,18 +949,11 @@ check_metadata_for_selection (NautilusBatchRenameDialog *dialog,
                                     file_name);
         }
 
-        metadata = g_new (FileMetadata, 1);
-        metadata->file_name = g_string_new (file_name);
-        metadata->creation_date = NULL;
-        metadata->equipment = NULL;
-        metadata->season = NULL;
-        metadata->episode_number = NULL;
-        metadata->track_number = NULL;
-        metadata->artist_name = NULL;
-        metadata->title = NULL;
-        metadata->album_name = NULL;
+        file_metadata = g_new0 (FileMetadata, 1);
+        file_metadata->file_name = g_string_new (file_name);
+        file_metadata->metadata[ORIGINAL_FILE_NAME] = g_string_new (file_name);
 
-        selection_metadata = g_list_append (selection_metadata, metadata);
+        selection_metadata = g_list_append (selection_metadata, file_metadata);
 
         g_free (file_name);
     }
@@ -1149,24 +972,17 @@ check_metadata_for_selection (NautilusBatchRenameDialog *dialog,
         return;
     }
 
-    hash_table = g_hash_table_new_full (g_str_hash,
-                                        g_str_equal,
-                                        (GDestroyNotify) g_free,
-                                        NULL);
-
     query_data = g_new (QueryData, 1);
-    query_data->hash_table = hash_table;
+    query_data->date_order_hash_table = g_hash_table_new_full (g_str_hash,
+                                                               g_str_equal,
+                                                               (GDestroyNotify) g_free,
+                                                               NULL);
     query_data->dialog = dialog;
     query_data->selection_metadata = selection_metadata;
-
-    query_data->have_season = TRUE;
-    query_data->have_creation_date = TRUE;
-    query_data->have_artist_name = TRUE;
-    query_data->have_track_number = TRUE;
-    query_data->have_equipment = TRUE;
-    query_data->have_episode_number = TRUE;
-    query_data->have_title = TRUE;
-    query_data->have_album_name = TRUE;
+    for (i = 0; i < G_N_ELEMENTS (metadata_tags_constants); i++)
+    {
+        query_data->has_metadata[i] = TRUE;
+    }
 
     /* Make an asynchronous query to the store */
     tracker_sparql_connection_query_async (connection,
diff --git a/src/nautilus-batch-rename-utilities.h b/src/nautilus-batch-rename-utilities.h
index 9025cc8..49631b7 100644
--- a/src/nautilus-batch-rename-utilities.h
+++ b/src/nautilus-batch-rename-utilities.h
@@ -60,4 +60,6 @@ gboolean file_name_conflicts_with_results       (GList        *selection,
 GString* batch_rename_replace_label_text        (gchar             *label,
                                                  const gchar       *substr);
 
+gchar*   batch_rename_get_tag_text_representation (TagConstants tag_constants);
+
 #endif /* NAUTILUS_BATCH_RENAME_UTILITIES_H */
diff --git a/src/resources/ui/nautilus-batch-rename-dialog.ui 
b/src/resources/ui/nautilus-batch-rename-dialog.ui
index 51ef0b7..4d4a6ec 100644
--- a/src/resources/ui/nautilus-batch-rename-dialog.ui
+++ b/src/resources/ui/nautilus-batch-rename-dialog.ui
@@ -406,15 +406,15 @@
       <attribute name="label" translatable="yes">Automatic Numbers</attribute>
       <item>
         <attribute name="label" translatable="yes">1, 2, 3, 4</attribute>
-        <attribute name="action">dialog.add-numbering-tag-zero</attribute>
+        <attribute name="action">dialog.add-numbering-no-zero-pad-tag</attribute>
       </item>
       <item>
         <attribute name="label" translatable="yes">01, 02, 03, 04</attribute>
-        <attribute name="action">dialog.add-numbering-tag-one</attribute>
+        <attribute name="action">dialog.add-numbering-one-zero-pad-tag</attribute>
       </item>
       <item>
         <attribute name="label" translatable="yes">001, 002, 003, 004</attribute>
-        <attribute name="action">dialog.add-numbering-tag-two</attribute>
+        <attribute name="action">dialog.add-numbering-two-zero-pad-tag</attribute>
       </item>
     </section>
     <section>


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