Skip to content
Snippets Groups Projects
Commit 0f19480a authored by Simon Barner's avatar Simon Barner
Browse files

- doCompositorBasedDelete(): Sort list of deletion targets such that object...

- doCompositorBasedDelete(): Sort list of deletion targets such that object whose eContainer() is not contained in 'targets' are deleted first (e.g., free connectors in hierarchical element models).
- This is required to avoid an NPE when the GUI is refreshed while the list of object to be deleted is processed.

refs 2231
parent d4376282
No related branches found
No related tags found
No related merge requests found
......@@ -23,8 +23,11 @@ import static org.eclipse.ui.PlatformUI.getWorkbench;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.dialogs.IDialogConstants;
......@@ -52,7 +55,7 @@ import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService;
* @author hoelzl
* @author $Author$
* @version $Rev$
* @ConQAT.Rating YELLOW Hash: 321312CCB8B9B8E9973A26EEB4C895EF
* @ConQAT.Rating YELLOW Hash: 3B08C0EC7040F9C58DBD551958C4FBAF
*/
public class DeleteAction extends EObjectActionBase<EObject> {
......@@ -131,7 +134,31 @@ public class DeleteAction extends EObjectActionBase<EObject> {
/** Executes the delete using the correct service. */
private static void doCompositorBasedDelete(List<EObject> targets) {
for(EObject target : targets) {
// Sort list of deletion targets such that object whose eContainer() is not contained in
// 'targets' are deleted first (e.g., free connectors in hierarchical element models).
Set<EObject> targetSet = new HashSet<EObject>();
targetSet.addAll(targets);
// First, put all objects whose container is contained in 'targets' as well as the container
// itself to the sorted list.
LinkedList<EObject> sortedTargets = new LinkedList<EObject>();
for(EObject obj : targets) {
EObject container = obj.eContainer();
if(targetSet.contains(container)) {
sortedTargets.addLast(obj);
targetSet.remove(obj);
sortedTargets.addLast(container);
targetSet.remove(container);
}
}
// Then, put all remaining objects (e.g., whose container is not contained in 'targets'), to
// the beginning of the sorted list
for(EObject obj : targetSet) {
sortedTargets.addFirst(obj);
}
for(EObject target : sortedTargets) {
if(IElementCompositorService.INSTANCE.canDecompose(target)) {
IElementCompositorService.INSTANCE.decompose(target);
} else if(IConnectionCompositorService.INSTANCE.canDisconnect(target)) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment