diff options
| author | Florian Barbin | 2014-10-21 16:16:30 +0000 |
|---|---|---|
| committer | Florian Barbin | 2014-10-22 09:42:20 +0000 |
| commit | bc7cca665b5978b9d8f6d54b8371b5d87a3a50dc (patch) | |
| tree | dc6ba101eccc33eccac00d4b5dc5f236367a355c | |
| parent | 5608523e2474c181bba1c7679498c43e29fabd48 (diff) | |
| download | org.eclipse.sirius-bc7cca665b5978b9d8f6d54b8371b5d87a3a50dc.tar.gz org.eclipse.sirius-bc7cca665b5978b9d8f6d54b8371b5d87a3a50dc.tar.xz org.eclipse.sirius-bc7cca665b5978b9d8f6d54b8371b5d87a3a50dc.zip | |
[437528] Handle the resize case
* If a centered edge source or target is resized, we now launch a
command to keep the edge ends centered if needed.
* This commit fixes the problem described in comment 19 of bug 437528
[1]
[1] https://bugs.eclipse.org/bugs/show_bug.cgi?id=437528#c19
Bug: 437528
Change-Id: Iae1773a2b1e83e6032de0c394689ad2d7885641e
Signed-off-by: Florian Barbin <florian.barbin@obeo.fr>
3 files changed, 88 insertions, 0 deletions
diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/AirResizableEditPolicy.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/AirResizableEditPolicy.java index e2679b43f1..8f99eeacb3 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/AirResizableEditPolicy.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/AirResizableEditPolicy.java @@ -44,6 +44,7 @@ import org.eclipse.sirius.diagram.NodeStyle; import org.eclipse.sirius.diagram.description.DiagramElementMapping; import org.eclipse.sirius.diagram.ui.edit.api.part.IDiagramNodeEditPart; import org.eclipse.sirius.diagram.ui.edit.internal.validators.ResizeValidator; +import org.eclipse.sirius.diagram.ui.internal.edit.commands.CenterEditPartEdgesCommand; import org.eclipse.sirius.diagram.ui.internal.edit.commands.ChangeBendpointsOfEdgesCommand; import org.eclipse.sirius.diagram.ui.internal.edit.commands.ChildrenAdjustmentCommand; import org.eclipse.sirius.diagram.ui.tools.api.figure.SiriusWrapLabel; @@ -186,6 +187,12 @@ public class AirResizableEditPolicy extends ResizableShapeEditPolicy { result = new ICommandProxy(solution); } } + + // we add a command to keep the edges centered (if they should be) + if (result != null && getHost() instanceof IGraphicalEditPart) { + CenterEditPartEdgesCommand centerEditPartEdgesCommand = new CenterEditPartEdgesCommand((IGraphicalEditPart) getHost()); + result = result.chain(new ICommandProxy(centerEditPartEdgesCommand)); + } return result; } diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/SpecificBorderItemSelectionEditPolicy.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/SpecificBorderItemSelectionEditPolicy.java index 25064e3cc5..ba4a129937 100644 --- a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/SpecificBorderItemSelectionEditPolicy.java +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/graphical/edit/policies/SpecificBorderItemSelectionEditPolicy.java @@ -65,6 +65,7 @@ import org.eclipse.sirius.diagram.ui.business.api.query.NodeQuery; import org.eclipse.sirius.diagram.ui.business.internal.query.RequestQuery; import org.eclipse.sirius.diagram.ui.edit.api.part.AbstractDiagramBorderNodeEditPart; import org.eclipse.sirius.diagram.ui.edit.internal.part.PortLayoutHelper; +import org.eclipse.sirius.diagram.ui.internal.edit.commands.CenterEditPartEdgesCommand; import org.eclipse.sirius.diagram.ui.internal.edit.commands.ChangeBendpointsOfEdgesCommand; import org.eclipse.sirius.diagram.ui.internal.edit.parts.DNodeNameEditPart; import org.eclipse.sirius.diagram.ui.internal.operation.ShiftEdgeIdentityAnchorOperation; @@ -640,6 +641,10 @@ public class SpecificBorderItemSelectionEditPolicy extends ResizableEditPolicyEx ShiftEdgeIdentityAnchorOperation operation = new ShiftEdgeIdentityAnchorOperation(request); ICommand command = CommandFactory.createICommand(editingDomain, operation); ctc.add(command); + + // we add a command to keep the edges centered (if they should be) + CenterEditPartEdgesCommand centerEditPartEdgesCommand = new CenterEditPartEdgesCommand((IGraphicalEditPart) host); + ctc.add(centerEditPartEdgesCommand); return new ICommandProxy(ctc); } return superCommand; diff --git a/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/commands/CenterEditPartEdgesCommand.java b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/commands/CenterEditPartEdgesCommand.java new file mode 100644 index 0000000000..edfe7ee2d3 --- /dev/null +++ b/plugins/org.eclipse.sirius.diagram.ui/src-diag/org/eclipse/sirius/diagram/ui/internal/edit/commands/CenterEditPartEdgesCommand.java @@ -0,0 +1,76 @@ +/******************************************************************************* + * Copyright (c) 2014 THALES GLOBAL SERVICES. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ + +package org.eclipse.sirius.diagram.ui.internal.edit.commands; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.gmf.runtime.common.core.command.CommandResult; +import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart; +import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; +import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand; +import org.eclipse.gmf.runtime.notation.Edge; +import org.eclipse.sirius.diagram.ui.internal.operation.CenterEdgeEndModelChangeOperation; + +import com.google.common.collect.Iterables; + +/** + * A command that centers (if needed) the incoming and outgoing edges of the + * given graphicalEditPart. + * + * @author Florian Barbin + * + */ +public class CenterEditPartEdgesCommand extends AbstractTransactionalCommand { + + IGraphicalEditPart editPart; + + /** + * Constructor. + * + * @param graphicalEditPart + * the edit part for which we need to keep center edges (if they + * should be) + */ + public CenterEditPartEdgesCommand(IGraphicalEditPart graphicalEditPart) { + super(graphicalEditPart.getEditingDomain(), "Center Edges", null); + editPart = graphicalEditPart; + } + + @Override + protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { + + List<Object> edges = new ArrayList<Object>(); + edges.addAll(editPart.getSourceConnections()); + edges.addAll(editPart.getTargetConnections()); + for (ConnectionEditPart connection : Iterables.filter(edges, ConnectionEditPart.class)) { + Object model = connection.getModel(); + if (model instanceof Edge) { + CenterEdgeEndModelChangeOperation centerEdgeEndModelChangeOperation = new CenterEdgeEndModelChangeOperation((Edge) model, false); + centerEdgeEndModelChangeOperation.execute(); + } + + } + + return CommandResult.newOKCommandResult(); + } + + @Override + public void dispose() { + editPart = null; + super.dispose(); + } + +} |
