/* * $Id$ * * Copyright (c) 2003 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.counters; import java.awt.Component; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.Shape; import javax.swing.BoxLayout; import javax.swing.JPanel; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import VASSAL.build.GameModule; import VASSAL.build.module.documentation.HelpFile; import VASSAL.command.Command; import VASSAL.command.RemovePiece; import VASSAL.configure.NamedHotKeyConfigurer; import VASSAL.configure.StringConfigurer; import VASSAL.i18n.PieceI18nData; import VASSAL.i18n.TranslatablePiece; import VASSAL.tools.NamedKeyStroke; import VASSAL.tools.SequenceEncoder; /** * This trait adds a command that creates a duplicate of the selected Gamepiece */ public class Delete extends Decorator implements TranslatablePiece { public static final String ID = "delete;"; protected KeyCommand[] keyCommands; protected KeyCommand deleteCommand; protected String commandName; protected NamedKeyStroke key; public Delete() { this(ID + "Delete;D", null); } public Delete(String type, GamePiece inner) { mySetType(type); setInner(inner); } public void mySetType(String type) { type = type.substring(ID.length()); SequenceEncoder.Decoder st = new SequenceEncoder.Decoder(type, ';'); commandName = st.nextToken(); key = st.nextNamedKeyStroke('D'); keyCommands = null; } public String myGetType() { SequenceEncoder se = new SequenceEncoder(';'); se.append(commandName).append(key); return ID + se.getValue(); } protected KeyCommand[] myGetKeyCommands() { if (keyCommands == null) { deleteCommand = new KeyCommand(commandName, key, Decorator.getOutermost(this), this); if (commandName.length() > 0 && key != null && ! key.isNull()) { keyCommands = new KeyCommand[]{deleteCommand}; } else { keyCommands = new KeyCommand[0]; } } deleteCommand.setEnabled(getMap() != null); return keyCommands; } public String myGetState() { return ""; } public Command myKeyEvent(KeyStroke stroke) { Command c = null; myGetKeyCommands(); if (deleteCommand.matches(stroke)) { GamePiece outer = Decorator.getOutermost(this); if (getParent() != null) { GamePiece next = getParent().getPieceBeneath(outer); if (next == null) next = getParent().getPieceAbove(outer); if (next != null) { final GamePiece selected = next; Runnable runnable = new Runnable() { public void run() { // Don't select if the next piece has itself been deleted if (GameModule.getGameModule().getGameState().getPieceForId(selected.getId()) != null) { KeyBuffer.getBuffer().add(selected); } } }; SwingUtilities.invokeLater(runnable); } } c = new RemovePiece(outer); c.execute(); } return c; } public void mySetState(String newState) { } public Rectangle boundingBox() { return piece.boundingBox(); } public void draw(Graphics g, int x, int y, Component obs, double zoom) { piece.draw(g, x, y, obs, zoom); } public String getName() { return piece.getName(); } public Shape getShape() { return piece.getShape(); } public PieceEditor getEditor() { return new Ed(this); } public String getDescription() { return "Delete"; } public HelpFile getHelpFile() { return HelpFile.getReferenceManualPage("GamePiece.htm", "Delete"); } public PieceI18nData getI18nData() { return getI18nData(commandName, "Delete command"); } public static class Ed implements PieceEditor { private StringConfigurer nameInput; private NamedHotKeyConfigurer keyInput; private JPanel controls; public Ed(Delete p) { controls = new JPanel(); controls.setLayout(new BoxLayout(controls, BoxLayout.Y_AXIS)); nameInput = new StringConfigurer(null, "Command name: ", p.commandName); controls.add(nameInput.getControls()); keyInput = new NamedHotKeyConfigurer(null, "Keyboard Command: ", p.key); controls.add(keyInput.getControls()); } public Component getControls() { return controls; } public String getType() { SequenceEncoder se = new SequenceEncoder(';'); se.append(nameInput.getValueString()).append(keyInput.getValueString()); return ID + se.getValue(); } public String getState() { return ""; } } }