/******************************************************************************* * 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 org.eclipse.gef.EditPart; import org.eclipse.jst.pagedesigner.dom.EditModelQuery; import org.eclipse.jst.pagedesigner.viewer.DesignPosition; import org.eclipse.jst.pagedesigner.viewer.DesignRefPosition; import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper; import org.w3c.dom.Text; /** * For whitespaces 1. If there is sibling can be reference, then we don't * reference whitespace text. 2. Position can't be between whitespace text. * * @author mengbo */ public class WhitespacePositionMoveRule extends DefaultPositionRule implements IMovementRule { /** * @param actionData */ public WhitespacePositionMoveRule(ActionData actionData) { super(actionData); } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canEnter(org.eclipse.gef.EditPart) */ public boolean allowsMoveIn(Target target) { if (EditModelQuery.isTransparentText(target.getNode())) { return false; } return true; } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.caret.IMovementRule#canMoveOut(org.eclipse.gef.EditPart) */ public boolean allowsMoveOut(Target target) { return true; } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#canReference(org.eclipse.jst.pagedesigner.caret.Target) */ public boolean canReference(Target target, boolean atRight) { boolean result = super.canReference(target, atRight); if (EditModelQuery.isText(target.getNode())) { if (((Text) target.getNode()).getData().length() == 0) { result = false; } else if (EditModelQuery.isTransparentText(target.getNode())) { DesignPosition position = new DesignRefPosition(target .getPart(), atRight); if (EditPartPositionHelper.getConcretePart(position, atRight) != null) { result = true; } else { EditPart part = EditPartPositionHelper.getNextConcretPart( position, atRight); EditPart oppPart = EditPartPositionHelper .getNextConcretPart(position, !atRight); if (part == null) { if (oppPart == null) { result = true; } } result = false; } } } return result; } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#hasEditableArea(org.eclipse.jst.pagedesigner.caret.Target) */ public boolean hasEditableArea(Target target) { if (EditModelQuery.isTransparentText(target.getNode())) { return false; } return super.hasEditableArea(target); } /* * (non-Javadoc) * * @see org.eclipse.jst.pagedesigner.caret.IPositionRule#isEditable(org.eclipse.jst.pagedesigner.caret.Target) */ public boolean isEditable(Target target) { if (EditModelQuery.isTransparentText(target.getNode())) { return false; } return super.isEditable(target); } // /* // * (non-Javadoc) // * // * @see // org.eclipse.jst.pagedesigner.caret.IPositionRule#isValidPosition(org.eclipse.jst.pagedesigner.dom.IDOMPosition) // */ // public boolean isValidPosition(IDOMPosition position) // { // Node node = null; // if (position instanceof DOMRefPosition) // { // node = ((DOMRefPosition)position).getReferenceNode(); // } else if (position.isText()) // { // node = position.getContainerNode(); // } else { // return super.isValidPosition(position); // } // if (EditModelQuery.isTransparentText(position.getContainerNode())) // { // if (node.getPreviousSibling() != null) // { // node = node.getPreviousSibling(); // return _mediator.canReference(new Target(node), true); // } // else if (node.getNextSibling() != null) // { // node = node.getNextSibling(); // return _mediator.canReference(new Target(node), false); // } // } // return super.isValidPosition(position); // } }