| /******************************************************************************* |
| * Copyright (c) 2006 Sybase, Inc. 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: |
| * Sybase, Inc. - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.pagedesigner.editpolicies; |
| |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.Request; |
| import org.eclipse.gef.commands.Command; |
| import org.eclipse.gef.commands.UnexecutableCommand; |
| import org.eclipse.gef.requests.ChangeBoundsRequest; |
| import org.eclipse.gef.requests.DropRequest; |
| import org.eclipse.jst.pagedesigner.commands.CloneNodeCommand; |
| import org.eclipse.jst.pagedesigner.commands.MoveNodeCommand; |
| import org.eclipse.jst.pagedesigner.dom.DOMPositionHelper; |
| import org.eclipse.jst.pagedesigner.dom.DOMUtil; |
| import org.eclipse.jst.pagedesigner.dom.IDOMPosition; |
| import org.eclipse.jst.pagedesigner.parts.NodeEditPart; |
| import org.eclipse.jst.pagedesigner.validation.caret.ActionData; |
| import org.eclipse.jst.pagedesigner.validation.caret.DnDPositionValidator; |
| import org.eclipse.jst.pagedesigner.validation.caret.DropActionData; |
| import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator; |
| import org.eclipse.jst.pagedesigner.validation.caret.DropActionData.DropData; |
| import org.eclipse.jst.pagedesigner.viewer.DesignPosition; |
| import org.eclipse.jst.pagedesigner.viewer.IDropLocationStrategy; |
| import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer; |
| import org.w3c.dom.Node; |
| |
| /** |
| * @author mengbo |
| * @version 1.5 |
| */ |
| public class DragMoveEditPolicy extends DropEditPolicy |
| { |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getCommand(org.eclipse.gef.Request) |
| */ |
| public final Command getCommand(Request request) { |
| if (!(request instanceof ChangeBoundsRequest)) { |
| return null; |
| } |
| |
| ChangeBoundsRequest r = (ChangeBoundsRequest) request; |
| |
| // we only support move/copy a single node. |
| if (!MoveSupport.isSingleNode(r)) { |
| return UnexecutableCommand.INSTANCE; |
| } |
| |
| // the edit policy only handle at the target part, so only care about |
| // the |
| // target part request. |
| final Object type = r.getType(); |
| if (type != REQ_ADD && type != REQ_CLONE && type != REQ_MOVE_CHILDREN) { |
| |
| return null; |
| } |
| |
| Node draggedNode = MoveSupport.getDraggedNode(r); |
| Node hostNode = ((NodeEditPart) getHost()).getIDOMNode(); |
| |
| if (DOMUtil.isAncester(draggedNode, hostNode)) { |
| return UnexecutableCommand.INSTANCE; |
| } |
| |
| DesignPosition position = findPosition(r); |
| if (position == null || !position.isValid()) { |
| return null; |
| } |
| |
| // can't move/copy into self. |
| Node node = position.getContainerNode(); |
| if (DOMUtil.isAncester(draggedNode, node)) { |
| return UnexecutableCommand.INSTANCE; |
| } |
| |
| // ok, we are about to move/copy into the specified position. |
| IDOMPosition domposition = DOMPositionHelper.toDOMPosition(position); |
| |
| if (REQ_CLONE.equals(type)) { |
| return new CloneNodeCommand((IHTMLGraphicalViewer) getHost() |
| .getViewer(), domposition, draggedNode); |
| } |
| return new MoveNodeCommand((IHTMLGraphicalViewer) getHost() |
| .getViewer(), domposition, draggedNode); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.gef.editpolicies.AbstractEditPolicy#getTargetEditPart(org.eclipse.gef.Request) |
| */ |
| public EditPart getTargetEditPart(Request request) { |
| if (request instanceof ChangeBoundsRequest) { |
| return this.getHost(); |
| } |
| return super.getTargetEditPart(request); |
| } |
| |
| protected final DesignPosition findPosition(DropRequest r) { |
| final IPositionMediator mediator = getDropChildValidator(r); |
| if (mediator == null) |
| { |
| return null; |
| } |
| final IDropLocationStrategy dropStrategy = createDropLocationStrategy(r); |
| final DesignPosition position = |
| dropStrategy.calculateDesignPosition(getHost(), r.getLocation(), mediator); |
| |
| // verify that the drop strategy has honoured it's contract that our |
| // mediator be respected |
| if (position != null) |
| { |
| if (!mediator.isValidPosition(position)) |
| { |
| // if our mediator says no go, then veto the requestor |
| // there is no drop location |
| return null; |
| } |
| } |
| return position; |
| } |
| |
| public void showTargetFeedback(Request request) |
| { |
| Object type = request.getType(); |
| // only show feedback for these request types |
| if (type == REQ_ADD || type == REQ_CLONE |
| || type == REQ_MOVE_CHILDREN || type == REQ_MOVE) { |
| super.showTargetFeedback(request); |
| } |
| } |
| |
| protected final IPositionMediator createDefaultDropChildValidator(DropData r) |
| { |
| return new DnDPositionValidator(new DropActionData( |
| ActionData.COMPONENT_MOVE, r)); |
| } |
| } |