blob: 0aa51dc6c97a40e32ed1c8e883d5dd090811bb27 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.ui.editparts.policies;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.bpel.common.ui.figures.InsetResizeHandle;
import org.eclipse.bpel.ui.BPELUIPlugin;
import org.eclipse.bpel.ui.IBPELUIConstants;
import org.eclipse.bpel.ui.util.BPELDragEditPartsTracker;
import org.eclipse.draw2d.Cursors;
import org.eclipse.draw2d.FigureUtilities;
import org.eclipse.draw2d.Graphics;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.RectangleFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Handle;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import org.eclipse.gef.tools.ResizeTracker;
import org.eclipse.jface.resource.ColorRegistry;
/**
* Add handles to the selected edit part. We use this instead of
* NonResizableEditPolicy because we don't want a focus rectangle.
*
* TODO: can this policy be installed higher up in the editpart hierarchy?
* (search refs to see what I mean)
*/
public class BPELSelectionEditPolicy extends NonResizableEditPolicy {
protected boolean fResizable;
protected boolean fMovable;
/**
* Brand new BPELSelectionEditPolicy ...
* @param resizable
* @param movable
*/
public BPELSelectionEditPolicy(boolean resizable, boolean movable) {
this.fResizable = resizable;
this.fMovable = movable;
}
@Override
protected List<Handle> createSelectionHandles() {
if (fResizable) {
return createResizableHandles ( (GraphicalEditPart)getHost() );
}
return createCornerHandles ( (GraphicalEditPart)getHost() );
}
/**
* Dispatches erase requests to more specific methods.
* @see org.eclipse.gef.EditPolicy#eraseSourceFeedback(org.eclipse.gef.Request)
*/
@Override
public void eraseSourceFeedback(Request request) {
if (fResizable && REQ_RESIZE.equals(request.getType()))
eraseChangeBoundsFeedback((ChangeBoundsRequest)request);
else
super.eraseSourceFeedback(request);
}
/**
* @see org.eclipse.gef.EditPolicy#getCommand(org.eclipse.gef.Request)
*/
@Override
public Command getCommand(Request request) {
if (fResizable && REQ_RESIZE.equals(request.getType()))
return getResizeCommand((ChangeBoundsRequest)request);
return super.getCommand(request);
}
/**
* Returns the command contribution for the given resize request. By default, the request
* is redispatched to the host's parent as a {@link
* org.eclipse.gef.RequestConstants#REQ_RESIZE_CHILDREN}. The parent's editpolicies
* determine how to perform the resize based on the layout manager in use.
* @param request the resize request
* @return the command contribution obtained from the parent
*/
protected Command getResizeCommand(ChangeBoundsRequest request) {
ChangeBoundsRequest req = new ChangeBoundsRequest(REQ_RESIZE_CHILDREN);
req.setEditParts(getHost());
req.setMoveDelta(request.getMoveDelta());
req.setSizeDelta(request.getSizeDelta());
req.setLocation(request.getLocation());
req.setResizeDirection(request.getResizeDirection());
return getHost().getParent().getCommand(req);
}
/**
* @see org.eclipse.gef.EditPolicy#showSourceFeedback(org.eclipse.gef.Request)
*/
@Override
public void showSourceFeedback(Request request) {
if (fResizable && REQ_RESIZE.equals(request.getType()))
showChangeBoundsFeedback((ChangeBoundsRequest)request);
else
super.showSourceFeedback(request);
}
/**
* @see org.eclipse.gef.EditPolicy#understandsRequest(org.eclipse.gef.Request)
*/
@Override
public boolean understandsRequest(Request request) {
if (fResizable && REQ_RESIZE.equals(request.getType()))
return true;
// TODO: This code is more correct than the above code. Change it in the future.
// if (REQ_RESIZE.equals(request.getType())) return resizable;
if (REQ_MOVE.equals(request.getType())) return fMovable;
return super.understandsRequest(request);
}
List<Handle> createCornerHandles(GraphicalEditPart part ) {
List<Handle> handleList = new ArrayList<Handle>(4);
handleList.add(createHandle(part, PositionConstants.SOUTH_EAST, getSouthInset(), getEastInset()));
handleList.add(createHandle(part, PositionConstants.SOUTH_WEST, getSouthInset(), getWestInset()));
handleList.add(createHandle(part, PositionConstants.NORTH_WEST, getNorthInset(), getWestInset()));
handleList.add(createHandle(part, PositionConstants.NORTH_EAST, getNorthInset(), getEastInset()));
return handleList ;
}
Handle createHandle(GraphicalEditPart owner, int direction, int verticalInset, int horizontalInset) {
InsetResizeHandle handle = new InsetResizeHandle(owner, direction, verticalInset, horizontalInset);
handle.setCursor(Cursors.SIZEALL);
handle.setDragTracker(new BPELDragEditPartsTracker(owner));
return handle;
}
List<Handle> createResizableHandles ( GraphicalEditPart part ) {
List<Handle> handlesList = new ArrayList<Handle>(8);
handlesList.add(createResizableHandle(part, PositionConstants.EAST, 0, getEastInset()));
handlesList.add(createResizableHandle(part, PositionConstants.SOUTH_EAST, getSouthInset(), getEastInset()));
handlesList.add(createResizableHandle(part, PositionConstants.SOUTH, getSouthInset(), 0));
handlesList.add(createResizableHandle(part, PositionConstants.SOUTH_WEST, getSouthInset(), getWestInset()));
handlesList.add(createResizableHandle(part, PositionConstants.WEST, 0, getWestInset()));
handlesList.add(createResizableHandle(part, PositionConstants.NORTH_WEST, getNorthInset(), getWestInset()));
handlesList.add(createResizableHandle(part, PositionConstants.NORTH, getNorthInset(), 0));
handlesList.add(createResizableHandle(part, PositionConstants.NORTH_EAST, getNorthInset(), getEastInset()));
return handlesList;
}
Handle createResizableHandle(GraphicalEditPart owner, int direction, int verticalInset, int horizontalInset) {
// ResizeHandle handle = new ResizeHandle(owner, direction);
InsetResizeHandle handle = new InsetResizeHandle(owner, direction, verticalInset, horizontalInset);
handle.setDragTracker(new ResizeTracker(owner, direction));
return handle;
}
@Override
protected void eraseChangeBoundsFeedback(ChangeBoundsRequest request) {
if (REQ_MOVE.equals(request.getType()) && !fMovable)
return;
super.eraseChangeBoundsFeedback(request);
}
@Override
protected void showChangeBoundsFeedback(ChangeBoundsRequest request) {
if (REQ_MOVE.equals(request.getType()) && !fMovable)
return;
// Take the super implementation to account for the drawer width on the ghost figure.
IFigure p = getDragSourceFeedbackFigure();
Rectangle r = getHostFigure().getBounds().getCopy();
getHostFigure().translateToAbsolute(r);
r.translate(request.getMoveDelta());
Dimension resize = request.getSizeDelta();
r.width += resize.width;
r.height += resize.height;
// Adjust for drawer width
r.x += getDrawerInset();
r.width -= getDrawerInset() * 2;
p.translateToRelative(r);
p.setBounds(r);
}
/**
* Override method from superclass to adjust for drawer width on ghost figure
*/
@Override
protected IFigure createDragSourceFeedbackFigure() {
// Use a ghost rectangle for feedback
ColorRegistry registry = BPELUIPlugin.INSTANCE.getColorRegistry();
RectangleFigure r = new RectangleFigure();
FigureUtilities.makeGhostShape(r);
r.setLineStyle(Graphics.LINE_DASHDOT);
r.setForegroundColor(registry.get(IBPELUIConstants.COLOR_BLACK));
Rectangle bounds = ((GraphicalEditPart)getHost()).getFigure().getBounds().getCopy();
// Adjust for drawer width if necessary
bounds.x += getDrawerInset();
bounds.width -= getDrawerInset() * 2;
r.setBounds(bounds);
addFeedback(r);
return r;
}
// Subclasses may override these methods to locate feedback and handles.
protected int getDrawerInset() {
return 0;
}
protected int getNorthInset() {
return 0;
}
protected int getSouthInset() {
return 0;
}
protected int getEastInset() {
return 0;
}
protected int getWestInset() {
return 0;
}
}