/*******************************************************************************
 * Copyright (c) 2003, 2005 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.jst.j2ee.internal.webservice.adapter;

import java.util.Iterator;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;

public class AdapterCCombo extends AdapterImpl implements SelectionListener {
	private EObject eObject_;
	private EStructuralFeature feature_;
	private EStructuralFeature displayFeature_;
	private CCombo combo_;
	private String defaultDisplayString_;

	public AdapterCCombo(EStructuralFeature feature, EStructuralFeature displayFeature, CCombo combo, String defaultDisplayString) {
		super();
		eObject_ = null;
		feature_ = feature;
		displayFeature_ = displayFeature;
		combo_ = combo;
		combo_.addSelectionListener(this);
		defaultDisplayString_ = (defaultDisplayString != null) ? defaultDisplayString : ""; //$NON-NLS-1$
	}

	public AdapterCCombo(EStructuralFeature feature, EStructuralFeature displayFeature, CCombo combo) {
		this(feature, displayFeature, combo, null);
	}

	public AdapterCCombo(EObject eObject, EStructuralFeature feature, EStructuralFeature displayFeature, CCombo combo) {
		this(eObject, feature, displayFeature, combo, null);
	}

	public AdapterCCombo(EObject eObject, EStructuralFeature feature, EStructuralFeature displayFeature, CCombo combo, String defaultDisplayString) {
		this(feature, displayFeature, combo, defaultDisplayString);
		adapt(eObject);
	}

	@Override
	public void notifyChanged(Notification msg) {
		Object notifier = msg.getNotifier();
		if (notifier == eObject_) {
			int type = msg.getEventType();
			if (type == Notification.SET || type == Notification.UNSET || type == Notification.ADD || type == Notification.REMOVE || type == Notification.ADD_MANY || type == Notification.REMOVE_MANY)
				populateCombo();
		} else if (msg.getFeature() == displayFeature_)
			populateCombo();
	}

	private void populateCombo() {
		if (eObject_ != null) {
			Object object = eObject_.eGet(feature_);
			if (object != null) {
				if (combo_.isDisposed())
					return;
				int selectionIndex = combo_.getSelectionIndex();
				String text = combo_.getText();
				combo_.removeAll();
				if (object instanceof EList) {
					EList eList = (EList) object;
					for (Iterator it = eList.iterator(); it.hasNext();)
						combo_.add(toDisplayString(((EObject) it.next()).eGet(displayFeature_)));
				} else
					combo_.add(toDisplayString(((EObject) object).eGet(displayFeature_)));
				int newIndex = combo_.indexOf(text);
				if (selectionIndex != -1 && newIndex != -1)
					combo_.select(newIndex);
				else
					combo_.select(0);
			}
		}
	}

	private String toDisplayString(Object object) {
		if (object != null) {
			String s = object.toString();
			if (s != null && s.length() > 0)
				return s;
		}
		return defaultDisplayString_;
	}

	public void widgetDefaultSelected(SelectionEvent e) {
		//Do nothing
	}

	public void widgetSelected(SelectionEvent e) {
		//Do nothing
	}

	public void adapt(EObject eObject) {
		if (eObject_ != null) {
			eObject_.eAdapters().remove(this);
			combo_.removeAll();
		}
		eObject_ = eObject;
		if (eObject_ != null) {
			eObject_.eAdapters().add(this);
			Object object = eObject_.eGet(feature_);
			if (object instanceof EList) {
				for (Iterator it = ((EList) object).iterator(); it.hasNext();) {
					Object item = it.next();
					if (item instanceof EObject)
						((EObject) item).eAdapters().add(this);
				}
			} else if (object instanceof EObject)
				((EObject) object).eAdapters().add(this);
			populateCombo();
		}
	}

	public void dispose() {
		if (eObject_ != null)
			eObject_.eAdapters().remove(this);
		if (combo_ != null && !combo_.isDisposed())
			combo_.removeSelectionListener(this);
	}
}
