use of de.cau.cs.kieler.klighd.krendering.KText in project lingua-franca by lf-lang.
the class LinguaFrancaStyleExtensions method applyOnEdgePysicalDelayStyle.
public void applyOnEdgePysicalDelayStyle(KLabel label, Colors parentBackgroundColor) {
if (_onEdgePysicalDelayLabelConfigurator == null) {
LabelDecorationConfigurator configurator = LabelDecorationConfigurator.create().withInlineLabels(true);
configurator = configurator.withLabelTextRenderingProvider((KContainerRendering container, KLabel klabel) -> {
KText kText = _kRenderingFactory.createKText();
_kRenderingExtensions.setFontSize(kText, 8);
boldTextSelectionStyle(kText);
kText.setProperty(KlighdInternalProperties.MODEL_ELEMEMT, klabel.getProperty(KlighdInternalProperties.MODEL_ELEMEMT));
container.getChildren().add(kText);
return kText;
});
configurator = configurator.addDecoratorRenderingProvider(new IDecoratorRenderingProvider() {
@Override
public ElkPadding createDecoratorRendering(KContainerRendering container, KLabel label, LabelDecorationConfigurator.LayoutMode layoutMode) {
ElkPadding padding = new ElkPadding();
padding.left = 8;
padding.right = 16;
padding.bottom = Math.max(padding.bottom, 1);
KPolygon polygon = _kRenderingFactory.createKPolygon();
_kRenderingExtensions.from(polygon, LEFT, 0, 0, BOTTOM, 0, 0.5f);
_kRenderingExtensions.to(polygon, LEFT, 0, 0, TOP, 1, 0.5f);
_kRenderingExtensions.to(polygon, RIGHT, 0, 0, TOP, 1, 0.5f);
_kRenderingExtensions.to(polygon, RIGHT, 0, 0, BOTTOM, 0, 0.5f);
_kRenderingExtensions.setBackground(polygon, label.getProperty(LABEL_PARENT_BACKGROUND));
_kRenderingExtensions.setForeground(polygon, label.getProperty(LABEL_PARENT_BACKGROUND));
container.getChildren().add(polygon);
KSpline kSpline = _kRenderingFactory.createKSpline();
_kRenderingExtensions.from(kSpline, LEFT, -0.66f, 0, BOTTOM, -0.5f, 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 1, 0, BOTTOM, -0.5f, 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 3, 0, BOTTOM, 8, 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 5, 0, BOTTOM, 0, 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 5.5f, 0, BOTTOM, -1.5f, 0.5f);
container.getChildren().add(kSpline);
kSpline = _kRenderingFactory.createKSpline();
_kRenderingExtensions.from(kSpline, RIGHT, 15f, 0, BOTTOM, 3.5f, 0.5f);
_kRenderingExtensions.to(kSpline, RIGHT, 14f, 0, BOTTOM, 0, 0.5f);
_kRenderingExtensions.to(kSpline, RIGHT, 11, 0, BOTTOM, -8, 0.5f);
_kRenderingExtensions.to(kSpline, RIGHT, 9, 0, BOTTOM, 0, 0.5f);
_kRenderingExtensions.to(kSpline, RIGHT, 7, 0, BOTTOM, 8, 0.5f);
_kRenderingExtensions.to(kSpline, RIGHT, 4f, 0, BOTTOM, 2, 0.5f);
_kRenderingExtensions.to(kSpline, RIGHT, 1.5f, 0, BOTTOM, 0.5f, 0.5f);
_kRenderingExtensions.to(kSpline, RIGHT, 0.2f, 0, BOTTOM, -0.5f, 0.5f);
_kRenderingExtensions.to(kSpline, RIGHT, -0.7f, 0, BOTTOM, -0.5f, 0.5f);
container.getChildren().add(kSpline);
polygon = _kRenderingFactory.createKPolygon();
_kRenderingExtensions.from(polygon, LEFT, 4, 0, BOTTOM, 0, 0);
_kRenderingExtensions.to(polygon, LEFT, 8, 0, TOP, 0, 0);
_kRenderingExtensions.to(polygon, RIGHT, 12, 0, TOP, 0, 0);
_kRenderingExtensions.to(polygon, RIGHT, 16, 0, BOTTOM, 0, 0);
_kRenderingExtensions.setBackground(polygon, Colors.WHITE);
_kRenderingExtensions.setForeground(polygon, Colors.WHITE);
container.getChildren().add(polygon);
KPolyline polyline = _kRenderingFactory.createKPolyline();
_kRenderingExtensions.from(polyline, LEFT, 4, 0, BOTTOM, 0, 0);
_kRenderingExtensions.to(polyline, LEFT, 8, 0, TOP, 0, 0);
container.getChildren().add(polyline);
polyline = _kRenderingFactory.createKPolyline();
_kRenderingExtensions.from(polyline, RIGHT, 16, 0, BOTTOM, 0, 0);
_kRenderingExtensions.to(polyline, RIGHT, 12, 0, TOP, 0, 0);
container.getChildren().add(polyline);
return padding;
}
});
_onEdgePysicalDelayLabelConfigurator = configurator;
}
label.setProperty(LABEL_PARENT_BACKGROUND, parentBackgroundColor);
_onEdgePysicalDelayLabelConfigurator.applyTo(label);
}
use of de.cau.cs.kieler.klighd.krendering.KText in project lingua-franca by lf-lang.
the class LinguaFrancaStyleExtensions method applyOnEdgePysicalStyle.
public void applyOnEdgePysicalStyle(KLabel label, Colors parentBackgroundColor) {
if (_onEdgePysicalLabelConfigurator == null) {
LabelDecorationConfigurator configurator = LabelDecorationConfigurator.create().withInlineLabels(true);
configurator = configurator.withLabelTextRenderingProvider((KContainerRendering container, KLabel klabel) -> {
KText kText = _kRenderingFactory.createKText();
_kRenderingExtensions.setInvisible(kText, true);
container.getChildren().add(kText);
return kText;
});
configurator = configurator.addDecoratorRenderingProvider(new IDecoratorRenderingProvider() {
@Override
public ElkPadding createDecoratorRendering(final KContainerRendering container, final KLabel label, final LabelDecorationConfigurator.LayoutMode layoutMode) {
ElkPadding padding = new ElkPadding();
padding.left = 3;
padding.right = 3;
padding.bottom = Math.max(padding.bottom, 1);
KPolygon polygon = _kRenderingFactory.createKPolygon();
_kRenderingExtensions.from(polygon, LEFT, 0, 0, BOTTOM, 0, 0.5f);
_kRenderingExtensions.to(polygon, LEFT, 0, 0, TOP, 1, 0.5f);
_kRenderingExtensions.to(polygon, RIGHT, 0, 0, TOP, 1, 0.5f);
_kRenderingExtensions.to(polygon, RIGHT, 0, 0, BOTTOM, 0, 0.5f);
_kRenderingExtensions.setBackground(polygon, label.getProperty(LABEL_PARENT_BACKGROUND));
_kRenderingExtensions.setForeground(polygon, label.getProperty(LABEL_PARENT_BACKGROUND));
container.getChildren().add(polygon);
KSpline kSpline = _kRenderingFactory.createKSpline();
_kRenderingExtensions.from(kSpline, LEFT, (-0.66f), 0, BOTTOM, (-0.5f), 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 1, 0, BOTTOM, (-0.5f), 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 0, 0.1f, BOTTOM, 8, 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 0, 0.2f, BOTTOM, 0, 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 0, 0.3f, BOTTOM, (-8), 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 0, 0.4f, BOTTOM, 0, 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 0, 0.45f, BOTTOM, 4f, 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 0, 0.5f, BOTTOM, 8, 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 0, 0.55f, BOTTOM, 4f, 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 0, 0.6f, BOTTOM, 0, 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 0, 0.65f, BOTTOM, (-4), 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 0, 0.7f, BOTTOM, (-8), 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 0, 0.8f, BOTTOM, (-4), 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 0, 0.9f, BOTTOM, 0, 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, (-1), 1, BOTTOM, (-0.5f), 0.5f);
_kRenderingExtensions.to(kSpline, LEFT, 0.66f, 1, BOTTOM, (-0.5f), 0.5f);
container.getChildren().add(kSpline);
return padding;
}
});
_onEdgePysicalLabelConfigurator = configurator;
}
label.setProperty(LABEL_PARENT_BACKGROUND, parentBackgroundColor);
_onEdgePysicalLabelConfigurator.applyTo(label);
}
use of de.cau.cs.kieler.klighd.krendering.KText in project lingua-franca by lf-lang.
the class LinguaFrancaSynthesis method createReactorNode.
private Collection<KNode> createReactorNode(ReactorInstance reactorInstance, boolean expandDefault, Table<ReactorInstance, PortInstance, KPort> inputPortsReg, Table<ReactorInstance, PortInstance, KPort> outputPortsReg, Map<ReactorInstance, KNode> allReactorNodes) {
Reactor reactor = reactorInstance.reactorDefinition;
KNode node = _kNodeExtensions.createNode();
allReactorNodes.put(reactorInstance, node);
associateWith(node, reactor);
_utilityExtensions.setID(node, reactorInstance.uniqueID());
// save to distinguish nodes associated with the same reactor
NamedInstanceUtil.linkInstance(node, reactorInstance);
List<KNode> nodes = new ArrayList<>();
nodes.add(node);
String label = createReactorLabel(reactorInstance);
if (reactorInstance.recursive) {
// Mark this node
node.setProperty(REACTOR_RECURSIVE_INSTANTIATION, true);
// Mark root
allReactorNodes.get(reactorInstance.root()).setProperty(REACTOR_RECURSIVE_INSTANTIATION, true);
}
if (reactor == null) {
_linguaFrancaShapeExtensions.addErrorMessage(node, TEXT_REACTOR_NULL, null);
} else if (reactorInstance.isMainOrFederated()) {
KRoundedRectangle figure = _linguaFrancaShapeExtensions.addMainReactorFigure(node, reactorInstance, label);
if (getObjectValue(REACTOR_PARAMETER_MODE) == ReactorParameterDisplayModes.TABLE && !reactorInstance.parameters.isEmpty()) {
KRectangle rectangle = _kContainerRenderingExtensions.addRectangle(figure);
_kRenderingExtensions.setInvisible(rectangle, true);
_kRenderingExtensions.to(_kRenderingExtensions.from(_kRenderingExtensions.setGridPlacementData(rectangle), _kRenderingExtensions.LEFT, 8, 0, _kRenderingExtensions.TOP, 0, 0), _kRenderingExtensions.RIGHT, 8, 0, _kRenderingExtensions.BOTTOM, 4, 0);
_kRenderingExtensions.setHorizontalAlignment(rectangle, HorizontalAlignment.LEFT);
addParameterList(rectangle, reactorInstance.parameters);
}
if (reactorInstance.recursive) {
nodes.add(addErrorComment(node, TEXT_ERROR_RECURSIVE));
_linguaFrancaStyleExtensions.errorStyle(figure);
} else {
_kContainerRenderingExtensions.addChildArea(figure);
node.getChildren().addAll(transformReactorNetwork(reactorInstance, new HashMap<>(), new HashMap<>(), allReactorNodes));
}
Iterables.addAll(nodes, createUserComments(reactor, node));
configureReactorNodeLayout(node);
// Additional layout adjustment for main node
setLayoutOption(node, CoreOptions.ALGORITHM, LayeredOptions.ALGORITHM_ID);
setLayoutOption(node, CoreOptions.DIRECTION, Direction.RIGHT);
setLayoutOption(node, CoreOptions.NODE_SIZE_CONSTRAINTS, EnumSet.of(SizeConstraint.MINIMUM_SIZE));
setLayoutOption(node, LayeredOptions.NODE_PLACEMENT_BK_FIXED_ALIGNMENT, FixedAlignment.BALANCED);
setLayoutOption(node, LayeredOptions.NODE_PLACEMENT_BK_EDGE_STRAIGHTENING, EdgeStraighteningStrategy.IMPROVE_STRAIGHTNESS);
setLayoutOption(node, LayeredOptions.SPACING_EDGE_NODE, LayeredOptions.SPACING_EDGE_NODE.getDefault() * 1.1f);
setLayoutOption(node, LayeredOptions.SPACING_EDGE_NODE_BETWEEN_LAYERS, LayeredOptions.SPACING_EDGE_NODE_BETWEEN_LAYERS.getDefault() * 1.1f);
if (!getBooleanValue(SHOW_HYPERLINKS)) {
setLayoutOption(node, CoreOptions.PADDING, new ElkPadding(-1, 6, 6, 6));
setLayoutOption(node, LayeredOptions.SPACING_COMPONENT_COMPONENT, LayeredOptions.SPACING_COMPONENT_COMPONENT.getDefault() * 0.5f);
}
} else {
ReactorInstance instance = reactorInstance;
// Expanded Rectangle
ReactorFigureComponents comps = _linguaFrancaShapeExtensions.addReactorFigure(node, reactorInstance, label);
comps.getOuter().setProperty(KlighdProperties.EXPANDED_RENDERING, true);
for (KRendering figure : comps.getFigures()) {
associateWith(figure, reactor);
_kRenderingExtensions.addDoubleClickAction(figure, MemorizingExpandCollapseAction.ID);
}
_reactorIcons.handleIcon(comps.getReactor(), reactor, false);
if (getBooleanValue(SHOW_HYPERLINKS)) {
// Collapse button
KText button = _linguaFrancaShapeExtensions.addTextButton(comps.getReactor(), TEXT_HIDE_ACTION);
_kRenderingExtensions.to(_kRenderingExtensions.from(_kRenderingExtensions.setGridPlacementData(button), _kRenderingExtensions.LEFT, 8, 0, _kRenderingExtensions.TOP, 0, 0), _kRenderingExtensions.RIGHT, 8, 0, _kRenderingExtensions.BOTTOM, 0, 0);
_kRenderingExtensions.addSingleClickAction(button, MemorizingExpandCollapseAction.ID);
_kRenderingExtensions.addDoubleClickAction(button, MemorizingExpandCollapseAction.ID);
}
if (getObjectValue(REACTOR_PARAMETER_MODE) == ReactorParameterDisplayModes.TABLE && !instance.parameters.isEmpty()) {
KRectangle rectangle = _kContainerRenderingExtensions.addRectangle(comps.getReactor());
_kRenderingExtensions.setInvisible(rectangle, true);
if (!getBooleanValue(SHOW_HYPERLINKS)) {
_kRenderingExtensions.to(_kRenderingExtensions.from(_kRenderingExtensions.setGridPlacementData(rectangle), _kRenderingExtensions.LEFT, 8, 0, _kRenderingExtensions.TOP, 0, 0), _kRenderingExtensions.RIGHT, 8, 0, _kRenderingExtensions.BOTTOM, 4, 0);
} else {
_kRenderingExtensions.to(_kRenderingExtensions.from(_kRenderingExtensions.setGridPlacementData(rectangle), _kRenderingExtensions.LEFT, 8, 0, _kRenderingExtensions.TOP, 4, 0), _kRenderingExtensions.RIGHT, 8, 0, _kRenderingExtensions.BOTTOM, 0, 0);
}
_kRenderingExtensions.setHorizontalAlignment(rectangle, HorizontalAlignment.LEFT);
addParameterList(rectangle, instance.parameters);
}
if (instance.recursive) {
comps.getFigures().forEach(_linguaFrancaStyleExtensions::errorStyle);
} else {
_kContainerRenderingExtensions.addChildArea(comps.getReactor());
}
// Collapse Rectangle
comps = _linguaFrancaShapeExtensions.addReactorFigure(node, reactorInstance, label);
comps.getOuter().setProperty(KlighdProperties.COLLAPSED_RENDERING, true);
for (KRendering figure : comps.getFigures()) {
associateWith(figure, reactor);
if (_utilityExtensions.hasContent(instance) && !instance.recursive) {
_kRenderingExtensions.addDoubleClickAction(figure, MemorizingExpandCollapseAction.ID);
}
}
_reactorIcons.handleIcon(comps.getReactor(), reactor, true);
if (getBooleanValue(SHOW_HYPERLINKS)) {
// Expand button
if (_utilityExtensions.hasContent(instance) && !instance.recursive) {
KText button = _linguaFrancaShapeExtensions.addTextButton(comps.getReactor(), TEXT_SHOW_ACTION);
_kRenderingExtensions.to(_kRenderingExtensions.from(_kRenderingExtensions.setGridPlacementData(button), _kRenderingExtensions.LEFT, 8, 0, _kRenderingExtensions.TOP, 0, 0), _kRenderingExtensions.RIGHT, 8, 0, _kRenderingExtensions.BOTTOM, 8, 0);
_kRenderingExtensions.addSingleClickAction(button, MemorizingExpandCollapseAction.ID);
_kRenderingExtensions.addDoubleClickAction(button, MemorizingExpandCollapseAction.ID);
}
}
if (instance.recursive) {
comps.getFigures().forEach(_linguaFrancaStyleExtensions::errorStyle);
}
// Create ports
Map<PortInstance, KPort> inputPorts = new HashMap<>();
Map<PortInstance, KPort> outputPorts = new HashMap<>();
for (PortInstance input : ListExtensions.reverseView(instance.inputs)) {
inputPorts.put(input, addIOPort(node, input, true, input.isMultiport(), reactorInstance.isBank()));
}
for (PortInstance output : instance.outputs) {
outputPorts.put(output, addIOPort(node, output, false, output.isMultiport(), reactorInstance.isBank()));
}
// Mark ports
inputPorts.values().forEach(it -> it.setProperty(REACTOR_INPUT, true));
outputPorts.values().forEach(it -> it.setProperty(REACTOR_OUTPUT, true));
// Add content
if (_utilityExtensions.hasContent(instance) && !instance.recursive) {
node.getChildren().addAll(transformReactorNetwork(instance, inputPorts, outputPorts, allReactorNodes));
}
// Pass port to given tables
if (!_utilityExtensions.isRoot(instance)) {
if (inputPortsReg != null) {
for (Map.Entry<PortInstance, KPort> entry : inputPorts.entrySet()) {
inputPortsReg.put(instance, entry.getKey(), entry.getValue());
}
}
if (outputPortsReg != null) {
for (Map.Entry<PortInstance, KPort> entry : outputPorts.entrySet()) {
outputPortsReg.put(instance, entry.getKey(), entry.getValue());
}
}
}
if (instance.recursive) {
setLayoutOption(node, KlighdProperties.EXPAND, false);
nodes.add(addErrorComment(node, TEXT_ERROR_RECURSIVE));
} else {
setLayoutOption(node, KlighdProperties.EXPAND, expandDefault);
// Interface Dependencies
_interfaceDependenciesVisualization.addInterfaceDependencies(node, expandDefault);
}
if (!_utilityExtensions.isRoot(instance)) {
// add the annotation now.
if (!getBooleanValue(SHOW_ALL_REACTORS)) {
Iterables.addAll(nodes, createUserComments(reactor, node));
}
} else {
Iterables.addAll(nodes, createUserComments(reactor, node));
}
configureReactorNodeLayout(node);
}
// Find and annotate cycles
if (getBooleanValue(CYCLE_DETECTION) && _utilityExtensions.isRoot(reactorInstance)) {
KNode errNode = detectAndAnnotateCycles(node, reactorInstance, allReactorNodes);
if (errNode != null) {
nodes.add(errNode);
}
}
return nodes;
}
use of de.cau.cs.kieler.klighd.krendering.KText in project lingua-franca by lf-lang.
the class LinguaFrancaSynthesis method detectAndAnnotateCycles.
private KNode detectAndAnnotateCycles(KNode node, ReactorInstance reactorInstance, Map<ReactorInstance, KNode> allReactorNodes) {
if (node.getProperty(REACTOR_RECURSIVE_INSTANTIATION)) {
_filterCycleAction.resetCycleFiltering(node);
return addErrorComment(node, TEXT_ERROR_CONTAINS_RECURSION);
} else {
// only detect dependency cycles if not recursive
try {
boolean hasCycle = _cycleVisualization.detectAndHighlightCycles(reactorInstance, allReactorNodes, it -> {
if (it instanceof KNode) {
List<KRendering> renderings = IterableExtensions.toList(Iterables.filter(((KNode) it).getData(), KRendering.class));
if (renderings.size() == 1) {
_linguaFrancaStyleExtensions.errorStyle(IterableExtensions.head(renderings));
} else {
IterableExtensions.filter(renderings, rendering -> {
return rendering.getProperty(KlighdProperties.COLLAPSED_RENDERING);
}).forEach(_linguaFrancaStyleExtensions::errorStyle);
}
} else if (it instanceof KEdge) {
Iterables.filter(((KEdge) it).getData(), KRendering.class).forEach(_linguaFrancaStyleExtensions::errorStyle);
// TODO initiallyHide does not work with incremental (https://github.com/kieler/KLighD/issues/37)
// cycleEgde.initiallyShow() // Show hidden order dependencies
_kRenderingExtensions.setInvisible(_kRenderingExtensions.getKRendering(it), false);
} else if (it instanceof KPort) {
Iterables.filter(((KPort) it).getData(), KRendering.class).forEach(_linguaFrancaStyleExtensions::errorStyle);
// it.reverseTrianglePort()
}
});
if (hasCycle) {
KNode err = addErrorComment(node, TEXT_ERROR_CONTAINS_CYCLE);
// Add to existing figure
KRectangle rectangle = _kContainerRenderingExtensions.addRectangle(_kRenderingExtensions.getKContainerRendering(err));
_kRenderingExtensions.to(_kRenderingExtensions.from(_kRenderingExtensions.setGridPlacementData(rectangle), _kRenderingExtensions.LEFT, 3, 0, _kRenderingExtensions.TOP, (-1), 0), _kRenderingExtensions.RIGHT, 3, 0, _kRenderingExtensions.BOTTOM, 3, 0);
_linguaFrancaStyleExtensions.noSelectionStyle(rectangle);
_kRenderingExtensions.setInvisible(rectangle, true);
_kContainerRenderingExtensions.setGridPlacement(rectangle, 2);
KRectangle subrectangle = _kContainerRenderingExtensions.addRectangle(rectangle);
_kRenderingExtensions.to(_kRenderingExtensions.from(_kRenderingExtensions.setGridPlacementData(subrectangle), _kRenderingExtensions.LEFT, 0, 0, _kRenderingExtensions.TOP, 0, 0), _kRenderingExtensions.RIGHT, 2, 0, _kRenderingExtensions.BOTTOM, 0, 0);
_linguaFrancaStyleExtensions.noSelectionStyle(subrectangle);
_kRenderingExtensions.addSingleClickAction(subrectangle, ShowCycleAction.ID);
KText subrectangleText = _kContainerRenderingExtensions.addText(subrectangle, TEXT_ERROR_CYCLE_BTN_SHOW);
// Copy text style
List<KStyle> styles = ListExtensions.map(IterableExtensions.head(_kRenderingExtensions.getKContainerRendering(err).getChildren()).getStyles(), EcoreUtil::copy);
subrectangleText.getStyles().addAll(styles);
_kRenderingExtensions.setFontSize(subrectangleText, 5);
_kRenderingExtensions.setSurroundingSpace(subrectangleText, 1, 0);
_linguaFrancaStyleExtensions.noSelectionStyle(subrectangleText);
_kRenderingExtensions.addSingleClickAction(subrectangleText, ShowCycleAction.ID);
subrectangle = _kContainerRenderingExtensions.addRectangle(rectangle);
_kRenderingExtensions.to(_kRenderingExtensions.from(_kRenderingExtensions.setGridPlacementData(subrectangle), _kRenderingExtensions.LEFT, 0, 0, _kRenderingExtensions.TOP, 0, 0), _kRenderingExtensions.RIGHT, 0, 0, _kRenderingExtensions.BOTTOM, 0, 0);
_linguaFrancaStyleExtensions.noSelectionStyle(subrectangle);
_kRenderingExtensions.addSingleClickAction(subrectangle, FilterCycleAction.ID);
subrectangleText = _kContainerRenderingExtensions.addText(subrectangle, _filterCycleAction.isCycleFiltered(node) ? TEXT_ERROR_CYCLE_BTN_UNFILTER : TEXT_ERROR_CYCLE_BTN_FILTER);
// Copy text style
styles = ListExtensions.map(IterableExtensions.head(_kRenderingExtensions.getKContainerRendering(err).getChildren()).getStyles(), EcoreUtil::copy);
subrectangleText.getStyles().addAll(styles);
_kRenderingExtensions.setFontSize(subrectangleText, 5);
_kRenderingExtensions.setSurroundingSpace(subrectangleText, 1, 0);
_linguaFrancaStyleExtensions.noSelectionStyle(subrectangleText);
_kRenderingExtensions.addSingleClickAction(subrectangleText, FilterCycleAction.ID);
_filterCycleAction.markCycleFilterText(subrectangleText, err);
// if user interactively requested a filtered diagram keep it filtered during updates
if (_filterCycleAction.isCycleFiltered(node)) {
_filterCycleAction.filterCycle(node);
}
return err;
}
} catch (Exception e) {
_filterCycleAction.resetCycleFiltering(node);
e.printStackTrace();
return addErrorComment(node, TEXT_ERROR_CYCLE_DETECTION);
}
}
return null;
}
use of de.cau.cs.kieler.klighd.krendering.KText in project lingua-franca by lf-lang.
the class FilterCycleAction method execute.
@Override
public IAction.ActionResult execute(final IAction.ActionContext context) {
ViewContext vc = context.getViewContext();
Object all = vc.getOptionValue(LinguaFrancaSynthesis.SHOW_ALL_REACTORS);
List<KNode> nodes = vc.getViewModel().getChildren();
if (all instanceof Boolean && (Boolean) all) {
nodes = IterableExtensions.toList(Iterables.concat(ListExtensions.map(nodes, it -> {
return it.getChildren();
})));
}
if (IterableExtensions.exists(nodes, this::isCycleFiltered)) {
// undo
nodes.forEach(this::resetCycleFiltering);
// re-synthesize everything
vc.getViewModel().getChildren().clear();
vc.update();
} else {
// filter
nodes.forEach(it -> {
this.markCycleFiltered(it);
this.filterCycle(it);
});
Function1<KNode, Boolean> knodeFilterButton = it -> {
return it.getProperty(FILTER_BUTTON);
};
Function1<KText, Boolean> ktextFilterButton = it -> {
return it.getProperty(FILTER_BUTTON);
};
// switch filter label
for (KNode node : IterableExtensions.filter(nodes, knodeFilterButton)) {
Iterator<KText> ktexts = Iterators.filter(node.eAllContents(), KText.class);
KText text = IteratorExtensions.findFirst(ktexts, ktextFilterButton);
if (text != null) {
text.setText(LinguaFrancaSynthesis.TEXT_ERROR_CYCLE_BTN_UNFILTER);
}
}
}
return IAction.ActionResult.createResult(true);
}
Aggregations