/******************************************************************************* * Copyright (c) 2016 itemis AG 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: * Alexander Nyßen (itemis AG) - initial API and implementation *******************************************************************************/ package org.eclipse.gef.zest.fx.handlers; import java.util.ArrayList; import java.util.Collections; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; import java.util.Set; import org.eclipse.gef.geometry.planar.Dimension; import org.eclipse.gef.mvc.fx.handlers.BendFirstAnchorageOnSegmentHandleDragHandler; import org.eclipse.gef.mvc.fx.parts.PartUtils; import org.eclipse.gef.zest.fx.ZestProperties; import org.eclipse.gef.zest.fx.parts.AbstractLabelPart; import org.eclipse.gef.zest.fx.parts.EdgeLabelPart; import org.eclipse.gef.zest.fx.parts.EdgePart; import org.eclipse.gef.zest.fx.policies.TransformLabelPolicy; import javafx.scene.input.MouseEvent; /** * An {@link BendFirstAnchorageOnSegmentHandleDragHandler} that also takes care * of relocating related {@link EdgeLabelPart}s. * * @author anyssen * */ public class BendFirstAnchorageAndRelocateLabelsOnDragHandler extends BendFirstAnchorageOnSegmentHandleDragHandler { @Override public void drag(MouseEvent e, Dimension delta) { super.drag(e, delta); for (AbstractLabelPart lp : getLabelParts()) { lp.getAdapter(TransformLabelPolicy.class).preserveLabelOffset(); } } @Override public void abortDrag() { for (AbstractLabelPart lp : getLabelParts()) { rollback(lp.getAdapter(TransformLabelPolicy.class)); restoreRefreshVisuals(lp); } super.abortDrag(); } private List<AbstractLabelPart> getEdgeLabelParts(EdgePart edgePart) { List<AbstractLabelPart> linked = new ArrayList<>(); linked.addAll(new ArrayList<>(PartUtils .filterParts(PartUtils.getAnchoreds(edgePart, ZestProperties.LABEL__NE), AbstractLabelPart.class))); linked.addAll(new ArrayList<>(PartUtils.filterParts( PartUtils.getAnchoreds(edgePart, ZestProperties.EXTERNAL_LABEL__NE), AbstractLabelPart.class))); linked.addAll(new ArrayList<>(PartUtils.filterParts( PartUtils.getAnchoreds(edgePart, ZestProperties.SOURCE_LABEL__E), AbstractLabelPart.class))); linked.addAll(new ArrayList<>(PartUtils.filterParts( PartUtils.getAnchoreds(edgePart, ZestProperties.TARGET_LABEL__E), AbstractLabelPart.class))); return linked; } private List<AbstractLabelPart> getLabelParts() { Set<AbstractLabelPart> labelParts = Collections .newSetFromMap(new IdentityHashMap<AbstractLabelPart, Boolean>()); // ensure that linked parts are moved with us during dragging labelParts .addAll(getEdgeLabelParts((EdgePart) getHost().getAnchoragesUnmodifiable().keySet().iterator().next())); for (Iterator<AbstractLabelPart> iterator = labelParts.iterator(); iterator.hasNext();) { // filter out those that do not have a stored position if (iterator.next().getLabelPosition() == null) { iterator.remove(); } } return new ArrayList<>(labelParts); } @Override public void startDrag(MouseEvent e) { super.startDrag(e); // init label transform policies for (AbstractLabelPart lp : getLabelParts()) { storeAndDisableRefreshVisuals(lp); init(lp.getAdapter(TransformLabelPolicy.class)); } } @Override public void endDrag(MouseEvent e, Dimension delta) { for (AbstractLabelPart lp : getLabelParts()) { commit(lp.getAdapter(TransformLabelPolicy.class)); restoreRefreshVisuals(lp); } super.endDrag(e, delta); } }