Ver código fonte

Added prototype IdentityCommand

Andreas Mülder 11 anos atrás
pai
commit
4df3d5c5b5

+ 105 - 0
de.itemis.xtext.utils/plugins/de.itemis.xtext.utils.gmf/src/de/itemis/xtext/utils/gmf/commands/AdjustIdentityAnchorCommand.java

@@ -0,0 +1,105 @@
+/**
+ * Copyright (c) 2013 committers of YAKINDU and others.
+ * 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:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package de.itemis.xtext.utils.gmf.commands;
+
+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.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.PrecisionPoint;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.requests.ChangeBoundsRequest;
+import org.eclipse.gmf.runtime.common.core.command.CommandResult;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.draw2d.ui.figures.BaseSlidableAnchor;
+import org.eclipse.gmf.runtime.emf.commands.core.command.AbstractTransactionalCommand;
+import org.eclipse.gmf.runtime.notation.Anchor;
+import org.eclipse.gmf.runtime.notation.Edge;
+import org.eclipse.gmf.runtime.notation.IdentityAnchor;
+import org.eclipse.gmf.runtime.notation.View;
+
+/**
+ * EXPERIMENTAL !!
+ * 
+ * Recalculates the {@link IdentityAnchor}s to recalculate connection anchors
+ * when a node is resized
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class AdjustIdentityAnchorCommand extends AbstractTransactionalCommand {
+
+	private ChangeBoundsRequest request;
+	private List<IGraphicalEditPart> editParts;
+
+	@SuppressWarnings("unchecked")
+	public AdjustIdentityAnchorCommand(TransactionalEditingDomain domain, ChangeBoundsRequest request) {
+		super(domain, "Adjusting anchors", null);
+		this.request = request;
+		editParts = request.getEditParts();
+
+	}
+
+	@Override
+	protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		for (EditPart editPart : editParts) {
+			adjustAnchors(editPart);
+		}
+		return CommandResult.newOKCommandResult();
+	}
+
+	@SuppressWarnings("unchecked")
+	private void adjustAnchors(EditPart editPart) {
+		if (editPart instanceof IGraphicalEditPart) {
+			View view = ((IGraphicalEditPart) editPart).getNotationView();
+			EList<Edge> targetEdges = view.getTargetEdges();
+			for (Edge edge : targetEdges) {
+				Anchor targetAnchor = edge.getTargetAnchor();
+				if (targetAnchor instanceof IdentityAnchor) {
+					PrecisionPoint anchorPoint = BaseSlidableAnchor.parseTerminalString(((IdentityAnchor) targetAnchor)
+							.getId());
+					IFigure figure = ((IGraphicalEditPart) editPart).getFigure();
+					Dimension sizeBefore = figure.getBounds().getSize();
+					float widthFactor = (float) (sizeBefore.width() + request.getSizeDelta().width())
+							/ (float) sizeBefore.width();
+					float heightFactor = (float) (sizeBefore.height() + request.getSizeDelta().height())
+							/ (float) sizeBefore.height();
+					PrecisionPoint newPoint = new PrecisionPoint(anchorPoint.preciseX() / widthFactor,
+							anchorPoint.preciseY() / heightFactor);
+					((IdentityAnchor) targetAnchor).setId(composeTerminalString(newPoint));
+				}
+			}
+		}
+
+	}
+
+	// Copied from BaseSlideableAnchor
+	final private static char TERMINAL_START_CHAR = '(';
+	final private static char TERMINAL_DELIMITER_CHAR = ',';
+	final private static char TERMINAL_END_CHAR = ')';
+
+	protected String composeTerminalString(PrecisionPoint p) {
+		StringBuffer s = new StringBuffer(24);
+		s.append(TERMINAL_START_CHAR); // 1 char
+		s.append(p.preciseX()); // 10 chars
+		s.append(TERMINAL_DELIMITER_CHAR); // 1 char
+		s.append(p.preciseY()); // 10 chars
+		s.append(TERMINAL_END_CHAR); // 1 char
+		return s.toString(); // 24 chars max (+1 for safety, i.e. for string
+								// termination)
+	}
+
+}