/**
* Copyright (c) 2010-2012 ISBAN S.L
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Ruben De Dios (ISBAN S.L)
* Andrez Alvarez Mattos (ISBAN S.L)
*/
package org.eclipse.gmf.tooling.simplemap.model.triggers.parent;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.gmfgraph.ChildAccess;
import org.eclipse.gmf.gmfgraph.Compartment;
import org.eclipse.gmf.gmfgraph.Connection;
import org.eclipse.gmf.gmfgraph.DecorationFigure;
import org.eclipse.gmf.gmfgraph.DiagramElement;
import org.eclipse.gmf.gmfgraph.Figure;
import org.eclipse.gmf.gmfgraph.FigureDescriptor;
import org.eclipse.gmf.gmfgraph.Node;
import org.eclipse.gmf.gmfgraph.PolylineConnection;
import org.eclipse.gmf.mappings.CompartmentMapping;
import org.eclipse.gmf.mappings.LabelMapping;
import org.eclipse.gmf.mappings.LinkMapping;
import org.eclipse.gmf.mappings.NodeMapping;
import org.eclipse.gmf.mappings.NodeReference;
import org.eclipse.gmf.tooldef.AbstractTool;
import org.eclipse.gmf.tooling.simplemap.model.triggers.AbstractTrigger;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleChildNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleChildReference;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleCompartment;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleLinkMapping;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleNode;
import org.eclipse.gmf.tooling.simplemap.simplemappings.SimpleSubNode;
public class RemoveChildNodeTrigger extends AbstractTrigger {
private List<SimpleChildNode> removedNodes = new ArrayList<SimpleChildNode>();
public RemoveChildNodeTrigger(TransactionalEditingDomain domain, SimpleChildNode removedNode) {
super(domain);
this.removedNodes.add(removedNode);
}
public RemoveChildNodeTrigger(TransactionalEditingDomain domain, List<SimpleChildNode> removedNodes) {
super(domain);
this.removedNodes.addAll(removedNodes);
}
@Override
public void executeTrigger() {
for (SimpleChildNode removedNode : removedNodes)
removeChildNode(removedNode);
}
private void removeChildNode(SimpleChildNode removedNode) {
if (removedNode instanceof SimpleChildReference)
removeSimpleChildReference((SimpleChildReference) removedNode);
if (removedNode instanceof SimpleNode)
removeSimpleNode((SimpleNode) removedNode);
if (removedNode instanceof SimpleCompartment)
removeCompartment((SimpleCompartment) removedNode);
if (removedNode instanceof SimpleLinkMapping)
removeLinkMapping((SimpleLinkMapping) removedNode);
}
private void removeSimpleNode(SimpleNode removedNode) {
if (removedNode instanceof SimpleSubNode)
for (SimpleChildNode childNode : ((SimpleSubNode) removedNode).getChildren())
removeChildNode(childNode);
NodeReference nodeReferenceToRemove = removedNode.getNodeReference();
if (nodeReferenceToRemove != null && nodeReferenceToRemove.eIsProxy())
nodeReferenceToRemove = (NodeReference) EcoreUtil.resolve(nodeReferenceToRemove, getDomain().getResourceSet());
AbstractTool toolToRemove = null;
NodeMapping nodeMappingToRemove = null;
if (nodeReferenceToRemove != null && nodeReferenceToRemove.getChild() != null) {
nodeMappingToRemove = nodeReferenceToRemove.getChild();
toolToRemove = nodeMappingToRemove.getTool();
}
List<DiagramElement> diagramElementsToRemove = collectDiagramElementsToRemove(removedNode);
List<FigureDescriptor> figureDescToRemove = new ArrayList<FigureDescriptor>();
for (DiagramElement diagramElement : diagramElementsToRemove)
if (diagramElement.getFigure() != null)
figureDescToRemove.add(diagramElement.getFigure());
for (FigureDescriptor figDesc : figureDescToRemove)
EcoreUtil.delete(figDesc);
for (DiagramElement diagramElement : diagramElementsToRemove)
EcoreUtil.delete(diagramElement);
if (toolToRemove != null && canRemove(toolToRemove))
EcoreUtil.delete(toolToRemove);
if (nodeMappingToRemove != null)
EcoreUtil.delete(nodeMappingToRemove);
if (nodeReferenceToRemove != null)
EcoreUtil.delete(nodeReferenceToRemove);
}
private void removeSimpleChildReference(SimpleChildReference removedNode) {
NodeReference nodeReferenceToRemove = removedNode.getNodeReference();
if (nodeReferenceToRemove != null && nodeReferenceToRemove.eIsProxy())
nodeReferenceToRemove = (NodeReference) EcoreUtil.resolve(nodeReferenceToRemove, getDomain().getResourceSet());
if (nodeReferenceToRemove != null)
EcoreUtil.delete(nodeReferenceToRemove);
}
private List<DiagramElement> collectDiagramElementsToRemove(SimpleNode removedNode) {
List<DiagramElement> diagramElementsToRemove = new ArrayList<DiagramElement>();
NodeReference nodeReferenceToRemove = removedNode.getNodeReference();
if (nodeReferenceToRemove == null)
return diagramElementsToRemove;
if (nodeReferenceToRemove.eIsProxy())
nodeReferenceToRemove = (NodeReference) EcoreUtil.resolve(nodeReferenceToRemove, getDomain().getResourceSet());
NodeMapping nodeMapping = nodeReferenceToRemove.getChild();
if (nodeMapping != null) {
Node nodeToRemove = nodeMapping.getDiagramNode();
if (nodeToRemove != null && canRemove(nodeToRemove))
diagramElementsToRemove.add(nodeToRemove);
for (LabelMapping labelMapping : nodeMapping.getLabelMappings())
if (labelMapping.getDiagramLabel() != null && canRemove(labelMapping.getDiagramLabel()))
diagramElementsToRemove.add(labelMapping.getDiagramLabel());
}
return diagramElementsToRemove;
}
private List<DiagramElement> collectDiagramElementsToRemove(SimpleLinkMapping removedLinkMapping) {
List<DiagramElement> diagramElementsToRemove = new ArrayList<DiagramElement>();
LinkMapping linkMapping = removedLinkMapping.getLinkMapping();
if (linkMapping != null) {
Connection connectionToRemove = linkMapping.getDiagramLink();
if (connectionToRemove != null && canRemove(connectionToRemove))
diagramElementsToRemove.add(connectionToRemove);
for (LabelMapping labelMapping : linkMapping.getLabelMappings())
if (labelMapping.getDiagramLabel() != null && canRemove(labelMapping.getDiagramLabel()))
diagramElementsToRemove.add(labelMapping.getDiagramLabel());
}
return diagramElementsToRemove;
}
private void removeCompartment(SimpleCompartment removedCompartment) {
for (SimpleChildNode childNode : removedCompartment.getChildren())
removeChildNode(childNode);
CompartmentMapping compartmentMappingToRemove = removedCompartment.getCompartmentMapping();
if (compartmentMappingToRemove.eIsProxy())
compartmentMappingToRemove = (CompartmentMapping) EcoreUtil.resolve(compartmentMappingToRemove, getDomain().getResourceSet());
Compartment compartmentToRemove = compartmentMappingToRemove != null ? compartmentMappingToRemove.getCompartment() : null;
if (compartmentToRemove != null && canRemove(compartmentToRemove)) {
FigureDescriptor labelFigDesToRemove = compartmentToRemove != null ? compartmentToRemove.getFigure() : null;
ChildAccess accessorToRemove = compartmentToRemove != null ? compartmentToRemove.getAccessor() : null;
if (labelFigDesToRemove != null && canRemove(labelFigDesToRemove))
EcoreUtil.delete(labelFigDesToRemove);
if (accessorToRemove != null && canRemove(accessorToRemove)) {
Figure compartmentFigDesToRemove = accessorToRemove != null ? accessorToRemove.getFigure() : null;
if (compartmentFigDesToRemove != null)
EcoreUtil.delete(compartmentFigDesToRemove);
EcoreUtil.delete(accessorToRemove);
}
EcoreUtil.delete(compartmentToRemove);
}
if (compartmentMappingToRemove != null)
EcoreUtil.delete(compartmentMappingToRemove);
}
private void removeLinkMapping(SimpleLinkMapping removedLinkMapping) {
AbstractTool toolToRemove = removedLinkMapping.getTool();
LinkMapping linkMappingToRemove = removedLinkMapping.getLinkMapping();
List<DiagramElement> diagramElementsToRemove = collectDiagramElementsToRemove(removedLinkMapping);
List<FigureDescriptor> figureDescToRemove = new ArrayList<FigureDescriptor>();
DecorationFigure targetDecorationToRemove = null;
DecorationFigure sourceDecorationToRemove = null;
for (DiagramElement diagramElement : diagramElementsToRemove)
if (diagramElement.getFigure() != null) {
figureDescToRemove.add(diagramElement.getFigure());
if (diagramElement.getFigure().getActualFigure() instanceof PolylineConnection) {
targetDecorationToRemove = ((PolylineConnection) diagramElement.getFigure().getActualFigure()).getTargetDecoration();
sourceDecorationToRemove = ((PolylineConnection) diagramElement.getFigure().getActualFigure()).getSourceDecoration();
}
}
for (FigureDescriptor figDesc : figureDescToRemove)
EcoreUtil.delete(figDesc);
for (DiagramElement diagramElement : diagramElementsToRemove)
EcoreUtil.delete(diagramElement);
if (toolToRemove != null && canRemove(toolToRemove))
EcoreUtil.delete(toolToRemove);
if (linkMappingToRemove != null)
EcoreUtil.delete(linkMappingToRemove);
if (targetDecorationToRemove != null)
EcoreUtil.delete(targetDecorationToRemove);
if (sourceDecorationToRemove != null)
EcoreUtil.delete(sourceDecorationToRemove);
}
}