package VASSAL.build.module.map; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Icon; import VASSAL.build.AbstractConfigurable; import VASSAL.build.AutoConfigurable; import VASSAL.build.Buildable; import VASSAL.build.module.Map; import VASSAL.build.module.documentation.HelpFile; import VASSAL.configure.StringArrayConfigurer; import VASSAL.configure.StringEnum; import VASSAL.configure.VisibilityCondition; import VASSAL.i18n.Resources; import VASSAL.tools.LaunchButton; import VASSAL.tools.NamedKeyStroke; /** * Adds a button to the toolbar to manipulate Game Piece Layers * * @author Brent Easton * */ public class LayerControl extends AbstractConfigurable { public static final String NAME = "name"; public static final String TOOLTIP = "tooltip"; public static final String BUTTON_TEXT = "text"; public static final String BUTTON_ICON = "icon"; public static final String BUTTON_HOTKEY = "hotkey"; public static final String COMMAND = "command"; public static final String SKIP = "skip"; public static final String LAYERS = "layers"; public static final String CMD_ROTATE_UP = "Rotate Layer Order Up"; public static final String CMD_ROTATE_DN = "Rotate Layer Order Down"; public static final String CMD_ENABLE = "Make Layer Active"; public static final String CMD_DISABLE = "Make Layer Inactive"; public static final String CMD_TOGGLE = "Switch Layer between Active and Inactive"; public static final String CMD_RESET = "Reset All Layers"; protected LaunchButton launch; protected static final String[] COMMANDS = new String[] {CMD_ROTATE_UP, CMD_ROTATE_DN, CMD_RESET, CMD_ENABLE, CMD_DISABLE, CMD_TOGGLE}; protected String command = CMD_RESET; protected boolean skip = true; protected String[] layers = new String[0]; protected LayeredPieceCollection pieceLayers; protected CompoundPieceCollection pieceCollection; public LayerControl() { launch = new LaunchButton("Reset Layers", TOOLTIP, BUTTON_TEXT, BUTTON_HOTKEY, BUTTON_ICON, new ActionListener() { public void actionPerformed(ActionEvent e) { launch(); } }); } public void launch() { if (command.equals(CMD_RESET)) { pieceCollection.reset(); } else if (command.equals(CMD_ROTATE_UP)) { pieceCollection.rotate(true, skip); } else if (command.equals(CMD_ROTATE_DN)) { pieceCollection.rotate(false, skip); } else if (command.equals(CMD_ENABLE)) { for (int i = 0; i < layers.length; i++) { try { Integer.parseInt(layers[i]); pieceCollection.setLayerEnabled(i, true); } catch (NumberFormatException e) { // User specified a layer name instead of an index pieceCollection.setLayerEnabled(layers[i], true); } } } else if (command.equals(CMD_DISABLE)) { for (int i = 0; i < layers.length; i++) { try { Integer.parseInt(layers[i]); pieceCollection.setLayerEnabled(i, false); } catch (NumberFormatException e) { // User specified a layer name instead of an index pieceCollection.setLayerEnabled(layers[i], false); } } } else if (command.equals(CMD_TOGGLE)) { for (int i = 0; i < layers.length; i++) { try { Integer.parseInt(layers[i]); pieceCollection.toggleLayerEnabled(i); } catch (NumberFormatException e) { // User specified a layer name instead of an index pieceCollection.toggleLayerEnabled(layers[i]); } } } else { return; } getMap().repaint(); } public LaunchButton getLaunchButton() { return launch; } public String[] getAttributeDescriptions() { return new String[] { Resources.getString(Resources.BUTTON_TEXT), Resources.getString(Resources.TOOLTIP_TEXT), Resources.getString(Resources.BUTTON_ICON), Resources.getString(Resources.HOTKEY_LABEL), Resources.getString("Editor.LayerControl.action"), //$NON-NLS-1$ Resources.getString("Editor.LayerControl.skip_layer"), //$NON-NLS-1$ Resources.getString("Editor.LayerControl.affect_layer"), //$NON-NLS-1$ }; } public Class<?>[] getAttributeTypes() { return new Class<?>[] { String.class, String.class, Icon.class, NamedKeyStroke.class, CommandConfig.class, Boolean.class, String[].class }; } public static class CommandConfig extends StringEnum { public String[] getValidValues(AutoConfigurable target) { return COMMANDS; } } public String[] getAttributeNames() { return new String[] {BUTTON_TEXT, TOOLTIP, BUTTON_ICON, BUTTON_HOTKEY, COMMAND, SKIP, LAYERS}; } public String getAttributeValueString(String key) { if (NAME.equals(key)) { return getConfigureName(); } else if (COMMAND.equals(key)) { return command; } else if (SKIP.equals(key)) { return String.valueOf(skip); } else if (LAYERS.equals(key)) { return StringArrayConfigurer.arrayToString(layers); } else { return launch.getAttributeValueString(key); } } public void setAttribute(String key, Object value) { if (NAME.equals(key)) { setConfigureName((String)value); if (launch.getAttributeValueString(TOOLTIP) == null) { launch.setAttribute(TOOLTIP,(String)value); } } else if (COMMAND.equals(key)) { command = (String) value; } else if (SKIP.equals(key)) { if (value instanceof String) { value = Boolean.valueOf((String) value); } skip = ((Boolean) value).booleanValue(); } else if (LAYERS.equals(key)) { if (value instanceof String) { value = StringArrayConfigurer.stringToArray((String) value); } layers = (String[]) value; } else { launch.setAttribute(key, value); } } public VisibilityCondition getAttributeVisibility(String name) { if (SKIP.equals(name)) { return new VisibilityCondition() { public boolean shouldBeVisible() { return command.equals(CMD_ROTATE_UP) || command.equals(CMD_ROTATE_DN); } }; } else if (LAYERS.equals(name)) { return new VisibilityCondition() { public boolean shouldBeVisible() { return command.equals(CMD_ENABLE) || command.equals(CMD_DISABLE) || command.equals(CMD_TOGGLE); } }; } else { return null; } } public void addTo(Buildable parent) { pieceLayers = (LayeredPieceCollection) parent; pieceLayers.getToolBar().add(launch); pieceCollection = pieceLayers.getPieceCollection(); } public Map getMap() { return pieceLayers.getMap(); } public Class<?>[] getAllowableConfigureComponents() { return new Class<?>[0]; } public HelpFile getHelpFile() { return HelpFile.getReferenceManualPage("GamePieceLayers.htm"); } public static String getConfigureTypeName() { return Resources.getString("Editor.LayerControl.component_type"); //$NON-NLS-1$ } public void removeFrom(Buildable parent) { if (getMap() != null) { getMap().getToolBar().remove(launch); } } }