/******************************************************************************* * Copyright (c) 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.pagedesigner.properties.celleditors; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jst.jsf.common.ui.internal.utils.StyleCombo; import org.eclipse.jst.jsf.metadataprocessors.features.IDefaultValue; import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue; import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues; import org.eclipse.swt.widgets.Composite; import org.eclipse.wst.sse.ui.internal.Logger; /** * A combo cell editor * */ public class LabeledStyleComboCellEditor extends StyleComboCellEditor { private boolean _fSettingValue = false; private Object[] _values; /** * @param parent * @param valueLabelMap * @param defaultValue * @param style * @return the new instance */ public static LabeledStyleComboCellEditor newInstance(Composite parent, Map valueLabelMap, String defaultValue, int style) { // we'll sort according to label. since that is what being show to user. List list = new ArrayList(); for (Iterator iter = valueLabelMap.keySet().iterator(); iter.hasNext();) { Object key = iter.next(); String label = (String) valueLabelMap.get(key); list.add(new Object[] { key, label }); } // sort by label Collections.sort(list, new Comparator() { public int compare(Object o1, Object o2) { String label1 = (String) ((Object[]) o1)[1]; String label2 = (String) ((Object[]) o2)[1]; return label1.compareTo(label2); } }); Object[] values = new Object[list.size()]; String[] labels = new String[list.size()]; for (int i = 0, n = list.size(); i < n; i++) { values[i] = ((Object[]) list.get(i))[0]; labels[i] = (String) ((Object[]) list.get(i))[1]; } return new LabeledStyleComboCellEditor(parent, values, labels, defaultValue, style); } /** * Constructor * * @param parent * @param values * @param labels * @param defaultValue * @param style */ public LabeledStyleComboCellEditor(Composite parent, Object[] values, String[] labels, String defaultValue, int style) { super(parent, labels, style); StyleCombo combo = (StyleCombo) getControl(); if (defaultValue != null) combo.setDefaultValue(defaultValue); _values = values; } protected Object doGetValue() { // otherwise limits to set of valid values Object index = super.doGetValue(); int selection1 = -1; if (index instanceof Integer) { selection1 = ((Integer) index).intValue(); } if (selection1 >= 0) { return _values[selection1]; } else if (getControl() instanceof StyleCombo) { // retrieve the actual text as the list of valid items doesn't // contain the value return ((StyleCombo) 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 selection1 = -1; for (int i = 0; i < _values.length; i++) { if (_values[i].equals(stringValue)) { selection1 = i; } } if (selection1 >= 0) { super.doSetValue(new Integer(selection1)); } else { super.doSetValue(new Integer(-1)); if (getControl() instanceof StyleCombo && !stringValue.equals(((StyleCombo) getControl()) .getText())) { // update the Text widget ((StyleCombo) 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 StyleCombo) { for (int i = 0; i < newItems.length; i++) { if (newItems[i].equals(previousSelectedValue)) { setValue(previousSelectedValue); } } } } /** * Create CellEditor * @param parent * @param pvs * @param defaultValue * @param style * @return CellEditor */ public static CellEditor newInstance(Composite parent, IPossibleValues pvs, IDefaultValue defaultValue, int style) { CellEditor ed = null; if (pvs != null) { Map map = getPossibleValueMap(pvs); ed = newInstance(parent, map, defaultValue != null ? defaultValue.getDefaultValue() : null, style); } return ed; } private static Map getPossibleValueMap(IPossibleValues pvs) { Map<String, String> map = new HashMap<String, String>(pvs.getPossibleValues().size()); for (Iterator it = pvs.getPossibleValues().iterator();it.hasNext();){ IPossibleValue pv = (IPossibleValue)it.next(); map.put(pv.getValue(), pv.getDisplayValue()); } return map; } }