Let's extend the example referred to yesterday. We'll let the user connect widgets with each other, after the Ctrl key is pressed and the mouse is moved from one widget to another.
Add the below to the AccountBuchWidget class:
private class AccountBuchConnectProvider implements ConnectProvider {
@Override
public boolean isSourceWidget(Widget source) {
return source instanceof AccountBuchWidget
&& source != null ? true : false;
}
@Override
public ConnectorState isTargetWidget(Widget src, Widget trg) {
return src != trg && trg instanceof AccountBuchWidget
? ConnectorState.ACCEPT : ConnectorState.REJECT;
}
@Override
public boolean hasCustomTargetWidgetResolver(Scene arg0) {
return false;
}
@Override
public Widget resolveTargetWidget(Scene arg0, Point arg1) {
return null;
}
@Override
public void createConnection(Widget source, Widget target) {
ConnectionWidget conn = new ConnectionWidget(scene);
conn.setTargetAnchorShape(AnchorShape.TRIANGLE_FILLED);
conn.setTargetAnchor(AnchorFactory.createRectangularAnchor(target));
conn.setSourceAnchor(AnchorFactory.createRectangularAnchor(source));
connectionLayerWidget.addChild(conn);
}
}
Next, in the TopComponent constructor, create a new LayerWidget, add it to the Scene, and change the initialization of the AccountBuchWidget so that the new LayerWidget is passed to the AccountBuchWidget constructor:
final LayerWidget connectionLayerWidget = new LayerWidget(scene);
layerWidget.addChild(new AccountBuchWidget(scene, ab, point, connectionLayerWidget));
scene.addChild(connectionLayerWidget);
Then you can add the AccountBuchConnectionProvider to the list of Actions in the constructor of the AccountBuchWidget:
getActions().addAction(ActionFactory.createExtendedConnectAction(
connectionLayerWidget,
new AccountBuchConnectProvider())
);
Finally, if you incorporated the Delete key, mentioned by Mike in the comments yesterday, make sure to also remove the related ConnectionWidgets when deleting an AccountBuchWidget:
} else if (event.getKeyCode() == KeyEvent.VK_DELETE) {
widget.removeFromParent();
List<Widget> connectionsToRemove = new ArrayList<Widget>();
for (Widget clwKid : connectionLayerWidget.getChildren()) {
ConnectionWidget connectionWidget = (ConnectionWidget) clwKid;
if (connectionWidget.getSourceAnchor().getRelatedWidget().equals(widget)) {
connectionsToRemove.add(connectionWidget);
}
if (connectionWidget.getTargetAnchor().getRelatedWidget().equals(widget)) {
connectionsToRemove.add(connectionWidget);
}
}
connectionLayerWidget.removeChildren(connectionsToRemove);
}
Tip: Make sure to hold down the Ctrl key when using the mouse to connect two widgets.