diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/ElementRemovingContext.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/ElementRemovingContext.cs index f047859e8..a1c6b61f3 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/ElementRemovingContext.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Framework/Elements/ElementRemovingContext.cs @@ -1,13 +1,20 @@ -using Orchard.ContentManagement; +using System.Collections.Generic; +using Orchard.ContentManagement; namespace Orchard.Layouts.Framework.Elements { public class ElementRemovingContext { - public ElementRemovingContext(Element element, IContent content) { + public ElementRemovingContext(Element element, IEnumerable elements, IEnumerable removedElements, IContent content) { Element = element; + Elements = elements; + RemovedElements = removedElements; Content = content; } public IContent Content { get; private set; } + // All the other elements on the canvas. + public IEnumerable Elements { get; set; } + // All the other removed elements from the canvas (including the current element). + public IEnumerable RemovedElements { get; set; } public Element Element { get; private set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Providers/PlaceableContentElementHarvester.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Providers/PlaceableContentElementHarvester.cs index c03d5350c..62c49377f 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Providers/PlaceableContentElementHarvester.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Providers/PlaceableContentElementHarvester.cs @@ -129,6 +129,19 @@ namespace Orchard.Layouts.Providers { private void RemoveContentItem(ElementRemovingContext context) { var element = (PlaceableContentItem) context.Element; var contentItemId = element.ContentItemId; + + // Only remove the content item if no other elements are referencing this one. + // This can happen if the user cut an element and then pasted it back. + // That will delete the initial element and create a copy. + var placeableElements = + from e in context.Elements.Flatten() + let p = e as PlaceableContentItem + where p != null && p.ContentItemId == contentItemId + select p; + + if (placeableElements.Any()) + return; + var contentItem = contentItemId != null ? _contentManager.Value.Get(contentItemId.Value, VersionOptions.Latest) : default(ContentItem); if(contentItem != null) diff --git a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementManager.cs b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementManager.cs index 0e10ae9c9..863672541 100644 --- a/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementManager.cs +++ b/src/Orchard.Web/Modules/Orchard.Layouts/Services/ElementManager.cs @@ -153,7 +153,7 @@ namespace Orchard.Layouts.Services { var elements = context.RemovedElements.Flatten().ToList(); foreach (var element in elements) { - var removingContext = new ElementRemovingContext(element, context.Content); + var removingContext = new ElementRemovingContext(element, context.Elements, context.RemovedElements, context.Content); _elementEventHandler.Removing(removingContext); element.Descriptor.Removing(removingContext); }