/* * Copyright (c) 2005 (Mike) Maurice Kienenberger (mkienenb@gmail.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package org.gamenet.swing.controls; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Iterator; import java.util.Map; import javax.swing.JComboBox; import javax.swing.ListCellRenderer; public class StringComboBox extends JComboBox implements ActionListener { private ObjectLabelValueHolder[] objectValueLabelArray; private ObjectValueHolder objectValueHolder; /** @deprecated */ private NumberLabelValueHolder[] numberValueLabelArray; /** @deprecated */ private IntValueHolder intValueHolder; public StringComboBox(Map labelValuesMap, ObjectValueHolder srcObjectValueHolder) { this(convertMapToLabelNameObjectArray(labelValuesMap), srcObjectValueHolder); } private static ObjectLabelValueHolder[] convertMapToLabelNameObjectArray(Map map) { ObjectLabelValueHolder array[] = new ObjectLabelValueHolder[map.size()]; int arrayIndex = 0; Iterator labelValueEntryIterator = map.entrySet().iterator(); while (labelValueEntryIterator.hasNext()) { Map.Entry labelValueEntry = (Map.Entry) labelValueEntryIterator.next(); String label = (String)labelValueEntry.getKey(); Object value = labelValueEntry.getValue(); array[arrayIndex++] = new ObjectLabelValueHolder(value, label); } return array; } public StringComboBox(final ObjectLabelValueHolder srcValueLabelArray[], final ObjectValueHolder srcObjectValueHolder) { this(convertObjectToNumberVH(srcValueLabelArray), createIntValueHolderFromObjectValueHolder(srcValueLabelArray, srcObjectValueHolder)); } //// IMPLEMENT: WHY DOES THE FOLLOWING NOT WORK!?!?!?!?!?!?!?!?!??!?!?!?!?!?! // public StringComboBox(ObjectLabelValueHolder srcValueLabelArray[], ObjectValueHolder srcObjectValueHolder) // { // this.objectValueLabelArray = srcValueLabelArray; // this.objectValueHolder = srcObjectValueHolder; // // Object selectedObject = objectValueHolder.getValue(); // // ObjectLabelValueHolder defaultObjectLabelValueHolder // = ObjectLabelValueHolder.getObjectLabelValueHolderForObjectInObjectLabelValueHolderArray( // selectedObject, objectValueLabelArray); // // ListCellRenderer renderer = new AbstractStringListCellRenderer() // { // protected String getStringForValue(Object value) // { // if (null == value) // { // return "Error: empty value"; // } // // if (value instanceof ObjectLabelValueHolder) // { // return ((ObjectLabelValueHolder)value).getLabel(); // } // else // { // return "Error: wrong value class: " + value.getClass().getName(); // } // } // }; // // this.setRenderer(renderer); // this.setSelectedItem(defaultObjectLabelValueHolder); // this.addActionListener(this); // } static private IntValueHolder createIntValueHolderFromObjectValueHolder(final ObjectLabelValueHolder[] srcValueLabelArray, final ObjectValueHolder srcObjectValueHolder) { return new IntValueHolder() { public int getValue() { return convertObjectToNumber(srcValueLabelArray, srcObjectValueHolder.getValue()); } public void setValue(int value) { srcObjectValueHolder.setValue(convertNumberToObject(srcValueLabelArray, value)); } private int convertObjectToNumber(ObjectLabelValueHolder[] valueLabelArray, Object targetObject) { for (int valueLabelIndex = 0; valueLabelIndex < valueLabelArray.length; valueLabelIndex++) { ObjectLabelValueHolder valueLabel = valueLabelArray[valueLabelIndex]; if (valueLabel.getObject().equals(targetObject)) { return valueLabelIndex; } } return -1; } private Object convertNumberToObject(ObjectLabelValueHolder[] valueLabelArray, int number) { return valueLabelArray[number].getObject(); } }; } static private NumberLabelValueHolder[] convertObjectToNumberVH(final ObjectLabelValueHolder[] srcValueLabelArray) { NumberLabelValueHolder numberLabelValueArray[] = new NumberLabelValueHolder[srcValueLabelArray.length]; for (int objectIndex = 0; objectIndex < srcValueLabelArray.length; objectIndex++) { ObjectLabelValueHolder objectVH = srcValueLabelArray[objectIndex]; numberLabelValueArray[objectIndex] = new NumberLabelValueHolder(objectIndex, objectVH.getLabel()); } return numberLabelValueArray; } /** @deprecated */ public StringComboBox(NumberLabelValueHolder srcValueLabelArray[], IntValueHolder srcIntValueHolder) { super(srcValueLabelArray); this.numberValueLabelArray = srcValueLabelArray; this.intValueHolder = srcIntValueHolder; NumberLabelValueHolder selectedNumberLabelValueHolder = NumberLabelValueHolder.getLabelForNumberInArray( intValueHolder.getValue(), numberValueLabelArray); ListCellRenderer renderer = new AbstractStringListCellRenderer() { protected String getStringForValue(Object value) { if (null == value) return "Error: empty value"; return ((NumberLabelValueHolder)value).getLabel(); } }; this.setRenderer(renderer); this.setSelectedItem(selectedNumberLabelValueHolder); this.addActionListener(this); } public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e.getSource(); if (null == intValueHolder) { ObjectLabelValueHolder item = (ObjectLabelValueHolder)cb.getSelectedItem(); objectValueHolder.setValue(item.getObject()); } else /** deprecated methods */ { NumberLabelValueHolder item = (NumberLabelValueHolder)cb.getSelectedItem(); intValueHolder.setValue(item.getNumber()); } } public ObjectLabelValueHolder[] getObjectLabelValueHolder() { return objectValueLabelArray; } public ObjectValueHolder getObjectValueHolder() { return objectValueHolder; } /** @deprecated */ public NumberLabelValueHolder[] getNumberLabelValueHolder() { return numberValueLabelArray; } /** @deprecated */ public IntValueHolder getIntValueHolder() { return intValueHolder; } }