blob: c1c1115edc621f83bd6ac6c8634c1aa335a780f1 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}