diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/.ratings index 740f31903cb27afedc4f8d504a10873e578dff8c..8a21ba475b440130bd137a0923bcfd987bcdc596 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/.ratings +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/.ratings @@ -1,3 +1,5 @@ -AutoLayoutMenu.java ef3b897cc2fd99cf9ce201f03cffea036555e3ac GREEN +AutoLayoutMenu.java bca7986c209678ed937548a37db494430877d80e GREEN +DiagramTapeMeasure.java 72454e6fe5225dab11d3d691baad93aab7a171c0 GREEN IAutoLayouter.java de1b11d9e202c7e23352ad85684dbf8a3fd17c7d GREEN -KielerAutoLayouter.java fae8692ca0131a6d14cff768aba446b7b35512d6 GREEN +IAutoLayouterTapeMeasure.java df186e0ba505e0ecda211b1df76cf12f3245b47e GREEN +KielerAutoLayouter.java a0f2d0cd94ffd043e6d4ddbe1589a1894412f81c GREEN diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/AutoLayoutMenu.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/AutoLayoutMenu.java index ef3b897cc2fd99cf9ce201f03cffea036555e3ac..bca7986c209678ed937548a37db494430877d80e 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/AutoLayoutMenu.java +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/AutoLayoutMenu.java @@ -21,7 +21,6 @@ import static org.fortiss.tooling.base.utils.AngleUtils.getAngle; import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickInstanceOf; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import org.eclipse.emf.ecore.EObject; @@ -34,9 +33,10 @@ import org.fortiss.tooling.base.model.element.IConnector; import org.fortiss.tooling.base.model.element.IHierarchicElement; import org.fortiss.tooling.base.model.layout.ILayoutedModelElement; import org.fortiss.tooling.base.ui.ToolingBaseUIActivator; -import org.fortiss.tooling.kernel.model.IProjectRootElement; import org.fortiss.tooling.kernel.ui.extension.IContextMenuContributor; +import org.fortiss.tooling.kernel.ui.extension.IModelElementHandler; import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider; +import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService; /** * Context menu entry to automatic layout {@link IHierarchicElement}-based models. @@ -96,16 +96,16 @@ public class AutoLayoutMenu implements IContextMenuContributor { public List<IContributionItem> getContributedItems(EObject selection, ContextMenuContextProvider contextProvider) { - if(!(selection instanceof IHierarchicElement)) { - return Collections.emptyList(); + IModelElementHandler<EObject> handler = + IModelElementHandlerService.getInstance().getModelElementHandler(selection); + if(handler == null) { + return emptyList(); } - - IHierarchicElement element = (IHierarchicElement)selection; - // Skip single top-level model element (e.g., AF3 component architecture) - if(element instanceof IProjectRootElement && element.getContainedElements().size() == 1) { - // There is exactly one child element - element = element.getContainedElements().get(0); + EObject editedObject = handler.handleOpenModelElementRequest(selection); + if(!(editedObject instanceof IHierarchicElement)) { + return emptyList(); } + IHierarchicElement element = (IHierarchicElement)editedObject; // Check if model is empty if(pickInstanceOf(ILayoutedModelElement.class, element.getContainedElements()).isEmpty()) { diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/DiagramTapeMeasure.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/DiagramTapeMeasure.java new file mode 100644 index 0000000000000000000000000000000000000000..72454e6fe5225dab11d3d691baad93aab7a171c0 --- /dev/null +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/DiagramTapeMeasure.java @@ -0,0 +1,145 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.tooling.base.ui.layout.auto; + +import static java.lang.Math.max; +import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_CONNECTOR_SIZE; +import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_GRID_SIZE; +import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_SHAPE_MINIMUM_WIDTH; +import static org.fortiss.tooling.base.utils.LayoutDataUtils.getNodeSize; +import static org.fortiss.tooling.kernel.ui.util.KernelUIUtils.getName; +import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickInstanceOf; + +import org.eclipse.draw2d.IFigure; +import org.eclipse.draw2d.Label; +import org.eclipse.gef.EditPartViewer; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Point; +import org.fortiss.tooling.base.model.base.EntryConnectorBase; +import org.fortiss.tooling.base.model.element.IConnection; +import org.fortiss.tooling.base.model.element.IConnector; +import org.fortiss.tooling.base.model.element.IHierarchicElement; +import org.fortiss.tooling.base.model.element.IModelElement; +import org.fortiss.tooling.base.model.layout.Dimension; +import org.fortiss.tooling.base.model.layout.ILayoutedModelElement; +import org.fortiss.tooling.base.ui.editor.DiagramEditorBase; +import org.fortiss.tooling.base.ui.editpart.ConnectionEditPartBase; +import org.fortiss.tooling.base.ui.editpart.ElementEditPartBase; + +/** + * {@link IAutoLayouterTapeMeasure} specialization to for automatic layout of models to be displayed + * in {@link DiagramEditorBase}-based editors. + * + * @author barner + */ +public class DiagramTapeMeasure implements IAutoLayouterTapeMeasure { + + /** {@link EditPartViewer} used to display the underlying diagram. */ + private EditPartViewer diagramEpv; + + /** Underlying GC. */ + private GC gc; + + /** Constructor. */ + public DiagramTapeMeasure(EditPartViewer epv, GC gc) { + this.diagramEpv = epv; + this.gc = gc; + } + + /** Returns the {@code Font} used by the given {@code element} (may be {@code null}). */ + private Font getFont(IModelElement element) { + if(diagramEpv == null) { + return null; + } + Object ep = diagramEpv.getEditPartRegistry().get(element); + if(ep instanceof ElementEditPartBase) { + Label label = ((ElementEditPartBase<?>)ep).createLabelFigure(); + if(label != null) { + return label.getFont(); + } + } else if(ep instanceof ConnectionEditPartBase) { + IFigure figure = ((ConnectionEditPartBase<?>)ep).getFigure(); + if(figure != null) { + return figure.getFont(); + } + } + + return null; + } + + /** Returns the text extend of the given {@code element}'s label (may be {@code null}). */ + private Point getTextExtent(IModelElement element) { + if(gc == null) { + return null; + } + + String name = getName(element); + if(name == null) { + return null; + } + + gc.setFont(getFont(element)); + Point rval = gc.textExtent(name); + + return rval; + } + + /** {@inheritDoc} */ + @Override + public int getElementWidth(IHierarchicElement element) { + Dimension dimension = getNodeSize((ILayoutedModelElement)element); + + int width = max(DEFAULT_SHAPE_MINIMUM_WIDTH, dimension.getWidth()); + Point textExtend = getTextExtent(element); + if(textExtend != null) { + width = max(width, textExtend.x + 6 * DEFAULT_GRID_SIZE); + } + + return width; + } + + /** {@inheritDoc} */ + @Override + public int getElementHeight(IHierarchicElement element) { + Dimension dimension = getNodeSize((ILayoutedModelElement)element); + int numElemConnectors = element.getConnectors().size(); + int numElemInputConnectors = + pickInstanceOf(EntryConnectorBase.class, element.getConnectors()).size(); + int numConnectors = max(numElemInputConnectors, numElemConnectors - numElemInputConnectors); + + return max((1 + 2 * numConnectors) * DEFAULT_CONNECTOR_SIZE, dimension.getHeight()); + } + + /** {@inheritDoc} */ + @Override + public int getConnectorWidth(IConnector connector) { + return 2 * DEFAULT_CONNECTOR_SIZE; + } + + /** {@inheritDoc} */ + @Override + public int getConnectorHeight(IConnector connector) { + return 2 * DEFAULT_CONNECTOR_SIZE; + } + + /** {@inheritDoc} */ + @Override + public int getConnectionWidth(IConnection connection) { + Point textExtend = getTextExtent(connection); + return textExtend != null ? textExtend.x : 0; + } +} diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/IAutoLayouterTapeMeasure.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/IAutoLayouterTapeMeasure.java new file mode 100644 index 0000000000000000000000000000000000000000..df186e0ba505e0ecda211b1df76cf12f3245b47e --- /dev/null +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/IAutoLayouterTapeMeasure.java @@ -0,0 +1,43 @@ +/*-------------------------------------------------------------------------+ +| Copyright 2018 fortiss GmbH | +| | +| Licensed under the Apache License, Version 2.0 (the "License"); | +| you may not use this file except in compliance with the License. | +| You may obtain a copy of the License at | +| | +| http://www.apache.org/licenses/LICENSE-2.0 | +| | +| Unless required by applicable law or agreed to in writing, software | +| distributed under the License is distributed on an "AS IS" BASIS, | +| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | +| See the License for the specific language governing permissions and | +| limitations under the License. | ++--------------------------------------------------------------------------*/ +package org.fortiss.tooling.base.ui.layout.auto; + +import org.fortiss.tooling.base.model.element.IConnection; +import org.fortiss.tooling.base.model.element.IConnector; +import org.fortiss.tooling.base.model.element.IHierarchicElement; + +/** + * Interface used by {@link IAutoLayouter} to estimate dimensions requirements of elements (for the + * respective editor for which the automatic layout is performed). + * + * @author barner + */ +public interface IAutoLayouterTapeMeasure { + /** Estimates the width requirements of the given element. */ + public int getElementWidth(IHierarchicElement element); + + /** Estimates the height requirements of the given element. */ + public int getElementHeight(IHierarchicElement element); + + /** Estimates the width requirements of the given connector. */ + public int getConnectorWidth(IConnector connector); + + /** Estimates the height requirements of the given connector. */ + public int getConnectorHeight(IConnector connector); + + /** Estimates the width requirements of the given connection. */ + public int getConnectionWidth(IConnection connection); +} diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/KielerAutoLayouter.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/KielerAutoLayouter.java index fae8692ca0131a6d14cff768aba446b7b35512d6..a0f2d0cd94ffd043e6d4ddbe1589a1894412f81c 100644 --- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/KielerAutoLayouter.java +++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/layout/auto/KielerAutoLayouter.java @@ -20,19 +20,17 @@ import static de.cau.cs.kieler.kiml.options.LayoutOptions.DIRECTION; import static de.cau.cs.kieler.kiml.options.LayoutOptions.INTERACTIVE; import static de.cau.cs.kieler.kiml.options.LayoutOptions.PORT_SIDE; import static de.cau.cs.kieler.kiml.util.KimlUtil.createInitializedEdge; +import static de.cau.cs.kieler.kiml.util.KimlUtil.createInitializedLabel; import static de.cau.cs.kieler.kiml.util.KimlUtil.createInitializedNode; import static de.cau.cs.kieler.kiml.util.KimlUtil.createInitializedPort; import static de.cau.cs.kieler.klay.layered.properties.InteractiveReferencePoint.TOP_LEFT; import static de.cau.cs.kieler.klay.layered.properties.Properties.FEEDBACK_EDGES; import static de.cau.cs.kieler.klay.layered.properties.Properties.INTERACTIVE_REFERENCE_POINT; -import static java.lang.Math.max; import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_CONNECTOR_SIZE; import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_GRID_SIZE; -import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_SHAPE_MINIMUM_WIDTH; import static org.fortiss.tooling.base.ui.annotation.view.AnnotationViewPartBase.isUpdateEnabled; import static org.fortiss.tooling.base.ui.annotation.view.AnnotationViewPartBase.setUpdateEnabled; import static org.fortiss.tooling.base.ui.utils.LayoutDataUIUtils.addBendPointToConnection; -import static org.fortiss.tooling.base.utils.LayoutDataUtils.getNodeSize; import static org.fortiss.tooling.base.utils.LayoutDataUtils.setNodeLayoutData; import static org.fortiss.tooling.base.utils.LayoutDataUtils.setNodePosition; import static org.fortiss.tooling.base.utils.LayoutDataUtils.setStickyConnectorLayoutData; @@ -43,23 +41,29 @@ import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.BasicEMap; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.EMap; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.gef.EditPartViewer; +import org.eclipse.swt.graphics.GC; import org.fortiss.tooling.base.model.base.EntryConnectorBase; import org.fortiss.tooling.base.model.base.ExitConnectorBase; import org.fortiss.tooling.base.model.element.IConnection; import org.fortiss.tooling.base.model.element.IConnector; import org.fortiss.tooling.base.model.element.IHierarchicElement; -import org.fortiss.tooling.base.model.layout.Dimension; import org.fortiss.tooling.base.model.layout.EOrientation; import org.fortiss.tooling.base.model.layout.ILayoutData; import org.fortiss.tooling.base.model.layout.ILayoutedModelElement; import org.fortiss.tooling.base.model.layout.Points; import org.fortiss.tooling.base.model.layout.impl.PointsImpl; +import org.fortiss.tooling.base.ui.editor.DiagramEditorBase; import org.fortiss.tooling.kernel.extension.data.ITopLevelElement; import org.fortiss.tooling.kernel.service.IPersistencyService; +import org.fortiss.tooling.kernel.ui.extension.IModelEditor; +import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService; import de.cau.cs.kieler.core.alg.BasicProgressMonitor; import de.cau.cs.kieler.core.alg.IKielerProgressMonitor; import de.cau.cs.kieler.core.kgraph.KEdge; +import de.cau.cs.kieler.core.kgraph.KLabel; import de.cau.cs.kieler.core.kgraph.KNode; import de.cau.cs.kieler.core.kgraph.KPort; import de.cau.cs.kieler.kiml.AbstractLayoutProvider; @@ -109,11 +113,10 @@ public class KielerAutoLayouter implements IAutoLayouter { /** {@inheritDoc} */ @Override - public void performAutoLayout(IHierarchicElement hierarchicElement) { - + public void performAutoLayout(IHierarchicElement element) { boolean avUpdateEnabled = isUpdateEnabled(); setUpdateEnabled(false); - KNode rootNode = createKIELERGraph(hierarchicElement); + KNode rootNode = createKIELERGraph(element); KShapeLayout rootNodeLayout = rootNode.getData(KShapeLayout.class); rootNodeLayout.setProperty(DIRECTION, RIGHT); @@ -125,7 +128,7 @@ public class KielerAutoLayouter implements IAutoLayouter { IKielerProgressMonitor progressMonitor = new BasicProgressMonitor(); layoutProvider.doLayout(rootNode, progressMonitor); - applyLayout(rootNode, hierarchicElement); + applyLayout(rootNode, element); setUpdateEnabled(avUpdateEnabled); } @@ -173,19 +176,19 @@ public class KielerAutoLayouter implements IAutoLayouter { * * @param template * The {@link KNode} that stores the layout. - * @param hierarchicElement + * @param element * The {@link IHierarchicElement} to which the layout should be applied. */ - private void applyLayout(KNode template, IHierarchicElement hierarchicElement) { + private void applyLayout(KNode template, IHierarchicElement element) { ITopLevelElement topLevelElement = - IPersistencyService.getInstance().getTopLevelElementFor(hierarchicElement); + IPersistencyService.getInstance().getTopLevelElementFor(element); topLevelElement.runAsCommand(() -> { - filterBendPoints(hierarchicElement); + filterBendPoints(element); - for(IHierarchicElement element : hierarchicElement.getContainedElements()) { - KNode kNode = modelElementsToKNodes.get(element); + for(IHierarchicElement child : element.getContainedElements()) { + KNode kNode = modelElementsToKNodes.get(child); KShapeLayout kNodeLayout = kNode.getData(KShapeLayout.class); - setNodeLayoutData((ILayoutedModelElement)element, + setNodeLayoutData((ILayoutedModelElement)child, truncateSnap2Grid(kNodeLayout.getXpos()), truncateSnap2Grid(kNodeLayout.getYpos()), truncateSnap2Grid(kNodeLayout.getWidth(), true), @@ -263,13 +266,9 @@ public class KielerAutoLayouter implements IAutoLayouter { } } - /** - * Removes all bend-points in connections contained in the given {@link IHierarchicElement}. - * - * @param hierarchicElement - */ - private void filterBendPoints(IHierarchicElement hierarchicElement) { - for(IConnection connection : hierarchicElement.getConnections()) { + /** Removes all bend-points in connections contained in the given {@link IHierarchicElement}. */ + private void filterBendPoints(IHierarchicElement element) { + for(IConnection connection : element.getConnections()) { for(ILayoutData layoutData : ((ILayoutedModelElement)connection).getLayoutData()) { if(layoutData instanceof Points || layoutData instanceof PointsImpl) { ((Points)layoutData).getPoints().clear(); @@ -278,17 +277,30 @@ public class KielerAutoLayouter implements IAutoLayouter { } } + /** + * Opens the given {@link IHierarchicElement} in an editor. Returns the editor in case it is a + * {@link DiagramEditorBase}-based, {@code null} otherwise. + */ + private EditPartViewer getDiagramEditPartViewer(IHierarchicElement element) { + IModelEditorBindingService es = IModelEditorBindingService.getInstance(); + es.openInEditor(element); + IModelEditor<EObject> editor = es.getActiveEditor(); + + boolean isDiagramEditor = editor instanceof DiagramEditorBase; + return isDiagramEditor ? ((DiagramEditorBase<?>)editor).getViewer() : null; + } + /** * Creates a KIELER {@link KNode} graph with the same structure as the given * {@link IHierarchicElement}. * - * @param hierarchicElement + * @param element * The {@link IHierarchicElement} for which the {@link KNode} graph should be created * * @return A {@link KNode} graph with the same structure as the graph contained in the * {@link IHierarchicElement}. */ - private KNode createKIELERGraph(IHierarchicElement hierarchicElement) { + private KNode createKIELERGraph(IHierarchicElement element) { KNode rootNode = createInitializedNode(); @@ -298,22 +310,31 @@ public class KielerAutoLayouter implements IAutoLayouter { connectionsToKEdges = new BasicEMap<IConnection, KEdge>(); undirectedConnectorsToKPorts = new BasicEMap<IConnector, KPort>(); - // Create nodes - for(IHierarchicElement currentChild : hierarchicElement.getContainedElements()) { + EditPartViewer viewer = getDiagramEditPartViewer(element); + GC gc = viewer != null ? new GC(viewer.getControl()) : null; + IAutoLayouterTapeMeasure tapeMeasure = new DiagramTapeMeasure(viewer, gc); - if(!(currentChild instanceof ILayoutedModelElement)) { + // Create nodes + for(IHierarchicElement child : element.getContainedElements()) { + if(!(child instanceof ILayoutedModelElement)) { continue; } - + // Adjust size of node to number of connectors and label size KNode kNode = createInitializedNode(); - KShapeLayout kNodeLayout = kNode.getData(KShapeLayout.class); + int width = tapeMeasure.getElementWidth(child); + kNodeLayout.setWidth(truncateSnap2Grid(width, true)); + int height = tapeMeasure.getElementHeight(child); + kNodeLayout.setHeight(truncateSnap2Grid(height, true)); + kNode.setParent(rootNode); + modelElementsToKNodes.put(child, kNode); + + // Setup connectors EList<IConnector> inputConnectors = new BasicEList<IConnector>(); EList<IConnector> outputConnectors = new BasicEList<IConnector>(); EList<IConnector> undirectedConnectors = new BasicEList<IConnector>(); - - for(IConnector connector : currentChild.getConnectors()) { + for(IConnector connector : child.getConnectors()) { if(connector instanceof EntryConnectorBase) { inputConnectors.add(connector); } else if(connector instanceof ExitConnectorBase) { @@ -323,17 +344,6 @@ public class KielerAutoLayouter implements IAutoLayouter { undirectedConnectors.add(connector); } } - - // Adjust size of node to number of connectors - Dimension dimension = getNodeSize((ILayoutedModelElement)currentChild); - int numConnectors = max(inputConnectors.size(), outputConnectors.size()); - kNodeLayout.setHeight(max((1 + 2 * numConnectors) * DEFAULT_CONNECTOR_SIZE, - truncateSnap2Grid(dimension.getHeight(), true))); - kNodeLayout.setWidth(max(DEFAULT_SHAPE_MINIMUM_WIDTH, - truncateSnap2Grid(dimension.getWidth(), true))); - - kNode.setParent(rootNode); - modelElementsToKNodes.put(currentChild, kNode); for(IConnector connector : outputConnectors) { KPort k = createKPortFromIConnector(connector, kNode, outboundConnectorsToKPorts); if(undirectedConnectors.contains(connector)) { @@ -349,11 +359,11 @@ public class KielerAutoLayouter implements IAutoLayouter { globalInboundConnectorsToKPorts = new BasicEMap<IConnector, KPort>(); globalOutboundConnectorsToKPorts = new BasicEMap<IConnector, KPort>(); - for(IConnector connector : hierarchicElement.getConnectors()) { + for(IConnector connector : element.getConnectors()) { KNode kNodeVirtual = createInitializedNode(); KShapeLayout kNodeVirtualLayout = kNodeVirtual.getData(KShapeLayout.class); - kNodeVirtualLayout.setHeight(DEFAULT_CONNECTOR_SIZE); - kNodeVirtualLayout.setWidth(2 * DEFAULT_CONNECTOR_SIZE); + kNodeVirtualLayout.setWidth(tapeMeasure.getConnectorWidth(connector)); + kNodeVirtualLayout.setHeight(tapeMeasure.getConnectorHeight(connector)); kNodeVirtual.setParent(rootNode); KPort kPort = createInitializedPort(); @@ -374,6 +384,12 @@ public class KielerAutoLayouter implements IAutoLayouter { kEdge.setSource(kSourcePort.getNode()); kEdge.setSourcePort(kSourcePort); + + KLabel kLabel = createInitializedLabel(kEdge); + KShapeLayout kLabelLayout = kLabel.getData(KShapeLayout.class); + int width = tapeMeasure.getConnectionWidth(connection); + kLabelLayout.setWidth(truncateSnap2Grid(width, true)); + kSourcePort.getEdges().add(kEdge); KPort kTargetPort = inboundConnectorsToKPorts.get(connection.getTarget()); if(kTargetPort == null) { @@ -388,11 +404,15 @@ public class KielerAutoLayouter implements IAutoLayouter { connectionsToKEdges.put(connection, kEdge); } } + + if(gc != null) { + gc.dispose(); + } return rootNode; } /** - * Converts a given {@link IConnection} into a {@link KPort}, and registers it with the given + * Converts a given {@link IConnector} into a {@link KPort}, and registers it with the given * {@link KNode} (representing the {@link IHierarchicElement} containing the {@link IConnector}) * and a {@link IConnector}-to- {@link KPort} map. * diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/.ratings index eb78ff56bb246641f3d14ce1126701c892998fdc..6f11580115d0508bfcacd4d6f5b27e4d4bdc8358 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/.ratings +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/.ratings @@ -1,5 +1,5 @@ ActionBarContributor.java 18d9db3744c5381cca8b6823b5f7bc18183a1cfa GREEN -ExtendableMultiPageEditor.java 968540e08143a77e8233bb8a7d8af6bd90b6b12e GREEN +ExtendableMultiPageEditor.java e2907990cfcc5ba4c2fc3d689ab3258e8014c79a GREEN IActionContributingEditor.java 4aa7496d67822de919a8cf0af0ddaafc61bf2919 GREEN ModelElementEditorInput.java 7edf3d4955c55ee595fdcd097ce9a7050ff1b383 GREEN TutorialStepUIEditor.java 9eadc96c302b5131ff4cc3715777718fa06ec7e8 GREEN diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/ExtendableMultiPageEditor.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/ExtendableMultiPageEditor.java index 968540e08143a77e8233bb8a7d8af6bd90b6b12e..e2907990cfcc5ba4c2fc3d689ab3258e8014c79a 100644 --- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/ExtendableMultiPageEditor.java +++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/ExtendableMultiPageEditor.java @@ -34,6 +34,7 @@ import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.ISaveablePart; +import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPartConstants; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.MultiPageEditorPart; @@ -109,6 +110,14 @@ public class ExtendableMultiPageEditor extends MultiPageEditorPart implements } } + /** {@inheritDoc} */ + @Override + public void setFocus() { + super.setFocus(); + // Workaround to prevent tab icons from disappearing when tabs are reordered + firePropertyChange(IWorkbenchPart.PROP_TITLE); + } + /** * This is called whenever something about the currently edited object * changes. This is used to update the part name and to close the editor if