/*******************************************************************************
 * 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.dtd.core.internal;

import java.util.ArrayList;

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.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.text.ITextRegion;


public class AttributeList extends NamedTopLevelNode {
	public AttributeList(DTDFile file, IStructuredDocumentRegion flatNode) {
		super(file, flatNode, DTDRegionTypes.ATTLIST_TAG);
	}

	public void addAttribute(String name) {
		beginRecording(this, DTDCorePlugin.getDTDString("_UI_LABEL_ATTR_LIST_ADD")); //$NON-NLS-1$

		DTDNode lastAttribute = (DTDNode) getLastChild();
		if (lastAttribute != null) {
			replaceText(this, lastAttribute.getEndOffset(), 0, "\n\t" + name + " CDATA #IMPLIED"); //$NON-NLS-1$ //$NON-NLS-2$
		}
		else {
			ITextRegion nameRegion = getNameRegion();
			if (nameRegion != null) {
				replaceText(this, getStructuredDTDDocumentRegion().getEndOffset(nameRegion), 0, "\n\t" + name + " CDATA #IMPLIED"); //$NON-NLS-1$ //$NON-NLS-2$
			}

		}

		endRecording(this);
	}

	public Image getImage() {
		return DTDCorePlugin.getInstance().getImage(DTDResource.ATTRIBUTELISTICON);
	}

	public void insertIntoModel(Object requestor, Attribute reference, Attribute node, boolean isAfter) {
		int offset = 0;
		String newText = ""; //$NON-NLS-1$
		String nodeText = node.getFullNodeText();
		if (!isAfter) {
			offset = reference.getStartOffset();
		}
		else {
			// try and get next child
			Attribute attr = (Attribute) reference.getNextSibling();
			if (attr != null) {
				offset = attr.getStartOffset();
			}
			else {
				// just use the end offset
				offset = reference.getWhitespaceEndOffset();
			}
		}
		newText += nodeText;// + (isLastChild ? "\n" : "\n\t");
		if (!node.hasTrailingWhitespace()) {
			newText += "\n\t"; //$NON-NLS-1$
		}
		replaceText(requestor, offset, 0, newText);
	}

	public void resolveRegions() {
		removeChildNodes();
		RegionIterator iter = iterator();

		if (getNameRegion() != null) {
			// we skip past the name token is our name
			skipPastName(iter);
		}

		ArrayList children = new ArrayList();
		Attribute attribute = null;
		boolean trailingWhitespace = false;
		while (iter.hasNext()) {
			ITextRegion currentRegion = iter.next();
			if (currentRegion.getType().equals(DTDRegionTypes.ATTRIBUTE_NAME)) {
				attribute = new Attribute(getDTDFile(), getStructuredDTDDocumentRegion());
				children.add(attribute);
				appendChild(attribute);
				trailingWhitespace = false;
			}
			if (attribute != null && currentRegion.getType() != DTDRegionTypes.END_TAG) {
				if (!trailingWhitespace) {
					attribute.addRegion(currentRegion);
				}
				else {
					if (currentRegion.getType() == DTDRegionTypes.WHITESPACE) {
						attribute.addWhitespaceRegion(currentRegion);
					}
				}

				// the following prevents extra whitespace from being picked
				// up by the attribute
				if (currentRegion.getType() == DTDRegionTypes.REQUIRED_KEYWORD || currentRegion.getType() == DTDRegionTypes.IMPLIED_KEYWORD || currentRegion.getType() == DTDRegionTypes.SINGLEQUOTED_LITERAL || currentRegion.getType() == DTDRegionTypes.DOUBLEQUOTED_LITERAL) {
					trailingWhitespace = true;
				}
			}
		}
		int numKids = children.size();
		for (int i = 0; i < numKids; i++) {
			((Attribute) children.get(i)).resolveRegions();
		} // end of for ()
	}
}
