| /********************************************************************* |
| * Copyright (c) 2005, 2019 SAP SE |
| * |
| * This program and the accompanying materials are made |
| * available under the terms of the Eclipse Public License 2.0 |
| * which is available at https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * Contributors: |
| * SAP SE - initial API, implementation and documentation |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| **********************************************************************/ |
| package org.eclipse.graphiti.testtool.sketch.features; |
| |
| import java.util.List; |
| |
| import org.eclipse.graphiti.features.IFeatureProvider; |
| import org.eclipse.graphiti.features.context.IReconnectionContext; |
| import org.eclipse.graphiti.features.context.impl.ReconnectionContext; |
| import org.eclipse.graphiti.features.context.impl.RemoveContext; |
| import org.eclipse.graphiti.features.impl.DefaultReconnectionFeature; |
| import org.eclipse.graphiti.mm.algorithms.Polyline; |
| import org.eclipse.graphiti.mm.algorithms.styles.LineStyle; |
| import org.eclipse.graphiti.mm.pictograms.Anchor; |
| import org.eclipse.graphiti.mm.pictograms.AnchorContainer; |
| import org.eclipse.graphiti.mm.pictograms.Connection; |
| import org.eclipse.graphiti.mm.pictograms.FreeFormConnection; |
| import org.eclipse.graphiti.mm.pictograms.PictogramElement; |
| import org.eclipse.graphiti.mm.pictograms.Shape; |
| import org.eclipse.graphiti.services.Graphiti; |
| import org.eclipse.graphiti.services.ICreateService; |
| import org.eclipse.graphiti.testtool.sketch.SketchUtil; |
| import org.eclipse.graphiti.util.IColorConstant; |
| |
| public class SketchReconnectionFeature extends DefaultReconnectionFeature { |
| |
| public SketchReconnectionFeature(IFeatureProvider fp) { |
| super(fp); |
| } |
| |
| @Override |
| public boolean canReconnect(IReconnectionContext context) { |
| boolean ret = false; |
| |
| PictogramElement targetPictogramElement = context.getTargetPictogramElement(); |
| if (getDiagram().equals(targetPictogramElement)) { |
| return false; |
| } |
| |
| ret = super.canReconnect(context); |
| if (ret == true) { |
| return ret; |
| } |
| |
| if (targetPictogramElement instanceof Connection) { |
| ret = true; |
| } |
| return ret; |
| } |
| |
| @Override |
| public void preReconnect(IReconnectionContext context) { |
| PictogramElement targetPictogramElement = context.getTargetPictogramElement(); |
| if (targetPictogramElement instanceof FreeFormConnection) { |
| Connection targetConnection = (Connection) targetPictogramElement; |
| ICreateService createService = Graphiti.getCreateService(); |
| |
| Shape connectionPointShape = SketchUtil.createConnectionPoint(context.getTargetLocation(), getDiagram()); |
| Anchor newAnchor = createService.createChopboxAnchor(connectionPointShape); |
| |
| Anchor targetStart = targetConnection.getStart(); |
| Anchor targetEnd = targetConnection.getEnd(); |
| |
| FreeFormConnection newConn1 = createService.createFreeFormConnection(getDiagram()); |
| newConn1.setStart(targetStart); |
| newConn1.setEnd(newAnchor); |
| initConnection(newConn1); |
| |
| FreeFormConnection newConn2 = createService.createFreeFormConnection(getDiagram()); |
| newConn2.setStart(newAnchor); |
| newConn2.setEnd(targetEnd); |
| initConnection(newConn2); |
| |
| Graphiti.getPeService().deletePictogramElement(targetConnection); |
| |
| if (context instanceof ReconnectionContext) { |
| ReconnectionContext rc = (ReconnectionContext) context; |
| rc.setNewAnchor(newAnchor); |
| rc.setTargetPictogramElement(connectionPointShape); |
| } |
| } |
| super.preReconnect(context); |
| } |
| |
| @Override |
| public void postReconnect(IReconnectionContext context) { |
| Anchor oldAnchor = context.getOldAnchor(); |
| AnchorContainer oldAnchorContainer = oldAnchor.getParent(); |
| if (SketchUtil.isConnectionPoint(oldAnchorContainer)) { |
| List<Connection> allConnections = Graphiti.getPeService().getAllConnections(oldAnchor); |
| if (allConnections.size() == 2) { |
| Connection c = allConnections.get(0); |
| Anchor start = oldAnchor.equals(c.getStart()) ? c.getEnd() : c.getStart(); |
| c = allConnections.get(1); |
| Anchor end = oldAnchor.equals(c.getStart()) ? c.getEnd() : c.getStart(); |
| |
| FreeFormConnection newConn = Graphiti.getPeCreateService().createFreeFormConnection(getDiagram()); |
| newConn.setStart(start); |
| newConn.setEnd(end); |
| initConnection(newConn); |
| |
| RemoveContext ctx = new RemoveContext(oldAnchorContainer); |
| getFeatureProvider().getRemoveFeature(ctx).remove(ctx); |
| } |
| } |
| super.postReconnect(context); |
| } |
| |
| private void initConnection(Connection connection) { |
| Polyline p = Graphiti.getGaCreateService().createPolyline(connection); |
| p.setLineWidth(3); |
| p.setForeground(manageColor(IColorConstant.LIGHT_BLUE)); |
| p.setLineStyle(LineStyle.DASHDOT); |
| } |
| } |