/*******************************************************************************
 * Copyright (c) 2004, 2006 Sybase, Inc. 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:
 *     Sybase, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jst.jsf.facesconfig.ui.pageflow.properties;

import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.jface.viewers.CellEditor;
import org.eclipse.jface.viewers.ICellEditorValidator;
import org.eclipse.jst.jsf.facesconfig.ui.EditorPlugin;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.PageflowMessages;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.Pageflow;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowElement;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowLink;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPackage;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.model.PageflowPage;
import org.eclipse.jst.jsf.facesconfig.ui.pageflow.util.PageflowValidation;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.views.properties.IPropertyDescriptor;
import org.eclipse.ui.views.properties.PropertyDescriptor;
import org.eclipse.ui.views.properties.TextPropertyDescriptor;

/**
 * The property source for Pageflow Link.
 * 
 * @author hmeng
 */

public class PageflowLinkPropertySource extends PageflowElementPropertySource {

	/**
	 * @param element
	 */
	public PageflowLinkPropertySource(PageflowElement element) {
		super(element);
	}

	public Object getPropertyValue(Object id) {
		Object result = super.getPropertyValue(id);
		if (Integer.parseInt((String) id) == PageflowPackage.PF_LINK__SOURCE
				|| Integer.parseInt((String) id) == PageflowPackage.PF_LINK__TARGET) {
			result = ((PageflowPage) result).getPath();
		}
		return result;
	}

	public void setPropertyValue(Object id, Object value) {
		if (Integer.parseInt((String) id) == PageflowPackage.PF_LINK__SOURCE) {
			((PageflowLink) element).setSourcePath((String) value);

		} else if (Integer.parseInt((String) id) == PageflowPackage.PF_LINK__TARGET) {
			((PageflowLink) element).setTargetPath((String) value);
		} else {
			super.setPropertyValue(id, value);
		}
	}

	public IPropertyDescriptor[] getPropertyDescriptors() {
		// property descriptors
		List propertyDescriptors = new Vector();

		Iterator it;
		EClass cls = element.eClass();

		it = cls.getEAllAttributes().iterator();
		while (it.hasNext()) {
			EAttribute attr = (EAttribute) it.next();
			if (attr.isID()
					|| attr.getName().equalsIgnoreCase(PAGEFLOW_NAME)
					|| attr.getName().equalsIgnoreCase(PAGEFLOW_COMMENT)
					|| attr.getFeatureID() == PageflowPackage.PAGEFLOW__REFERENCE_LINK) {
				continue;
			}

			EDataType type = attr.getEAttributeType();
			if (type.getInstanceClass() == String.class) {
				PropertyDescriptor propertyDescriptor;

				propertyDescriptor = new TextPropertyDescriptor(Integer
						.toString(attr.getFeatureID()),
						getString(attr.getName()));

				if (propertyDescriptor != null) {
					propertyDescriptor
							.setLabelProvider(new PageflowLabelProvider());
					propertyDescriptors.add(propertyDescriptor);
				}

			} else if (type.getInstanceClass() == boolean.class) {
				PropertyDescriptor propertyDescriptor;
				propertyDescriptor = getBooleanTypePropertyDescriptor(attr);
				propertyDescriptor.setLabelProvider(new BooleanLabelProvider());
				propertyDescriptors.add(propertyDescriptor);
			}
		}
		it = cls.getEReferences().iterator();
		while (it.hasNext()) {
			EReference attr = (EReference) it.next();
			if (attr.getFeatureID() == PageflowPackage.PF_LINK__SOURCE
					|| attr.getFeatureID() == PageflowPackage.PF_LINK__TARGET) {

				PropertyDescriptor propertyDescriptor;

				propertyDescriptor = getExistingPagePathPropertyDescriptor(attr);

				if (propertyDescriptor != null) {
					propertyDescriptor
							.setLabelProvider(new PageflowLabelProvider());
					propertyDescriptors.add(propertyDescriptor);
				}
			}
		}

		return (IPropertyDescriptor[]) propertyDescriptors
				.toArray(new IPropertyDescriptor[] {});
	}

	/**
	 * The link's ends can be modified to another page existing in current pageflow.
	 * @param attr
	 * @return
	 */
	private PropertyDescriptor getExistingPagePathPropertyDescriptor(
			EReference attr) {
		PropertyDescriptor propertyDescriptor = new PropertyDescriptor(Integer
				.toString(attr.getFeatureID()), getString(attr.getName())) {
			public CellEditor createPropertyEditor(Composite parent) {
				CellEditor editor = new ExistingPagePathDialogCellEditor(
						parent, (Pageflow) element.eContainer());
				if (getValidator() != null) {
					editor.setValidator(getValidator());
				}
				return editor;
			}

			/**
			 * Returns the input validator for editing the property.
			 * 
			 * @return the validator used to verify correct values for this
			 *         property, or <code>null</code>
			 */
			protected ICellEditorValidator getValidator() {
				return new ICellEditorValidator() {
					public String isValid(Object value) {
						if (value != null) {
							if (!PageflowValidation.getInstance()
									.isExistedPage(
											((Pageflow) element.eContainer()),
											(String) value)) {
								// Pageflow.PageflowEditor.Alert.DNDResourceTitle
								// = Pageflow Creation Error
								// Pageflow.PageflowEditor.Alert.ExistingPage =
								// The web page {0} is already existed in
								// current PageFlow.
								EditorPlugin.getAlerts().info(PageflowMessages.PageflowLinkPropertySource_Title,
										PageflowMessages.PageflowLinkPropertySource_Text);
								// "Pageflow.PageflowEditor.Alert.DNDResourceTitle",
								// "Pageflow.PageflowEditor.Alert.ExistingPage",
								// (String) value);

								return EditorPlugin
										.getResourceString("Pageflow.PageflowEditor.Alert.ExistingPage"); //$NON-NLS-1$
							}
						}
						return null;
					}

				};
			}

		};
		return propertyDescriptor;
	}

}
