| /********************************************************************* |
| * 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 |
| * mwenz - Bug 340627 - Features should be able to indicate cancellation |
| * mgorning - Bug 329517 - state call backs during creation of a connection |
| * fvelasco - Bug 417577 - state call backs review |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| **********************************************************************/ |
| package org.eclipse.graphiti.ui.internal.editor; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.emf.common.util.EList; |
| import org.eclipse.emf.transaction.RollbackException; |
| import org.eclipse.gef.requests.CreateConnectionRequest; |
| import org.eclipse.gef.requests.CreationFactory; |
| import org.eclipse.gef.tools.ConnectionCreationTool; |
| import org.eclipse.graphiti.dt.IDiagramTypeProvider; |
| import org.eclipse.graphiti.features.ICreateConnectionFeature; |
| import org.eclipse.graphiti.features.IFeature; |
| import org.eclipse.graphiti.features.IFeatureProvider; |
| import org.eclipse.graphiti.features.context.impl.CreateConnectionContext; |
| import org.eclipse.graphiti.internal.command.CommandExec; |
| import org.eclipse.graphiti.mm.pictograms.Anchor; |
| import org.eclipse.graphiti.mm.pictograms.AnchorContainer; |
| import org.eclipse.graphiti.mm.pictograms.ChopboxAnchor; |
| import org.eclipse.graphiti.mm.pictograms.PictogramElement; |
| import org.eclipse.graphiti.platform.IDiagramBehavior; |
| import org.eclipse.graphiti.ui.internal.T; |
| import org.eclipse.graphiti.ui.internal.command.CreateConnectionCommand; |
| import org.eclipse.swt.events.KeyEvent; |
| |
| /** |
| * @noinstantiate This class is not intended to be instantiated by clients. |
| * @noextend This class is not intended to be subclassed by clients. |
| */ |
| public class GFConnectionCreationTool extends ConnectionCreationTool { |
| |
| public GFConnectionCreationTool() { |
| super(); |
| } |
| |
| public GFConnectionCreationTool(CreationFactory factory) { |
| super(factory); |
| } |
| |
| @Override |
| protected boolean handleKeyUp(KeyEvent e) { |
| Object object = getFactory().getNewObject(); |
| if (object instanceof List<?>) { |
| List<?> list = (List<?>) object; |
| if (list.size() > 0) { |
| object = list.get(0); |
| } |
| } |
| if (object instanceof ICreateConnectionFeature) { |
| final ICreateConnectionFeature createFeature = (ICreateConnectionFeature) object; |
| final CreateConnectionContext context = new CreateConnectionContext(); |
| IFeatureProvider featureProvider = createFeature.getFeatureProvider(); |
| IDiagramTypeProvider diagramTypeProvider = featureProvider.getDiagramTypeProvider(); |
| IDiagramBehavior diagramBehavior = diagramTypeProvider.getDiagramBehavior(); |
| PictogramElement[] selectedPictogramElements = diagramBehavior.getDiagramContainer() |
| .getSelectedPictogramElements(); |
| if (selectedPictogramElements.length == 2) { |
| PictogramElement sourcePictogramElement = selectedPictogramElements[0]; |
| Anchor sourceAnchor = getAnchor(sourcePictogramElement); |
| PictogramElement targetPictogramElement = selectedPictogramElements[1]; |
| Anchor targetAnchor = getAnchor(targetPictogramElement); |
| context.setSourcePictogramElement(sourcePictogramElement); |
| context.setSourceAnchor(sourceAnchor); |
| context.setTargetPictogramElement(targetPictogramElement); |
| context.setTargetAnchor(targetAnchor); |
| if (createFeature.canExecute(context)) { |
| try { |
| CommandExec.executeFeatureWithContext(createFeature, context); |
| } catch (Exception ex) { |
| if (ex instanceof RollbackException) { |
| // Just log it as info (operation was cancelled on |
| // purpose) |
| T.racer().log(IStatus.INFO, "GFCommandStack.execute(Command) " + ex, ex); //$NON-NLS-1$ |
| } else { |
| // Just log it as an error |
| T.racer().error("GFCommandStack.execute(Command) " + ex, ex); //$NON-NLS-1$ |
| } |
| } |
| } |
| } |
| } |
| eraseTargetFeedback(); |
| unlockTargetEditPart(); |
| return true; |
| } |
| |
| private Anchor getAnchor(PictogramElement sourcePictogramElement) { |
| if (sourcePictogramElement instanceof AnchorContainer) { |
| EList<Anchor> anchors = ((AnchorContainer) sourcePictogramElement).getAnchors(); |
| if (anchors.size() > 0) { |
| // Search for the first ChopboxAnchor... |
| for (Iterator<Anchor> it = anchors.iterator(); it.hasNext();) { |
| Anchor anchor = it.next(); |
| if (anchor instanceof ChopboxAnchor) { |
| // ... and return it |
| return anchor; |
| } |
| } |
| // No ChopboxAnchor --> simply return first anchor |
| return anchors.get(0); |
| } |
| } |
| // No anchors |
| return null; |
| } |
| |
| @Override |
| public void deactivate() { |
| CreateConnectionCommand cmd = getCreateConnectionCommand(); |
| if (cmd != null) { |
| cmd.deactivate(); |
| } |
| for (ICreateConnectionFeature ccf : getCreateConnectionFeatures()) { |
| ccf.endConnecting(); |
| } |
| super.deactivate(); |
| } |
| |
| @Override |
| public void activate() { |
| super.activate(); |
| for (ICreateConnectionFeature ccf : getCreateConnectionFeatures()) { |
| ccf.startConnecting(); |
| } |
| } |
| |
| @Override |
| protected void setState(int state) { |
| if (state == STATE_CONNECTION_STARTED) { |
| CreateConnectionCommand cmd = getCreateConnectionCommand(); |
| if (cmd != null) { |
| cmd.connectionStarted(); |
| } |
| } |
| super.setState(state); |
| } |
| |
| private CreateConnectionCommand getCreateConnectionCommand() { |
| if (getTargetRequest() instanceof CreateConnectionRequest) { |
| CreateConnectionRequest r = (CreateConnectionRequest) getTargetRequest(); |
| if (r.getStartCommand() instanceof CreateConnectionCommand) { |
| CreateConnectionCommand cmd = (CreateConnectionCommand) r.getStartCommand(); |
| return cmd; |
| } |
| } |
| return null; |
| } |
| |
| private Iterable<ICreateConnectionFeature> getCreateConnectionFeatures() { |
| if (getTargetRequest() instanceof CreateConnectionRequest) { |
| List<ICreateConnectionFeature> ret = new ArrayList<ICreateConnectionFeature>(); |
| CreateConnectionRequest r = (CreateConnectionRequest) getTargetRequest(); |
| @SuppressWarnings("unchecked") |
| List<IFeature> features = (List<IFeature>) r.getNewObject(); |
| for (IFeature feature : features) { |
| if (feature instanceof ICreateConnectionFeature) { |
| ICreateConnectionFeature ccf = (ICreateConnectionFeature) feature; |
| ret.add(ccf); |
| } |
| } |
| return ret; |
| } |
| return Collections.emptyList(); |
| } |
| } |