/* * $Id$ * * Copyright (c) 2005 by Rodney Kinney, Brent Easton * * 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.turn; import java.awt.Component; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import VASSAL.build.module.documentation.HelpFile; import VASSAL.configure.IntConfigurer; import VASSAL.configure.VisibilityCondition; import VASSAL.tools.ArrayUtils; import VASSAL.tools.SequenceEncoder; public class CounterTurnLevel extends TurnLevel { protected static final String START = "start"; //$NON-NLS-1$ protected static final String INCR = "incr"; //$NON-NLS-1$ protected static final String LOOP = "loop"; //$NON-NLS-1$ protected static final String LOOP_LIMIT = "loopLimit"; //$NON-NLS-1$ protected int incr = 1; protected boolean loop = false; protected int loopLimit = -1; public CounterTurnLevel() { super(); } /* * Reset counter to initial state */ protected void reset() { super.reset(); setLow(); } protected void setLow() { current = start; super.setLow(); } protected void setHigh() { current = loopLimit; super.setHigh(); } /* * Generate the state of the level */ protected String getState() { SequenceEncoder se = new SequenceEncoder(';'); se.append(current); se.append(currentSubLevel); se.append(loop); se.append(loopLimit); for (int i = 0; i < getTurnLevelCount(); i++) { se.append(getTurnLevel(i).getState()); } return se.getValue(); } /* * Set the state of the level */ protected void setState(String code) { SequenceEncoder.Decoder sd = new SequenceEncoder.Decoder(code, ';'); current = sd.nextInt(start); currentSubLevel = sd.nextInt(0); // Change to 0 as default due to issue 3500 loop = sd.nextBoolean(false); loopLimit = sd.nextInt(-1); for (int i = 0; i < getTurnLevelCount(); i++) { getTurnLevel(i).setState(sd.nextToken("")); //$NON-NLS-1$ } myValue.setPropertyValue(getValueString()); } protected String getValueString() { return String.valueOf(current); } /* (non-Javadoc) * @see turn.TurnLevel#getLongestValueName() */ protected String getLongestValueName() { return start < 10000 ? "9999" : String.valueOf(start); //$NON-NLS-1$ } /* * Advance this level. * 1. If there are any sub-levels, Advance the current sub-level first. * 2. If the sublevels roll over, then advance the counter * 3. If LOOP is reached, roll over the counter */ protected void advance() { // Advance sub-levels super.advance(); // If no sub-levels, or they rolled over, advance this level if (getTurnLevelCount() == 0 || (getTurnLevelCount() > 0 && hasSubLevelRolledOver())) { current += incr; if (loop && current > loopLimit) { current = start; setRolledOver(true); } } myValue.setPropertyValue(getValueString()); } protected void retreat() { // Retreat sub-levels super.retreat(); // If no sub-levels, or they rolled over, retreat this level int oldCurrent = current; if (getTurnLevelCount() == 0 || (getTurnLevelCount() > 0 && hasSubLevelRolledOver())) { current -= incr; if (loop && oldCurrent <= start) { current = loopLimit; setRolledOver(true); } } myValue.setPropertyValue(getValueString()); } protected Component getSetControl() { final IntConfigurer config = new IntConfigurer("", " "+getConfigureName()+": ", current); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ config.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { current = (Integer) ((IntConfigurer) e.getSource()).getValue(); myValue.setPropertyValue(getValueString()); }}); return config.getControls(); } public String[] getAttributeDescriptions() { return ArrayUtils.append( super.getAttributeDescriptions(), "Start Value: ", "Increment By: ", "Loop?", "Maximum value: " ); } public Class<?>[] getAttributeTypes() { return ArrayUtils.append( super.getAttributeTypes(), Integer.class, Integer.class, Boolean.class, Integer.class ); } public String[] getAttributeNames() { return ArrayUtils.append( super.getAttributeNames(), START, INCR, LOOP, LOOP_LIMIT ); } public void setAttribute(String key, Object value) { if (START.equals(key)) { if (value instanceof String) { value = Integer.valueOf((String) value); } start = ((Integer) value).intValue(); current = start; myValue.setPropertyValue(getValueString()); } else if (INCR.equals(key)) { if (value instanceof String) { value = Integer.valueOf((String) value); } incr = ((Integer) value).intValue(); } else if (LOOP.equals(key)) { if (value instanceof String) { value = Boolean.valueOf((String) value); } loop = ((Boolean) value).booleanValue(); } else if (LOOP_LIMIT.equals(key)) { if (value instanceof String) { value = Integer.valueOf((String) value); } loopLimit = ((Integer) value).intValue(); } else { super.setAttribute(key, value); } } public String getAttributeValueString(String key) { if (START.equals(key)) { return start + ""; //$NON-NLS-1$ } else if (INCR.equals(key)) { return incr + ""; //$NON-NLS-1$ } else if (LOOP.equals(key)) { return loop + ""; //$NON-NLS-1$ } else if (LOOP_LIMIT.equals(key)) { return loopLimit + ""; //$NON-NLS-1$ } else return super.getAttributeValueString(key); } public static String getConfigureTypeName() { return "Counter"; } public HelpFile getHelpFile() { return HelpFile.getReferenceManualPage("TurnTracker.htm","Counter"); //$NON-NLS-1$ //$NON-NLS-2$ } public VisibilityCondition getAttributeVisibility(String name) { if (LOOP_LIMIT.equals(name)) { return loopCond; } else { return null; } } private VisibilityCondition loopCond = new VisibilityCondition() { public boolean shouldBeVisible() { return loop; } }; }