blob: 6a799f75f41e75b99cee8554fbdb250694300e1b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2004 IBM Corporation 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:
* IBM Corporation - initial API and implementation
* Jens Lukowski/Innoopract - initial renaming/restructuring
*
*******************************************************************************/
package org.eclipse.wst.xml.core.internal.document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
/**
* XMLModelContext class
*/
class XMLModelContext {
private Node nextNode = null;
private Node parentNode = null;
// private XMLModelImpl model = null;
private Node rootNode = null;
/**
* XMLModelContext constructor
*
* @param rootNode
* org.w3c.dom.Node
*/
XMLModelContext(Node rootNode) {
super();
this.rootNode = rootNode;
}
/**
* findEndTag method
*
* @return org.w3c.dom.Element
* @param tagName
* java.lang.String
*/
Element findEndTag(String tagName) {
if (tagName == null)
return null;
if (this.parentNode == null)
return null;
for (Node parent = this.parentNode.getParentNode(); parent != null; parent = parent.getParentNode()) {
if (parent.getNodeType() != Node.ELEMENT_NODE)
break;
ElementImpl element = (ElementImpl) parent;
if (element.hasEndTag()) {
if (element.matchTagName(tagName))
return element;
// if ancestor element has end tag stop search
break;
}
if (element.getNextSibling() != null)
break;
}
return null;
}
/**
*/
Text findNextText() {
Node node = this.nextNode;
while (node != null) {
if (node != this.nextNode && node.getNodeType() == Node.TEXT_NODE) {
TextImpl text = (TextImpl) node;
// skip empty text
if (text.getStructuredDocumentRegion() != null)
return text;
}
Node child = node.getFirstChild();
if (child != null) {
node = child;
continue;
}
while (node != null) {
Node next = node.getNextSibling();
if (next != null) {
node = next;
break;
}
node = node.getParentNode();
}
}
return null;
}
/**
* findPreviousText method
*
* @return org.w3c.dom.Text
*/
Text findPreviousText() {
if (this.parentNode == null)
return null;
Node node = null;
if (this.nextNode != null)
node = this.nextNode.getPreviousSibling();
else
node = this.parentNode.getLastChild();
if (node == null || node.getNodeType() != Node.TEXT_NODE)
return null;
return (Text) node;
}
/**
* findStartTag method
*
* @return org.w3c.dom.Element
* @param tagName
* java.lang.String
*/
Element findStartTag(String tagName, String rootName) {
if (tagName == null)
return null;
// check previous for empty content element
Node prev = null;
if (this.nextNode != null)
prev = this.nextNode.getPreviousSibling();
else if (this.parentNode != null)
prev = this.parentNode.getLastChild();
if (prev != null && prev.getNodeType() == Node.ELEMENT_NODE) {
ElementImpl element = (ElementImpl) prev;
if (!element.hasEndTag() && !element.isEmptyTag() && element.matchTagName(tagName))
return element;
}
for (Node parent = this.parentNode; parent != null; parent = parent.getParentNode()) {
if (parent.getNodeType() != Node.ELEMENT_NODE)
break;
ElementImpl element = (ElementImpl) parent;
if (element.matchTagName(tagName))
return element;
if (rootName != null && element.matchTagName(rootName))
break;
}
return null;
}
/**
* getNextNode method
*
* @return org.w3c.dom.Node
*/
Node getNextNode() {
return this.nextNode;
}
/**
* getParentNode method
*
* @return org.w3c.dom.Node
*/
Node getParentNode() {
return this.parentNode;
}
/**
* getRootNode method
*
* @return org.w3c.dom.Node
*/
Node getRootNode() {
return this.rootNode;
}
/**
* setLast method
*/
void setLast() {
if (this.parentNode == null)
return;
if (this.nextNode != null) {
Node prev = this.nextNode.getPreviousSibling();
if (prev == null || prev.getNodeType() != Node.ELEMENT_NODE)
return;
ElementImpl element = (ElementImpl) prev;
if (element.hasEndTag() || !element.isContainer() || element.isEmptyTag())
return;
setParentNode(prev);
}
// find last open parent
Node parent = this.parentNode;
Node last = parent.getLastChild();
while (last != null) {
if (last.getNodeType() != Node.ELEMENT_NODE)
break;
ElementImpl element = (ElementImpl) last;
if (element.hasEndTag() || !element.isContainer() || element.isEmptyTag())
break;
parent = element;
last = parent.getLastChild();
}
if (parent != this.parentNode)
setParentNode(parent);
}
/**
* setNextNode method
*
* @param nextNode
* org.w3c.dom.Node
*/
void setNextNode(Node nextNode) {
this.nextNode = nextNode;
if (nextNode == null)
return;
this.parentNode = nextNode.getParentNode();
}
/**
* setParentNode method
*
* @param parentNode
* org.w3c.dom.Node
*/
void setParentNode(Node parentNode) {
this.parentNode = parentNode;
this.nextNode = null;
}
}