use of org.eclipse.sirius.components.diagrams.description.SynchronizationPolicy in project sirius-components by eclipse-sirius.
the class AbstractNodeMappingConverter method convert.
public NodeDescription convert(AbstractNodeMapping abstractNodeMapping, AQLInterpreter interpreter, Map<UUID, NodeDescription> id2NodeDescriptions) {
LabelStyleDescriptionConverter labelStyleDescriptionConverter = new LabelStyleDescriptionConverter(interpreter, this.objectService);
Function<VariableManager, org.eclipse.sirius.viewpoint.description.style.LabelStyleDescription> abstractNodeMappingDescriptionProvider = new LabelStyleDescriptionProvider(interpreter, abstractNodeMapping);
Function<VariableManager, String> labelIdProvider = this.getLabelIdProvider();
Function<VariableManager, String> labelExpressionProvider = this.getLabelExpressionProvider(interpreter, abstractNodeMappingDescriptionProvider);
Function<VariableManager, LabelStyleDescription> labelStyleDescriptionProvider = this.getLabelStyleDescriptionProvider(labelStyleDescriptionConverter, abstractNodeMappingDescriptionProvider);
// @formatter:off
LabelDescription labelDescription = LabelDescription.newLabelDescription(this.identifierProvider.getIdentifier(abstractNodeMapping) + LabelDescription.LABEL_SUFFIX).idProvider(labelIdProvider).textProvider(labelExpressionProvider).styleDescriptionProvider(labelStyleDescriptionProvider).build();
// @formatter:on
Function<VariableManager, String> semanticTargetIdProvider = variableManager -> {
return variableManager.get(VariableManager.SELF, Object.class).map(this.objectService::getId).orElse(null);
};
Function<VariableManager, String> semanticTargetKindProvider = variableManager -> {
return variableManager.get(VariableManager.SELF, Object.class).map(this.objectService::getKind).orElse(null);
};
Function<VariableManager, String> semanticTargetLabelProvider = variableManager -> {
return variableManager.get(VariableManager.SELF, Object.class).map(this.objectService::getLabel).orElse(null);
};
Function<VariableManager, INodeStyle> styleProvider = new AbstractNodeMappingStyleProvider(interpreter, abstractNodeMapping);
Function<VariableManager, String> typeProvider = variableManager -> {
var result = NodeType.NODE_RECTANGLE;
INodeStyle style = styleProvider.apply(variableManager);
if (style instanceof ImageNodeStyle) {
result = NodeType.NODE_IMAGE;
} else if (style instanceof ListItemNodeStyle) {
result = NodeType.NODE_LIST_ITEM;
} else if (style instanceof ListNodeStyle) {
result = NodeType.NODE_LIST;
}
return result;
};
AbstractNodeMappingSizeProvider sizeProvider = new AbstractNodeMappingSizeProvider(interpreter, abstractNodeMapping);
String domainClass = abstractNodeMapping.getDomainClass();
String semanticCandidatesExpression = abstractNodeMapping.getSemanticCandidatesExpression();
String preconditionExpression = abstractNodeMapping.getPreconditionExpression();
Function<VariableManager, List<?>> semanticElementsProvider = this.semanticCandidatesProviderFactory.getSemanticCandidatesProvider(interpreter, domainClass, semanticCandidatesExpression, preconditionExpression);
List<NodeDescription> childNodeDescriptions = this.getChildNodeDescriptions(abstractNodeMapping, interpreter, id2NodeDescriptions);
// @formatter:off
List<NodeDescription> borderNodeDescriptions = abstractNodeMapping.getBorderedNodeMappings().stream().map(borderNodeMapping -> this.convert(borderNodeMapping, interpreter, id2NodeDescriptions)).collect(Collectors.toList());
// @formatter:on
ToolConverter toolConverter = new ToolConverter(interpreter, this.editService, this.modelOperationHandlerSwitchProvider);
var deleteHandler = toolConverter.createDeleteToolHandler(abstractNodeMapping.getDeletionDescription());
var labelEditHandler = toolConverter.createDirectEditToolHandler(abstractNodeMapping.getLabelDirectEdit());
SynchronizationPolicy synchronizationPolicy = SynchronizationPolicy.SYNCHRONIZED;
if (!abstractNodeMapping.isCreateElements()) {
synchronizationPolicy = SynchronizationPolicy.UNSYNCHRONIZED;
}
// @formatter:off
NodeDescription description = NodeDescription.newNodeDescription(UUID.fromString(this.identifierProvider.getIdentifier(abstractNodeMapping))).typeProvider(typeProvider).targetObjectIdProvider(semanticTargetIdProvider).targetObjectKindProvider(semanticTargetKindProvider).targetObjectLabelProvider(semanticTargetLabelProvider).semanticElementsProvider(semanticElementsProvider).synchronizationPolicy(synchronizationPolicy).labelDescription(labelDescription).styleProvider(styleProvider).sizeProvider(sizeProvider).borderNodeDescriptions(borderNodeDescriptions).childNodeDescriptions(childNodeDescriptions).labelEditHandler(labelEditHandler).deleteHandler(deleteHandler).build();
// @formatter:on
id2NodeDescriptions.put(description.getId(), description);
return description;
}
use of org.eclipse.sirius.components.diagrams.description.SynchronizationPolicy in project sirius-components by eclipse-sirius.
the class UnsynchronizedDiagramTests method getDiagramDescription.
private DiagramDescription getDiagramDescription() {
// @formatter:off
LabelStyleDescription labelStyleDescription = LabelStyleDescription.newLabelStyleDescription().italicProvider(VariableManager -> true).boldProvider(VariableManager -> true).underlineProvider(VariableManager -> true).strikeThroughProvider(VariableManager -> true).colorProvider(// $NON-NLS-1$
VariableManager -> "#FFFFFF").fontSizeProvider(variableManager -> 10).iconURLProvider(// $NON-NLS-1$
VariableManager -> "").build();
LabelDescription labelDescription = // $NON-NLS-1$
LabelDescription.newLabelDescription("labelDescriptionId").idProvider(// $NON-NLS-1$
variableManager -> "labelid").textProvider(// $NON-NLS-1$
variableManager -> "label").styleDescriptionProvider(variableManager -> labelStyleDescription).build();
Function<VariableManager, INodeStyle> styleProvider = variableManager -> {
return RectangularNodeStyle.newRectangularNodeStyle().color(// $NON-NLS-1$
"").borderColor(// $NON-NLS-1$
"").borderSize(0).borderStyle(LineStyle.Solid).build();
};
NodeDescription subUnsynchronizedNodeDescription = // $NON-NLS-1$
NodeDescription.newNodeDescription(UUID.nameUUIDFromBytes("subUnsynchronized".getBytes())).synchronizationPolicy(SynchronizationPolicy.UNSYNCHRONIZED).typeProvider(variableManager -> NODE_TYPE).semanticElementsProvider(variableManager -> List.of(new Object())).targetObjectIdProvider(variableManager -> TARGET_OBJECT_ID).targetObjectKindProvider(// $NON-NLS-1$
variableManager -> "").targetObjectLabelProvider(// $NON-NLS-1$
variableManager -> "").labelDescription(labelDescription).styleProvider(styleProvider).sizeProvider(variableManager -> Size.UNDEFINED).borderNodeDescriptions(new ArrayList<>()).childNodeDescriptions(new ArrayList<>()).labelEditHandler((variableManager, newLabel) -> new Success()).deleteHandler(variableManager -> new Success()).build();
NodeDescription unsynchronizedNodeDescription = // $NON-NLS-1$
NodeDescription.newNodeDescription(UUID.nameUUIDFromBytes("unsynchronized".getBytes())).synchronizationPolicy(SynchronizationPolicy.UNSYNCHRONIZED).typeProvider(variableManager -> NODE_TYPE).semanticElementsProvider(variableManager -> List.of(new Object())).targetObjectIdProvider(variableManager -> TARGET_OBJECT_ID).targetObjectKindProvider(// $NON-NLS-1$
variableManager -> "").targetObjectLabelProvider(// $NON-NLS-1$
variableManager -> "").labelDescription(labelDescription).styleProvider(styleProvider).sizeProvider(variableManager -> Size.UNDEFINED).borderNodeDescriptions(new ArrayList<>()).childNodeDescriptions(List.of(subUnsynchronizedNodeDescription)).labelEditHandler((variableManager, newLabel) -> new Success()).deleteHandler(variableManager -> new Success()).build();
NodeDescription synchronizedNodeDescription = // $NON-NLS-1$
NodeDescription.newNodeDescription(UUID.nameUUIDFromBytes("synchronized".getBytes())).synchronizationPolicy(SynchronizationPolicy.SYNCHRONIZED).typeProvider(variableManager -> NODE_TYPE).semanticElementsProvider(variableManager -> List.of(new Object())).targetObjectIdProvider(variableManager -> TARGET_OBJECT_ID).targetObjectKindProvider(// $NON-NLS-1$
variableManager -> "").targetObjectLabelProvider(// $NON-NLS-1$
variableManager -> "").labelDescription(labelDescription).styleProvider(styleProvider).sizeProvider(variableManager -> Size.UNDEFINED).borderNodeDescriptions(new ArrayList<>()).childNodeDescriptions(new ArrayList<>()).labelEditHandler((variableManager, newLabel) -> new Success()).deleteHandler(variableManager -> new Success()).build();
DiagramDescription diagramDescription = // $NON-NLS-1$
DiagramDescription.newDiagramDescription(UUID.nameUUIDFromBytes("diagram".getBytes())).label(// $NON-NLS-1$
"").canCreatePredicate(variableManager -> true).targetObjectIdProvider(// $NON-NLS-1$
variableManager -> "diagramTargetObjectId").labelProvider(// $NON-NLS-1$
variableManager -> "label").nodeDescriptions(List.of(unsynchronizedNodeDescription, synchronizedNodeDescription)).edgeDescriptions(List.of()).toolSections(List.of()).dropHandler(// $NON-NLS-1$
variableManager -> new Failure("")).build();
return diagramDescription;
}
use of org.eclipse.sirius.components.diagrams.description.SynchronizationPolicy in project sirius-components by eclipse-sirius.
the class EdgeComponent method render.
@Override
public Element render() {
VariableManager variableManager = this.props.getVariableManager();
EdgeDescription edgeDescription = this.props.getEdgeDescription();
IEdgesRequestor edgesRequestor = this.props.getEdgesRequestor();
DiagramRenderingCache cache = this.props.getCache();
List<Element> children = new ArrayList<>();
// @formatter:off
boolean hasCandidates = this.hasNodeCandidates(edgeDescription.getSourceNodeDescriptions(), cache) && this.hasNodeCandidates(edgeDescription.getTargetNodeDescriptions(), cache);
if (hasCandidates) {
VariableManager semanticElementsVariableManager = new VariableManager();
variableManager.getVariables().forEach(semanticElementsVariableManager::put);
semanticElementsVariableManager.put(DiagramDescription.CACHE, cache);
List<?> semanticElements = edgeDescription.getSemanticElementsProvider().apply(semanticElementsVariableManager);
int count = 0;
for (Object semanticElement : semanticElements) {
VariableManager edgeVariableManager = variableManager.createChild();
edgeVariableManager.put(VariableManager.SELF, semanticElement);
edgeVariableManager.put(DiagramDescription.CACHE, cache);
String targetObjectId = edgeDescription.getTargetObjectIdProvider().apply(edgeVariableManager);
String targetObjectKind = edgeDescription.getTargetObjectKindProvider().apply(edgeVariableManager);
String targetObjectLabel = edgeDescription.getTargetObjectLabelProvider().apply(edgeVariableManager);
List<Element> sourceNodes = edgeDescription.getSourceNodesProvider().apply(edgeVariableManager);
if (!sourceNodes.isEmpty()) {
List<Element> targetNodes = edgeDescription.getTargetNodesProvider().apply(edgeVariableManager);
for (Element sourceNode : sourceNodes) {
for (Element targetNode : targetNodes) {
String id = this.computeEdgeId(edgeDescription, sourceNode, targetNode, count);
var optionalPreviousEdge = edgesRequestor.getById(id);
var edgeInstanceVariableManager = edgeVariableManager.createChild();
edgeInstanceVariableManager.put(EdgeDescription.SEMANTIC_EDGE_SOURCE, cache.getNodeToObject().get(sourceNode));
edgeInstanceVariableManager.put(EdgeDescription.SEMANTIC_EDGE_TARGET, cache.getNodeToObject().get(targetNode));
SynchronizationPolicy synchronizationPolicy = edgeDescription.getSynchronizationPolicy();
boolean shouldRender = synchronizationPolicy == SynchronizationPolicy.SYNCHRONIZED || (synchronizationPolicy == SynchronizationPolicy.UNSYNCHRONIZED && optionalPreviousEdge.isPresent());
if (shouldRender) {
EdgeStyle style = edgeDescription.getStyleProvider().apply(edgeInstanceVariableManager);
String sourceId = this.getId(sourceNode);
String targetId = this.getId(targetNode);
// @formatter:off
String edgeType = optionalPreviousEdge.map(Edge::getType).orElse(// $NON-NLS-1$
"edge:straight");
List<Position> routingPoints = optionalPreviousEdge.map(Edge::getRoutingPoints).orElse(List.of());
Ratio sourceAnchorRelativePosition = optionalPreviousEdge.map(Edge::getSourceAnchorRelativePosition).orElse(Ratio.UNDEFINED);
Ratio targetAnchorRelativePosition = optionalPreviousEdge.map(Edge::getTargetAnchorRelativePosition).orElse(Ratio.UNDEFINED);
List<Element> labelChildren = this.getLabelsChildren(edgeDescription, edgeInstanceVariableManager, optionalPreviousEdge, id, routingPoints);
EdgeElementProps edgeElementProps = EdgeElementProps.newEdgeElementProps(id).type(edgeType).descriptionId(edgeDescription.getId()).targetObjectId(targetObjectId).targetObjectKind(targetObjectKind).targetObjectLabel(targetObjectLabel).sourceId(sourceId).targetId(targetId).style(style).routingPoints(routingPoints).sourceAnchorRelativePosition(sourceAnchorRelativePosition).targetAnchorRelativePosition(targetAnchorRelativePosition).children(labelChildren).build();
// @formatter:on
Element edgeElement = new Element(EdgeElementProps.TYPE, edgeElementProps);
children.add(edgeElement);
count++;
}
}
}
}
}
}
FragmentProps fragmentProps = new FragmentProps(children);
return new Fragment(fragmentProps);
}
use of org.eclipse.sirius.components.diagrams.description.SynchronizationPolicy in project sirius-components by eclipse-sirius.
the class DiagramDescriptionConverter method convert.
private EdgeDescription convert(org.eclipse.sirius.components.view.EdgeDescription viewEdgeDescription, AQLInterpreter interpreter) {
Function<VariableManager, List<?>> semanticElementsProvider;
if (viewEdgeDescription.isIsDomainBasedEdge()) {
// Same logic as for nodes.
semanticElementsProvider = this.getSemanticElementsProvider(viewEdgeDescription, interpreter);
} else {
//
var sourceNodeDescriptions = viewEdgeDescription.getSourceNodeDescriptions().stream().map(this.convertedNodes::get);
semanticElementsProvider = new RelationBasedSemanticElementsProvider(sourceNodeDescriptions.map(NodeDescription::getId).collect(Collectors.toList()));
}
Function<VariableManager, List<Element>> sourceNodesProvider = null;
if (viewEdgeDescription.isIsDomainBasedEdge()) {
sourceNodesProvider = variableManager -> {
var optionalCache = variableManager.get(DiagramDescription.CACHE, DiagramRenderingCache.class);
if (optionalCache.isEmpty()) {
return List.of();
}
DiagramRenderingCache cache = optionalCache.get();
String sourceFinderExpression = viewEdgeDescription.getSourceNodesExpression();
Result result = interpreter.evaluateExpression(variableManager.getVariables(), sourceFinderExpression);
List<Object> semanticCandidates = result.asObjects().orElse(List.of());
var nodeCandidates = semanticCandidates.stream().flatMap(semanticObject -> cache.getElementsRepresenting(semanticObject).stream());
// @formatter:off
return nodeCandidates.filter(nodeElement -> viewEdgeDescription.getSourceNodeDescriptions().stream().anyMatch(nodeDescription -> this.isFromDescription(nodeElement, nodeDescription))).filter(Objects::nonNull).collect(Collectors.toList());
// @formatter:on
};
} else {
sourceNodesProvider = variableManager -> {
var optionalObject = variableManager.get(VariableManager.SELF, Object.class);
var optionalCache = variableManager.get(DiagramDescription.CACHE, DiagramRenderingCache.class);
if (optionalObject.isEmpty() || optionalCache.isEmpty()) {
return List.of();
}
DiagramRenderingCache cache = optionalCache.get();
Object object = optionalObject.get();
// @formatter:off
return cache.getElementsRepresenting(object).stream().filter(this.isFromCompatibleSourceMapping(viewEdgeDescription)).filter(Objects::nonNull).collect(Collectors.toList());
// @formatter:on
};
}
Function<VariableManager, List<Element>> targetNodesProvider = new TargetNodesProvider(this.idProvider, viewEdgeDescription, interpreter);
Function<VariableManager, EdgeStyle> styleProvider = variableManager -> {
// @formatter:off
var effectiveStyle = viewEdgeDescription.getConditionalStyles().stream().filter(style -> this.matches(interpreter, style.getCondition(), variableManager)).map(org.eclipse.sirius.components.view.EdgeStyle.class::cast).findFirst().orElseGet(viewEdgeDescription::getStyle);
// @formatter:on
return this.stylesFactory.createEdgeStyle(effectiveStyle);
};
SynchronizationPolicy synchronizationPolicy = SynchronizationPolicy.valueOf(viewEdgeDescription.getSynchronizationPolicy().getName());
// @formatter:off
var builder = EdgeDescription.newEdgeDescription(this.idProvider.apply(viewEdgeDescription)).targetObjectIdProvider(this.semanticTargetIdProvider).targetObjectKindProvider(this.semanticTargetKindProvider).targetObjectLabelProvider(this.semanticTargetLabelProvider).sourceNodeDescriptions(viewEdgeDescription.getSourceNodeDescriptions().stream().map(this.convertedNodes::get).collect(Collectors.toList())).targetNodeDescriptions(viewEdgeDescription.getTargetNodeDescriptions().stream().map(this.convertedNodes::get).collect(Collectors.toList())).semanticElementsProvider(semanticElementsProvider).synchronizationPolicy(synchronizationPolicy).sourceNodesProvider(sourceNodesProvider).targetNodesProvider(targetNodesProvider).styleProvider(styleProvider).deleteHandler(this.createDeleteHandler(viewEdgeDescription, interpreter)).labelEditHandler(this.createLabelEditHandler(viewEdgeDescription, interpreter));
// $NON-NLS-1$
this.getSpecificEdgeLabelDescription(viewEdgeDescription, viewEdgeDescription.getBeginLabelExpression(), "_beginlabel", interpreter).ifPresent(builder::beginLabelDescription);
// $NON-NLS-1$
this.getSpecificEdgeLabelDescription(viewEdgeDescription, viewEdgeDescription.getLabelExpression(), "_centerlabel", interpreter).ifPresent(builder::centerLabelDescription);
// $NON-NLS-1$
this.getSpecificEdgeLabelDescription(viewEdgeDescription, viewEdgeDescription.getEndLabelExpression(), "_endlabel", interpreter).ifPresent(builder::endLabelDescription);
EdgeDescription result = builder.build();
this.convertedEdges.put(viewEdgeDescription, result);
return result;
// @formatter:on
}
use of org.eclipse.sirius.components.diagrams.description.SynchronizationPolicy in project sirius-components by eclipse-sirius.
the class NodeComponent method shouldRender.
private boolean shouldRender(String targetObjectId, Optional<Node> optionalPreviousNode) {
boolean shouldRender = false;
NodeDescription nodeDescription = this.props.getNodeDescription();
SynchronizationPolicy synchronizationPolicy = nodeDescription.getSynchronizationPolicy();
if (synchronizationPolicy == SynchronizationPolicy.SYNCHRONIZED) {
shouldRender = true;
} else if (synchronizationPolicy == SynchronizationPolicy.UNSYNCHRONIZED) {
if (optionalPreviousNode.isPresent()) {
Node previousNode = optionalPreviousNode.get();
shouldRender = !this.existsViewDeletionRequested(previousNode.getId());
} else {
shouldRender = this.existsViewCreationRequested(targetObjectId);
}
}
return shouldRender;
}
Aggregations