/*******************************************************************************
 * Copyright (c) 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
 *     
 *******************************************************************************/

package org.eclipse.wst.html.core.tests.model;

import junit.framework.TestCase;

import org.eclipse.wst.css.core.internal.provisional.adapters.IStyleSheetAdapter;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleRule;
import org.eclipse.wst.css.core.internal.provisional.document.ICSSStyleSheet;
import org.eclipse.wst.html.core.internal.provisional.HTML40Namespace;
import org.eclipse.wst.html.core.tests.utils.FileUtil;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;

public class TestForNPEInCSSCreation extends TestCase {


	public void testCSSModel() {

		IDOMModel model = FileUtil.createHTMLModel();

		try {
			IStructuredDocument structuredDocument = model.getStructuredDocument();
			structuredDocument.set(getHTMLDocumentText());

			IDOMDocument doc = model.getDocument();

			// get head tag
			NodeList list = doc.getElementsByTagName(HTML40Namespace.ElementName.HEAD);
			Element head = (Element) list.item(0);

			// create and append style element
			Element ele = doc.createElement(HTML40Namespace.ElementName.STYLE);
			ele.setAttribute(HTML40Namespace.ATTR_NAME_TYPE, "text/css");

			String delim = model.getStructuredDocument().getLineDelimiter();
			if (delim == null)
				delim = "\n";//$NON-NLS-1$
			StringBuffer buffer = new StringBuffer(delim);
			buffer.append("<!--");//$NON-NLS-1$
			buffer.append(delim);
			buffer.append("-->");//$NON-NLS-1$
			buffer.append(delim);
			Text text = doc.createTextNode(buffer.toString());
			ele.appendChild(text);

			head.insertBefore(ele, null);

			// get adapter for StyleSheet
			ICSSStyleSheet sheet = (ICSSStyleSheet) ((IStyleSheetAdapter) ((INodeNotifier) ele).getAdapterFor(IStyleSheetAdapter.class)).getSheet();

			// create style declaration
			ICSSStyleRule rule = sheet.createCSSStyleRule();
			rule.getStyle().setProperty("background-color", "lime", "");
			rule.getStyle().setProperty("background-color", "blue", "");
			rule.getStyle().setProperty("background-color", "#0080ff", "");

			//model.save();


		}


		finally {
			if (model != null) {
				model.releaseFromEdit();
			}
		}

	}

	private String getHTMLDocumentText() {
		return "<html><head></head><body></body></html>";
	}

}
