/**
* 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.mapping;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gmf.gmfgraph.ChildAccess;
import org.eclipse.gmf.gmfgraph.DiagramLabel;
import org.eclipse.gmf.gmfgraph.FigureDescriptor;
import org.eclipse.gmf.gmfgraph.Label;
import org.eclipse.gmf.gmfgraph.Node;
import org.eclipse.gmf.gmfgraph.RealFigure;
import org.eclipse.gmf.mappings.FeatureLabelMapping;
import org.eclipse.gmf.mappings.LabelMapping;
import org.eclipse.gmf.mappings.NodeMapping;
import org.eclipse.gmf.tooldef.AbstractTool;
import org.eclipse.gmf.tooling.simplemap.model.triggers.AbstractTrigger;
class SetDomainMetaElementTrigger extends AbstractTrigger {
private EClass newElement;
private NodeMapping nodeMapping;
public SetDomainMetaElementTrigger(TransactionalEditingDomain domain, NodeMapping nodeMapping, EClass newElement) {
super(domain);
this.newElement = newElement;
this.nodeMapping = nodeMapping;
}
@Override
public void executeTrigger() {
String newElementName = newElement != null ? newElement.getName() : "";
updateMapping();
updateCanvas(newElementName);
}
private void updateMapping() {
EAttribute defaultLabelAttribute = getDefaultLabelAttribute();
FeatureLabelMapping defaultFeatureLabelMapping = getDefaultFeatureLabelMapping();
if (defaultFeatureLabelMapping != null && defaultLabelAttribute != null)
defaultFeatureLabelMapping.getFeatures().add(defaultLabelAttribute);
}
/**
* We search for a candidate to be the Label Attribute
* We choose the first String attribute
* TODO we can use a string pattern algorithm (i.e Search for "name" attributes)
* @return
*/
private EAttribute getDefaultLabelAttribute() {
if (newElement != null)
for (EAttribute attribute : newElement.getEAllAttributes()) {
Class<?> attributeInstanceClass = attribute.getEType().getInstanceClass();
Class<?> stringInstanceClass = EcorePackage.eINSTANCE.getEString().getInstanceClass();
if (attributeInstanceClass != null && stringInstanceClass.isAssignableFrom(attributeInstanceClass))
return attribute;
}
return null;
}
private FeatureLabelMapping getDefaultFeatureLabelMapping() {
for (LabelMapping labelMapping : nodeMapping.getLabelMappings())
if (labelMapping instanceof FeatureLabelMapping)
return (FeatureLabelMapping) labelMapping;
return null;
}
private void updateCanvas(String newElementName) {
DiagramLabel diagramLabelToRename = null;
//Devolvemos el primer label definido
if (!nodeMapping.getLabelMappings().isEmpty())
diagramLabelToRename = nodeMapping.getLabelMappings().get(0).getDiagramLabel();
Node nodeToRename = nodeMapping.getDiagramNode();
AbstractTool toolToRename = nodeMapping.getTool();
//Node Name
if (nodeToRename != null && canRename(nodeToRename)) {
String newNodeName = getNewCanvasElementName(newElementName, nodeToRename);
nodeToRename.setName(newNodeName);
renameNode(nodeToRename, newElementName);
}
//Tool Name
if (toolToRename != null && canRename(toolToRename)) {
String newToolName = getNewToolName(newElementName, toolToRename);
toolToRename.setTitle(newToolName);
toolToRename.setDescription("Create new " + newElementName);
}
//Label Mapping Name
String newDiagramLabelName = newElementName + "Name";
if (diagramLabelToRename != null && canRename(diagramLabelToRename)) {
String newLabelName = getNewCanvasElementName(newDiagramLabelName, diagramLabelToRename);
diagramLabelToRename.setName(newLabelName);
renameNode(diagramLabelToRename, newElementName);
}
}
private void renameNode(Node nodeToRename, String newElementName) {
String newFigureName = newElementName + "Figure";
//Figure Descriptor Name
FigureDescriptor figDesc = nodeToRename.getFigure();
String newFigDescName = getNewCanvasElementName(newFigureName, figDesc);
figDesc.setName(newFigDescName);
//Figure Name
if (figDesc.getActualFigure() instanceof RealFigure)
((RealFigure) figDesc.getActualFigure()).setName(newFigDescName);
if (nodeToRename instanceof DiagramLabel) {
ChildAccess labelAccessor = ((DiagramLabel) nodeToRename).getAccessor();
if (labelAccessor != null && labelAccessor.getFigure() instanceof Label) {
//Label and Label Accessor Name
String newLabelName = newElementName + "NameFigure";
String newLabelAccessorName = "getFigure" + newLabelName;
((Label) labelAccessor.getFigure()).setName(newLabelName);
labelAccessor.setAccessor(newLabelAccessorName);
}
}
}
}