/*******************************************************************************
 * 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.ui.views.properties;

import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.IPropertySource;
import org.eclipse.wst.sse.core.INodeAdapter;
import org.eclipse.wst.sse.core.INodeNotifier;
import org.eclipse.wst.sse.core.text.IStructuredDocumentRegion;
import org.eclipse.wst.sse.core.text.ITextRegion;
import org.eclipse.wst.sse.core.text.ITextRegionList;
import org.eclipse.wst.sse.core.util.StringUtils;
import org.eclipse.wst.sse.ui.util.Assert;
import org.eclipse.wst.sse.ui.views.properties.CustomPropertyDescriptor;
import org.eclipse.wst.sse.ui.views.properties.IPropertySourceExtension;
import org.eclipse.wst.xml.core.document.XMLNode;
import org.eclipse.wst.xml.core.parser.XMLRegionContext;
import org.w3c.dom.Node;
import org.w3c.dom.ProcessingInstruction;


/**
 * An IPropertySource implementation for a JFace viewer used to display
 * properties of DOM nodes. Requires an adapter factory to create JFace
 * adapters for the nodes in the tree.
 * 
 * @deprecated - to be removed in M4
 */
public class ProcessingInstructionPropertySourceAdapter implements INodeAdapter, IPropertySource, IPropertySourceExtension {
	protected final static String CATEGORY_ATTRIBUTES = "Instructions"; //$NON-NLS-1$

	protected IPropertyDescriptor[] fDescriptors = null;
	protected Node fNode = null;

	public ProcessingInstructionPropertySourceAdapter(INodeNotifier target) {
		super();
		fNode = (Node) target;
		Assert.isTrue(target instanceof XMLNode);
		Assert.isTrue(fNode.getNodeType() == Node.PROCESSING_INSTRUCTION_NODE);
	}

	/**
	 * Returns the current collection of property descriptors.
	 * 
	 * @return all valid descriptors.
	 */
	protected IPropertyDescriptor[] createPropertyDescriptors() {
		boolean isXML = ((ProcessingInstruction) fNode).getTarget().equalsIgnoreCase("xml"); //$NON-NLS-1$
		if (!isXML)
			return new IPropertyDescriptor[0];
		CustomPropertyDescriptor[] descriptors = new CustomPropertyDescriptor[2];
		descriptors[0] = new CustomPropertyDescriptor("version", "version", null); //$NON-NLS-1$ //$NON-NLS-2$
		descriptors[0].setCategory(CATEGORY_ATTRIBUTES);
		descriptors[1] = new CustomPropertyDescriptor("encoding", "encoding", null); //$NON-NLS-1$ //$NON-NLS-2$
		descriptors[1].setCategory(CATEGORY_ATTRIBUTES);
		return descriptors;
	}

	/**
	 * Returns a value for this Node that can be editted in a property sheet.
	 * 
	 * @return a value that can be editted
	 */
	public Object getEditableValue() {
		return null;
	}

	/**
	 * Returns the current collection of property descriptors.
	 * 
	 * @return all valid descriptors.
	 */
	public IPropertyDescriptor[] getPropertyDescriptors() {
		if (fDescriptors == null) {
			fDescriptors = createPropertyDescriptors();
		}
		return fDescriptors;
	}

	/**
	 * Returns the current value for the named property.
	 */
	public Object getPropertyValue(Object nameObject) {
		XMLNode node = (XMLNode) fNode;
		String value = null;
		String name = null;
		IStructuredDocumentRegion docRegion = node.getFirstStructuredDocumentRegion();
		if (docRegion == null)
			return null;
		ITextRegionList regions = docRegion.getRegions();
		ITextRegion region = null;
		int i = 2;
		while (value == null && i < regions.size()) {
			region = regions.get(i);
			if (region.getType().equals(XMLRegionContext.XML_TAG_ATTRIBUTE_NAME))
				name = docRegion.getText(region);
			else if (region.getType().equals(XMLRegionContext.XML_TAG_ATTRIBUTE_VALUE) && name != null && name.equals(nameObject))
				value = docRegion.getText(region);
			i++;
		}
		if (value != null)
			value = StringUtils.strip(value);
		return value;
	}

	/**
	 * Allowing the INodeAdapter to compare itself against the type allows it
	 * to return true in more than one case.
	 */
	public boolean isAdapterForType(Object type) {
		return type == IPropertySource.class;
	}

	/**
	 * Returns whether the property value has changed from the default.
	 * 
	 * @return <code>true</code> if the value of the specified property has
	 *         changed from its original default value; <code>false</code>
	 *         otherwise.
	 */
	public boolean isPropertySet(Object propertyObject) {
		return false;
	}

	public void notifyChanged(INodeNotifier notifier, int eventType, java.lang.Object changedFeature, java.lang.Object oldValue, java.lang.Object newValue, int pos) {
	}

	/**
	 * Remove the given attribute from the Node
	 * 
	 * @param propertyObject
	 */
	public void removeProperty(Object propertyObject) {
	}

	/**
	 * Resets the specified property's value to its default value.
	 */
	public void resetPropertyValue(Object propertyObject) {
	}

	/**
	 * Sets the named property to the given value.
	 * 
	 */
	public void setPropertyValue(Object nameObject, Object value) {
	}
}
