/*******************************************************************************
 * Copyright (c) 2009 by SAP AG, Walldorf. 
 * 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:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.ws.jaxws.dom.ui.internal.impl;

import java.beans.PropertyDescriptor;

import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
import org.eclipse.jst.ws.jaxws.dom.runtime.IPropertyDefaults;
import org.eclipse.jst.ws.jaxws.dom.runtime.IPropertyState;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.defaults.PropertyDefaultsAdapterFactory;
import org.eclipse.jst.ws.jaxws.dom.runtime.persistence.state.PropertyStateAdapterFactory;

/**
 * Extends {@link PropertyDescriptor} to represent property descriptor for DOM objects. 
 * This class overrides createPropertyValueWrapper form {@link PropertyDescriptor} to provide
 * custom property wrapper class.
 * 
 * @author Georgi Vachkov
 */
public class DOMItemPropertyProvider extends ItemPropertyDescriptor 
{
	public DOMItemPropertyProvider(AdapterFactory adapterFactory,
				ResourceLocator resourceLocator, 
				String displayName,
				String description, 
				EStructuralFeature feature, 
				boolean isSettable,
				boolean multiLine, 
				boolean sortChoices, 
				Object staticImage,
				String category, 
				String[] filterFlags) 
	{
		super(adapterFactory, resourceLocator, displayName, description, feature,
				isSettable, multiLine, sortChoices, staticImage, category, filterFlags);
	}

	@Override
	protected Object createPropertyValueWrapper(Object object, Object propertyValue) 
	{
		return new DOMPropertyValue(adapterFactory, object, propertyValue, null);
	}
	
	@Override
	public boolean canSetProperty(Object object)
	{
		final IPropertyState state = (IPropertyState)PropertyStateAdapterFactory.INSTANCE.adapt(object, IPropertyState.class);
		if (state != null) {
			super.isSettable = state.isChangeable(feature);
		}
		
		return super.canSetProperty(object);
	}

	@Override
	public void resetPropertyValue(Object object)
	{
		final IPropertyDefaults defaults = (IPropertyDefaults)PropertyDefaultsAdapterFactory.INSTANCE.adapt(object, IPropertyDefaults.class);
		if (defaults != null) {
			final Object defaultValue = defaults.getDefault(feature);
			((EObject)object).eSet(feature, defaultValue);
		} 
		else {
			super.resetPropertyValue(object);
		}
	}
}
