[gimp] Bring parent items to the public API in the core



commit c4075975bf9a238dcdfc6a8fed1847db51a82140
Author: Michael Natterer <mitch gimp org>
Date:   Mon Aug 3 19:21:51 2009 +0200

    Bring parent items to the public API in the core
    
    * app/core/gimpimage.[ch]: make the parent parameter public in
    add_layer(), add_layers(), add_channel() and add_vectors().
    
    * app/vectors/gimpvectors-import.[ch]: add parent parameters to
      the vectors import functions.
    
    * app/core/gimpchannelundo.[ch]
    * app/core/gimplayerundo.[ch]
    * app/vectors/gimpvectorsundo.[ch]
    * app/core/gimpimage-undo-push.[ch]: remember the parent item when
      removing layers, channels and vectors.
    
    * app/actions/channels-commands.c
    * app/actions/debug-commands.c
    * app/actions/edit-commands.c
    * app/actions/layers-commands.c
    * app/actions/vectors-commands.c
    * app/core/gimp-edit.c
    * app/core/gimpimage-duplicate.c
    * app/core/gimpimage-merge.c
    * app/core/gimpimage-quick-mask.c
    * app/core/gimplayer-floating-sel.c
    * app/core/gimpselection.c
    * app/core/gimptemplate.c
    * app/dialogs/file-open-dialog.c
    * app/display/gimpdisplayshell-dnd.c
    * app/text/gimptext-compat.c
    * app/tools/gimptexttool.c
    * app/tools/gimpvectortool.c
    * app/widgets/gimptoolbox-dnd.c
    * app/xcf/xcf-load.c
    * tools/pdbgen/pdb/image.pdb
    * tools/pdbgen/pdb/paths.pdb
    * tools/pdbgen/pdb/vectors.pdb: pass NULL as parent item to above
      functions and add FIXMEs all over the place because there is some
      more hacking needed to make adding with index = -1 (on top of the
      current item) work again.
    
    * app/pdb/image-cmds.c
    * app/pdb/paths-cmds.c
    * app/pdb/vectors-cmds.c: regenerated.
    
    * app/core/gimpimage-duplicate.c: duplicate the original image's
      tree structure in the copy.
    
    * app/widgets/gimpitemtreeview.[ch]: add parent to GimpAddItemFunc,
      add utility function gimp_item_tree_view_get_drop_index() which
      figures where to add something dropped to an item tree.
    
    * app/widgets/gimpchanneltreeview.c
    * app/widgets/gimplayertreeview.c
    * app/widgets/gimpvectorstreeview.c: changed accordingly, using above
      new GimpItemTreeView API.

 app/actions/channels-commands.c    |    9 +++--
 app/actions/debug-commands.c       |    2 +-
 app/actions/edit-commands.c        |    6 ++-
 app/actions/layers-commands.c      |   20 +++++++-----
 app/actions/vectors-commands.c     |   15 ++++++---
 app/core/gimp-edit.c               |    4 +-
 app/core/gimpchannelundo.c         |   26 +++++++++++++--
 app/core/gimpchannelundo.h         |    1 +
 app/core/gimpimage-duplicate.c     |   62 +++++++++++++++++++++++++++++++----
 app/core/gimpimage-merge.c         |   10 ++++--
 app/core/gimpimage-quick-mask.c    |    2 +-
 app/core/gimpimage-undo-push.c     |   12 +++++++
 app/core/gimpimage-undo-push.h     |    5 ++-
 app/core/gimpimage.c               |   42 +++++++++++++++++-------
 app/core/gimpimage.h               |    4 ++
 app/core/gimplayer-floating-sel.c  |    2 +-
 app/core/gimplayerundo.c           |   20 +++++++++++-
 app/core/gimplayerundo.h           |    1 +
 app/core/gimpselection.c           |    3 +-
 app/core/gimptemplate.c            |    2 +-
 app/dialogs/file-open-dialog.c     |    3 +-
 app/display/gimpdisplayshell-dnd.c |   18 +++++++---
 app/pdb/image-cmds.c               |   12 +++++--
 app/pdb/paths-cmds.c               |    4 +-
 app/pdb/vectors-cmds.c             |    8 +++-
 app/text/gimptext-compat.c         |    2 +-
 app/tools/gimptexttool.c           |   10 +++--
 app/tools/gimpvectortool.c         |    3 +-
 app/vectors/gimpvectors-import.c   |   15 +++++++--
 app/vectors/gimpvectors-import.h   |    2 +
 app/vectors/gimpvectorsundo.c      |   20 +++++++++++-
 app/vectors/gimpvectorsundo.h      |    1 +
 app/widgets/gimpchanneltreeview.c  |   55 +++++++++++++++----------------
 app/widgets/gimpitemtreeview.c     |   50 ++++++++++++++++++++++++++--
 app/widgets/gimpitemtreeview.h     |    6 +++
 app/widgets/gimplayertreeview.c    |   57 +++++++++++++++------------------
 app/widgets/gimptoolbox-dnd.c      |    6 ++--
 app/widgets/gimpvectorstreeview.c  |   24 ++++++-------
 app/xcf/xcf-load.c                 |    4 ++
 tools/pdbgen/pdb/image.pdb         |   12 +++++--
 tools/pdbgen/pdb/paths.pdb         |    4 +-
 tools/pdbgen/pdb/vectors.pdb       |    8 +++-
 42 files changed, 410 insertions(+), 162 deletions(-)
---
diff --git a/app/actions/channels-commands.c b/app/actions/channels-commands.c
index 8c7b214..d4d6854 100644
--- a/app/actions/channels-commands.c
+++ b/app/actions/channels-commands.c
@@ -166,7 +166,8 @@ channels_new_last_vals_cmd_callback (GtkAction *action,
                               action_data_get_context (data),
                               GIMP_TRANSPARENT_FILL);
 
-  gimp_image_add_channel (image, new_channel, -1, TRUE);
+  /* FIXME tree */
+  gimp_image_add_channel (image, new_channel, NULL, -1, TRUE);
 
   gimp_image_undo_group_end (image);
 
@@ -262,7 +263,8 @@ channels_duplicate_cmd_callback (GtkAction *action,
                                            G_TYPE_FROM_INSTANCE (channel)));
     }
 
-  gimp_image_add_channel (image, new_channel, -1, TRUE);
+  /* FIXME tree */
+  gimp_image_add_channel (image, new_channel, NULL, -1, TRUE);
   gimp_image_flush (image);
 }
 
@@ -356,7 +358,8 @@ channels_new_channel_response (GtkWidget            *widget,
                                       GIMP_TRANSPARENT_FILL);
         }
 
-      gimp_image_add_channel (options->image, new_channel, -1, TRUE);
+      /* FIXME tree */
+      gimp_image_add_channel (options->image, new_channel, NULL, -1, TRUE);
       gimp_image_flush (options->image);
     }
 
diff --git a/app/actions/debug-commands.c b/app/actions/debug-commands.c
index ca1e7f0..c511032 100644
--- a/app/actions/debug-commands.c
+++ b/app/actions/debug-commands.c
@@ -364,7 +364,7 @@ debug_show_image_graph (GimpImage *source_image)
                                      new_name,
                                      1.0,
                                      GIMP_NORMAL_MODE);
-  gimp_image_add_layer (new_image, layer, 0, FALSE);
+  gimp_image_add_layer (new_image, layer, NULL, 0, FALSE);
   gimp_create_display (gimp, new_image, GIMP_UNIT_PIXEL, 1.0);
 
   /* Cleanup */
diff --git a/app/actions/edit-commands.c b/app/actions/edit-commands.c
index 3a7a09c..50f3464 100644
--- a/app/actions/edit-commands.c
+++ b/app/actions/edit-commands.c
@@ -348,7 +348,8 @@ edit_paste_as_new_layer_cmd_callback (GtkAction *action,
                                          GIMP_OPACITY_OPAQUE, GIMP_NORMAL_MODE);
       g_object_unref (buffer);
 
-      gimp_image_add_layer (image, layer, -1, TRUE);
+      /* FIXME tree */
+      gimp_image_add_layer (image, layer, NULL, -1, TRUE);
 
       gimp_image_flush (image);
     }
@@ -495,8 +496,9 @@ edit_paste (GimpDisplay *display,
 
   if (svg)
     {
+      /* FIXME tree */
       if (gimp_vectors_import_buffer (display->image, svg, svg_size,
-                                      TRUE, TRUE, -1, NULL, NULL))
+                                      TRUE, TRUE, NULL, -1, NULL, NULL))
         {
           gimp_image_flush (display->image);
         }
diff --git a/app/actions/layers-commands.c b/app/actions/layers-commands.c
index f1bac82..bb6caa7 100644
--- a/app/actions/layers-commands.c
+++ b/app/actions/layers-commands.c
@@ -329,7 +329,8 @@ layers_new_last_vals_cmd_callback (GtkAction *action,
                               layer_fill_type);
   gimp_item_translate (GIMP_ITEM (new_layer), off_x, off_y, FALSE);
 
-  gimp_image_add_layer (image, new_layer, -1, TRUE);
+  /* FIXME tree */
+  gimp_image_add_layer (image, new_layer, NULL, -1, TRUE);
 
   gimp_image_undo_group_end (image);
 
@@ -352,7 +353,8 @@ layers_new_from_visible_cmd_callback (GtkAction *action,
                                      gimp_image_base_type_with_alpha (image),
                                      _("Visible"),
                                      GIMP_OPACITY_OPAQUE, GIMP_NORMAL_MODE);
-  gimp_image_add_layer (image, layer, -1, TRUE);
+  /* FIXME tree */
+  gimp_image_add_layer (image, layer, NULL, -1, TRUE);
 
   gimp_image_flush (image);
 }
@@ -445,7 +447,8 @@ layers_duplicate_cmd_callback (GtkAction *action,
 
   new_layer = GIMP_LAYER (gimp_item_duplicate (GIMP_ITEM (layer),
                                                G_TYPE_FROM_INSTANCE (layer)));
-  gimp_image_add_layer (image, new_layer, -1, TRUE);
+  /* FIXME tree */
+  gimp_image_add_layer (image, new_layer, NULL, -1, TRUE);
 
   gimp_image_flush (image);
 }
@@ -520,8 +523,8 @@ layers_text_to_vectors_cmd_callback (GtkAction *action,
       gimp_item_get_offset (GIMP_ITEM (layer), &x, &y);
       gimp_item_translate (GIMP_ITEM (vectors), x, y, FALSE);
 
-      gimp_image_add_vectors (image, vectors, -1, TRUE);
-      gimp_image_set_active_vectors (image, vectors);
+      /* FIXME tree */
+      gimp_image_add_vectors (image, vectors, NULL, -1, TRUE);
 
       gimp_image_flush (image);
     }
@@ -548,8 +551,8 @@ layers_text_along_vectors_cmd_callback (GtkAction *action,
 
       gimp_item_set_visible (GIMP_ITEM (new_vectors), TRUE, FALSE);
 
-      gimp_image_add_vectors (image, new_vectors, -1, TRUE);
-      gimp_image_set_active_vectors (image, new_vectors);
+      /* FIXME tree */
+      gimp_image_add_vectors (image, new_vectors, NULL, -1, TRUE);
 
       gimp_image_flush (image);
     }
@@ -965,7 +968,8 @@ layers_new_layer_response (GtkWidget          *widget,
           gimp_drawable_fill_by_type (GIMP_DRAWABLE (layer),
                                       dialog->context,
                                       layer_fill_type);
-          gimp_image_add_layer (dialog->image, layer, -1, TRUE);
+          /* FIXME tree */
+          gimp_image_add_layer (dialog->image, layer, NULL, -1, TRUE);
 
           gimp_image_flush (dialog->image);
         }
diff --git a/app/actions/vectors-commands.c b/app/actions/vectors-commands.c
index 837f0de..636c3f9 100644
--- a/app/actions/vectors-commands.c
+++ b/app/actions/vectors-commands.c
@@ -187,7 +187,8 @@ vectors_new_last_vals_cmd_callback (GtkAction *action,
   new_vectors = gimp_vectors_new (image,
                                   vectors_name ? vectors_name : _("New Path"));
 
-  gimp_image_add_vectors (image, new_vectors, -1, TRUE);
+  /* FIXME tree */
+  gimp_image_add_vectors (image, new_vectors, NULL, -1, TRUE);
 
   gimp_image_flush (image);
 }
@@ -251,7 +252,8 @@ vectors_duplicate_cmd_callback (GtkAction *action,
 
   new_vectors = GIMP_VECTORS (gimp_item_duplicate (GIMP_ITEM (vectors),
                                                    G_TYPE_FROM_INSTANCE (vectors)));
-  gimp_image_add_vectors (image, new_vectors, -1, TRUE);
+  /* FIXME tree */
+  gimp_image_add_vectors (image, new_vectors, NULL, -1, TRUE);
   gimp_image_flush (image);
 }
 
@@ -476,8 +478,9 @@ vectors_paste_cmd_callback (GtkAction *action,
     {
       GError *error = NULL;
 
+      /* FIXME tree */
       if (! gimp_vectors_import_buffer (image, svg, svg_size,
-                                        TRUE, TRUE, -1, NULL, &error))
+                                        TRUE, TRUE, NULL, -1, NULL, &error))
         {
           gimp_message (image->gimp, G_OBJECT (widget), GIMP_MESSAGE_ERROR,
                         "%s", error->message);
@@ -622,7 +625,8 @@ vectors_new_vectors_response (GtkWidget            *widget,
 
       new_vectors = gimp_vectors_new (options->image, vectors_name);
 
-      gimp_image_add_vectors (options->image, new_vectors, -1, TRUE);
+      /* FIXME tree */
+      gimp_image_add_vectors (options->image, new_vectors, NULL, -1, TRUE);
 
       gimp_image_flush (options->image);
     }
@@ -668,9 +672,10 @@ vectors_import_response (GtkWidget           *widget,
 
       filename = gtk_file_chooser_get_filename (chooser);
 
+      /* FIXME tree */
       if (gimp_vectors_import_file (dialog->image, filename,
                                     vectors_import_merge, vectors_import_scale,
-                                    -1, NULL, &error))
+                                    NULL, -1, NULL, &error))
         {
           gimp_image_flush (dialog->image);
         }
diff --git a/app/core/gimp-edit.c b/app/core/gimp-edit.c
index 4de1733..7ab2719 100644
--- a/app/core/gimp-edit.c
+++ b/app/core/gimp-edit.c
@@ -270,7 +270,7 @@ gimp_edit_paste (GimpImage    *image,
   if (drawable)
     floating_sel_attach (layer, drawable);
   else
-    gimp_image_add_layer (image, layer, 0, TRUE);
+    gimp_image_add_layer (image, layer, NULL, 0, TRUE);
 
   /*  end the group undo  */
   gimp_image_undo_group_end (image);
@@ -330,7 +330,7 @@ gimp_edit_paste_as_new (Gimp       *gimp,
       return NULL;
     }
 
-  gimp_image_add_layer (image, layer, 0, TRUE);
+  gimp_image_add_layer (image, layer, NULL, 0, TRUE);
 
   gimp_image_undo_enable (image);
 
diff --git a/app/core/gimpchannelundo.c b/app/core/gimpchannelundo.c
index 1a8114c..8cd2ecd 100644
--- a/app/core/gimpchannelundo.c
+++ b/app/core/gimpchannelundo.c
@@ -29,6 +29,7 @@
 enum
 {
   PROP_0,
+  PROP_PREV_PARENT,
   PROP_PREV_POSITION,
   PROP_PREV_CHANNEL
 };
@@ -74,14 +75,23 @@ gimp_channel_undo_class_init (GimpChannelUndoClass *klass)
 
   undo_class->pop                = gimp_channel_undo_pop;
 
+  g_object_class_install_property (object_class, PROP_PREV_PARENT,
+                                   g_param_spec_object ("prev-parent",
+                                                        NULL, NULL,
+                                                        GIMP_TYPE_CHANNEL,
+                                                        GIMP_PARAM_READWRITE |
+                                                        G_PARAM_CONSTRUCT_ONLY));
+
   g_object_class_install_property (object_class, PROP_PREV_POSITION,
-                                   g_param_spec_int ("prev-position", NULL, NULL,
+                                   g_param_spec_int ("prev-position",
+                                                     NULL, NULL,
                                                      0, G_MAXINT, 0,
                                                      GIMP_PARAM_READWRITE |
                                                      G_PARAM_CONSTRUCT_ONLY));
 
   g_object_class_install_property (object_class, PROP_PREV_CHANNEL,
-                                   g_param_spec_object ("prev-channel", NULL, NULL,
+                                   g_param_spec_object ("prev-channel",
+                                                        NULL, NULL,
                                                         GIMP_TYPE_CHANNEL,
                                                         GIMP_PARAM_READWRITE |
                                                         G_PARAM_CONSTRUCT_ONLY));
@@ -119,6 +129,9 @@ gimp_channel_undo_set_property (GObject      *object,
 
   switch (property_id)
     {
+    case PROP_PREV_PARENT:
+      channel_undo->prev_parent = g_value_get_object (value);
+      break;
     case PROP_PREV_POSITION:
       channel_undo->prev_position = g_value_get_int (value);
       break;
@@ -142,6 +155,9 @@ gimp_channel_undo_get_property (GObject    *object,
 
   switch (property_id)
     {
+    case PROP_PREV_PARENT:
+      g_value_set_object (value, channel_undo->prev_parent);
+      break;
     case PROP_PREV_POSITION:
       g_value_set_int (value, channel_undo->prev_position);
       break;
@@ -187,7 +203,10 @@ gimp_channel_undo_pop (GimpUndo            *undo,
     {
       /*  remove channel  */
 
-      /*  record the current position  */
+      /*  record the current parent and position  */
+      channel_undo->prev_parent =
+        GIMP_CHANNEL (gimp_viewable_get_parent (GIMP_VIEWABLE (channel)));
+
       channel_undo->prev_position = gimp_item_get_index (GIMP_ITEM (channel));
 
       gimp_image_remove_channel (undo->image, channel, FALSE,
@@ -201,6 +220,7 @@ gimp_channel_undo_pop (GimpUndo            *undo,
       channel_undo->prev_channel = gimp_image_get_active_channel (undo->image);
 
       gimp_image_add_channel (undo->image, channel,
+                              channel_undo->prev_parent,
                               channel_undo->prev_position, FALSE);
 
       GIMP_ITEM (channel)->removed = FALSE;
diff --git a/app/core/gimpchannelundo.h b/app/core/gimpchannelundo.h
index ddbe145..8801f29 100644
--- a/app/core/gimpchannelundo.h
+++ b/app/core/gimpchannelundo.h
@@ -36,6 +36,7 @@ struct _GimpChannelUndo
 {
   GimpItemUndo  parent_instance;
 
+  GimpChannel  *prev_parent;
   gint          prev_position;   /*  former position in list  */
   GimpChannel  *prev_channel;    /*  previous active channel  */
 };
diff --git a/app/core/gimpimage-duplicate.c b/app/core/gimpimage-duplicate.c
index d802e74..b3099ff 100644
--- a/app/core/gimpimage-duplicate.c
+++ b/app/core/gimpimage-duplicate.c
@@ -225,6 +225,9 @@ gimp_image_duplicate_layers (GimpImage     *image,
                                                  new_image,
                                                  G_TYPE_FROM_INSTANCE (layer)));
 
+      g_object_set_data (G_OBJECT (layer), "gimp-image-duplicate-item",
+                         new_layer);
+
       /*  Make sure the copied layer doesn't say: "<old layer> copy"  */
       gimp_object_set_name (GIMP_OBJECT (new_layer),
                             gimp_object_get_name (GIMP_OBJECT (layer)));
@@ -246,9 +249,24 @@ gimp_image_duplicate_layers (GimpImage     *image,
         *new_floating_sel_drawable = GIMP_DRAWABLE (new_layer);
 
       if (*floating_layer != new_layer)
-        gimp_image_add_layer (new_image, new_layer, count++, FALSE);
+        {
+          GimpViewable *parent;
+          GimpLayer    *new_parent = NULL;
+
+          parent = gimp_viewable_get_parent (GIMP_VIEWABLE (layer));
+
+          if (parent)
+            new_parent = g_object_get_data (G_OBJECT (parent),
+                                            "gimp-image-duplicate-item");
+
+          gimp_image_add_layer (new_image, new_layer,
+                                new_parent, count++, FALSE);
+        }
     }
 
+  for (list = all_layers; list; list = g_list_next (list))
+    g_object_set_data (list->data, "gimp-image-duplicate-item", NULL);
+
   g_list_free (all_layers);
 
   return active_layer;
@@ -271,13 +289,18 @@ gimp_image_duplicate_channels (GimpImage     *image,
        list;
        list = g_list_next (list))
     {
-      GimpChannel *channel = list->data;
-      GimpChannel *new_channel;
+      GimpChannel  *channel = list->data;
+      GimpChannel  *new_channel;
+      GimpViewable *parent;
+      GimpChannel  *new_parent = NULL;
 
       new_channel = GIMP_CHANNEL (gimp_item_convert (GIMP_ITEM (channel),
                                                      new_image,
                                                      G_TYPE_FROM_INSTANCE (channel)));
 
+      g_object_set_data (G_OBJECT (channel), "gimp-image-duplicate-item",
+                         new_channel);
+
       /*  Make sure the copied channel doesn't say: "<old channel> copy"  */
       gimp_object_set_name (GIMP_OBJECT (new_channel),
                             gimp_object_get_name (GIMP_OBJECT (channel)));
@@ -288,9 +311,19 @@ gimp_image_duplicate_channels (GimpImage     *image,
       if (floating_sel_drawable == GIMP_DRAWABLE (channel))
         *new_floating_sel_drawable = GIMP_DRAWABLE (new_channel);
 
-      gimp_image_add_channel (new_image, new_channel, count++, FALSE);
+      parent = gimp_viewable_get_parent (GIMP_VIEWABLE (channel));
+
+      if (parent)
+        new_parent = g_object_get_data (G_OBJECT (parent),
+                                        "gimp-image-duplicate-item");
+
+      gimp_image_add_channel (new_image, new_channel,
+                              new_parent, count++, FALSE);
     }
 
+  for (list = all_channels; list; list = g_list_next (list))
+    g_object_set_data (list->data, "gimp-image-duplicate-item", NULL);
+
   g_list_free (all_channels);
 
   return active_channel;
@@ -311,13 +344,18 @@ gimp_image_duplicate_vectors (GimpImage *image,
        list;
        list = g_list_next (list))
     {
-      GimpVectors *vectors = list->data;
-      GimpVectors *new_vectors;
+      GimpVectors  *vectors = list->data;
+      GimpVectors  *new_vectors;
+      GimpViewable *parent;
+      GimpVectors  *new_parent = NULL;
 
       new_vectors = GIMP_VECTORS (gimp_item_convert (GIMP_ITEM (vectors),
                                                      new_image,
                                                      G_TYPE_FROM_INSTANCE (vectors)));
 
+      g_object_set_data (G_OBJECT (vectors), "gimp-image-duplicate-item",
+                         new_vectors);
+
       /*  Make sure the copied vectors doesn't say: "<old vectors> copy"  */
       gimp_object_set_name (GIMP_OBJECT (new_vectors),
                             gimp_object_get_name (GIMP_OBJECT (vectors)));
@@ -325,9 +363,19 @@ gimp_image_duplicate_vectors (GimpImage *image,
       if (gimp_image_get_active_vectors (image) == vectors)
         active_vectors = new_vectors;
 
-      gimp_image_add_vectors (new_image, new_vectors, count++, FALSE);
+      parent = gimp_viewable_get_parent (GIMP_VIEWABLE (vectors));
+
+      if (parent)
+        new_parent = g_object_get_data (G_OBJECT (parent),
+                                        "gimp-image-duplicate-item");
+
+      gimp_image_add_vectors (new_image, new_vectors,
+                              new_parent, count++, FALSE);
     }
 
+  for (list = all_vectors; list; list = g_list_next (list))
+    g_object_set_data (list->data, "gimp-image-duplicate-item", NULL);
+
   g_list_free (all_vectors);
 
   return active_vectors;
diff --git a/app/core/gimpimage-merge.c b/app/core/gimpimage-merge.c
index c71a474..55065e5 100644
--- a/app/core/gimpimage-merge.c
+++ b/app/core/gimpimage-merge.c
@@ -276,7 +276,8 @@ gimp_image_merge_visible_vectors (GimpImage  *image,
 
       g_slist_free (merge_list);
 
-      gimp_image_add_vectors (image, target_vectors, pos, TRUE);
+      /* FIXME tree */
+      gimp_image_add_vectors (image, target_vectors, NULL, pos, TRUE);
       gimp_unset_busy (image->gimp);
 
       gimp_image_undo_group_end (image);
@@ -591,14 +592,17 @@ gimp_image_merge_layers (GimpImage     *image,
           gimp_image_remove_layer (image, layer, TRUE, NULL);
         }
 
-      gimp_image_add_layer (image, merge_layer, position, TRUE);
+      /* FIXME tree */
+      gimp_image_add_layer (image, merge_layer, NULL, position, TRUE);
     }
   else
     {
       /*  Add the layer to the image  */
+
+      /* FIXME tree */
       gimp_image_add_layer
         (image, merge_layer,
-         gimp_container_get_n_children (image->layers) - position + 1,
+         NULL, gimp_container_get_n_children (image->layers) - position + 1,
          TRUE);
     }
 
diff --git a/app/core/gimpimage-quick-mask.c b/app/core/gimpimage-quick-mask.c
index 9f746e0..8179c5d 100644
--- a/app/core/gimpimage-quick-mask.c
+++ b/app/core/gimpimage-quick-mask.c
@@ -116,7 +116,7 @@ gimp_image_set_quick_mask_state (GimpImage *image,
           if (image->quick_mask_inverted)
             gimp_channel_invert (mask, FALSE);
 
-          gimp_image_add_channel (image, mask, 0, TRUE);
+          gimp_image_add_channel (image, mask, NULL, 0, TRUE);
 
           gimp_image_undo_group_end (image);
         }
diff --git a/app/core/gimpimage-undo-push.c b/app/core/gimpimage-undo-push.c
index c7f0900..bb5b55e 100644
--- a/app/core/gimpimage-undo-push.c
+++ b/app/core/gimpimage-undo-push.c
@@ -427,12 +427,15 @@ GimpUndo *
 gimp_image_undo_push_layer_remove (GimpImage   *image,
                                    const gchar *undo_desc,
                                    GimpLayer   *layer,
+                                   GimpLayer   *prev_parent,
                                    gint         prev_position,
                                    GimpLayer   *prev_layer)
 {
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
   g_return_val_if_fail (GIMP_IS_LAYER (layer), NULL);
   g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (layer)), NULL);
+  g_return_val_if_fail (prev_parent == NULL || GIMP_IS_LAYER (prev_parent),
+                        NULL);
   g_return_val_if_fail (prev_layer == NULL || GIMP_IS_LAYER (prev_layer),
                         NULL);
 
@@ -440,6 +443,7 @@ gimp_image_undo_push_layer_remove (GimpImage   *image,
                                GIMP_UNDO_LAYER_REMOVE, undo_desc,
                                GIMP_DIRTY_IMAGE_STRUCTURE,
                                "item",          layer,
+                               "prev-parent",   prev_parent,
                                "prev-position", prev_position,
                                "prev-layer",    prev_layer,
                                NULL);
@@ -656,12 +660,15 @@ GimpUndo *
 gimp_image_undo_push_channel_remove (GimpImage   *image,
                                      const gchar *undo_desc,
                                      GimpChannel *channel,
+                                     GimpChannel *prev_parent,
                                      gint         prev_position,
                                      GimpChannel *prev_channel)
 {
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
   g_return_val_if_fail (GIMP_IS_CHANNEL (channel), NULL);
   g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (channel)), NULL);
+  g_return_val_if_fail (prev_parent == NULL || GIMP_IS_CHANNEL (prev_parent),
+                        NULL);
   g_return_val_if_fail (prev_channel == NULL || GIMP_IS_CHANNEL (prev_channel),
                         NULL);
 
@@ -669,6 +676,7 @@ gimp_image_undo_push_channel_remove (GimpImage   *image,
                                GIMP_UNDO_CHANNEL_REMOVE, undo_desc,
                                GIMP_DIRTY_IMAGE_STRUCTURE,
                                "item",          channel,
+                               "prev-parent",   prev_parent,
                                "prev-position", prev_position,
                                "prev-channel",  prev_channel,
                                NULL);
@@ -735,12 +743,15 @@ GimpUndo *
 gimp_image_undo_push_vectors_remove (GimpImage   *image,
                                      const gchar *undo_desc,
                                      GimpVectors *vectors,
+                                     GimpVectors *prev_parent,
                                      gint         prev_position,
                                      GimpVectors *prev_vectors)
 {
   g_return_val_if_fail (GIMP_IS_IMAGE (image), NULL);
   g_return_val_if_fail (GIMP_IS_VECTORS (vectors), NULL);
   g_return_val_if_fail (gimp_item_is_attached (GIMP_ITEM (vectors)), NULL);
+  g_return_val_if_fail (prev_parent == NULL || GIMP_IS_VECTORS (prev_parent),
+                        NULL);
   g_return_val_if_fail (prev_vectors == NULL || GIMP_IS_VECTORS (prev_vectors),
                         NULL);
 
@@ -748,6 +759,7 @@ gimp_image_undo_push_vectors_remove (GimpImage   *image,
                                GIMP_UNDO_VECTORS_REMOVE, undo_desc,
                                GIMP_DIRTY_IMAGE_STRUCTURE,
                                "item",          vectors,
+                               "prev-parent",   prev_parent,
                                "prev-position", prev_position,
                                "prev-vectors",  prev_vectors,
                                NULL);
diff --git a/app/core/gimpimage-undo-push.h b/app/core/gimpimage-undo-push.h
index 99bfe22..16247e1 100644
--- a/app/core/gimpimage-undo-push.h
+++ b/app/core/gimpimage-undo-push.h
@@ -111,6 +111,7 @@ GimpUndo * gimp_image_undo_push_layer_add           (GimpImage     *image,
 GimpUndo * gimp_image_undo_push_layer_remove        (GimpImage     *image,
                                                      const gchar   *undo_desc,
                                                      GimpLayer     *layer,
+                                                     GimpLayer     *prev_parent,
                                                      gint           prev_position,
                                                      GimpLayer     *prev_layer);
 GimpUndo * gimp_image_undo_push_layer_reposition    (GimpImage     *image,
@@ -165,6 +166,7 @@ GimpUndo * gimp_image_undo_push_channel_add         (GimpImage     *image,
 GimpUndo * gimp_image_undo_push_channel_remove      (GimpImage     *image,
                                                      const gchar   *undo_desc,
                                                      GimpChannel   *channel,
+                                                     GimpChannel   *prev_parent,
                                                      gint           prev_position,
                                                      GimpChannel   *prev_channel);
 GimpUndo * gimp_image_undo_push_channel_reposition  (GimpImage     *image,
@@ -183,7 +185,8 @@ GimpUndo * gimp_image_undo_push_vectors_add         (GimpImage     *image,
                                                      GimpVectors   *prev_vectors);
 GimpUndo * gimp_image_undo_push_vectors_remove      (GimpImage     *image,
                                                      const gchar   *undo_desc,
-                                                     GimpVectors   *channel,
+                                                     GimpVectors   *vectors,
+                                                     GimpVectors   *prev_parent,
                                                      gint           prev_position,
                                                      GimpVectors   *prev_vectors);
 GimpUndo * gimp_image_undo_push_vectors_mod         (GimpImage     *image,
diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c
index c4e6a2e..18e4905 100644
--- a/app/core/gimpimage.c
+++ b/app/core/gimpimage.c
@@ -2949,10 +2949,10 @@ gimp_image_get_vectors_by_name (const GimpImage *image,
 gboolean
 gimp_image_add_layer (GimpImage *image,
                       GimpLayer *layer,
+                      GimpLayer *parent,
                       gint       position,
                       gboolean   push_undo)
 {
-  GimpLayer     *parent = NULL;
   GimpLayer     *active_layer;
   GimpContainer *container;
   GimpLayer     *floating_sel;
@@ -3085,8 +3085,8 @@ gimp_image_remove_layer (GimpImage *image,
     }
 
   if (push_undo)
-    gimp_image_undo_push_layer_remove (image, undo_desc,
-                                       layer, index, active_layer);
+    gimp_image_undo_push_layer_remove (image, undo_desc, layer,
+                                       parent, index, active_layer);
 
   g_object_ref (layer);
 
@@ -3155,6 +3155,7 @@ gimp_image_remove_layer (GimpImage *image,
 void
 gimp_image_add_layers (GimpImage   *image,
                        GList       *layers,
+                       GimpLayer   *parent,
                        gint         position,
                        gint         x,
                        gint         y,
@@ -3172,14 +3173,30 @@ gimp_image_add_layers (GimpImage   *image,
 
   g_return_if_fail (GIMP_IS_IMAGE (image));
   g_return_if_fail (layers != NULL);
+  g_return_if_fail (parent == NULL || GIMP_IS_LAYER (parent));
+  g_return_if_fail (parent == NULL ||
+                    gimp_item_is_attached (GIMP_ITEM (parent)));
+  g_return_if_fail (parent == NULL ||
+                    gimp_item_get_image (GIMP_ITEM (parent)) == image);
 
   if (position == -1)
     {
       GimpLayer *active_layer = gimp_image_get_active_layer (image);
 
       if (active_layer)
-        position = gimp_item_get_index (GIMP_ITEM (active_layer));
-      else
+        {
+          GimpContainer *container;
+
+          if (parent)
+            container = gimp_viewable_get_children (GIMP_VIEWABLE (parent));
+          else
+            container = image->layers;
+
+          position = gimp_container_get_child_index (container,
+                                                     GIMP_OBJECT (active_layer));
+        }
+
+      if (position == -1)
         position = 0;
     }
 
@@ -3210,7 +3227,8 @@ gimp_image_add_layers (GimpImage   *image,
 
       gimp_item_translate (new_item, offset_x, offset_y, FALSE);
 
-      gimp_image_add_layer (image, GIMP_LAYER (new_item), position, TRUE);
+      gimp_image_add_layer (image, GIMP_LAYER (new_item),
+                            parent, position, TRUE);
       position++;
     }
 
@@ -3338,10 +3356,10 @@ gimp_image_position_layer (GimpImage   *image,
 gboolean
 gimp_image_add_channel (GimpImage   *image,
                         GimpChannel *channel,
+                        GimpChannel *parent,
                         gint         position,
                         gboolean     push_undo)
 {
-  GimpVectors   *parent = NULL;
   GimpChannel   *active_channel;
   GimpContainer *container;
 
@@ -3438,8 +3456,8 @@ gimp_image_remove_channel (GimpImage   *image,
   index = gimp_item_get_index (GIMP_ITEM (channel));
 
   if (push_undo)
-    gimp_image_undo_push_channel_remove (image, _("Remove Channel"),
-                                         channel, index, active_channel);
+    gimp_image_undo_push_channel_remove (image, _("Remove Channel"), channel,
+                                         parent, index, active_channel);
 
   g_object_ref (channel);
 
@@ -3610,10 +3628,10 @@ gimp_image_position_channel (GimpImage   *image,
 gboolean
 gimp_image_add_vectors (GimpImage   *image,
                         GimpVectors *vectors,
+                        GimpVectors *parent,
                         gint         position,
                         gboolean     push_undo)
 {
-  GimpVectors   *parent = NULL;
   GimpVectors   *active_vectors;
   GimpContainer *container;
 
@@ -3691,8 +3709,8 @@ gimp_image_remove_vectors (GimpImage   *image,
   index = gimp_item_get_index (GIMP_ITEM (vectors));
 
   if (push_undo)
-    gimp_image_undo_push_vectors_remove (image, _("Remove Path"),
-                                         vectors, index, active_vectors);
+    gimp_image_undo_push_vectors_remove (image, _("Remove Path"), vectors,
+                                         parent, index, active_vectors);
 
   g_object_ref (vectors);
 
diff --git a/app/core/gimpimage.h b/app/core/gimpimage.h
index 32110b3..13cd1f6 100644
--- a/app/core/gimpimage.h
+++ b/app/core/gimpimage.h
@@ -462,6 +462,7 @@ GimpVectors   * gimp_image_get_vectors_by_name   (const GimpImage    *image,
 
 gboolean        gimp_image_add_layer             (GimpImage          *image,
                                                   GimpLayer          *layer,
+                                                  GimpLayer          *parent,
                                                   gint                position,
                                                   gboolean            push_undo);
 void            gimp_image_remove_layer          (GimpImage          *image,
@@ -471,6 +472,7 @@ void            gimp_image_remove_layer          (GimpImage          *image,
 
 void            gimp_image_add_layers            (GimpImage          *image,
                                                   GList              *layers,
+                                                  GimpLayer          *parent,
                                                   gint                position,
                                                   gint                x,
                                                   gint                y,
@@ -496,6 +498,7 @@ gboolean        gimp_image_position_layer        (GimpImage          *image,
 
 gboolean        gimp_image_add_channel           (GimpImage          *image,
                                                   GimpChannel        *channel,
+                                                  GimpChannel        *parent,
                                                   gint                position,
                                                   gboolean            push_undo);
 void            gimp_image_remove_channel        (GimpImage          *image,
@@ -521,6 +524,7 @@ gboolean        gimp_image_position_channel      (GimpImage          *image,
 
 gboolean        gimp_image_add_vectors           (GimpImage          *image,
                                                   GimpVectors        *vectors,
+                                                  GimpVectors        *parent,
                                                   gint                position,
                                                   gboolean            push_undo);
 void            gimp_image_remove_vectors        (GimpImage          *image,
diff --git a/app/core/gimplayer-floating-sel.c b/app/core/gimplayer-floating-sel.c
index 6e5c1fb..7b3e169 100644
--- a/app/core/gimplayer-floating-sel.c
+++ b/app/core/gimplayer-floating-sel.c
@@ -80,7 +80,7 @@ floating_sel_attach (GimpLayer    *layer,
   gimp_layer_set_floating_sel_drawable (layer, drawable);
 
   /*  add the layer to the image  */
-  gimp_image_add_layer (image, layer, 0, TRUE);
+  gimp_image_add_layer (image, layer, NULL, 0, TRUE);
 }
 
 void
diff --git a/app/core/gimplayerundo.c b/app/core/gimplayerundo.c
index 31502f4..779adc6 100644
--- a/app/core/gimplayerundo.c
+++ b/app/core/gimplayerundo.c
@@ -29,6 +29,7 @@
 enum
 {
   PROP_0,
+  PROP_PREV_PARENT,
   PROP_PREV_POSITION,
   PROP_PREV_LAYER
 };
@@ -74,6 +75,13 @@ gimp_layer_undo_class_init (GimpLayerUndoClass *klass)
 
   undo_class->pop                = gimp_layer_undo_pop;
 
+  g_object_class_install_property (object_class, PROP_PREV_PARENT,
+                                   g_param_spec_object ("prev-parent",
+                                                        NULL, NULL,
+                                                        GIMP_TYPE_LAYER,
+                                                        GIMP_PARAM_READWRITE |
+                                                        G_PARAM_CONSTRUCT_ONLY));
+
   g_object_class_install_property (object_class, PROP_PREV_POSITION,
                                    g_param_spec_int ("prev-position", NULL, NULL,
                                                      0, G_MAXINT, 0,
@@ -119,6 +127,9 @@ gimp_layer_undo_set_property (GObject      *object,
 
   switch (property_id)
     {
+    case PROP_PREV_PARENT:
+      layer_undo->prev_parent = g_value_get_object (value);
+      break;
     case PROP_PREV_POSITION:
       layer_undo->prev_position = g_value_get_int (value);
       break;
@@ -142,6 +153,9 @@ gimp_layer_undo_get_property (GObject    *object,
 
   switch (property_id)
     {
+    case PROP_PREV_PARENT:
+      g_value_set_object (value, layer_undo->prev_parent);
+      break;
     case PROP_PREV_POSITION:
       g_value_set_int (value, layer_undo->prev_position);
       break;
@@ -187,7 +201,10 @@ gimp_layer_undo_pop (GimpUndo            *undo,
     {
       /*  remove layer  */
 
-      /*  record the current position  */
+      /*  record the current parent and position  */
+      layer_undo->prev_parent =
+        GIMP_LAYER (gimp_viewable_get_parent (GIMP_VIEWABLE (layer)));
+
       layer_undo->prev_position = gimp_item_get_index (GIMP_ITEM (layer));
 
       gimp_image_remove_layer (undo->image, layer, FALSE,
@@ -201,6 +218,7 @@ gimp_layer_undo_pop (GimpUndo            *undo,
       layer_undo->prev_layer = gimp_image_get_active_layer (undo->image);
 
       gimp_image_add_layer (undo->image, layer,
+                            layer_undo->prev_parent,
                             layer_undo->prev_position, FALSE);
 
       GIMP_ITEM (layer)->removed = FALSE;
diff --git a/app/core/gimplayerundo.h b/app/core/gimplayerundo.h
index 4bf8ddd..0d741e2 100644
--- a/app/core/gimplayerundo.h
+++ b/app/core/gimplayerundo.h
@@ -36,6 +36,7 @@ struct _GimpLayerUndo
 {
   GimpItemUndo  parent_instance;
 
+  GimpLayer    *prev_parent;
   gint          prev_position;   /*  former position in list  */
   GimpLayer    *prev_layer;      /*  previous active layer    */
 };
diff --git a/app/core/gimpselection.c b/app/core/gimpselection.c
index d4a824a..07009b0 100644
--- a/app/core/gimpselection.c
+++ b/app/core/gimpselection.c
@@ -615,7 +615,8 @@ gimp_selection_save (GimpSelection *selection)
   /*  saved selections are not visible by default  */
   gimp_item_set_visible (GIMP_ITEM (new_channel), FALSE, FALSE);
 
-  gimp_image_add_channel (image, new_channel, -1, TRUE);
+  /* FIXME tree */
+  gimp_image_add_channel (image, new_channel, NULL, -1, TRUE);
 
   return new_channel;
 }
diff --git a/app/core/gimptemplate.c b/app/core/gimptemplate.c
index 7a676ff..e887a9a 100644
--- a/app/core/gimptemplate.c
+++ b/app/core/gimptemplate.c
@@ -407,7 +407,7 @@ gimp_template_create_image (Gimp         *gimp,
   gimp_drawable_fill_by_type (GIMP_DRAWABLE (layer),
                               context, template->fill_type);
 
-  gimp_image_add_layer (image, layer, 0, FALSE);
+  gimp_image_add_layer (image, layer, NULL, 0, FALSE);
 
   gimp_image_undo_enable (image);
   gimp_image_clean_all (image);
diff --git a/app/dialogs/file-open-dialog.c b/app/dialogs/file-open-dialog.c
index e523c84..5e7852e 100644
--- a/app/dialogs/file-open-dialog.c
+++ b/app/dialogs/file-open-dialog.c
@@ -247,7 +247,8 @@ file_open_dialog_open_layers (GtkWidget           *open_dialog,
 
   if (new_layers)
     {
-      gimp_image_add_layers (image, new_layers, -1,
+      /* FIXME tree */
+      gimp_image_add_layers (image, new_layers, NULL, -1,
                              0, 0,
                              gimp_image_get_width (image),
                              gimp_image_get_height (image),
diff --git a/app/display/gimpdisplayshell-dnd.c b/app/display/gimpdisplayshell-dnd.c
index 545a8d6..247158c 100644
--- a/app/display/gimpdisplayshell-dnd.c
+++ b/app/display/gimpdisplayshell-dnd.c
@@ -260,7 +260,8 @@ gimp_display_shell_drop_drawable (GtkWidget    *widget,
       gimp_item_set_visible (new_item, TRUE, FALSE);
       gimp_item_set_linked (new_item, FALSE, FALSE);
 
-      gimp_image_add_layer (image, new_layer, -1, TRUE);
+      /* FIXME tree */
+      gimp_image_add_layer (image, new_layer, NULL, -1, TRUE);
 
       gimp_image_undo_group_end (image);
 
@@ -300,7 +301,8 @@ gimp_display_shell_drop_vectors (GtkWidget    *widget,
       gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_EDIT_PASTE,
                                    _("Drop New Path"));
 
-      gimp_image_add_vectors (image, new_vectors, -1, TRUE);
+      /* FIXME tree */
+      gimp_image_add_vectors (image, new_vectors, NULL, -1, TRUE);
 
       gimp_image_undo_group_end (image);
 
@@ -328,9 +330,10 @@ gimp_display_shell_drop_svg (GtkWidget     *widget,
   if (! image)
     return;
 
+  /* FIXME tree */
   if (! gimp_vectors_import_buffer (image,
                                     (const gchar *) svg_data, svg_data_len,
-                                    TRUE, TRUE, -1, NULL, &error))
+                                    TRUE, TRUE, NULL, -1, NULL, &error))
     {
       gimp_message_literal (shell->display->gimp, G_OBJECT (shell->display),
 			    GIMP_MESSAGE_ERROR,
@@ -492,7 +495,8 @@ gimp_display_shell_drop_uri_list (GtkWidget *widget,
               gimp_display_shell_untransform_viewport (shell, &x, &y,
                                                        &width, &height);
 
-              gimp_image_add_layers (image, new_layers, -1,
+              /* FIXME tree */
+              gimp_image_add_layers (image, new_layers, NULL, -1,
                                      x, y, width, height,
                                      _("Drop layers"));
 
@@ -588,7 +592,8 @@ gimp_display_shell_drop_component (GtkWidget       *widget,
 
       gimp_display_shell_dnd_position_item (shell, new_item);
 
-      gimp_image_add_layer (dest_image, new_layer, -1, TRUE);
+      /* FIXME tree */
+      gimp_image_add_layer (dest_image, new_layer, NULL, -1, TRUE);
 
       gimp_image_undo_group_end (dest_image);
 
@@ -660,7 +665,8 @@ gimp_display_shell_drop_pixbuf (GtkWidget *widget,
       if (! new_image)
         gimp_display_shell_dnd_position_item (shell, new_item);
 
-      gimp_image_add_layer (image, new_layer, -1, TRUE);
+      /* FIXME tree */
+      gimp_image_add_layer (image, new_layer, NULL, -1, TRUE);
 
       gimp_image_undo_group_end (image);
 
diff --git a/app/pdb/image-cmds.c b/app/pdb/image-cmds.c
index 1342c8c..c57b041 100644
--- a/app/pdb/image-cmds.c
+++ b/app/pdb/image-cmds.c
@@ -914,7 +914,9 @@ image_add_layer_invoker (GimpProcedure      *procedure,
                                        GIMP_IMAGE_TYPE_BASE_TYPE (gimp_drawable_type (GIMP_DRAWABLE (layer))),
                                        error))
         {
-          success = gimp_image_add_layer (image, layer, MAX (position, -1), TRUE);
+          /* FIXME tree */
+          success = gimp_image_add_layer (image, layer,
+                                          NULL, MAX (position, -1), TRUE);
         }
       else
         {
@@ -1104,7 +1106,9 @@ image_add_channel_invoker (GimpProcedure      *procedure,
     {
       if (gimp_pdb_item_is_floating (GIMP_ITEM (channel), image, error))
         {
-          success = gimp_image_add_channel (image, channel, MAX (position, -1), TRUE);
+          /* FIXME tree */
+          success = gimp_image_add_channel (image, channel,
+                                            NULL, MAX (position, -1), TRUE);
         }
       else
         {
@@ -1246,7 +1250,9 @@ image_add_vectors_invoker (GimpProcedure      *procedure,
     {
       if (gimp_pdb_item_is_floating (GIMP_ITEM (vectors), image, error))
         {
-          success = gimp_image_add_vectors (image, vectors, MAX (position, -1), TRUE);
+          /* FIXME tree */
+          success = gimp_image_add_vectors (image, vectors,
+                                            NULL, MAX (position, -1), TRUE);
         }
       else
         {
diff --git a/app/pdb/paths-cmds.c b/app/pdb/paths-cmds.c
index 18ecb96..758caa7 100644
--- a/app/pdb/paths-cmds.c
+++ b/app/pdb/paths-cmds.c
@@ -302,7 +302,7 @@ path_set_points_invoker (GimpProcedure      *procedure,
           g_free (points);
 
           if (vectors)
-            success = gimp_image_add_vectors (image, vectors, 0, TRUE);
+            success = gimp_image_add_vectors (image, vectors, NULL, 0, TRUE);
           else
             success = FALSE;
         }
@@ -676,7 +676,7 @@ path_import_invoker (GimpProcedure      *procedure,
   if (success)
     {
       success = gimp_vectors_import_file (image, filename,
-                                          merge, scale, -1, NULL, NULL);
+                                          merge, scale, NULL, -1, NULL, NULL);
     }
 
   return gimp_procedure_get_return_values (procedure, success,
diff --git a/app/pdb/vectors-cmds.c b/app/pdb/vectors-cmds.c
index 888fd63..87d84cc 100644
--- a/app/pdb/vectors-cmds.c
+++ b/app/pdb/vectors-cmds.c
@@ -1291,8 +1291,10 @@ vectors_import_from_file_invoker (GimpProcedure      *procedure,
     {
       GList *list, *vectors_list = NULL;
 
+      /* FIXME tree */
       success = gimp_vectors_import_file (image, filename,
-                                          merge, scale, -1, &vectors_list, error);
+                                          merge, scale, NULL, -1,
+                                          &vectors_list, error);
 
       if (success)
         {
@@ -1353,8 +1355,10 @@ vectors_import_from_string_invoker (GimpProcedure      *procedure,
     {
       GList *list, *vectors_list = NULL;
 
+      /* FIXME tree */
       success = gimp_vectors_import_buffer (image, string, length,
-                                            merge, scale, -1, &vectors_list, error);
+                                            merge, scale, NULL, -1,
+                                            &vectors_list, error);
 
       if (success)
         {
diff --git a/app/text/gimptext-compat.c b/app/text/gimptext-compat.c
index 135e198..8f01a55 100644
--- a/app/text/gimptext-compat.c
+++ b/app/text/gimptext-compat.c
@@ -119,7 +119,7 @@ text_render (GimpImage    *image,
   if (drawable == NULL)
     {
       /*  If the drawable is NULL, create a new layer  */
-      gimp_image_add_layer (image, layer, -1, TRUE);
+      gimp_image_add_layer (image, layer, NULL, -1, TRUE);
     }
   else
     {
diff --git a/app/tools/gimptexttool.c b/app/tools/gimptexttool.c
index dbfcc38..d12a6b0 100644
--- a/app/tools/gimptexttool.c
+++ b/app/tools/gimptexttool.c
@@ -2173,7 +2173,8 @@ gimp_text_tool_create_layer (GimpTextTool *text_tool,
 
   gimp_item_set_offset (GIMP_ITEM (layer), x1, y1);
 
-  gimp_image_add_layer (image, layer, -1, TRUE);
+  /* FIXME tree */
+  gimp_image_add_layer (image, layer, NULL, -1, TRUE);
 
   if (text_tool->text_box_fixed)
     {
@@ -2790,7 +2791,8 @@ gimp_text_tool_create_vectors (GimpTextTool *text_tool)
       gimp_item_translate (GIMP_ITEM (vectors), x, y, FALSE);
     }
 
-  gimp_image_add_vectors (text_tool->image, vectors, -1, TRUE);
+  /* FIXME tree */
+  gimp_image_add_vectors (text_tool->image, vectors, NULL, -1, TRUE);
 
   gimp_image_flush (text_tool->image);
 }
@@ -2817,8 +2819,8 @@ gimp_text_tool_create_vectors_warped (GimpTextTool *text_tool)
 
   gimp_vectors_warp_vectors (vectors0, vectors, 0.5 * box_height);
 
-  gimp_image_add_vectors (text_tool->image, vectors, -1, TRUE);
-  gimp_image_set_active_vectors (text_tool->image, vectors);
+  /* FIXME tree */
+  gimp_image_add_vectors (text_tool->image, vectors, NULL, -1, TRUE);
   gimp_item_set_visible (GIMP_ITEM (vectors), TRUE, FALSE);
 
   gimp_image_flush (text_tool->image);
diff --git a/app/tools/gimpvectortool.c b/app/tools/gimpvectortool.c
index f674a6d..77b6ea6 100644
--- a/app/tools/gimpvectortool.c
+++ b/app/tools/gimpvectortool.c
@@ -305,7 +305,8 @@ gimp_vector_tool_button_press (GimpTool            *tool,
 
       vector_tool->undo_motion = TRUE;
 
-      gimp_image_add_vectors (display->image, vectors, -1, TRUE);
+      /* FIXME tree */
+      gimp_image_add_vectors (display->image, vectors, NULL, -1, TRUE);
       gimp_image_flush (display->image);
 
       gimp_vector_tool_set_vectors (vector_tool, vectors);
diff --git a/app/vectors/gimpvectors-import.c b/app/vectors/gimpvectors-import.c
index 40add09..dcccc98 100644
--- a/app/vectors/gimpvectors-import.c
+++ b/app/vectors/gimpvectors-import.c
@@ -97,6 +97,7 @@ static gboolean  gimp_vectors_import  (GimpImage            *image,
                                        gsize                 len,
                                        gboolean              merge,
                                        gboolean              scale,
+                                       GimpVectors          *parent,
                                        gint                  position,
                                        GList               **ret_vectors,
                                        GError              **error);
@@ -198,16 +199,19 @@ gimp_vectors_import_file (GimpImage    *image,
                           const gchar  *filename,
                           gboolean      merge,
                           gboolean      scale,
+                          GimpVectors  *parent,
                           gint          position,
                           GList       **ret_vectors,
                           GError      **error)
 {
   g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE);
   g_return_val_if_fail (filename != NULL, FALSE);
+  g_return_val_if_fail (parent == NULL || GIMP_IS_VECTORS (parent), FALSE);
   g_return_val_if_fail (ret_vectors == NULL || *ret_vectors == NULL, FALSE);
   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
-  return gimp_vectors_import (image, filename, NULL, 0, merge, scale, position,
+  return gimp_vectors_import (image, filename, NULL, 0, merge, scale,
+                              parent, position,
                               ret_vectors, error);
 }
 
@@ -230,16 +234,19 @@ gimp_vectors_import_buffer (GimpImage    *image,
                             gsize         len,
                             gboolean      merge,
                             gboolean      scale,
+                            GimpVectors  *parent,
                             gint          position,
                             GList       **ret_vectors,
                             GError      **error)
 {
   g_return_val_if_fail (GIMP_IS_IMAGE (image), FALSE);
   g_return_val_if_fail (buffer != NULL || len == 0, FALSE);
+  g_return_val_if_fail (parent == NULL || GIMP_IS_VECTORS (parent), FALSE);
   g_return_val_if_fail (ret_vectors == NULL || *ret_vectors == NULL, FALSE);
   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
-  return gimp_vectors_import (image, NULL, buffer, len, merge, scale, position,
+  return gimp_vectors_import (image, NULL, buffer, len, merge, scale,
+                              parent, position,
                               ret_vectors, error);
 }
 
@@ -250,6 +257,7 @@ gimp_vectors_import (GimpImage    *image,
                      gsize         len,
                      gboolean      merge,
                      gboolean      scale,
+                     GimpVectors  *parent,
                      gint          position,
                      GList       **ret_vectors,
                      GError      **error)
@@ -305,7 +313,8 @@ gimp_vectors_import (GimpImage    *image,
                   vectors = gimp_vectors_new (image,
                                               ((merge || !path->id) ?
                                                _("Imported Path") : path->id));
-                  gimp_image_add_vectors (image, vectors, position, TRUE);
+                  gimp_image_add_vectors (image, vectors,
+                                          parent, position, TRUE);
                   gimp_vectors_freeze (vectors);
 
                   if (ret_vectors)
diff --git a/app/vectors/gimpvectors-import.h b/app/vectors/gimpvectors-import.h
index fc8b951..7ab74fc 100644
--- a/app/vectors/gimpvectors-import.h
+++ b/app/vectors/gimpvectors-import.h
@@ -26,6 +26,7 @@ gboolean  gimp_vectors_import_file   (GimpImage    *image,
                                       const gchar  *filename,
                                       gboolean      merge,
                                       gboolean      scale,
+                                      GimpVectors  *parent,
                                       gint          position,
                                       GList       **ret_vectors,
                                       GError      **error);
@@ -34,6 +35,7 @@ gboolean  gimp_vectors_import_buffer (GimpImage    *image,
                                       gsize         len,
                                       gboolean      merge,
                                       gboolean      scale,
+                                      GimpVectors  *parent,
                                       gint          position,
                                       GList       **ret_vectors,
                                       GError      **error);
diff --git a/app/vectors/gimpvectorsundo.c b/app/vectors/gimpvectorsundo.c
index 5f8e730..fff52b6 100644
--- a/app/vectors/gimpvectorsundo.c
+++ b/app/vectors/gimpvectorsundo.c
@@ -30,6 +30,7 @@
 enum
 {
   PROP_0,
+  PROP_PREV_PARENT,
   PROP_PREV_POSITION,
   PROP_PREV_VECTORS
 };
@@ -75,6 +76,13 @@ gimp_vectors_undo_class_init (GimpVectorsUndoClass *klass)
 
   undo_class->pop                = gimp_vectors_undo_pop;
 
+  g_object_class_install_property (object_class, PROP_PREV_PARENT,
+                                   g_param_spec_object ("prev-parent",
+                                                        NULL, NULL,
+                                                        GIMP_TYPE_VECTORS,
+                                                        GIMP_PARAM_READWRITE |
+                                                        G_PARAM_CONSTRUCT_ONLY));
+
   g_object_class_install_property (object_class, PROP_PREV_POSITION,
                                    g_param_spec_int ("prev-position", NULL, NULL,
                                                      0, G_MAXINT, 0,
@@ -120,6 +128,9 @@ gimp_vectors_undo_set_property (GObject      *object,
 
   switch (property_id)
     {
+    case PROP_PREV_PARENT:
+      vectors_undo->prev_parent = g_value_get_object (value);
+      break;
     case PROP_PREV_POSITION:
       vectors_undo->prev_position = g_value_get_int (value);
       break;
@@ -143,6 +154,9 @@ gimp_vectors_undo_get_property (GObject    *object,
 
   switch (property_id)
     {
+    case PROP_PREV_PARENT:
+      g_value_set_object (value, vectors_undo->prev_parent);
+      break;
     case PROP_PREV_POSITION:
       g_value_set_int (value, vectors_undo->prev_position);
       break;
@@ -188,7 +202,10 @@ gimp_vectors_undo_pop (GimpUndo            *undo,
     {
       /*  remove vectors  */
 
-      /*  record the current position  */
+      /*  record the current parent and position  */
+      vectors_undo->prev_parent =
+        GIMP_VECTORS (gimp_viewable_get_parent (GIMP_VIEWABLE (vectors)));
+
       vectors_undo->prev_position = gimp_item_get_index (GIMP_ITEM (vectors));
 
       gimp_image_remove_vectors (undo->image, vectors, FALSE,
@@ -202,6 +219,7 @@ gimp_vectors_undo_pop (GimpUndo            *undo,
       vectors_undo->prev_vectors = gimp_image_get_active_vectors (undo->image);
 
       gimp_image_add_vectors (undo->image, vectors,
+                              vectors_undo->prev_parent,
                               vectors_undo->prev_position, FALSE);
 
       GIMP_ITEM (vectors)->removed = FALSE;
diff --git a/app/vectors/gimpvectorsundo.h b/app/vectors/gimpvectorsundo.h
index bde3f4a..857dc82 100644
--- a/app/vectors/gimpvectorsundo.h
+++ b/app/vectors/gimpvectorsundo.h
@@ -36,6 +36,7 @@ struct _GimpVectorsUndo
 {
   GimpItemUndo  parent_instance;
 
+  GimpVectors  *prev_parent;
   gint          prev_position;   /*  former position in list  */
   GimpVectors  *prev_vectors;    /*  previous active vectors  */
 };
diff --git a/app/widgets/gimpchanneltreeview.c b/app/widgets/gimpchanneltreeview.c
index 9d43b56..b469a32 100644
--- a/app/widgets/gimpchanneltreeview.c
+++ b/app/widgets/gimpchanneltreeview.c
@@ -2,7 +2,7 @@
  * Copyright (C) 1995 Spencer Kimball and Peter Mattis
  *
  * gimpchanneltreeview.c
- * Copyright (C) 2001-2004 Michael Natterer <mitch gimp org>
+ * Copyright (C) 2001-2009 Michael Natterer <mitch gimp org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -51,9 +51,9 @@
 
 struct _GimpChannelTreeViewPriv
 {
-  GtkWidget            *component_editor;
+  GtkWidget *component_editor;
 
-  GtkWidget            *toselection_button;
+  GtkWidget *toselection_button;
 };
 
 
@@ -212,24 +212,22 @@ gimp_channel_tree_view_drop_viewable (GimpContainerTreeView   *tree_view,
                                       GtkTreeViewDropPosition  drop_pos)
 {
   GimpItemTreeView      *item_view = GIMP_ITEM_TREE_VIEW (tree_view);
+  GimpImage             *image     = gimp_item_tree_view_get_image (item_view);
   GimpItemTreeViewClass *item_view_class;
 
   item_view_class = GIMP_ITEM_TREE_VIEW_GET_CLASS (item_view);
 
   if (GIMP_IS_DRAWABLE (src_viewable) &&
-      (gimp_item_tree_view_get_image (item_view) != gimp_item_get_image (GIMP_ITEM (src_viewable)) ||
+      (image != gimp_item_get_image (GIMP_ITEM (src_viewable)) ||
        G_TYPE_FROM_INSTANCE (src_viewable) != item_view_class->item_type))
     {
       GimpItem *new_item;
-      gint      index = -1;
+      GimpItem *parent;
+      gint      index;
 
-      if (dest_viewable)
-        {
-          index = gimp_item_get_index (GIMP_ITEM (dest_viewable));
-
-          if (drop_pos == GTK_TREE_VIEW_DROP_AFTER)
-            index++;
-        }
+      index = gimp_item_tree_view_get_drop_index (item_view, dest_viewable,
+                                                  drop_pos,
+                                                  (GimpViewable **) &parent);
 
       new_item = gimp_item_convert (GIMP_ITEM (src_viewable),
                                     gimp_item_tree_view_get_image (item_view),
@@ -237,8 +235,10 @@ gimp_channel_tree_view_drop_viewable (GimpContainerTreeView   *tree_view,
 
       gimp_item_set_linked (new_item, FALSE, FALSE);
 
-      item_view_class->add_item (gimp_item_tree_view_get_image (item_view), new_item, index, TRUE);
-      gimp_image_flush (gimp_item_tree_view_get_image (item_view));
+      item_view_class->add_item (image, new_item, parent, index, TRUE);
+
+      gimp_image_flush (image);
+
       return;
     }
 
@@ -256,18 +256,16 @@ gimp_channel_tree_view_drop_component (GimpContainerTreeView   *tree_view,
                                        GtkTreeViewDropPosition  drop_pos)
 {
   GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (tree_view);
+  GimpImage        *image     = gimp_item_tree_view_get_image (item_view);
   GimpItem         *new_item;
-  gint              index     = -1;
+  GimpChannel      *parent;
+  gint              index;
   const gchar      *desc;
   gchar            *name;
 
-  if (dest_viewable)
-    {
-      index = gimp_item_get_index (GIMP_ITEM (dest_viewable));
-
-      if (drop_pos == GTK_TREE_VIEW_DROP_AFTER)
-        index++;
-    }
+  index = gimp_item_tree_view_get_drop_index (item_view, dest_viewable,
+                                              drop_pos,
+                                              (GimpViewable **) &parent);
 
   gimp_enum_get_value (GIMP_TYPE_CHANNEL_TYPE, component,
                        NULL, NULL, &desc, NULL);
@@ -283,12 +281,12 @@ gimp_channel_tree_view_drop_component (GimpContainerTreeView   *tree_view,
 
   g_free (name);
 
-  if (src_image != gimp_item_tree_view_get_image (item_view))
-    GIMP_ITEM_GET_CLASS (new_item)->convert (new_item, gimp_item_tree_view_get_image (item_view));
+  if (src_image != image)
+    GIMP_ITEM_GET_CLASS (new_item)->convert (new_item, image);
+
+  gimp_image_add_channel (image, GIMP_CHANNEL (new_item), parent, index, TRUE);
 
-  gimp_image_add_channel (gimp_item_tree_view_get_image (item_view), GIMP_CHANNEL (new_item), index,
-                          TRUE);
-  gimp_image_flush (gimp_item_tree_view_get_image (item_view));
+  gimp_image_flush (image);
 }
 
 
@@ -346,7 +344,8 @@ gimp_channel_tree_view_item_new (GimpImage *image)
                                   gimp_image_get_height (image),
                                   _("Empty Channel"), &color);
 
-  gimp_image_add_channel (image, new_channel, -1, TRUE);
+  /* FIXME tree */
+  gimp_image_add_channel (image, new_channel, NULL, -1, TRUE);
 
   gimp_image_undo_group_end (image);
 
diff --git a/app/widgets/gimpitemtreeview.c b/app/widgets/gimpitemtreeview.c
index 0087a5a..b98247c 100644
--- a/app/widgets/gimpitemtreeview.c
+++ b/app/widgets/gimpitemtreeview.c
@@ -2,7 +2,7 @@
  * Copyright (C) 1995 Spencer Kimball and Peter Mattis
  *
  * gimpitemtreeview.c
- * Copyright (C) 2001-2003 Michael Natterer <mitch gimp org>
+ * Copyright (C) 2001-2009 Michael Natterer <mitch gimp org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -493,6 +493,45 @@ gimp_item_tree_view_get_edit_button (GimpItemTreeView *view)
   return view->priv->edit_button;
 }
 
+gint
+gimp_item_tree_view_get_drop_index (GimpItemTreeView         *view,
+                                    GimpViewable             *dest_viewable,
+                                    GtkTreeViewDropPosition   drop_pos,
+                                    GimpViewable            **parent)
+{
+  gint index = -1;
+
+  g_return_val_if_fail (GIMP_IS_ITEM_TREE_VIEW (view), -1);
+  g_return_val_if_fail (dest_viewable == NULL ||
+                        GIMP_IS_VIEWABLE (dest_viewable), -1);
+  g_return_val_if_fail (parent != NULL, -1);
+
+  *parent = NULL;
+
+  if (dest_viewable)
+    {
+      *parent = gimp_viewable_get_parent (dest_viewable);
+      index   = gimp_item_get_index (GIMP_ITEM (dest_viewable));
+
+      if (drop_pos == GTK_TREE_VIEW_DROP_AFTER)
+        {
+          GimpContainer *children = gimp_viewable_get_children (dest_viewable);
+
+          if (children)
+            {
+              *parent = dest_viewable;
+              index   = 0;
+            }
+          else
+            {
+              index++;
+            }
+        }
+    }
+
+  return index;
+}
+
 static void
 gimp_item_tree_view_real_set_image (GimpItemTreeView *view,
                                     GimpImage        *image)
@@ -768,19 +807,22 @@ gimp_item_tree_view_drop_viewable (GimpContainerTreeView   *tree_view,
     {
       GType     item_type = item_view_class->item_type;
       GimpItem *new_item;
+      GimpItem *parent;
 
       if (g_type_is_a (G_TYPE_FROM_INSTANCE (src_viewable), item_type))
         item_type = G_TYPE_FROM_INSTANCE (src_viewable);
 
-      if (dest_viewable && drop_pos == GTK_TREE_VIEW_DROP_AFTER)
-        dest_index++;
+      dest_index = gimp_item_tree_view_get_drop_index (item_view, dest_viewable,
+                                                       drop_pos,
+                                                       (GimpViewable **) &parent);
 
       new_item = gimp_item_convert (GIMP_ITEM (src_viewable),
                                     item_view->priv->image, item_type);
 
       gimp_item_set_linked (new_item, FALSE, FALSE);
 
-      item_view_class->add_item (item_view->priv->image, new_item, dest_index, TRUE);
+      item_view_class->add_item (item_view->priv->image, new_item,
+                                 parent, dest_index, TRUE);
     }
   else if (dest_viewable)
     {
diff --git a/app/widgets/gimpitemtreeview.h b/app/widgets/gimpitemtreeview.h
index a6d3ed2..a2a58bc 100644
--- a/app/widgets/gimpitemtreeview.h
+++ b/app/widgets/gimpitemtreeview.h
@@ -36,6 +36,7 @@ typedef void            (* GimpReorderItemFunc)  (GimpImage       *image,
                                                   const gchar     *undo_desc);
 typedef void            (* GimpAddItemFunc)      (GimpImage       *image,
                                                   GimpItem        *item,
+                                                  GimpItem        *parent,
                                                   gint             index,
                                                   gboolean         push_undo);
 typedef void            (* GimpRemoveItemFunc)   (GimpImage       *image,
@@ -117,5 +118,10 @@ GimpImage * gimp_item_tree_view_get_image       (GimpItemTreeView *view);
 GtkWidget * gimp_item_tree_view_get_new_button  (GimpItemTreeView *view);
 GtkWidget * gimp_item_tree_view_get_edit_button (GimpItemTreeView *view);
 
+gint        gimp_item_tree_view_get_drop_index  (GimpItemTreeView *view,
+                                                 GimpViewable     *dest_viewable,
+                                                 GtkTreeViewDropPosition drop_pos,
+                                                 GimpViewable    **parent);
+
 
 #endif  /*  __GIMP_ITEM_TREE_VIEW_H__  */
diff --git a/app/widgets/gimplayertreeview.c b/app/widgets/gimplayertreeview.c
index 3fccc65..d3e7693 100644
--- a/app/widgets/gimplayertreeview.c
+++ b/app/widgets/gimplayertreeview.c
@@ -2,7 +2,7 @@
  * Copyright (C) 1995 Spencer Kimball and Peter Mattis
  *
  * gimplayertreeview.c
- * Copyright (C) 2001-2003 Michael Natterer <mitch gimp org>
+ * Copyright (C) 2001-2009 Michael Natterer <mitch gimp org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -715,16 +715,13 @@ gimp_layer_tree_view_drop_uri_list (GimpContainerTreeView   *view,
   GimpItemTreeView  *item_view = GIMP_ITEM_TREE_VIEW (view);
   GimpContainerView *cont_view = GIMP_CONTAINER_VIEW (view);
   GimpImage         *image     = gimp_item_tree_view_get_image (item_view);
-  gint               index     = -1;
+  GimpLayer         *parent;
+  gint               index;
   GList             *list;
 
-  if (dest_viewable)
-    {
-      index = gimp_item_get_index (GIMP_ITEM (dest_viewable));
-
-      if (drop_pos == GTK_TREE_VIEW_DROP_AFTER)
-        index++;
-    }
+  index = gimp_item_tree_view_get_drop_index (item_view, dest_viewable,
+                                              drop_pos,
+                                              (GimpViewable **) &parent);
 
   for (list = uri_list; list; list = g_list_next (list))
     {
@@ -742,7 +739,7 @@ gimp_layer_tree_view_drop_uri_list (GimpContainerTreeView   *view,
 
       if (new_layers)
         {
-          gimp_image_add_layers (image, new_layers, index,
+          gimp_image_add_layers (image, new_layers, parent, index,
                                  0, 0,
                                  gimp_image_get_width (image),
                                  gimp_image_get_height (image),
@@ -776,22 +773,20 @@ gimp_layer_tree_view_drop_component (GimpContainerTreeView   *tree_view,
                                      GtkTreeViewDropPosition  drop_pos)
 {
   GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (tree_view);
+  GimpImage        *image     = gimp_item_tree_view_get_image (item_view);
   GimpChannel      *channel;
   GimpItem         *new_item;
+  GimpLayer        *parent;
+  gint              index;
   const gchar      *desc;
-  gint              index = -1;
 
-  if (dest_viewable)
-    {
-      index = gimp_item_get_index (GIMP_ITEM (dest_viewable));
-
-      if (drop_pos == GTK_TREE_VIEW_DROP_AFTER)
-        index++;
-    }
+  index = gimp_item_tree_view_get_drop_index (item_view, dest_viewable,
+                                              drop_pos,
+                                              (GimpViewable **) &parent);
 
   channel = gimp_channel_new_from_component (src_image, component, NULL, NULL);
 
-  new_item = gimp_item_convert (GIMP_ITEM (channel), gimp_item_tree_view_get_image (item_view),
+  new_item = gimp_item_convert (GIMP_ITEM (channel), image,
                                 GIMP_TYPE_LAYER);
 
   g_object_unref (channel);
@@ -801,8 +796,9 @@ gimp_layer_tree_view_drop_component (GimpContainerTreeView   *tree_view,
   gimp_object_take_name (GIMP_OBJECT (new_item),
                          g_strdup_printf (_("%s Channel Copy"), desc));
 
-  gimp_image_add_layer (gimp_item_tree_view_get_image (item_view), GIMP_LAYER (new_item), index, TRUE);
-  gimp_image_flush (gimp_item_tree_view_get_image (item_view));
+  gimp_image_add_layer (image, GIMP_LAYER (new_item), parent, index, TRUE);
+
+  gimp_image_flush (image);
 }
 
 static void
@@ -814,15 +810,12 @@ gimp_layer_tree_view_drop_pixbuf (GimpContainerTreeView   *tree_view,
   GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (tree_view);
   GimpImage        *image     = gimp_item_tree_view_get_image (item_view);
   GimpLayer        *new_layer;
-  gint              index     = -1;
-
-  if (dest_viewable)
-    {
-      index = gimp_item_get_index (GIMP_ITEM (dest_viewable));
+  GimpLayer        *parent;
+  gint              index;
 
-      if (drop_pos == GTK_TREE_VIEW_DROP_AFTER)
-        index++;
-    }
+  index = gimp_item_tree_view_get_drop_index (item_view, dest_viewable,
+                                              drop_pos,
+                                              (GimpViewable **) &parent);
 
   new_layer =
     gimp_layer_new_from_pixbuf (pixbuf, image,
@@ -830,7 +823,8 @@ gimp_layer_tree_view_drop_pixbuf (GimpContainerTreeView   *tree_view,
                                 _("Dropped Buffer"),
                                 GIMP_OPACITY_OPAQUE, GIMP_NORMAL_MODE);
 
-  gimp_image_add_layer (image, new_layer, index, TRUE);
+  gimp_image_add_layer (image, new_layer, parent, index, TRUE);
+
   gimp_image_flush (image);
 }
 
@@ -869,7 +863,8 @@ gimp_layer_tree_view_item_new (GimpImage *image)
                               gimp_image_base_type_with_alpha (image),
                               _("Empty Layer"), 1.0, GIMP_NORMAL_MODE);
 
-  gimp_image_add_layer (image, new_layer, -1, TRUE);
+  /* FIXME tree */
+  gimp_image_add_layer (image, new_layer, NULL, -1, TRUE);
 
   gimp_image_undo_group_end (image);
 
diff --git a/app/widgets/gimptoolbox-dnd.c b/app/widgets/gimptoolbox-dnd.c
index cc377d7..174d287 100644
--- a/app/widgets/gimptoolbox-dnd.c
+++ b/app/widgets/gimptoolbox-dnd.c
@@ -226,7 +226,7 @@ gimp_toolbox_drop_drawable (GtkWidget    *widget,
   gimp_layer_set_opacity (new_layer, GIMP_OPACITY_OPAQUE, FALSE);
   gimp_layer_set_lock_alpha (new_layer, FALSE, FALSE);
 
-  gimp_image_add_layer (new_image, new_layer, 0, TRUE);
+  gimp_image_add_layer (new_image, new_layer, NULL, 0, TRUE);
 
   gimp_image_undo_enable (new_image);
 
@@ -312,7 +312,7 @@ gimp_toolbox_drop_component (GtkWidget       *widget,
   gimp_object_take_name (GIMP_OBJECT (new_layer),
                          g_strdup_printf (_("%s Channel Copy"), desc));
 
-  gimp_image_add_layer (new_image, new_layer, 0, TRUE);
+  gimp_image_add_layer (new_image, new_layer, NULL, 0, TRUE);
 
   gimp_image_undo_enable (new_image);
 
@@ -361,7 +361,7 @@ gimp_toolbox_drop_pixbuf (GtkWidget *widget,
                                 _("Dropped Buffer"),
                                 GIMP_OPACITY_OPAQUE, GIMP_NORMAL_MODE);
 
-  gimp_image_add_layer (new_image, new_layer, 0, TRUE);
+  gimp_image_add_layer (new_image, new_layer, NULL, 0, TRUE);
 
   gimp_image_undo_enable (new_image);
 
diff --git a/app/widgets/gimpvectorstreeview.c b/app/widgets/gimpvectorstreeview.c
index 55f72ba..4e0c248 100644
--- a/app/widgets/gimpvectorstreeview.c
+++ b/app/widgets/gimpvectorstreeview.c
@@ -2,7 +2,7 @@
  * Copyright (C) 1995 Spencer Kimball and Peter Mattis
  *
  * gimpvectorstreeview.c
- * Copyright (C) 2001-2004 Michael Natterer <mitch gimp org>
+ * Copyright (C) 2001-2009 Michael Natterer <mitch gimp org>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -225,24 +225,21 @@ gimp_vectors_tree_view_drop_svg (GimpContainerTreeView   *tree_view,
                                  GimpViewable            *dest_viewable,
                                  GtkTreeViewDropPosition  drop_pos)
 {
-  GimpItemTreeView *view  = GIMP_ITEM_TREE_VIEW (tree_view);
-  GimpImage        *image = gimp_item_tree_view_get_image (view);
-  gint              index = -1;
+  GimpItemTreeView *item_view = GIMP_ITEM_TREE_VIEW (tree_view);
+  GimpImage        *image     = gimp_item_tree_view_get_image (item_view);
+  GimpVectors      *parent;
+  gint              index;
   GError           *error = NULL;
 
   if (image->gimp->be_verbose)
     g_print ("%s: SVG dropped (len = %d)\n", G_STRFUNC, (gint) svg_data_len);
 
-  if (dest_viewable)
-    {
-      index = gimp_item_get_index (GIMP_ITEM (dest_viewable));
-
-      if (drop_pos == GTK_TREE_VIEW_DROP_AFTER)
-        index++;
-    }
+  index = gimp_item_tree_view_get_drop_index (item_view, dest_viewable,
+                                              drop_pos,
+                                              (GimpViewable **) &parent);
 
   if (! gimp_vectors_import_buffer (image, svg_data, svg_data_len,
-                                    TRUE, TRUE, index, NULL, &error))
+                                    TRUE, TRUE, parent, index, NULL, &error))
     {
       gimp_message_literal (image->gimp,
 			    G_OBJECT (tree_view), GIMP_MESSAGE_ERROR,
@@ -262,7 +259,8 @@ gimp_vectors_tree_view_item_new (GimpImage *image)
 
   new_vectors = gimp_vectors_new (image, _("Empty Path"));
 
-  gimp_image_add_vectors (image, new_vectors, -1, TRUE);
+  /* FIXME tree */
+  gimp_image_add_vectors (image, new_vectors, NULL, -1, TRUE);
 
   return GIMP_ITEM (new_vectors);
 }
diff --git a/app/xcf/xcf-load.c b/app/xcf/xcf-load.c
index 48d0e1a..8f7eeea 100644
--- a/app/xcf/xcf-load.c
+++ b/app/xcf/xcf-load.c
@@ -200,6 +200,7 @@ xcf_load_image (Gimp     *gimp,
       /* add the layer to the image if its not the floating selection */
       if (layer != info->floating_sel)
         gimp_image_add_layer (image, layer,
+                              NULL, /* FIXME tree */
                               gimp_container_get_n_children (image->layers),
                               FALSE);
 
@@ -242,6 +243,7 @@ xcf_load_image (Gimp     *gimp,
       /* add the channel to the image if its not the selection */
       if (channel != gimp_image_get_mask (image))
         gimp_image_add_channel (image, channel,
+                                NULL, /* FIXME tree */
                                 gimp_container_get_n_children (image->channels),
                                 FALSE);
 
@@ -1630,6 +1632,7 @@ xcf_load_old_path (XcfInfo   *info,
     gimp_item_set_tattoo (GIMP_ITEM (vectors), tattoo);
 
   gimp_image_add_vectors (image, vectors,
+                          NULL, /* can't be a tree */
                           gimp_container_get_n_children (image->vectors),
                           FALSE);
 
@@ -1822,6 +1825,7 @@ xcf_load_vector (XcfInfo   *info,
     }
 
   gimp_image_add_vectors (image, vectors,
+                          NULL, /* FIXME tree */
                           gimp_container_get_n_children (image->vectors),
                           FALSE);
 
diff --git a/tools/pdbgen/pdb/image.pdb b/tools/pdbgen/pdb/image.pdb
index ffb1cee..7bdc071 100644
--- a/tools/pdbgen/pdb/image.pdb
+++ b/tools/pdbgen/pdb/image.pdb
@@ -1013,7 +1013,9 @@ HELP
 				   GIMP_IMAGE_TYPE_BASE_TYPE (gimp_drawable_type (GIMP_DRAWABLE (layer))),
 				   error))
     {
-      success = gimp_image_add_layer (image, layer, MAX (position, -1), TRUE);
+      /* FIXME tree */
+      success = gimp_image_add_layer (image, layer,
+                                      NULL, MAX (position, -1), TRUE);
     }
   else
     {
@@ -1218,7 +1220,9 @@ HELP
 {
   if (gimp_pdb_item_is_floating (GIMP_ITEM (channel), image, error))
     {
-      success = gimp_image_add_channel (image, channel, MAX (position, -1), TRUE);
+      /* FIXME tree */
+      success = gimp_image_add_channel (image, channel,
+                                        NULL, MAX (position, -1), TRUE);
     }
   else
     {
@@ -1282,7 +1286,9 @@ HELP
 {
   if (gimp_pdb_item_is_floating (GIMP_ITEM (vectors), image, error))
     {
-      success = gimp_image_add_vectors (image, vectors, MAX (position, -1), TRUE);
+      /* FIXME tree */
+      success = gimp_image_add_vectors (image, vectors,
+                                        NULL, MAX (position, -1), TRUE);
     }
   else
     {
diff --git a/tools/pdbgen/pdb/paths.pdb b/tools/pdbgen/pdb/paths.pdb
index b793f95..abe5d76 100644
--- a/tools/pdbgen/pdb/paths.pdb
+++ b/tools/pdbgen/pdb/paths.pdb
@@ -241,7 +241,7 @@ sub path_set_points {
       g_free (points);
 
       if (vectors)
-        success = gimp_image_add_vectors (image, vectors, 0, TRUE);
+        success = gimp_image_add_vectors (image, vectors, NULL, 0, TRUE);
       else
         success = FALSE;
     }
@@ -588,7 +588,7 @@ sub path_import {
 	code    => <<'CODE'
 {
   success = gimp_vectors_import_file (image, filename,
-                                      merge, scale, -1, NULL, NULL);
+                                      merge, scale, NULL, -1, NULL, NULL);
 }
 CODE
     );
diff --git a/tools/pdbgen/pdb/vectors.pdb b/tools/pdbgen/pdb/vectors.pdb
index 3df438e..eaa1ec8 100644
--- a/tools/pdbgen/pdb/vectors.pdb
+++ b/tools/pdbgen/pdb/vectors.pdb
@@ -1265,8 +1265,10 @@ HELP
 {
   GList *list, *vectors_list = NULL;
 
+  /* FIXME tree */
   success = gimp_vectors_import_file (image, filename,
-                                      merge, scale, -1, &vectors_list, error);
+                                      merge, scale, NULL, -1,
+                                      &vectors_list, error);
 
   if (success)
     {
@@ -1328,8 +1330,10 @@ HELP
 {
   GList *list, *vectors_list = NULL;
 
+  /* FIXME tree */
   success = gimp_vectors_import_buffer (image, string, length,
-                                        merge, scale, -1, &vectors_list, error);
+                                        merge, scale, NULL, -1,
+                                        &vectors_list, error);
 
   if (success)
     {



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