blob: e8a47d5ba2469ea4b2e725a4086d71455e3e5bb3 [file] [log] [blame]
/*******************************************************************************
* 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;
}
}