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



import org.eclipse.jface.viewers.ComboBoxCellEditor;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.wst.sse.ui.internal.Logger;


/**
 * An extended ComboBoxCellEditor that selects and returns Strings
 */

public class StringComboBoxCellEditor extends ComboBoxCellEditor {
	private boolean fSettingValue = false;

	/**
	 * 
	 */
	public StringComboBoxCellEditor() {
		super();
	}

	/**
	 * @param parent
	 * @param items
	 */
	public StringComboBoxCellEditor(Composite parent, String[] items) {
		super(parent, items);
	}

	/**
	 * @param parent
	 * @param items
	 * @param style
	 */
	public StringComboBoxCellEditor(Composite parent, String[] items, int style) {
		super(parent, items, style);
	}

	protected Object doGetValue() {
		// otherwise limits to set of valid values
		Object index = super.doGetValue();
		int selection = -1;
		if (index instanceof Integer) {
			selection = ((Integer) index).intValue();
		}
		if (selection >= 0) {
			return getItems()[selection];
		}
		else if (getControl() instanceof CCombo) {
			// retrieve the actual text as the list of valid items doesn't
			// contain the value
			return ((CCombo) getControl()).getText();
		}
		return null;
	}

	protected void doSetValue(Object value) {
		if (fSettingValue) {
			return;
		}
		fSettingValue = true;
		if (value instanceof Integer) {
			super.doSetValue(value);
		}
		else {
			String stringValue = value.toString();
			int selection = -1;
			for (int i = 0; i < getItems().length; i++) {
				if (getItems()[i].equals(stringValue)) {
					selection = i;
				}
			}
			if (selection >= 0) {
				super.doSetValue(new Integer(selection));
			}
			else {
				super.doSetValue(new Integer(-1));
				if ((getControl() instanceof CCombo) && !stringValue.equals(((CCombo) getControl()).getText())) {
					// update the Text widget
					((CCombo) getControl()).setText(stringValue);
				}
			}
		}
		fSettingValue = false;
	}

	public void setItems(String[] newItems) {
		if ((getControl() == null) || getControl().isDisposed()) {
			Logger.log(Logger.ERROR, "Attempted to update item list for disposed cell editor"); //$NON-NLS-1$
			return;
		}

		// keep selection if possible
		Object previousSelectedValue = getValue();
		super.setItems(newItems);
		if ((previousSelectedValue != null) && (getControl() instanceof CCombo)) {
			for (int i = 0; i < newItems.length; i++) {
				if (newItems[i].equals(previousSelectedValue)) {
					setValue(previousSelectedValue);
				}
			}
		}
	}
}
