/******************************************************************************* * 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.validation.caret; import java.util.List; import org.eclipse.draw2d.Viewport; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.gef.EditPart; import org.eclipse.gef.GraphicalViewer; import org.eclipse.gef.editparts.ScalableRootEditPart; import org.eclipse.jst.pagedesigner.dom.EditModelQuery; import org.eclipse.jst.pagedesigner.parts.DocumentEditPart; import org.eclipse.jst.pagedesigner.tools.ExposeHelper; import org.eclipse.jst.pagedesigner.viewer.DesignPosition; import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer; import org.w3c.dom.Document; import org.w3c.dom.Node; /** * @author mengbo */ public class InlineEditingNavigationMediator extends InlineEditingPositionMediator implements IMovementMediator { /** * @param actionData */ public InlineEditingNavigationMediator(ActionData actionData) { super(actionData); } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.caret.DefaultPositionValidator#initRules(org.eclipse.jst.pagedesigner.caret.ActionData) */ protected void initRules() { super.initRules(); this.addRule(new ContainerMoveInAndOutRule(_actionData)); this.addRule(new BasicMovementRule(_actionData)); } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.caret.IMovementValidator#allowsMoveIn(org.eclipse.gef.EditPart) */ public boolean allowsMoveIn(Target target) { boolean result = true; List _rules = getRules(); for (int i = 0, n = _rules.size(); i < n; i++) { Object rule = _rules.get(i); if (rule instanceof IMovementRule) { result &= ((IMovementRule) rule).allowsMoveIn(target); } else if (rule instanceof IPositionRule) { result &= ((IPositionRule) rule).hasEditableArea(target); } if (!result) { break; } } return result; } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.caret.IMovementValidator#allowsMoveOut(org.eclipse.gef.EditPart) */ public boolean allowsMoveOut(Target target) { boolean result = true; List _rules = getRules(); for (int i = 0, n = _rules.size(); i < n; i++) { Object rule = _rules.get(i); if (rule instanceof IMovementRule) { result &= ((IMovementRule) rule).allowsMoveOut(target); } if (!result) { break; } } return result; } /** * @param target * @return ? */ public EditPart getRootConstainedEditableContainer(Target target) { // if (EditModelQuery.isDocument(target.getNode())) // { // return target.getPart(); // } EditPart part = target.getPart(); while (part != null) { if (hasEditableArea(target) && !allowsMoveOut(target)) { break; } part = part.getParent(); target = new Target(part); } if (part instanceof DocumentEditPart && RootContainerPositionRule.hasBasicContainers((Document) part .getModel())) { Node node = RootContainerPositionRule .getBasicContainer((Document) part.getModel()); part = Target.resolvePart(node); } return part; } /** * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator#getConstainedEditableContainer(org.eclipse.jst.pagedesigner.validation.caret.Target) */ public EditPart getConstainedEditableContainer(Target target) { EditPart part = target.getPart(); while (part != null) { if (hasEditableArea(target)) { break; } part = part.getParent(); target = new Target(part); } if (part instanceof DocumentEditPart && RootContainerPositionRule.hasBasicContainers((Document) part .getModel())) { Node node = RootContainerPositionRule .getBasicContainer((Document) part.getModel()); part = Target.resolvePart(node); } return part; } /** * @param position * @param p * @param viewer * @return the constrained editable container or null if none found for the arguments * @see org.eclipse.jst.pagedesigner.validation.caret.IMovementMediator#getConstainedEditableContainer(org.eclipse.jst.pagedesigner.validation.caret.Target) */ public EditPart getConstainedEditableContainer(DesignPosition position, Point p, GraphicalViewer viewer) { Rectangle rect = new Rectangle(p.x, p.y, 1, 1); Viewport port = ((IHTMLGraphicalViewer) viewer).getViewport(); Point viewLocation = port.getViewLocation(); Point lastLocation = viewLocation.getCopy(); new ExposeHelper((IHTMLGraphicalViewer) viewer).exposeArea(rect); viewLocation = port.getViewLocation(); Dimension offset = lastLocation.getDifference(viewLocation); p.translate(offset.width, offset.height); EditPart part = viewer.findObjectAt(p); if (part != null && !(part instanceof ScalableRootEditPart)) { while (part != null) { Target target = new Target(part); if (hasEditableArea(target)) { if (allowsMoveIn(target) || EditModelQuery.isChild(target.getNode(), position.getContainerNode())) { break; } } part = part.getParent(); } if (part instanceof DocumentEditPart && RootContainerPositionRule .hasBasicContainers((Document) part.getModel())) { Node node = RootContainerPositionRule .getBasicContainer((Document) part.getModel()); part = Target.resolvePart(node); } return part; } return null; } }