/** * Copyright (C) 2002-2012 The FreeCol Team * * This file is part of FreeCol. * * FreeCol is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * FreeCol is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with FreeCol. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.freecol.common.option; import java.util.Iterator; import java.util.logging.Logger; import org.freecolandroid.xml.stream.XMLStreamException; import org.freecolandroid.xml.stream.XMLStreamWriter; import net.sf.freecol.common.model.Specification; /** * Represents an option where the valid choice is an integer and the * choices are represented by strings. In general, these strings are * localized by looking up the key of the choice, which consists of * the id of the AbstractObject followed by a "." followed by the * value of the option string. * * RangeOption differs from SelectOption, as the value being selected * represents a numeric measurement, defined by a bounded range of * comparable values. As the graphical component rendering a range * option only works with a conventional index, this implies to manage * a fixed rank for each possible values. */ public class RangeOption extends SelectOption { @SuppressWarnings("unused") private static Logger logger = Logger.getLogger(RangeOption.class.getName()); /** * Creates a new <code>RangeOption</code>. * * @param specification The specification this option belongs * to. May be null. */ public RangeOption(Specification specification) { super(specification); } /** * Gets the rank of the current selected value in the list of values of this * <code>RangeOption</code>. * * @return The value. */ public int getValueRank() { int rank = 0; Iterator<Integer> iterator = getItemValues().keySet().iterator(); while (iterator.hasNext() && iterator.next() != getValue()) { rank++; } return rank; } /** * Sets the value through the rank in the list of values of this * <code>RangeOption</code>. * * @param rank The rank of the value to be set. */ public void setValueRank(int rank) { int curValue = UNDEFINED; Iterator<Integer> iterator = getItemValues().keySet().iterator(); while (rank >= 0) { curValue = iterator.next(); rank--; } setValue(curValue); } /** * This method writes an XML-representation of this object to the given * stream. * * @param out The target stream. * @throws XMLStreamException if there are any problems writing to the * stream. */ protected void toXMLImpl(XMLStreamWriter out) throws XMLStreamException { super.toXMLImpl(out, getXMLElementTagName()); } /** * Gets the tag name of the root element representing this object. * * @return "rangeOption". */ public static String getXMLElementTagName() { return "rangeOption"; } /** * Gets the tag name of the item element * * @return "rangeValue". */ public String getXMLItemElementTagName() { return "rangeValue"; } }