/*
 * $Id: TableElementCellModifier.java,v 1.3 2006-10-21 23:18:43 pombredanne Exp $
 * Copyright Narushima Hironori. All rights reserved.
 */
package net.sourceforge.phpeclipse.wizards.html;

import javax.xml.parsers.DocumentBuilderFactory;

import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.swt.widgets.Item;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;

/**
 * 
 */
public class TableElementCellModifier implements ICellModifier {

	DocumentBuilderFactory builderFactory;

	IPropertyChangeListener listener;

	public TableElementCellModifier(IPropertyChangeListener listener) {
		builderFactory = DocumentBuilderFactory.newInstance();
		this.listener = listener;
	}

	public boolean canModify(Object element, String property) {
		return getValue(element, property) != null;
	}

	public Object getValue(Object trElem, String property) {
		if (trElem instanceof Element) {
			Element e = (Element) trElem;
			if (e.getNodeName().equals("tr")) {
				int v = TableElementModel.toNumeric(property);
				Element[] cells = TableElementModel.chooseCellElements(e);
				if (v >= 0 && v < cells.length) {
					NodeList nodes = cells[v].getChildNodes();
					if (nodes.getLength() == 1) {
						Node n = nodes.item(0);
						if (n instanceof Text) {
							return n.getNodeValue();
						}
					}
				}
			}
		}
		return null;
	}

	public void modify(Object element, String property, Object value) {
		if (element instanceof Item) {
			element = ((Item) element).getData();
		}
		Element trElem = (Element) element;
		int index = TableElementModel.toNumeric(property);
		Element cellElem = TableElementModel.chooseCellElements(trElem)[index];

		NodeList nodes = cellElem.getChildNodes();
		for (int i = 0; i < nodes.getLength(); i++) {
			cellElem.removeChild(nodes.item(i));
		}
		Document doc = cellElem.getOwnerDocument();

		if (value instanceof String) {
			cellElem.appendChild(doc.createTextNode((String) value));
		}
		// notify listener
		if (listener != null) {
			String oldValue = nodes.item(0).getNodeValue();
			listener.propertyChange(new PropertyChangeEvent(this, property,
					(String) value, oldValue));
		}
	}

}