/* * $Id$ * * Copyright (c) 2000-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.Point; import java.awt.Shape; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.BoxLayout; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.KeyStroke; import VASSAL.build.GameModule; import VASSAL.build.module.documentation.HelpFile; import VASSAL.command.ChangePiece; import VASSAL.command.Command; import VASSAL.configure.IntConfigurer; import VASSAL.configure.NamedHotKeyConfigurer; import VASSAL.configure.StringConfigurer; import VASSAL.i18n.PieceI18nData; import VASSAL.i18n.TranslatablePiece; import VASSAL.tools.NamedKeyStroke; import VASSAL.tools.ScrollPane; import VASSAL.tools.SequenceEncoder; /** * A Decorator class that endows a GamePiece with an editable * spreadsheet (i.e. JTable) */ public class TableInfo extends Decorator implements TranslatablePiece { public static final String ID = "table;"; protected String values; protected String oldState; protected int nRows, nCols; protected String command; protected NamedKeyStroke launchKey; protected KeyCommand launch; protected JTable table; protected JDialog frame; public TableInfo() { this(ID + "2;2;Show Data;S", null); } public TableInfo(String type, GamePiece p) { mySetType(type); setInner(p); } public int getRowCount() { return nRows; } public int getColumnCount() { return nCols; } public void mySetType(String s) { s = s.substring(ID.length()); SequenceEncoder.Decoder st = new SequenceEncoder.Decoder(s, ';'); nRows = st.nextInt(2); nCols = st.nextInt(2); command = st.nextToken(); launchKey = st.nextNamedKeyStroke(null); frame = null; table = null; } public void draw(java.awt.Graphics g, int x, int y, java.awt.Component obs, double zoom) { piece.draw(g, x, y, obs, zoom); } public String getName() { return piece.getName(); } public java.awt.Rectangle boundingBox() { return piece.boundingBox(); } public Shape getShape() { return piece.getShape(); } public String myGetState() { if (table == null) { return values; } else { SequenceEncoder se = new SequenceEncoder(','); for (int row = 0; row < nRows; ++row) { for (int col = 0; col < nCols; ++col) { String s = (String) table.getValueAt(row, col); se.append(s == null ? "" : s); } } return se.getValue(); } } public void mySetState(String state) { if (table == null) { values = state; } else { setValues(state); } } /** * @param val a comma-separated list of table values */ private void setValues(String val) { SequenceEncoder.Decoder st = new SequenceEncoder.Decoder(val, ','); for (int row = 0; row < nRows; ++row) { for (int col = 0; col < nCols; ++col) { table.setValueAt(st.nextToken(), row, col); } } } public String myGetType() { SequenceEncoder se = new SequenceEncoder(';'); se.append(nRows).append(nCols).append(command).append(launchKey); return ID + se.getValue(); } protected KeyCommand[] myGetKeyCommands() { if (launch == null) { launch = new KeyCommand(command, launchKey, Decorator.getOutermost(this), this); } return new KeyCommand[]{launch}; } public Command myKeyEvent(KeyStroke stroke) { myGetKeyCommands(); if (launch.matches(stroke)) { if (frame == null) { frame = new JDialog((java.awt.Frame) null, false); table = new JTable(nRows, nCols); setValues(values); table.setTableHeader(null); JScrollPane scroll = new ScrollPane(table); scroll.getViewport().setPreferredSize(table.getPreferredSize()); frame.add(scroll); Point p = GameModule.getGameModule().getFrame().getLocation(); if (getMap() != null) { p = getMap().getView().getLocationOnScreen(); Point p2 = getMap().componentCoordinates(getPosition()); p.translate(p2.x, p2.y); } frame.setLocation(p.x, p.y); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { table.editingStopped(null); GamePiece outer = Decorator.getOutermost(TableInfo.this); if (outer.getId() != null) { GameModule.getGameModule().sendAndLog(new ChangePiece(outer.getId(), oldState, outer.getState())); } } }); frame.pack(); } frame.setTitle(getName()); oldState = Decorator.getOutermost(this).getState(); frame.setVisible(true); return null; } else { return null; } } public String getDescription() { return "Spreadsheet"; } public VASSAL.build.module.documentation.HelpFile getHelpFile() { return HelpFile.getReferenceManualPage("Spreadsheet.htm"); } public PieceEditor getEditor() { return new Ed(this); } public PieceI18nData getI18nData() { return getI18nData(command, "Table Info command"); } private static class Ed implements PieceEditor { private IntConfigurer rowConfig = new IntConfigurer(null, "Number of rows: "); private IntConfigurer colConfig = new IntConfigurer(null, "Number of columns: "); private StringConfigurer commandConfig = new StringConfigurer(null, "Menu Command: "); private NamedHotKeyConfigurer keyConfig; private JPanel panel; public Ed(TableInfo p) { rowConfig.setValue(p.nRows); colConfig.setValue(p.nCols); commandConfig.setValue(p.command); keyConfig = new NamedHotKeyConfigurer(null,"Keyboard Command: ",p.launchKey); panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); panel.add(commandConfig.getControls()); panel.add(keyConfig.getControls()); panel.add(rowConfig.getControls()); panel.add(colConfig.getControls()); } public java.awt.Component getControls() { return panel; } public String getType() { SequenceEncoder se = new SequenceEncoder(';'); se.append(rowConfig.getValueString()) .append(colConfig.getValueString()) .append(commandConfig.getValueString()) .append(keyConfig.getValueString()); return ID + se.getValue(); } public String getState() { final StringBuilder buf = new StringBuilder(); int n = ((Integer) rowConfig.getValue()).intValue() * ((Integer) colConfig.getValue()).intValue(); while (--n > 0) { buf.append(','); } return buf.toString(); } } }