blob: 3e10f32134671a4a261cd7a266d6c28d6586e32a [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.viewer;
import java.util.List;
import org.eclipse.gef.EditPart;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
/**
* @author mengbo
*/
public class DesignPosition {
public static final DesignPosition INVALID = new DesignPosition(null, -1);
private EditPart _containerPart;
int _offset;
//private Node _containerNode;
/**
* @param part
* @param offset
*/
public DesignPosition(EditPart part, int offset) {
_containerPart = part;
_offset = offset;
}
/**
* if _containerPart is null, means it is invalid
*
* @return
*/
public EditPart getContainerPart() {
return _containerPart;
}
public Node getContainerNode() {
if (_containerPart != null) {
return (Node) _containerPart.getModel();
}
return null;
}
/**
* if offset < 0, means it is invalid.
*
* @return
*/
public int getOffset() {
return _offset;
}
public boolean isValid() {
return (_containerPart != null) && (_offset >= 0);
}
/**
* This method should not be called when is text node.
*
* @param forward
* @return
*/
public EditPart getSiblingEditPart(boolean forward) {
if (!isValid()) {
return null;
}
int index = forward ? (_offset) : (_offset - 1);
List children = _containerPart.getChildren();
if ((index >= children.size()) || (index < 0)) {
return null;
}
return (EditPart) children.get(index);
}
/**
* factory method
*
* @param part
* @return
*/
public static DesignPosition createPositionBeforePart(EditPart part) {
EditPart parent = part.getParent();
if (parent == null) {
return new DesignPosition(part, 0);
}
return new DesignPosition(parent, parent.getChildren()
.indexOf(part));
}
/**
* factory method
*
* @param part
* @return
*/
public static DesignPosition createPositionAfterPart(EditPart part) {
EditPart parent = part.getParent();
if (parent == null) {
return new DesignPosition(part, part.getChildren().size());
}
return new DesignPosition(parent, parent.getChildren()
.indexOf(part) + 1);
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
if (obj instanceof DesignPosition) {
DesignPosition p = (DesignPosition) obj;
return (p.getContainerPart() == this._containerPart)
&& (p.getOffset() == this._offset);
}
return false;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
public StringBuffer debugDump(StringBuffer buffer) {
// try {
buffer.append("DesignPosition: ").append(this._containerPart)
.append(": ").append(this._offset).append("\n");
if (this._containerPart.getModel() instanceof Text) {
// skip
} else {
if (this._offset > 0) {
buffer.append("after: ").append(
this._containerPart.getChildren().get(
this._offset - 1)).append("\n");
}
if (this._offset < (this._containerPart.getChildren().size() - 1)) {
buffer.append("before: ")
.append(
this._containerPart.getChildren().get(
this._offset)).append("\n");
}
}
//TODO: what was being caught here?
// } catch (Exception e) {
// }
return buffer;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
public String toString() {
StringBuffer buffer = new StringBuffer();
return debugDump(buffer).toString();
}
}