/** * Copyright (c) 2009 Borland Software Corp. * * 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 Shatalin (Borland) - initial API and implementation */ package org.eclipse.gmf.graphdef.editor.edit.policies; import org.eclipse.draw2d.Shape; import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gef.requests.ChangeBoundsRequest; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DragDropEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants; import org.eclipse.gmf.runtime.draw2d.ui.figures.FigureUtilities; import org.eclipse.swt.graphics.Color; public abstract class InnerFigureDragDropEditPolicy extends DragDropEditPolicy { private static final Color GRAY = new Color(null, 200, 200, 200); private Integer alpha; @Override public EditPart getTargetEditPart(Request request) { if (getHost().getParent() != null) { EditPolicy layoutEditPolicy = getHost().getParent().getEditPolicy(EditPolicy.LAYOUT_ROLE); if (layoutEditPolicy instanceof BorderLayoutEditPolicy || layoutEditPolicy instanceof GridLayoutEditPolicy) { if (RequestConstants.REQ_DROP.equals(request.getType()) && !isDeepInFigure((ChangeBoundsRequest) request)) { // Skipping requests if the mouse is close to the figure // border return null; } } } return super.getTargetEditPart(request); } private boolean isDeepInFigure(ChangeBoundsRequest request) { Point location = request.getLocation().getCopy(); getActualFigure().translateToRelative(location); Point figureCenter = getActualFigure().getBounds().getCenter(); int dx = location.x - figureCenter.x; dx = (int) (Math.signum(dx) * Math.min(0.3 * Math.abs(dx), 10)); int dy = location.y - figureCenter.y; dy = (int) (Math.signum(dy) * Math.min(0.3 * Math.abs(dy), 10)); // Shifting request location by dr in a direction from center of figure location.translate(dx, dy); return getActualFigure().containsPoint(location); } @Override public void showTargetFeedback(Request request) { Command c = getCommand(request); if (c != null && c.canExecute()) { if (revertColor == null) { revertColor = getActualFigure().getBackgroundColor(); opacity = getActualFigure().isOpaque(); alpha = getActualFigure().getAlpha(); getActualFigure().setBackgroundColor(FigureUtilities.mixColors(GRAY, revertColor)); getActualFigure().setOpaque(true); getActualFigure().setAlpha(alpha == null ? 128 : alpha / 2); } } } @Override public void eraseTargetFeedback(Request request) { if (revertColor != null) { getActualFigure().setBackgroundColor(revertColor); getActualFigure().setOpaque(opacity); getActualFigure().setAlpha(alpha); revertColor = null; } } protected abstract Shape getActualFigure(); }