/******************************************************************************* * 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.preference;import org.eclipse.core.runtime.Assert;import org.eclipse.jface.preference.FieldEditor;import org.eclipse.swt.SWT;import org.eclipse.swt.events.SelectionAdapter;import org.eclipse.swt.events.SelectionEvent;import org.eclipse.swt.layout.GridData;import org.eclipse.swt.widgets.Combo;import org.eclipse.swt.widgets.Composite;import org.eclipse.swt.widgets.Control;/** *  * A field editor for a combo box that allows the drop-down selection of one of * a list of items. *  *//*package*/ class ComboFieldEditor extends FieldEditor {	/**	 * 	 * The <code>Combo</code> widget.	 * 	 */	private Combo fCombo;	/**	 * 	 * The value (not the name) of the currently selected item in the Combo	 * widget.	 * 	 */	private String fValue;	/**	 * 	 * The names (labels) and underlying values to populate the combo widget.	 * These should be	 * 	 * arranged as: { {name1, value1}, {name2, value2}, ...}	 * 	 */	private String[][] fEntryNamesAndValues;	/**	 * @param name	 * @param labelText	 * @param entryNamesAndValues	 * @param parent	 */	public ComboFieldEditor(String name, String labelText,			String[][] entryNamesAndValues, Composite parent) {		init(name, labelText);		Assert.isTrue(checkArray(entryNamesAndValues));		fEntryNamesAndValues = entryNamesAndValues;		createControl(parent);	}	/**	 * 	 * Checks whether given <code>String[][]</code> is of "type"	 * 	 * <code>String[][2]</code>.	 * 	 * 	 * 	 * @return <code>true</code> if it is ok, and <code>false</code>	 *         otherwise	 * 	 */	private boolean checkArray(String[][] table) {		if (table == null) {			return false;		}		for (int i = 0; i < table.length; i++) {			String[] array = table[i];			if (array == null || array.length != 2) {				return false;			}		}		return true;	}	/**	 * 	 * @see FieldEditor#adjustForNumColumns(int)	 * 	 */	protected void adjustForNumColumns(int numColumns) {		if (numColumns > 1) {			Control control = getLabelControl();			int left = numColumns;			if (control != null) {				((GridData) control.getLayoutData()).horizontalSpan = 1;				left = left - 1;			}			((GridData) fCombo.getLayoutData()).horizontalSpan = left;		} else {			Control control = getLabelControl();			if (control != null) {				((GridData) control.getLayoutData()).horizontalSpan = 1;			}			((GridData) fCombo.getLayoutData()).horizontalSpan = 1;		}	}	/**	 * 	 * @see FieldEditor#doFillIntoGrid(Composite, int)	 * 	 */	protected void doFillIntoGrid(Composite parent, int numColumns) {		int comboC = 1;		if (numColumns > 1) {			comboC = numColumns - 1;		}		Control control = getLabelControl(parent);		GridData gd = new GridData();		gd.horizontalSpan = 1;		control.setLayoutData(gd);		control = getComboBoxControl(parent);		gd = new GridData();		gd.horizontalSpan = comboC;		gd.horizontalAlignment = GridData.FILL;		control.setLayoutData(gd);	}	/**	 * 	 * @see FieldEditor#doLoad()	 * 	 */	protected void doLoad() {		updateComboForValue(getPreferenceStore().getString(getPreferenceName()));	}	/**	 * 	 * @see FieldEditor#doLoadDefault()	 * 	 */	protected void doLoadDefault() {		updateComboForValue(getPreferenceStore().getDefaultString(				getPreferenceName()));	}	/**	 * 	 * @see FieldEditor#doStore()	 * 	 */	protected void doStore() {		if (fValue == null) {			getPreferenceStore().setToDefault(getPreferenceName());			return;		}		getPreferenceStore().setValue(getPreferenceName(), fValue);	}	/**	 * 	 * @see FieldEditor#getNumberOfControls()	 * 	 */	public int getNumberOfControls() {		return 1;	}	/**	 * 	 * Lazily create and return the Combo control.	 * @param parent 	 * @return the combo box	 * 	 */	public Combo getComboBoxControl(Composite parent) {		if (fCombo == null) {			fCombo = new Combo(parent, SWT.READ_ONLY);			for (int i = 0; i < fEntryNamesAndValues.length; i++) {				fCombo.add(fEntryNamesAndValues[i][0], i);			}			fCombo.addSelectionListener(new SelectionAdapter() {				public void widgetSelected(SelectionEvent evt) {					String oldValue = fValue;					String name = fCombo.getText();					fValue = getValueForName(name);					setPresentsDefaultValue(false);					fireValueChanged(VALUE, oldValue, fValue);				}			});		}		return fCombo;	}	/**	 * 	 * Given the name (label) of an entry, return the corresponding value.	 * @param name 	 * @return the value corresponding to name or the first value if	 * not found	 * 	 */	protected String getValueForName(String name) {		for (int i = 0; i < fEntryNamesAndValues.length; i++) {			String[] entry = fEntryNamesAndValues[i];			if (name.equals(entry[0])) {				return entry[1];			}		}		return fEntryNamesAndValues[0][0];	}	/**	 * 	 * Set the name in the combo widget to match the specified value.	 * @param value 	 * 	 */	protected void updateComboForValue(String value) {		fValue = value;		for (int i = 0; i < fEntryNamesAndValues.length; i++) {			if (value.equals(fEntryNamesAndValues[i][1])) {				fCombo.setText(fEntryNamesAndValues[i][0]);				return;			}		}		if (fEntryNamesAndValues.length > 0) {			fValue = fEntryNamesAndValues[0][1];		}	}}