Search in sources :

Example 6 with KText

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);
}
Also used : KText(de.cau.cs.kieler.klighd.krendering.KText) KPolygon(de.cau.cs.kieler.klighd.krendering.KPolygon) KLabel(de.cau.cs.kieler.klighd.kgraph.KLabel) LabelDecorationConfigurator(de.cau.cs.kieler.klighd.labels.decoration.LabelDecorationConfigurator) KContainerRendering(de.cau.cs.kieler.klighd.krendering.KContainerRendering) IDecoratorRenderingProvider(de.cau.cs.kieler.klighd.labels.decoration.IDecoratorRenderingProvider) ElkPadding(org.eclipse.elk.core.math.ElkPadding) KSpline(de.cau.cs.kieler.klighd.krendering.KSpline) KPolyline(de.cau.cs.kieler.klighd.krendering.KPolyline)

Example 7 with KText

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);
}
Also used : KText(de.cau.cs.kieler.klighd.krendering.KText) KPolygon(de.cau.cs.kieler.klighd.krendering.KPolygon) KLabel(de.cau.cs.kieler.klighd.kgraph.KLabel) LabelDecorationConfigurator(de.cau.cs.kieler.klighd.labels.decoration.LabelDecorationConfigurator) KContainerRendering(de.cau.cs.kieler.klighd.krendering.KContainerRendering) IDecoratorRenderingProvider(de.cau.cs.kieler.klighd.labels.decoration.IDecoratorRenderingProvider) ElkPadding(org.eclipse.elk.core.math.ElkPadding) KSpline(de.cau.cs.kieler.klighd.krendering.KSpline)

Example 8 with KText

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;
}
Also used : LineCap(de.cau.cs.kieler.klighd.krendering.LineCap) CoreOptions(org.eclipse.elk.core.options.CoreOptions) ElkMargin(org.eclipse.elk.core.math.ElkMargin) Exceptions(org.eclipse.xtext.xbase.lib.Exceptions) MemorizingExpandCollapseAction(org.lflang.diagram.synthesis.action.MemorizingExpandCollapseAction) LinguaFrancaStyleExtensions(org.lflang.diagram.synthesis.styles.LinguaFrancaStyleExtensions) PortSide(org.eclipse.elk.core.options.PortSide) KLabelExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KLabelExtensions) FileUtil(org.lflang.util.FileUtil) HashBasedTable(com.google.common.collect.HashBasedTable) ExpandAllReactorsAction(org.lflang.diagram.synthesis.action.ExpandAllReactorsAction) Extension(org.eclipse.xtext.xbase.lib.Extension) CollapseAllReactorsAction(org.lflang.diagram.synthesis.action.CollapseAllReactorsAction) LayeredOptions(org.eclipse.elk.alg.layered.options.LayeredOptions) KEdgeExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KEdgeExtensions) KContainerRenderingExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KContainerRenderingExtensions) KRenderingExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KRenderingExtensions) HashMultimap(com.google.common.collect.HashMultimap) KPolyline(de.cau.cs.kieler.klighd.krendering.KPolyline) LineStyle(de.cau.cs.kieler.klighd.krendering.LineStyle) Map(java.util.Map) TriggerInstance(org.lflang.generator.TriggerInstance) ReactorIcons(org.lflang.diagram.synthesis.util.ReactorIcons) Connection(org.lflang.lf.Connection) EnumSet(java.util.EnumSet) KEdge(de.cau.cs.kieler.klighd.kgraph.KEdge) KPolylineExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KPolylineExtensions) KPortExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KPortExtensions) NamedInstanceUtil(org.lflang.diagram.synthesis.util.NamedInstanceUtil) SynthesisOption(de.cau.cs.kieler.klighd.SynthesisOption) Collection(java.util.Collection) Set(java.util.Set) SizeConstraint(org.eclipse.elk.core.options.SizeConstraint) EObject(org.eclipse.emf.ecore.EObject) LinguaFrancaShapeExtensions(org.lflang.diagram.synthesis.styles.LinguaFrancaShapeExtensions) BoxLayouterOptions(org.eclipse.elk.core.options.BoxLayouterOptions) List(java.util.List) InterfaceDependenciesVisualization(org.lflang.diagram.synthesis.util.InterfaceDependenciesVisualization) KlighdProperties(de.cau.cs.kieler.klighd.util.KlighdProperties) Direction(org.eclipse.elk.core.options.Direction) UtilityExtensions(org.lflang.diagram.synthesis.util.UtilityExtensions) KLabel(de.cau.cs.kieler.klighd.kgraph.KLabel) KStyle(de.cau.cs.kieler.klighd.krendering.KStyle) Pair(org.eclipse.xtext.xbase.lib.Pair) StringExtensions(org.eclipse.xtext.xbase.lib.StringExtensions) AbstractDiagramSynthesis(de.cau.cs.kieler.klighd.syntheses.AbstractDiagramSynthesis) FileConfig(org.lflang.FileConfig) ASTUtils(org.lflang.ASTUtils) Iterables(com.google.common.collect.Iterables) KNodeExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KNodeExtensions) HashMap(java.util.HashMap) Multimap(com.google.common.collect.Multimap) ListExtensions(org.eclipse.xtext.xbase.lib.ListExtensions) ModeDiagrams(org.lflang.diagram.synthesis.util.ModeDiagrams) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Inject(javax.inject.Inject) EdgeStraighteningStrategy(org.eclipse.elk.alg.layered.options.EdgeStraighteningStrategy) ShowCycleAction(org.lflang.diagram.synthesis.action.ShowCycleAction) ElkPadding(org.eclipse.elk.core.math.ElkPadding) KRendering(de.cau.cs.kieler.klighd.krendering.KRendering) CycleVisualization(org.lflang.diagram.synthesis.util.CycleVisualization) TimerInstance(org.lflang.generator.TimerInstance) LinkedList(java.util.LinkedList) SynthesisErrorReporter(org.lflang.diagram.synthesis.util.SynthesisErrorReporter) KText(de.cau.cs.kieler.klighd.krendering.KText) FixedAlignment(org.eclipse.elk.alg.layered.options.FixedAlignment) FilterCycleAction(org.lflang.diagram.synthesis.action.FilterCycleAction) KNode(de.cau.cs.kieler.klighd.kgraph.KNode) KPort(de.cau.cs.kieler.klighd.kgraph.KPort) KRoundedRectangle(de.cau.cs.kieler.klighd.krendering.KRoundedRectangle) RuntimeRange(org.lflang.generator.RuntimeRange) Model(org.lflang.lf.Model) PortConstraints(org.eclipse.elk.core.options.PortConstraints) Property(org.eclipse.elk.graph.properties.Property) Conversions(org.eclipse.xtext.xbase.lib.Conversions) KVector(org.eclipse.elk.core.math.KVector) EcoreUtil(org.eclipse.emf.ecore.util.EcoreUtil) KContainerRendering(de.cau.cs.kieler.klighd.krendering.KContainerRendering) PortInstance(org.lflang.generator.PortInstance) ReactionInstance(org.lflang.generator.ReactionInstance) ParameterInstance(org.lflang.generator.ParameterInstance) SendRange(org.lflang.generator.SendRange) ActionInstance(org.lflang.generator.ActionInstance) LayerConstraint(org.eclipse.elk.alg.layered.options.LayerConstraint) ReactorInstance(org.lflang.generator.ReactorInstance) IterableExtensions(org.eclipse.xtext.xbase.lib.IterableExtensions) ReactorFigureComponents(org.lflang.diagram.synthesis.styles.ReactorFigureComponents) DisplayedActionData(de.cau.cs.kieler.klighd.DisplayedActionData) ViewSynthesisShared(de.cau.cs.kieler.klighd.krendering.ViewSynthesisShared) KRectangle(de.cau.cs.kieler.klighd.krendering.KRectangle) Reactor(org.lflang.lf.Reactor) Colors(de.cau.cs.kieler.klighd.krendering.Colors) HorizontalAlignment(de.cau.cs.kieler.klighd.krendering.HorizontalAlignment) Table(com.google.common.collect.Table) PortInstance(org.lflang.generator.PortInstance) ArrayList(java.util.ArrayList) KNode(de.cau.cs.kieler.klighd.kgraph.KNode) KRoundedRectangle(de.cau.cs.kieler.klighd.krendering.KRoundedRectangle) KRectangle(de.cau.cs.kieler.klighd.krendering.KRectangle) KText(de.cau.cs.kieler.klighd.krendering.KText) ReactorInstance(org.lflang.generator.ReactorInstance) ReactorFigureComponents(org.lflang.diagram.synthesis.styles.ReactorFigureComponents) Reactor(org.lflang.lf.Reactor) KRendering(de.cau.cs.kieler.klighd.krendering.KRendering) ElkPadding(org.eclipse.elk.core.math.ElkPadding) Map(java.util.Map) HashMap(java.util.HashMap)

Example 9 with KText

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;
}
Also used : LineCap(de.cau.cs.kieler.klighd.krendering.LineCap) CoreOptions(org.eclipse.elk.core.options.CoreOptions) ElkMargin(org.eclipse.elk.core.math.ElkMargin) Exceptions(org.eclipse.xtext.xbase.lib.Exceptions) MemorizingExpandCollapseAction(org.lflang.diagram.synthesis.action.MemorizingExpandCollapseAction) LinguaFrancaStyleExtensions(org.lflang.diagram.synthesis.styles.LinguaFrancaStyleExtensions) PortSide(org.eclipse.elk.core.options.PortSide) KLabelExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KLabelExtensions) FileUtil(org.lflang.util.FileUtil) HashBasedTable(com.google.common.collect.HashBasedTable) ExpandAllReactorsAction(org.lflang.diagram.synthesis.action.ExpandAllReactorsAction) Extension(org.eclipse.xtext.xbase.lib.Extension) CollapseAllReactorsAction(org.lflang.diagram.synthesis.action.CollapseAllReactorsAction) LayeredOptions(org.eclipse.elk.alg.layered.options.LayeredOptions) KEdgeExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KEdgeExtensions) KContainerRenderingExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KContainerRenderingExtensions) KRenderingExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KRenderingExtensions) HashMultimap(com.google.common.collect.HashMultimap) KPolyline(de.cau.cs.kieler.klighd.krendering.KPolyline) LineStyle(de.cau.cs.kieler.klighd.krendering.LineStyle) Map(java.util.Map) TriggerInstance(org.lflang.generator.TriggerInstance) ReactorIcons(org.lflang.diagram.synthesis.util.ReactorIcons) Connection(org.lflang.lf.Connection) EnumSet(java.util.EnumSet) KEdge(de.cau.cs.kieler.klighd.kgraph.KEdge) KPolylineExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KPolylineExtensions) KPortExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KPortExtensions) NamedInstanceUtil(org.lflang.diagram.synthesis.util.NamedInstanceUtil) SynthesisOption(de.cau.cs.kieler.klighd.SynthesisOption) Collection(java.util.Collection) Set(java.util.Set) SizeConstraint(org.eclipse.elk.core.options.SizeConstraint) EObject(org.eclipse.emf.ecore.EObject) LinguaFrancaShapeExtensions(org.lflang.diagram.synthesis.styles.LinguaFrancaShapeExtensions) BoxLayouterOptions(org.eclipse.elk.core.options.BoxLayouterOptions) List(java.util.List) InterfaceDependenciesVisualization(org.lflang.diagram.synthesis.util.InterfaceDependenciesVisualization) KlighdProperties(de.cau.cs.kieler.klighd.util.KlighdProperties) Direction(org.eclipse.elk.core.options.Direction) UtilityExtensions(org.lflang.diagram.synthesis.util.UtilityExtensions) KLabel(de.cau.cs.kieler.klighd.kgraph.KLabel) KStyle(de.cau.cs.kieler.klighd.krendering.KStyle) Pair(org.eclipse.xtext.xbase.lib.Pair) StringExtensions(org.eclipse.xtext.xbase.lib.StringExtensions) AbstractDiagramSynthesis(de.cau.cs.kieler.klighd.syntheses.AbstractDiagramSynthesis) FileConfig(org.lflang.FileConfig) ASTUtils(org.lflang.ASTUtils) Iterables(com.google.common.collect.Iterables) KNodeExtensions(de.cau.cs.kieler.klighd.krendering.extensions.KNodeExtensions) HashMap(java.util.HashMap) Multimap(com.google.common.collect.Multimap) ListExtensions(org.eclipse.xtext.xbase.lib.ListExtensions) ModeDiagrams(org.lflang.diagram.synthesis.util.ModeDiagrams) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Inject(javax.inject.Inject) EdgeStraighteningStrategy(org.eclipse.elk.alg.layered.options.EdgeStraighteningStrategy) ShowCycleAction(org.lflang.diagram.synthesis.action.ShowCycleAction) ElkPadding(org.eclipse.elk.core.math.ElkPadding) KRendering(de.cau.cs.kieler.klighd.krendering.KRendering) CycleVisualization(org.lflang.diagram.synthesis.util.CycleVisualization) TimerInstance(org.lflang.generator.TimerInstance) LinkedList(java.util.LinkedList) SynthesisErrorReporter(org.lflang.diagram.synthesis.util.SynthesisErrorReporter) KText(de.cau.cs.kieler.klighd.krendering.KText) FixedAlignment(org.eclipse.elk.alg.layered.options.FixedAlignment) FilterCycleAction(org.lflang.diagram.synthesis.action.FilterCycleAction) KNode(de.cau.cs.kieler.klighd.kgraph.KNode) KPort(de.cau.cs.kieler.klighd.kgraph.KPort) KRoundedRectangle(de.cau.cs.kieler.klighd.krendering.KRoundedRectangle) RuntimeRange(org.lflang.generator.RuntimeRange) Model(org.lflang.lf.Model) PortConstraints(org.eclipse.elk.core.options.PortConstraints) Property(org.eclipse.elk.graph.properties.Property) Conversions(org.eclipse.xtext.xbase.lib.Conversions) KVector(org.eclipse.elk.core.math.KVector) EcoreUtil(org.eclipse.emf.ecore.util.EcoreUtil) KContainerRendering(de.cau.cs.kieler.klighd.krendering.KContainerRendering) PortInstance(org.lflang.generator.PortInstance) ReactionInstance(org.lflang.generator.ReactionInstance) ParameterInstance(org.lflang.generator.ParameterInstance) SendRange(org.lflang.generator.SendRange) ActionInstance(org.lflang.generator.ActionInstance) LayerConstraint(org.eclipse.elk.alg.layered.options.LayerConstraint) ReactorInstance(org.lflang.generator.ReactorInstance) IterableExtensions(org.eclipse.xtext.xbase.lib.IterableExtensions) ReactorFigureComponents(org.lflang.diagram.synthesis.styles.ReactorFigureComponents) DisplayedActionData(de.cau.cs.kieler.klighd.DisplayedActionData) ViewSynthesisShared(de.cau.cs.kieler.klighd.krendering.ViewSynthesisShared) KRectangle(de.cau.cs.kieler.klighd.krendering.KRectangle) Reactor(org.lflang.lf.Reactor) Colors(de.cau.cs.kieler.klighd.krendering.Colors) HorizontalAlignment(de.cau.cs.kieler.klighd.krendering.HorizontalAlignment) Table(com.google.common.collect.Table) KStyle(de.cau.cs.kieler.klighd.krendering.KStyle) KEdge(de.cau.cs.kieler.klighd.kgraph.KEdge) KPort(de.cau.cs.kieler.klighd.kgraph.KPort) KNode(de.cau.cs.kieler.klighd.kgraph.KNode) KRectangle(de.cau.cs.kieler.klighd.krendering.KRectangle) KText(de.cau.cs.kieler.klighd.krendering.KText) KRendering(de.cau.cs.kieler.klighd.krendering.KRendering) EcoreUtil(org.eclipse.emf.ecore.util.EcoreUtil)

Example 10 with KText

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);
}
Also used : KEdge(de.cau.cs.kieler.klighd.kgraph.KEdge) KNode(de.cau.cs.kieler.klighd.kgraph.KNode) Iterables(com.google.common.collect.Iterables) Iterator(java.util.Iterator) Property(org.eclipse.elk.graph.properties.Property) Predicate(java.util.function.Predicate) ListExtensions(org.eclipse.xtext.xbase.lib.ListExtensions) Iterators(com.google.common.collect.Iterators) IteratorExtensions(org.eclipse.xtext.xbase.lib.IteratorExtensions) List(java.util.List) IterableExtensions(org.eclipse.xtext.xbase.lib.IterableExtensions) IAction(de.cau.cs.kieler.klighd.IAction) LinguaFrancaSynthesis(org.lflang.diagram.synthesis.LinguaFrancaSynthesis) ViewContext(de.cau.cs.kieler.klighd.ViewContext) CycleVisualization(org.lflang.diagram.synthesis.util.CycleVisualization) KText(de.cau.cs.kieler.klighd.krendering.KText) WeakHashMap(java.util.WeakHashMap) Function1(org.eclipse.xtext.xbase.lib.Functions.Function1) KText(de.cau.cs.kieler.klighd.krendering.KText) ViewContext(de.cau.cs.kieler.klighd.ViewContext) KNode(de.cau.cs.kieler.klighd.kgraph.KNode)

Aggregations

KText (de.cau.cs.kieler.klighd.krendering.KText)19 KContainerRendering (de.cau.cs.kieler.klighd.krendering.KContainerRendering)8 KRectangle (de.cau.cs.kieler.klighd.krendering.KRectangle)8 KPolygon (de.cau.cs.kieler.klighd.krendering.KPolygon)7 KPolyline (de.cau.cs.kieler.klighd.krendering.KPolyline)7 KLabel (de.cau.cs.kieler.klighd.kgraph.KLabel)6 KRoundedRectangle (de.cau.cs.kieler.klighd.krendering.KRoundedRectangle)6 ElkPadding (org.eclipse.elk.core.math.ElkPadding)6 KEdge (de.cau.cs.kieler.klighd.kgraph.KEdge)5 KNode (de.cau.cs.kieler.klighd.kgraph.KNode)5 KRendering (de.cau.cs.kieler.klighd.krendering.KRendering)5 KPort (de.cau.cs.kieler.klighd.kgraph.KPort)4 LayerConstraint (org.eclipse.elk.alg.layered.options.LayerConstraint)4 SizeConstraint (org.eclipse.elk.core.options.SizeConstraint)4 Pair (org.eclipse.xtext.xbase.lib.Pair)4 Iterables (com.google.common.collect.Iterables)3 Colors (de.cau.cs.kieler.klighd.krendering.Colors)3 HorizontalAlignment (de.cau.cs.kieler.klighd.krendering.HorizontalAlignment)3 KPosition (de.cau.cs.kieler.klighd.krendering.KPosition)3 LineStyle (de.cau.cs.kieler.klighd.krendering.LineStyle)3