use of org.eclipse.elk.alg.graphviz.dot.dot.EdgeTarget in project elk by eclipse.
the class AbstractGraphvizDotSemanticSequencer method sequence.
@Override
public void sequence(ISerializationContext context, EObject semanticObject) {
EPackage epackage = semanticObject.eClass().getEPackage();
ParserRule rule = context.getParserRule();
Action action = context.getAssignedAction();
Set<Parameter> parameters = context.getEnabledBooleanParameters();
if (epackage == DotPackage.eINSTANCE)
switch(semanticObject.eClass().getClassifierID()) {
case DotPackage.ATTRIBUTE:
if (rule == grammarAccess.getStatementRule() || rule == grammarAccess.getAttributeRule()) {
sequence_Attribute(context, (Attribute) semanticObject);
return;
} else if (rule == grammarAccess.getListAttributeRule()) {
sequence_ListAttribute(context, (Attribute) semanticObject);
return;
} else
break;
case DotPackage.ATTRIBUTE_STATEMENT:
sequence_AttributeStatement(context, (AttributeStatement) semanticObject);
return;
case DotPackage.EDGE_STATEMENT:
sequence_EdgeStatement(context, (EdgeStatement) semanticObject);
return;
case DotPackage.EDGE_TARGET:
sequence_EdgeTarget(context, (EdgeTarget) semanticObject);
return;
case DotPackage.GRAPH:
sequence_Graph(context, (Graph) semanticObject);
return;
case DotPackage.GRAPHVIZ_MODEL:
sequence_GraphvizModel(context, (GraphvizModel) semanticObject);
return;
case DotPackage.NODE:
sequence_Node(context, (Node) semanticObject);
return;
case DotPackage.NODE_STATEMENT:
sequence_NodeStatement(context, (NodeStatement) semanticObject);
return;
case DotPackage.PORT:
sequence_Port(context, (Port) semanticObject);
return;
case DotPackage.SUBGRAPH:
sequence_Subgraph(context, (Subgraph) semanticObject);
return;
}
if (errorAcceptor != null)
errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context));
}
use of org.eclipse.elk.alg.graphviz.dot.dot.EdgeTarget in project elk by eclipse.
the class DotExporter method transformEdges.
/**
* Transform the edges of the given parent node.
*
* @param parent a parent node
* @param statements the list to which new statements are added
* @param transData transformation data
*/
private void transformEdges(final ElkNode parent, final List<Statement> statements, final IDotTransformationData<ElkNode, GraphvizModel> transData) {
boolean hierarchy = transData.getProperty(HIERARCHY);
boolean transformEdgeLayout = transData.getProperty(TRANSFORM_EDGE_LAYOUT);
Direction direction = parent.getProperty(CoreOptions.DIRECTION);
boolean vertical = direction == Direction.DOWN || direction == Direction.UP || direction == Direction.UNDEFINED;
LinkedList<ElkNode> nodes = new LinkedList<>(parent.getChildren());
BiMap<ElkGraphElement, String> nodeIds = transData.getProperty(GRAPH_ELEMS).inverse();
while (!nodes.isEmpty()) {
ElkNode source = nodes.removeFirst();
for (ElkEdge edge : ElkGraphUtil.allOutgoingEdges(source)) {
// We don't support hyperedges
if (edge.isHyperedge()) {
throw new UnsupportedGraphException("Hyperedges are not supported.");
}
ElkNode target = ElkGraphUtil.connectableShapeToNode(edge.getTargets().get(0));
// cross-hierarchy edges are considered only if hierarchy mode is active
if (source.getParent() == target.getParent() || hierarchy && isInsideGraph(target, transData.getSourceGraph())) {
EdgeStatement edgeStatement = DotFactory.eINSTANCE.createEdgeStatement();
List<Attribute> attributes = edgeStatement.getAttributes();
// set source node or cluster
Node sourceNode = DotFactory.eINSTANCE.createNode();
if (hierarchy && !source.getChildren().isEmpty()) {
sourceNode.setName(source.getProperty(CLUSTER_DUMMY));
attributes.add(createAttribute(Attributes.LTAIL, nodeIds.get(source)));
} else {
sourceNode.setName(nodeIds.get(source));
}
edgeStatement.setSourceNode(sourceNode);
// set target node or cluster
EdgeTarget edgeTarget = DotFactory.eINSTANCE.createEdgeTarget();
Node targetNode = DotFactory.eINSTANCE.createNode();
if (hierarchy && !target.getChildren().isEmpty()) {
targetNode.setName(target.getProperty(CLUSTER_DUMMY));
attributes.add(createAttribute(Attributes.LHEAD, nodeIds.get(target)));
} else {
targetNode.setName(nodeIds.get(target));
}
edgeTarget.setTargetnode(targetNode);
edgeStatement.getEdgeTargets().add(edgeTarget);
// add edge labels at head, tail, and middle position
setEdgeLabels(edge, attributes, vertical);
if (transData.getProperty(USE_EDGE_IDS)) {
// add comment with edge identifier
String edgeID = getEdgeID(edge, transData);
attributes.add(createAttribute(Attributes.COMMENT, "\"" + edgeID + "\""));
}
// include edge routing for full export, if there is one
if (!edge.getSections().isEmpty()) {
ElkEdgeSection edgeSection = edge.getSections().get(0);
if (transformEdgeLayout && (edgeSection.getBendPoints().size() > 0 || edgeSection.getStartX() != 0 || edgeSection.getStartY() != 0 || edgeSection.getEndX() != 0 || edgeSection.getEndY() != 0)) {
StringBuilder pos = new StringBuilder();
Iterator<KVector> pointIter = ElkUtil.createVectorChain(edgeSection).iterator();
while (pointIter.hasNext()) {
KVector point = pointIter.next();
ElkUtil.toAbsolute(point, edge.getContainingNode());
pos.append(point.x);
pos.append(",");
pos.append(point.y);
if (pointIter.hasNext()) {
pos.append(" ");
}
}
attributes.add(createAttribute(Attributes.POS, "\"" + pos + "\""));
}
}
statements.add(edgeStatement);
}
}
if (hierarchy) {
nodes.addAll(source.getChildren());
}
}
}
use of org.eclipse.elk.alg.graphviz.dot.dot.EdgeTarget in project elk by eclipse.
the class DotImporter method transformEdge.
/**
* Transforms an edge.
*
* @param statement an edge statement
* @param parent the parent node
* @param transData the transformation data instance
* @param defaultProps default values for edge options
*/
private void transformEdge(final EdgeStatement statement, final ElkNode parent, final IDotTransformationData<GraphvizModel, ElkNode> transData, final IPropertyHolder defaultProps) {
String sourceName = statement.getSourceNode().getName();
ElkNode source = transformNode(sourceName, parent, transData);
ElkPort sourcePort = null;
if (statement.getSourceNode().getPort() != null) {
String portName = statement.getSourceNode().getPort().getCompass_pt();
if (portName == null) {
portName = statement.getSourceNode().getPort().getName();
}
sourcePort = transformPort(portName, source, transData);
}
ListIterator<EdgeTarget> targetIter = statement.getEdgeTargets().listIterator();
while (targetIter.hasNext()) {
EdgeTarget edgeTarget = targetIter.next();
ElkEdge elkedge = ElkGraphUtil.createEdge(null);
if (sourcePort != null) {
elkedge.getSources().add(sourcePort);
} else {
elkedge.getSources().add(source);
}
ElkNode target;
ElkPort targetPort = null;
Node edgeTargetNode = edgeTarget.getTargetnode();
String targetName;
if (edgeTargetNode == null) {
targetName = edgeTarget.getTargetSubgraph().getName();
target = transformNode(targetName, parent, transData);
} else {
targetName = edgeTargetNode.getName();
target = transformNode(targetName, parent, transData);
if (edgeTargetNode.getPort() != null) {
String portName = edgeTargetNode.getPort().getCompass_pt();
if (portName == null) {
portName = edgeTargetNode.getPort().getName();
}
targetPort = transformPort(portName, target, transData);
}
}
if (targetPort != null) {
elkedge.getTargets().add(targetPort);
} else {
elkedge.getTargets().add(target);
}
elkedge.copyProperties(defaultProps);
if (targetIter.previousIndex() == 0) {
// this is the first target - just store the edge statement
elkedge.setProperty(PROP_STATEMENT, statement);
} else {
// the edge statement has more that one target - create a copy
EdgeStatement newStatement = DotFactory.eINSTANCE.createEdgeStatement();
Node sourceNode = DotFactory.eINSTANCE.createNode();
sourceNode.setName(sourceName);
newStatement.setSourceNode(sourceNode);
targetIter.remove();
newStatement.getEdgeTargets().add(edgeTarget);
for (Attribute attr : statement.getAttributes()) {
newStatement.getAttributes().add(EcoreUtil.copy(attr));
}
elkedge.setProperty(PROP_STATEMENT, newStatement);
}
// evaluate attributes for the new edge
for (Attribute attr : statement.getAttributes()) {
String value = trimValue(attr);
if (Attributes.LABEL.equals(attr.getName())) {
ElkLabel label = ElkGraphUtil.createLabel(value, elkedge);
label.setProperty(CoreOptions.EDGE_LABELS_PLACEMENT, EdgeLabelPlacement.CENTER);
} else if (Attributes.HEADLABEL.equals(attr.getName())) {
ElkLabel label = ElkGraphUtil.createLabel(value, elkedge);
label.setProperty(CoreOptions.EDGE_LABELS_PLACEMENT, EdgeLabelPlacement.HEAD);
} else if (Attributes.TAILLABEL.equals(attr.getName())) {
ElkLabel label = ElkGraphUtil.createLabel(value, elkedge);
label.setProperty(CoreOptions.EDGE_LABELS_PLACEMENT, EdgeLabelPlacement.TAIL);
} else {
transformAttribute(elkedge, attr, transData);
}
}
// the edge target is the source for the next edge target
source = target;
sourceName = targetName;
sourcePort = targetPort;
}
}
Aggregations