Commit d64b0d1f authored by Liana Soima's avatar Liana Soima
Browse files

Merge branch 'master' of https://git.fortiss.org/af3/af3.git into 3976

parents 57dc7786 c0adec4b
......@@ -10,61 +10,6 @@
provider="org.fortiss.af3.component.ui.prototypes.PrototypeProvider">
</modelPrototypeProvider>
</extension>
<extension
point="org.fortiss.tooling.kernel.modelConnectionCompositor">
<modelConnectionCompositor
modelConnectionCompositor="org.fortiss.af3.component.ui.compose.ComponentConnectionCompositor">
<source>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Component">
</modelElementClass>
</source>
<target>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Component">
</modelElementClass>
</target>
</modelConnectionCompositor>
<modelConnectionCompositor
modelConnectionCompositor="org.fortiss.af3.component.ui.compose.ComponentConnectionCompositor">
<source>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Port">
</modelElementClass>
</source>
<target>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Component">
</modelElementClass>
</target>
</modelConnectionCompositor>
<modelConnectionCompositor
modelConnectionCompositor="org.fortiss.af3.component.ui.compose.ComponentConnectionCompositor">
<source>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Component">
</modelElementClass>
</source>
<target>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Port">
</modelElementClass>
</target>
</modelConnectionCompositor>
<modelConnectionCompositor
modelConnectionCompositor="org.fortiss.af3.component.ui.compose.ComponentConnectionCompositor">
<source>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Port">
</modelElementClass>
</source>
<target>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Port">
</modelElementClass>
</target>
</modelConnectionCompositor>
</extension>
<extension
point="org.fortiss.tooling.kernel.ui.modelElementHandler">
<modelElementHandler
......
ComponentConnectionCompositor.java 1e0f1142c9ea412ecfbdabd769e688930225ad08 GREEN
......@@ -309,4 +309,59 @@
</modelElementClass>
</modelElementCompositor>
</extension>
<extension
point="org.fortiss.tooling.kernel.modelConnectionCompositor">
<modelConnectionCompositor
modelConnectionCompositor="org.fortiss.af3.component.compose.ComponentConnectionCompositor">
<source>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Component">
</modelElementClass>
</source>
<target>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Component">
</modelElementClass>
</target>
</modelConnectionCompositor>
<modelConnectionCompositor
modelConnectionCompositor="org.fortiss.af3.component.compose.ComponentConnectionCompositor">
<source>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Port">
</modelElementClass>
</source>
<target>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Component">
</modelElementClass>
</target>
</modelConnectionCompositor>
<modelConnectionCompositor
modelConnectionCompositor="org.fortiss.af3.component.compose.ComponentConnectionCompositor">
<source>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Component">
</modelElementClass>
</source>
<target>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Port">
</modelElementClass>
</target>
</modelConnectionCompositor>
<modelConnectionCompositor
modelConnectionCompositor="org.fortiss.af3.component.compose.ComponentConnectionCompositor">
<source>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Port">
</modelElementClass>
</source>
<target>
<modelElementClass
modelElementClass="org.fortiss.af3.component.model.Port">
</modelElementClass>
</target>
</modelConnectionCompositor>
</extension>
</plugin>
......@@ -3,5 +3,6 @@ BehaviorComponentCompositorBase.java fb4774202dcb216450b206c6bec17ae0786cf79c GR
ComponentArchitectureCompositor.java 166faf6111d527724d966a734b702650706a20ce GREEN
ComponentArchitectureFileProjectCompositor.java 1b972b98efb662fc0e51b9abd0389ccabf314445 GREEN
ComponentCompositor.java 17115be2194e0a0581bf350f0b0013c270381939 GREEN
ComponentConnectionCompositor.java 3f2f5f557061557792f82c5d93441fde14ed9c44 GREEN
LibraryComponentPackageCompositor.java 0e3dcd3e839e275dd7a23e83388d66ae0cd180df GREEN
LibraryCompositor.java e6a47934d3b561fdde707ca1abeb56b27bb78ea2 GREEN
......@@ -13,43 +13,24 @@
| See the License for the specific language governing permissions and |
| limitations under the License. |
+--------------------------------------------------------------------------*/
package org.fortiss.af3.component.ui.compose;
package org.fortiss.af3.component.compose;
import static org.fortiss.af3.component.utils.ComponentModelElementFactory.createChannel;
import java.awt.MouseInfo;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.dialogs.PopupDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.fortiss.af3.component.model.Channel;
import org.fortiss.af3.component.model.Component;
import org.fortiss.af3.component.model.ComponentArchitecture;
import org.fortiss.af3.component.model.InputPort;
import org.fortiss.af3.component.model.OutputPort;
import org.fortiss.af3.component.model.Port;
import org.fortiss.af3.component.utils.ComponentModelElementFactory;
import org.fortiss.af3.component.utils.ComponentUtils;
import org.fortiss.tooling.base.compose.ConnectionCompositorBase;
import org.fortiss.tooling.base.dnd.ConnectionDragContext;
import org.fortiss.tooling.base.model.element.IConnection;
import org.fortiss.tooling.base.model.element.IHierarchicElement;
import org.fortiss.tooling.base.utils.LayoutDataUtils;
import org.fortiss.tooling.kernel.extension.data.IConnectionCompositionContext;
import org.fortiss.tooling.kernel.extension.data.IElementCompositionContext;
import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
import org.fortiss.tooling.kernel.service.IElementCompositorService;
import org.fortiss.tooling.kernel.service.IPersistencyService;
import org.fortiss.tooling.kernel.ui.presentation.ModelElementLabelProvider;
/**
* Connection compositor for directly connecting components.
......@@ -70,47 +51,26 @@ public class ComponentConnectionCompositor
Component parentComp = getConnectionContainer((Port)source, (Port)target);
return canConnect((Port)source, (Port)target, parentComp);
}
return true;
return false;
}
/** Check the classes for the given end of the connection. */
private boolean isOfValidClass(EObject end) {
return end instanceof Component || end instanceof ComponentArchitecture ||
end instanceof Port;
return end instanceof Port;
}
/** {@inheritDoc} */
@Override
public boolean connect(EObject source, EObject target, IHierarchicElement uselessParent,
IConnectionCompositionContext context) {
// Both targetPos and srcPos *have to be computed before the first call to
// handleConnectionEnd because they depend on the mouse cursor when the compositor is called
// (and handleConnectionEnd can change this cursor).
Point targetPos = null;
Point srcPos = null;
if(context instanceof ConnectionDragContext) {
targetPos = getTargetPopupPos();
srcPos = getSourcePopupPos((ConnectionDragContext)context);
}
Port sourceConnector = handleConnectionEnd(source, srcPos, context, false);
if(sourceConnector == null) {
// A little bit ugly to throw an exception there, we would rather just return false.
// However since the connection runs inside a transaction that would entail that the
// model is dirty even though we did not do anything.
throw new OperationCanceledException();
}
Port targetConnector = handleConnectionEnd(target, targetPos, context, true);
if(targetConnector == null) {
throw new OperationCanceledException();
}
Component parentComp = getConnectionContainer(sourceConnector, targetConnector);
Component parentComp = getConnectionContainer((Port)source, (Port)target);
ITopLevelElement topElement =
IPersistencyService.getInstance().getTopLevelElementFor(source);
if(topElement != null) {
topElement.prepareIDs(sourceConnector);
topElement.prepareIDs(targetConnector);
topElement.prepareIDs(source);
topElement.prepareIDs(target);
}
createConnection(sourceConnector, targetConnector, parentComp, topElement);
createConnection((Port)source, (Port)target, parentComp, topElement);
return true;
}
......@@ -128,6 +88,8 @@ public class ComponentConnectionCompositor
if(topElement != null) {
topElement.prepareIDs(connection);
}
// propagate name of source port to channel
((Channel)connection).setName(source.getName());
parent.getConnections().add(connection);
connection.setSource(source);
connection.setTarget(target);
......@@ -170,176 +132,12 @@ public class ComponentConnectionCompositor
return gParent1.equals(parent2) ? gParent1 : parent2.getParentComponent();
}
/**
* Returns the port corresponding to the given end.
* - If end is a port it is obvious.
* - If it is a component then we should add a port to the component and return this component.
* - If we are in a drag and drop context where the end corresponds to the background of the
* editor, then we raise a pop-up menu asking whether we should create a component or a port,
* and then create and return the objects accordingly.
*/
private Port handleConnectionEnd(EObject end, Point popupPos,
IConnectionCompositionContext context, boolean isTarget) {
Port targetConnector = null;
if(end instanceof Port) {
targetConnector = (Port)end;
} else {
if(!(context instanceof ConnectionDragContext)) {
return null;
}
ConnectionDragContext ctx = (ConnectionDragContext)context;
if(isTarget ? ctx.isTargetRoot() : ctx.isSourceRoot()) {
EndSelectionPopup popup = new EndSelectionPopup(popupPos, isTarget);
popup.open();
Display d = Display.getCurrent();
while(!(popup.getShell() == null || popup.getShell().isDisposed())) {
if(!d.readAndDispatch()) {
d.sleep();
}
}
EObject elt = popup.getSelectedItem();
if(elt == null) {
return null;
}
if(elt instanceof Component) {
composeWithDropContext((IHierarchicElement)end, elt, ctx, isTarget);
targetConnector = createPort(!isTarget);
composeWithDropContext((Component)elt, targetConnector, ctx, isTarget);
} else if(elt instanceof Port) {
targetConnector = (Port)elt;
IElementCompositionContext dropCtx =
isTarget ? ctx.getTargetDropContext() : ctx.getSourceDropContext();
LayoutDataUtils.layoutModelElement(elt, dropCtx);
IElementCompositorService.getInstance().compose(end, elt, null);
}
} else {
targetConnector = createPort(!isTarget);
composeWithDropContext((IHierarchicElement)end, targetConnector, ctx, isTarget);
}
}
return targetConnector;
}
/**
* Composes <code>contained</code> into <code>container</code> with the relevant drop context
* depending whether it we are considering the source or the target of the connection.
*/
private void composeWithDropContext(IHierarchicElement container, EObject contained,
IConnectionCompositionContext context, boolean isTarget) {
if(isTarget) {
createNewTargetDropContext(container, context, contained);
} else {
createNewSourceDropContext(container, context, contained);
}
}
/** {@inheritDoc} */
@Override
protected IConnection createConnection() {
return createChannel();
}
/** Creates an output port if we are considering a target or an input port otherwise. */
private Port createPort(boolean isTarget) {
if(isTarget) {
return ComponentModelElementFactory.createOutputPort("Output", "");
}
return ComponentModelElementFactory.createInputPort("Input", "");
}
/** Returns the position to use for the pop up letting the user select a target. */
private Point getTargetPopupPos() {
java.awt.Point pos = MouseInfo.getPointerInfo().getLocation();
return new Point(pos.x, pos.y);
}
/** Returns the position to use for the pop up letting the user select a source. */
private Point getSourcePopupPos(ConnectionDragContext context) {
org.fortiss.tooling.base.model.layout.Point targetPos = context.getTargetPosition();
// Big hack to get the absolute position of the source and target cursor:
// since when the command is triggered the mouse should be at the same position as the
// target we can compute the difference and apply it to the source as well to retrieve
// the absolute coordinate of the source. Disgusting but works.
java.awt.Point mouseLocation = MouseInfo.getPointerInfo().getLocation();
int relX = mouseLocation.x - targetPos.getX();
int relY = mouseLocation.y - targetPos.getY();
org.fortiss.tooling.base.model.layout.Point sourcePos = context.getSourcePosition();
return new Point(sourcePos.getX() + relX, sourcePos.getY() + relY);
}
/** Pop-up to use to let the user select the object they want to create. */
private class EndSelectionPopup extends org.eclipse.jface.dialogs.PopupDialog {
/** The item selected by the user. */
private EObject selectedItem;
/**
* Are we focusing on the source or the target of the connection ?
* Allows to create the relevant object (input or output port?).
*/
private boolean isTarget;
/** Position where to display the pop-up. Depends on the drag-and-drop gesture. */
private Point position;
/** Returns selectedItem. */
public EObject getSelectedItem() {
return selectedItem;
}
/** Constructor. */
public EndSelectionPopup(Point popupPosition, boolean isTarget) {
super(Display.getCurrent().getActiveShell(), PopupDialog.INFOPOPUP_SHELLSTYLE, true,
false, true, false, false, "Add", null);
this.isTarget = isTarget;
this.position = popupPosition;
}
/** {@inheritDoc} */
@Override
protected Point getDefaultLocation(Point initialSize) {
return this.position;
}
/** Fake class to get a cancel button. */
private class Cancel {
// Nothing to do.
}
/** {@inheritDoc} */
@Override
protected Control createDialogArea(Composite parent) {
TableViewer viewer;
viewer = new TableViewer(parent);
viewer.setContentProvider(new ArrayContentProvider());
viewer.setLabelProvider(new ModelElementLabelProvider() {
/** {@inheritDoc} */
@Override
public String getText(Object element) {
return element instanceof Cancel ? "Cancel" : super.getText(element);
}
});
Component comp = ComponentModelElementFactory.createComponent("Component", "");
Port port;
port = createPort(isTarget);
Object[] prototypes = {comp, port, new Cancel()};
viewer.setInput(prototypes);
viewer.getTable().addSelectionListener(new SelectionAdapter() {
/** {@inheritDoc} */
@Override
public void widgetSelected(SelectionEvent e) {
StructuredSelection selection = (StructuredSelection)viewer.getSelection();
Object sel = selection.getFirstElement();
selectedItem = sel instanceof Cancel ? null : (EObject)sel;
close();
}
});
return parent;
}
}
/** {@inheritDoc} */
@Override
public boolean canDisconnect(EObject connection) {
......
ModeVisual.java 68adf9e5fa791a8185b182b8232b4e415c440b56 GREEN
SwitchSegmentContentConnectorVisual.java 20eeb1739a1fbc5449253463916b2fcfdd5b51d5 GREEN
SwitchSegmentContentConnectorVisual.java e32b6ad95ea076aea4e37c7900ab2bfa047cb7b4 GREEN
SwitchSegmentDiagramConnectorVisual.java 501de4255c1e66249eb3d9a023b654d532dbad68 GREEN
......@@ -18,12 +18,12 @@ package org.fortiss.af3.mode.ui.editor.fx.visual;
import static javafx.scene.paint.Color.BLACK;
import static javafx.scene.paint.Color.WHITE;
import org.fortiss.tooling.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.IContentVisual;
import org.fortiss.af3.mode.model.Mode;
import org.fortiss.af3.mode.model.SwitchSegmentConnector;
import org.fortiss.af3.state.model.TransitionSegmentEntryConnector;
import org.fortiss.af3.mode.model.SwitchSegmentEntryConnector;
import org.fortiss.tooling.base.ui.editor.fx.visual.NamedLayoutedCircularAnchorageContentVisual;
import org.fortiss.tooling.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.IContentVisual;
import javafx.scene.paint.Paint;
......@@ -44,7 +44,7 @@ public class SwitchSegmentContentConnectorVisual
@Override
protected Paint getFillColor() {
SwitchSegmentConnector c = getModelElement();
if(c instanceof TransitionSegmentEntryConnector) {
if(c instanceof SwitchSegmentEntryConnector) {
return WHITE;
}
return BLACK;
......
......@@ -4,4 +4,4 @@ PlatformComponentControllerFactory.java c353602118a17bdb9e78ad3d97ed9dbca5297a7f
PlatformComponentFXEditor.java 579bda140d6d490e40c49386957bf63af345f373 GREEN
PlatformComponentFXEditorBinding.java 0cfd58f8ffdd9fd8faae854841cfd5fb8cde24a1 GREEN
PlatformComponentModelFactory.java 2075ee98896f6d26c3bf24045ccc8b3eb8f0d6aa GREEN
PlatformComponentVisualFactory.java e0a773856f7d037ff0f21234ed1884a49c1161c4 GREEN
PlatformComponentVisualFactory.java ae8344ea761001ab0dbb9f92addf721855f92e1c GREEN
......@@ -15,31 +15,33 @@
+--------------------------------------------------------------------------*/
package org.fortiss.af3.platform.hierarchic.ui.editor.fx;
import org.fortiss.tooling.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
import org.fortiss.tooling.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
import org.fortiss.tooling.common.ui.javafx.lwfxef.mvc.IDiagramAnchorageMVCBundle;
import org.fortiss.tooling.common.ui.javafx.lwfxef.mvc.ILinkMVCBundle;
import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.IContentAnchorageVisual;
import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.IContentVisual;
import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.IDiagramAnchorageVisual;
import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.ILinkVisual;
import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.IVisualFactory;
import org.fortiss.af3.platform.hierarchic.model.cluster.Cluster;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.DirectedPlatformConnectorContentVisual;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.DirectedPlatformConnectorDiagramVisual;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.PlatformClusterVisual;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.PlatformExecutionUnitVisual;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.PlatformGatewayUnitVisual;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.PlatformGenericUnitVisual;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.PlatformMemoryUnitVisual;
import org.fortiss.af3.platform.hierarchic.ui.editor.fx.visual.PlatformTransmissionUnitVisual;
import org.fortiss.af3.platform.model.ExecutionUnit;
import org.fortiss.af3.platform.model.GatewayUnit;
import org.fortiss.af3.platform.model.IPlatformArchitectureElement;
import org.fortiss.af3.platform.model.MemoryUnit;
import org.fortiss.af3.platform.model.PlatformArchitecture;
import org.fortiss.af3.platform.model.PlatformConnectorUnit;
import org.fortiss.af3.platform.model.TransmissionConnection;
import org.fortiss.af3.platform.model.TransmissionUnit;
import org.fortiss.tooling.base.ui.editor.fx.visual.NamedLayoutedLineLinkVisual;
import org.fortiss.af3.platform.ui.editor.fx.visual.TransmissionConnectionVisual;
import org.fortiss.tooling.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
import org.fortiss.tooling.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
import org.fortiss.tooling.common.ui.javafx.lwfxef.mvc.IDiagramAnchorageMVCBundle;
import org.fortiss.tooling.common.ui.javafx.lwfxef.mvc.ILinkMVCBundle;
import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.IContentAnchorageVisual;
import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.IContentVisual;
import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.IDiagramAnchorageVisual;
import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.ILinkVisual;
import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.IVisualFactory;
/**
* {@link IVisualFactory} for the or the lower layers of hierarchical
......@@ -63,6 +65,8 @@ public final class PlatformComponentVisualFactory implements IVisualFactory {
return new PlatformGatewayUnitVisual(modelBundle);
} else if(model instanceof MemoryUnit) {
return new PlatformMemoryUnitVisual(modelBundle);
} else if(model instanceof IPlatformArchitectureElement) {
return new PlatformGenericUnitVisual(modelBundle);
}
return null;
......@@ -99,7 +103,7 @@ public final class PlatformComponentVisualFactory implements IVisualFactory {
public ILinkVisual createLinkVisual(ILinkMVCBundle modelBundle) {
Object linkObj = modelBundle.getModel();
if(linkObj instanceof TransmissionConnection) {
return new NamedLayoutedLineLinkVisual<>(modelBundle, TransmissionConnection.class);
return new TransmissionConnectionVisual(modelBundle);
}
return null;
}
......
......@@ -3,5 +3,6 @@ DirectedPlatformConnectorDiagramVisual.java b752a6fc089fb0457409a16f8446349b3213
PlatformClusterVisual.java 119c9931b1674451e99ab5a3df090369de3ac629 GREEN
PlatformExecutionUnitVisual.java 6ca5f83416416e2e4576689199f9ed8375fb2118 GREEN
PlatformGatewayUnitVisual.java 7b22801b13863f972ab46eb4cd87853801ac7ce8 GREEN
PlatformGenericUnitVisual.java 80e903e53a226ac772f21f851c1230141a5ec0a9 GREEN
PlatformMemoryUnitVisual.java 12ced545e8aadcc4a413ad8f939b3528bcc1422a GREEN
PlatformTransmissionUnitVisual.java b2dee9a83c2bf9bbf082c042d3a712a91ed3feb6 GREEN
/*-------------------------------------------------------------------------+
| Copyright 2019 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.af3.platform.hierarchic.ui.editor.fx.visual;
import static javafx.scene.paint.Color.rgb;
import static org.fortiss.af3.platform.hierarchic.ui.HierarchicPlatformUIActivator.PLUGIN_ID;
import static org.fortiss.tooling.common.ui.javafx.util.GraphicUtils.getFXImage;
import org.fortiss.af3.platform.model.IPlatformArchitectureElement;
import org.fortiss.tooling.base.ui.editor.fx.visual.NamedLayoutedRectangularContentVisual;
import org.fortiss.tooling.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
import org.fortiss.tooling.common.ui.javafx.lwfxef.visual.IVisual;
import javafx.scene.image.Image;
import javafx.scene.paint.Color;
import javafx.scene.paint.Paint;
/**
* {@link IVisual} of hierarchical generic {@link IPlatformArchitectureElement}s.
*
* @author diewald
*/
public class PlatformGenericUnitVisual
extends NamedLayoutedRectangularContentVisual<IPlatformArchitectureElement> {
/** Fill color of a Cluster. */