blob: 3c10322468991f7ccc3595638733dfc0002c7b84 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2006 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.dtd.core.internal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.swt.graphics.Image;
import org.eclipse.wst.dtd.core.internal.parser.DTDRegionTypes;
import org.eclipse.wst.dtd.core.internal.text.RegionIterator;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.w3c.dom.Node;
public class Element extends NamedTopLevelNode {
List attListList = new ArrayList();
List attributes = new ArrayList();
protected CMNode fContentModel;
public Element(DTDFile dtdFile, IStructuredDocumentRegion flatNode) {
super(dtdFile, flatNode, DTDRegionTypes.ELEMENT_TAG);
}
public void addAttribute(String name) {
beginRecording(this, DTDCoreMessages._UI_LABEL_ELEMENT_ADD_ATTR); //$NON-NLS-1$
List attLists = getAttributeLists();
if (attLists.size() == 0) {
getDTDFile().createAttributeList(this, getName(), true);
attLists = getAttributeLists();
}
if (attLists.size() > 0) {
AttributeList attList = (AttributeList) attLists.get(attLists.size() - 1);
attList.addAttribute(name);
}
endRecording(this);
}
public void addChild() {
beginRecording(this, DTDCoreMessages._UI_LABEL_ELEMENT_ADD_CHILD); //$NON-NLS-1$
addContent(this, " EMPTY"); //$NON-NLS-1$
endRecording(this);
}
protected void addContent(Object requestor, String content) {
ITextRegion whitespace = getWhitespaceAfterName();
int startOffset = 0;
int length = 0;
if (whitespace != null) {
startOffset = getStructuredDTDDocumentRegion().getStartOffset(whitespace);
length = whitespace.getLength() >= 2 ? 1 : 0;
}
else {
ITextRegion nameRegion = getNameRegion();
if (nameRegion != null) {
startOffset = getStructuredDTDDocumentRegion().getEndOffset(nameRegion);
}
else {
ITextRegion elementTag = getNextRegion(iterator(), DTDRegionTypes.ELEMENT_TAG);
startOffset = getStructuredDTDDocumentRegion().getEndOffset(elementTag);
}
}
replaceText(requestor, startOffset, length, content);
}
public void addGroup() {
beginRecording(this, DTDCoreMessages._UI_LABEL_ELEMENT_ADD_GRP); //$NON-NLS-1$
addContent(this, " ()"); //$NON-NLS-1$
endRecording(this);
}
public Node cloneNode(boolean deep) {
return new Element(dtdFile, flatNode);
}
public List getAttributeLists() {
attListList.clear();
String elementName = getName();
Iterator iter = dtdFile.getNodes().iterator();
while (iter.hasNext()) {
DTDNode node = (DTDNode) iter.next();
if (node instanceof AttributeList && node.getName().equals(elementName)) {
attListList.add(node);
}
}
return attListList;
}
public CMNode getContentModel() {
// Object[] children = getChildren()
return (CMNode) getFirstChild();// contentModel;
}
public List getElementAttributes() {
attributes.clear();
Iterator attLists = getAttributeLists().iterator();
while (attLists.hasNext()) {
AttributeList attList = (AttributeList) attLists.next();
Object[] children = attList.getChildren();
for (int i = 0; i < children.length; i++) {
attributes.add(children[i]);
}
}
return attributes;
}
public Image getImage() {
return DTDCorePlugin.getInstance().getImage(DTDResource.ELEMENTICON);
}
public short getNodeType() {
return Node.ELEMENT_NODE;
}
public void replaceContentModel(Object requestor, CMNode node) {
replaceContentModel(requestor, node.getNodeText());
}
public void replaceContentModel(Object requestor, String nodeText) {
int offset = 0;
int length = 0;
CMNode contentModel = getContentModel();
if (contentModel != null) {
offset = contentModel.getStartOffset();
length = contentModel.getWhitespaceEndOffset() - offset;
replaceText(requestor, offset, length, nodeText);
}
else {
addContent(requestor, nodeText);
}
}
public void resolveRegions() {
// System.out.println("element node stream = " +
// tokenStream.getString());
fContentModel = null;
removeChildNodes();
RegionIterator iter = iterator();
if (getNameRegion() != null) {
// we skip past the name token is our name
skipPastName(iter);
}
while (iter.hasNext()) {
ITextRegion currentRegion = iter.next();
if (fContentModel == null) {
if (currentRegion.getType().equals(DTDRegionTypes.NAME)) {
fContentModel = new CMBasicNode(getDTDFile(), getStructuredDTDDocumentRegion());
}
else if (currentRegion.getType().equals(DTDRegionTypes.CONTENT_PCDATA)) {
fContentModel = new CMBasicNode(getDTDFile(), getStructuredDTDDocumentRegion());
}
else if (currentRegion.getType().equals(DTDRegionTypes.LEFT_PAREN)) {
fContentModel = new CMGroupNode(getDTDFile(), getStructuredDTDDocumentRegion());
}
}
if (fContentModel != null) {
if (!currentRegion.getType().equals(DTDRegionTypes.END_TAG)) {
// content model gets all regions except for the '>'
fContentModel.addRegion(currentRegion);
}
else {
// if it is equal to the end tag, then don't add anymore
// regions
// for the content model
break;
}
}
}
if (fContentModel != null) {
appendChild(fContentModel);
// this is the root element content so set it true
fContentModel.setRootElementContent(true);
// now tell the content model to resolve it's regions
fContentModel.resolveRegions();
}
}
public void setContentModel(CMNode contentModel) {
this.fContentModel = contentModel;
}
}