/* * $Id$ * * Copyright (c) 2000-2008 by Rodney Kinney * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.build.module.properties; import VASSAL.build.BadDataReport; import VASSAL.i18n.Resources; import VASSAL.tools.ErrorDialog; import VASSAL.tools.FormattedString; /** * Increments a property by a given value. * The value can be specified as a FormattedString property and evaluated at runtime * * @author rkinney * */ public class IncrementProperty implements PropertyChanger { protected Constraints constraints; protected FormattedString format = new FormattedString(); protected PropertyChangerConfigurer prop; public IncrementProperty(PropertyChangerConfigurer prop, String incr, Constraints constraints) { super(); this.prop = prop; this.constraints = constraints; format.setFormat(incr); } public String getNewValue(String oldValue) { int value = 0; try { if (oldValue == null || oldValue.length() == 0) { value = 0; } else { value = Integer.parseInt(oldValue); } } catch (NumberFormatException e) { ErrorDialog.dataError(new BadDataReport(Resources.getString("Error.non_number_error"),"Increment "+prop.getName()+": oldValue "+"="+oldValue,e)); return oldValue; } try { int incr = Integer.parseInt(format.getText(constraints.getPropertySource())); if (constraints.isWrap()) { if (value + incr > constraints.getMaximumValue()) { value = constraints.getMinimumValue() + (value + incr - constraints.getMaximumValue() - 1); } else if (value + incr < constraints.getMinimumValue()) { value = constraints.getMaximumValue() + (value + incr - constraints.getMinimumValue() + 1); } else { value += incr; } } else { value += incr; value = Math.min(constraints.getMaximumValue(), value); value = Math.max(constraints.getMinimumValue(), value); } return String.valueOf(value); } catch (NumberFormatException e) { ErrorDialog.dataError(new BadDataReport(Resources.getString("Error.non_number_error"),"Increment "+prop.getName()+": format="+format.getFormat()+", value="+format.getText(constraints),e)); return oldValue; } } public String getIncrement() { return format.getFormat(); } public static interface Constraints extends PropertySource { int getMinimumValue(); int getMaximumValue(); boolean isWrap(); PropertySource getPropertySource(); } }