[vassalengine-svn] SF.net SVN: vassalengine: [1975] VASSAL-src/branches/uckelman-merge/VASSAL
Brought to you by:
rodneykinney,
uckelman
From: <uck...@us...> - 2007-04-24 20:54:37
|
Revision: 1975 http://svn.sourceforge.net/vassalengine/?rev=1975&view=rev Author: uckelman Date: 2007-04-24 13:54:36 -0700 (Tue, 24 Apr 2007) Log Message: ----------- Merged trunk 1961:1964. Modified Paths: -------------- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/DrawPile.java VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/MassKeyCommand.java VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/SetupStack.java VASSAL-src/branches/uckelman-merge/VASSAL/counters/Deck.java VASSAL-src/branches/uckelman-merge/VASSAL/counters/GlobalCommand.java VASSAL-src/branches/uckelman-merge/VASSAL/counters/PieceDefiner.java VASSAL-src/branches/uckelman-merge/VASSAL/i18n/VASSAL.properties Added Paths: ----------- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/DeckGlobalKeyCommand.java Copied: VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/DeckGlobalKeyCommand.java (from rev 1962, VASSAL-src/trunk/VASSAL/build/module/map/DeckGlobalKeyCommand.java) =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/DeckGlobalKeyCommand.java (rev 0) +++ VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/DeckGlobalKeyCommand.java 2007-04-24 20:54:36 UTC (rev 1975) @@ -0,0 +1,168 @@ +/* + * $Id: DeckGlobalKeyCommand.java 1456 2006-11-15 14:36:16 +0000 (Wed, 15 Nov 2006) rodneykinney $ + * + * Copyright (c) 2005 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.map; + +import java.awt.event.ActionEvent; + +import javax.swing.KeyStroke; + +import VASSAL.build.Buildable; +import VASSAL.build.GameModule; +import VASSAL.build.module.Chatter; +import VASSAL.build.module.Map; +import VASSAL.build.module.properties.PropertySource; +import VASSAL.command.Command; +import VASSAL.command.NullCommand; +import VASSAL.configure.PropertyExpression; +import VASSAL.counters.Deck; +import VASSAL.counters.DeckVisitorDispatcher; +import VASSAL.counters.GlobalCommand; +import VASSAL.counters.KeyCommand; +import VASSAL.counters.PieceFilter; +import VASSAL.tools.SequenceEncoder; + +/** + * This version of {@link MassKeyCommand} is added directly to a + * {@link VASSAL.build.GameModule} and applies to all maps + */ +public class DeckGlobalKeyCommand extends MassKeyCommand { + + public DeckGlobalKeyCommand() { + globalCommand = new DeckGlobalCommand(); + } + + public DeckGlobalKeyCommand(String code) { + this(); + decode(code); + } + + public static String getConfigureTypeName() { + return "Deck Global Key Command"; + } + + public void addTo(Buildable parent) { + if (parent instanceof Map) { + map = (Map) parent; + } + if (parent instanceof PropertySource) { + propertySource = (PropertySource) parent; + } + ((DrawPile) parent).addGlobalKeyCommand(this); + } + + public void removeFrom(Buildable parent) { + ((DrawPile) parent).removeGlobalKeyCommand(this); + } + + public KeyCommand getKeyCommand(Deck deck) { + return new DeckKeyCommand(getConfigureName(), null, deck); + } + + class DeckKeyCommand extends KeyCommand { + private static final long serialVersionUID = 1L; + protected Deck deck; + public DeckKeyCommand(String name, KeyStroke key, Deck deck) { + super(name, key, deck); + this.deck = deck; + } + public void actionPerformed(ActionEvent e) { + apply(deck); + } + } + + /** + * Since we also limit application of a Deck Global Key command to a specified number of pieces in the + * Deck, a null match expression should match all pieces, not reject them all. + */ + public PieceFilter getFilter() { + if (propertiesFilter == null || propertiesFilter.getExpression() == null || propertiesFilter.getExpression().length() == 0) { + return null; + } + return super.getFilter(); + } + + public void apply(Deck deck) { + GameModule.getGameModule().sendAndLog(((DeckGlobalCommand) globalCommand).apply(deck, getFilter())); + } + + public String encode() { + SequenceEncoder se = new SequenceEncoder('|'); + se.append(getConfigureName()) + .append(getAttributeValueString(KEY_COMMAND)) + .append(getAttributeValueString(PROPERTIES_FILTER)) + .append(getAttributeValueString(DECK_COUNT)) + .append(getAttributeValueString(REPORT_FORMAT)); + return se.getValue(); + } + + public void decode(String s) { + SequenceEncoder.Decoder sd = new SequenceEncoder.Decoder(s, '|'); + setConfigureName(sd.nextToken("")); + setAttribute(KEY_COMMAND, sd.nextKeyStroke('A')); + setAttribute(PROPERTIES_FILTER, sd.nextToken(null)); + setAttribute(DECK_COUNT, sd.nextInt(0)); + setAttribute(REPORT_FORMAT, sd.nextToken("")); + } + + public String[] getAttributeDescriptions() { + return new String[]{"Menu Command: ", "Global Command: ", "Matching properties: ", "Affects: ", + "Report Format: "}; + } + + public String[] getAttributeNames() { + return new String[]{NAME, KEY_COMMAND, PROPERTIES_FILTER, DECK_COUNT, REPORT_FORMAT }; + } + + + public Class[] getAttributeTypes() { + return new Class[]{String.class, KeyStroke.class, PropertyExpression.class, DeckPolicyConfig2.class, + ReportFormatConfig.class}; + } + + public static class DeckPolicyConfig2 extends DeckPolicyConfig { + public DeckPolicyConfig2() { + super(); + typeConfig.setValidValues(new String[]{ALL, FIXED}); + prompt.setText("Affects: "); + } + } + + public static class DeckGlobalCommand extends GlobalCommand { + public Command apply(Deck d, PieceFilter filter) { + String reportText = reportFormat.getText(); + Command c; + if (reportText.length() > 0) { + c = new Chatter.DisplayText(GameModule.getGameModule().getChatter(), "*" + reportText); + c.execute(); + } + else { + c = new NullCommand(); + } + Visitor visitor = new Visitor(c, filter, keyStroke); + DeckVisitorDispatcher dispatcher = new DeckVisitorDispatcher(visitor); + + dispatcher.accept(d); + visitor.getTracker().repaint(); + + c = visitor.getCommand(); + return c; + } + } + +} Modified: VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/DrawPile.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/DrawPile.java 2007-04-24 20:49:01 UTC (rev 1974) +++ VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/DrawPile.java 2007-04-24 20:54:36 UTC (rev 1975) @@ -19,6 +19,7 @@ package VASSAL.build.module.map; import java.awt.Color; +import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; import java.util.ArrayList; @@ -94,6 +95,18 @@ } /** + * Decks can contain child Global Key Commands that only apply + * to cards in the Deck. Pass these to the dummy Deck component + */ + public void addGlobalKeyCommand(DeckGlobalKeyCommand globalCommand) { + dummy.addGlobalKeyCommand(globalCommand); + } + + public void removeGlobalKeyCommand(DeckGlobalKeyCommand globalCommand) { + dummy.removeGlobalKeyCommand(globalCommand); + } + + /** * Return the DrawPile instance with the matching id or name * @param id the Id or ConfigureName of the target DrawPile * @return the matching {@link DrawPile}, or null if none found @@ -503,7 +516,7 @@ } public Class[] getAllowableConfigureComponents() { - return new Class[]{CardSlot.class}; + return new Class[]{CardSlot.class, DeckGlobalKeyCommand.class}; } public Point getPosition() { @@ -544,6 +557,10 @@ protected String getDeckType() { return dummy.getType(); } + + public Dimension getSize() { + return dummy.getSize(); + } public VASSAL.build.module.documentation.HelpFile getHelpFile() { return HelpFile.getReferenceManualPage("Deck.htm"); Modified: VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/MassKeyCommand.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/MassKeyCommand.java 2007-04-24 20:49:01 UTC (rev 1974) +++ VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/MassKeyCommand.java 2007-04-24 20:54:36 UTC (rev 1975) @@ -86,16 +86,16 @@ private static final String ALWAYS = "Always"; public static final String CHECK_PROPERTY = "property"; public static final String CHECK_VALUE = "propValue"; - private LaunchButton launch; - private KeyStroke stroke = KeyStroke.getKeyStroke(0, 0); - private String[] names = new String[0]; - private String condition; + protected LaunchButton launch; + protected KeyStroke stroke = KeyStroke.getKeyStroke(0, 0); + protected String[] names = new String[0]; + protected String condition; protected String checkProperty; protected String checkValue; protected PropertyExpression propertiesFilter = new PropertyExpression(); protected PropertySource propertySource; protected PieceFilter filter; - private Map map; + protected Map map; protected GlobalCommand globalCommand = new GlobalCommand(); protected FormattedString reportFormat = new FormattedString(); @@ -176,19 +176,21 @@ } } public static class DeckPolicyConfig extends Configurer implements ConfigurerFactory { - private static final String FIXED = "Fixed number of pieces"; - private static final String NONE = "No pieces"; - private static final String ALL = "All pieces"; - private IntConfigurer intConfig; - private StringEnumConfigurer typeConfig; - private Box controls; + protected static final String FIXED = "Fixed number of pieces"; + protected static final String NONE = "No pieces"; + protected static final String ALL = "All pieces"; + protected IntConfigurer intConfig; + protected StringEnumConfigurer typeConfig; + protected JLabel prompt; + protected Box controls; public DeckPolicyConfig() { super(null, ""); typeConfig = new StringEnumConfigurer(null, "", new String[]{ALL, NONE, FIXED}); intConfig = new IntConfigurer(null, ""); controls = Box.createHorizontalBox(); - controls.add(new JLabel("Within a Deck, apply to: ")); + prompt = new JLabel("Within a Deck, apply to: "); + controls.add(prompt); controls.add(typeConfig.getControls()); controls.add(intConfig.getControls()); PropertyChangeListener l = new PropertyChangeListener() { Modified: VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/SetupStack.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/SetupStack.java 2007-04-24 20:49:01 UTC (rev 1974) +++ VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/SetupStack.java 2007-04-24 20:54:36 UTC (rev 1975) @@ -38,6 +38,7 @@ import java.awt.image.WritableRaster; import java.util.ArrayList; import java.util.Arrays; +import java.util.Enumeration; import java.util.Iterator; import javax.swing.Box; import javax.swing.ImageIcon; @@ -249,11 +250,13 @@ Stack s = createStack(); Configurable[] c = getConfigureComponents(); for (int i = 0; i < c.length; ++i) { - PieceSlot slot = (PieceSlot) c[i]; - GamePiece p = slot.getPiece(); - p = PieceCloner.getInstance().clonePiece(p); - GameModule.getGameModule().getGameState().addPiece(p); - s.add(p); + if (c[i] instanceof PieceSlot) { + PieceSlot slot = (PieceSlot) c[i]; + GamePiece p = slot.getPiece(); + p = PieceCloner.getInstance().clonePiece(p); + GameModule.getGameModule().getGameState().addPiece(p); + s.add(p); + } } GameModule.getGameModule().getGameState().addPiece(s); return s; @@ -340,6 +343,14 @@ stackConfigurer.setVisible(true); } + protected PieceSlot getTopPiece() { + Enumeration e = getAllDescendantComponents(PieceSlot.class); + if (e.hasMoreElements()) { + return (PieceSlot) e.nextElement(); + } + return null; + } + /* * Return a board to configure the stack on. */ @@ -365,7 +376,7 @@ protected static final int DELTA = 1; protected static final int FAST = 10; protected static final int FASTER = 5; - protected static final int DUMMY_SIZE = 50; + protected static final int DEFAULT_DUMMY_SIZE = 50; public class StackConfigurer extends JFrame implements ActionListener, KeyListener, MouseListener { @@ -378,13 +389,23 @@ protected PieceSlot mySlot; protected GamePiece myPiece; protected Point savePosition; + protected Dimension dummySize; + protected BufferedImage dummyImage; public StackConfigurer(SetupStack stack) { super("Adjust At-Start Stack"); myStack = stack; - mySlot = (PieceSlot) myStack.buildComponents.get(0); - myPiece = mySlot.getPiece(); + mySlot = stack.getTopPiece(); + if (mySlot != null) { + myPiece = mySlot.getPiece(); + } savePosition = new Point(myStack.pos); + if (stack instanceof DrawPile) { + dummySize = new Dimension(((DrawPile) stack).getSize()); + } + else { + dummySize = new Dimension(DEFAULT_DUMMY_SIZE, DEFAULT_DUMMY_SIZE); + } addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { cancel(); @@ -500,26 +521,28 @@ * need to supply a dummy one. */ public BufferedImage getDummyImage() { - BufferedImage dummyImage = new BufferedImage(DUMMY_SIZE*2, DUMMY_SIZE*2, BufferedImage.TYPE_INT_ARGB); - Graphics g = dummyImage.getGraphics(); - g.setColor(Color.white); - g.fillRect(0, 0, DUMMY_SIZE, DUMMY_SIZE); - g.setColor(Color.black); - g.drawRect(0, 0, DUMMY_SIZE, DUMMY_SIZE); + if (dummyImage == null) { + dummyImage = new BufferedImage(dummySize.width*2, dummySize.height*2, BufferedImage.TYPE_INT_ARGB); + Graphics g = dummyImage.getGraphics(); + g.setColor(Color.white); + g.fillRect(0, 0, dummySize.width, dummySize.height); + g.setColor(Color.black); + g.drawRect(0, 0, dummySize.width, dummySize.height); + } return dummyImage; } public void drawDummyImage(Graphics g, int x, int y) { - drawDummyImage(g, x-DUMMY_SIZE/2, y-DUMMY_SIZE/2, null, 1.0); + drawDummyImage(g, x-dummySize.width/2, y-dummySize.height/2, null, 1.0); } public void drawDummyImage(Graphics g, int x, int y, Component obs, double zoom) { g.drawImage(getDummyImage(), x, y, obs); } - public void drawImage(Graphics g, int x, int y, Component obs, double zoom) { - Rectangle r = myPiece.boundingBox(); - if (r.width == 0 || r.height == 0) { + public void drawImage(Graphics g, int x, int y, Component obs, double zoom) { + Rectangle r = myPiece == null ? null : myPiece.boundingBox(); + if (r == null || r.width == 0 || r.height == 0) { drawDummyImage(g, x, y); } else { @@ -529,12 +552,12 @@ } public Rectangle getPieceBoundingBox() { - Rectangle r = myPiece.getShape().getBounds(); - if (r.width == 0 || r.height == 0) { - r.x = 0 - DUMMY_SIZE/2; - r.y = r.x; - r.width = DUMMY_SIZE; - r.height = DUMMY_SIZE; + Rectangle r = myPiece == null ? new Rectangle() : myPiece.getShape().getBounds(); + if (r == null || r.width == 0 || r.height == 0) { + r.x = 0 - dummySize.width/2; + r.y = 0 - dummySize.height/2; + r.width = dummySize.width; + r.height = dummySize.height; } return r; } @@ -559,7 +582,9 @@ adjustX(1, e); break; default : - myPiece.keyEvent(KeyStroke.getKeyStrokeForEvent(e)); + if (myPiece != null) { + myPiece.keyEvent(KeyStroke.getKeyStrokeForEvent(e)); + } break; } updateDisplay(); @@ -619,7 +644,7 @@ public void mousePressed(MouseEvent e) { Rectangle r = getPieceBoundingBox(); r.translate(pos.x, pos.y); - if (e.isMetaDown() && r.contains(e.getPoint())) { + if (myPiece != null && e.isMetaDown() && r.contains(e.getPoint())) { JPopupMenu popup = MenuDisplayer.createPopup(myPiece); popup.addPopupMenuListener(new javax.swing.event.PopupMenuListener() { public void popupMenuCanceled(javax.swing.event.PopupMenuEvent evt) { @@ -670,8 +695,10 @@ myBoard = b; myGrid = b.getGrid(); myStack = s; - slot = (PieceSlot) myStack.buildComponents.get(0); - myPiece = slot.getPiece(); + slot = myStack.getTopPiece(); + if (slot != null) { + myPiece = slot.getPiece(); + } new DropTarget(this, DnDConstants.ACTION_MOVE, this); ds.createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_MOVE, this); Modified: VASSAL-src/branches/uckelman-merge/VASSAL/counters/Deck.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/counters/Deck.java 2007-04-24 20:49:01 UTC (rev 1974) +++ VASSAL-src/branches/uckelman-merge/VASSAL/counters/Deck.java 2007-04-24 20:54:36 UTC (rev 1975) @@ -51,6 +51,7 @@ import VASSAL.build.module.Chatter; import VASSAL.build.module.Map; import VASSAL.build.module.PlayerRoster; +import VASSAL.build.module.map.DeckGlobalKeyCommand; import VASSAL.build.module.map.DrawPile; import VASSAL.build.module.properties.MutableProperty; import VASSAL.build.module.properties.MutableProperty.Impl; @@ -110,8 +111,9 @@ protected int maxStack = 10; protected CountExpression[] countExpressions; protected boolean expressionCounting = false; - protected ArrayList nextDraw; + protected ArrayList nextDraw = null; protected KeyCommand[] commands; + protected ArrayList<DeckGlobalKeyCommand> globalCommands = new ArrayList<DeckGlobalKeyCommand>(); protected CommandEncoder commandEncoder = new CommandEncoder() { public Command decode(String command) { Command c = null; @@ -144,6 +146,29 @@ updateCountsAll(); } + public void addGlobalKeyCommand(DeckGlobalKeyCommand globalCommand) { + globalCommands.add(globalCommand); + } + + public void removeGlobalKeyCommand(DeckGlobalKeyCommand globalCommand) { + globalCommands.remove(globalCommand); + } + + protected String[] getGlobalCommands() { + String[] commands = new String[globalCommands.size()]; + for (int i = 0; i < globalCommands.size(); i++) { + commands[i] = globalCommands.get(i).encode(); + } + return commands; + } + + protected void setGlobalCommands(String[] commands) { + globalCommands = new ArrayList(commands.length); + for (int i = 0; i < commands.length; i++) { + globalCommands.add(new DeckGlobalKeyCommand(commands[i])); + } + } + /** * Update map-level count properties for all "expressions" of pieces that are configured * to be counted. These are held in the String[] countExpressions. @@ -279,6 +304,7 @@ maxStack = st.nextInt(10); setCountExpressions(st.nextStringArray(0)); expressionCounting = st.nextBoolean(false); + setGlobalCommands(st.nextStringArray(0)); if (shuffleListener == null) { shuffleListener = new KeyStrokeListener(new ActionListener() { @@ -514,7 +540,8 @@ faceDownOption).append(shuffleOption).append(String.valueOf(allowMultipleDraw)).append(String.valueOf(allowSelectDraw)).append( String.valueOf(reversible)).append(reshuffleCommand).append(reshuffleTarget).append(reshuffleMsgFormat).append(deckName).append(shuffleMsgFormat) .append(reverseMsgFormat).append(faceDownMsgFormat).append(drawFaceUp).append(persistable).append(shuffleKey).append(reshuffleKey).append(String.valueOf(maxStack)) - .append(getCountExpressions()).append(expressionCounting); + .append(getCountExpressions()).append(expressionCounting) + .append(getGlobalCommands()); return ID + se.getValue(); } @@ -699,7 +726,7 @@ public void draw(java.awt.Graphics g, int x, int y, Component obs, double zoom) { int count = Math.min(getPieceCount(), maxStack); - GamePiece top = nextDraw != null ? (GamePiece) nextDraw.get(0) : topPiece(); + GamePiece top = (nextDraw != null && nextDraw.size() > 0) ? (GamePiece) nextDraw.get(0) : topPiece(); if (top != null) { Object owner = top.getProperty(Properties.OBSCURED_BY); @@ -865,6 +892,7 @@ }; l.add(c); } + for (Iterator<DeckGlobalKeyCommand> i = globalCommands.iterator(); i.hasNext(); l.add(i.next().getKeyCommand(this))); commands = (KeyCommand[]) l.toArray(new KeyCommand[l.size()]); } for (int i = 0; i < commands.length; ++i) { Modified: VASSAL-src/branches/uckelman-merge/VASSAL/counters/GlobalCommand.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/counters/GlobalCommand.java 2007-04-24 20:49:01 UTC (rev 1974) +++ VASSAL-src/branches/uckelman-merge/VASSAL/counters/GlobalCommand.java 2007-04-24 20:54:36 UTC (rev 1975) @@ -100,7 +100,7 @@ return c; } - private class Visitor implements DeckVisitor { + protected class Visitor implements DeckVisitor { private Command command; private BoundsTracker tracker; private PieceFilter filter; Modified: VASSAL-src/branches/uckelman-merge/VASSAL/counters/PieceDefiner.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/counters/PieceDefiner.java 2007-04-24 20:49:01 UTC (rev 1974) +++ VASSAL-src/branches/uckelman-merge/VASSAL/counters/PieceDefiner.java 2007-04-24 20:54:36 UTC (rev 1975) @@ -33,6 +33,7 @@ import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JScrollPane; import javax.swing.ListCellRenderer; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; @@ -49,7 +50,7 @@ * This is the GamePiece designer dialog. It appears when you edit * the properties of a "Single Piece" in the Configuration window. */ -public class PieceDefiner extends javax.swing.JPanel implements HelpWindowExtension { +public class PieceDefiner extends JPanel implements HelpWindowExtension { private static final long serialVersionUID = 1L; protected static DefaultListModel availableModel; @@ -58,6 +59,7 @@ protected PieceSlot slot; private GamePiece piece; private HelpWindow helpWindow; + protected static Decorator clipBoard; /** Creates new form test */ public PieceDefiner() { @@ -167,24 +169,26 @@ JPanel controls = new JPanel(); controls.setLayout(new BoxLayout(controls, BoxLayout.X_AXIS)); - availablePanel = new javax.swing.JPanel(); - availableScroll = new javax.swing.JScrollPane(); - availableList = new javax.swing.JList(); - helpButton = new javax.swing.JButton(); - importButton = new javax.swing.JButton(); - addRemovePanel = new javax.swing.JPanel(); - addButton = new javax.swing.JButton(); - removeButton = new javax.swing.JButton(); - inUsePanel = new javax.swing.JPanel(); - inUseScroll = new javax.swing.JScrollPane(); - inUseList = new javax.swing.JList(); - propsButton = new javax.swing.JButton(); - moveUpDownPanel = new javax.swing.JPanel(); - moveUpButton = new javax.swing.JButton(); - moveDownButton = new javax.swing.JButton(); -// setLayout(new javax.swing.BoxLayout(this, 0)); + availablePanel = new JPanel(); + availableScroll = new JScrollPane(); + availableList = new JList(); + helpButton = new JButton(); + importButton = new JButton(); + addRemovePanel = new JPanel(); + addButton = new JButton(); + removeButton = new JButton(); + inUsePanel = new JPanel(); + inUseScroll = new JScrollPane(); + inUseList = new JList(); + propsButton = new JButton(); + moveUpDownPanel = new JPanel(); + moveUpButton = new JButton(); + moveDownButton = new JButton(); + copyButton = new JButton(); + pasteButton = new JButton(); +// setLayout(new BoxLayout(this, 0)); - availablePanel.setLayout(new javax.swing.BoxLayout(availablePanel, 1)); + availablePanel.setLayout(new BoxLayout(availablePanel, 1)); availableList.setModel(availableModel); @@ -211,8 +215,8 @@ helpButton.setText("Help"); - helpButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { + helpButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { showHelpForPiece(); } } @@ -220,8 +224,8 @@ availablePanel.add(helpButton); importButton.setText("Import"); - importButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { + importButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { String className = JOptionPane.showInputDialog(PieceDefiner.this, "Enter fully-qualified name of Java class to import"); importPiece(className); } @@ -232,11 +236,11 @@ controls.add(availablePanel); - addRemovePanel.setLayout(new javax.swing.BoxLayout(addRemovePanel, 1)); + addRemovePanel.setLayout(new BoxLayout(addRemovePanel, 1)); addButton.setText("Add ->"); - addButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { + addButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { Object selected = availableList.getSelectedValue(); if (selected instanceof Decorator) { if (inUseModel.getSize() > 0) { @@ -276,8 +280,8 @@ removeButton.setText("<- Remove"); - removeButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { + removeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { int index = inUseList.getSelectedIndex(); if (index >= 0) { removeTrait(index); @@ -294,7 +298,7 @@ controls.add(addRemovePanel); - inUsePanel.setLayout(new javax.swing.BoxLayout(inUsePanel, 1)); + inUsePanel.setLayout(new BoxLayout(inUsePanel, 1)); inUseList.setModel(inUseModel); @@ -307,10 +311,13 @@ propsButton.setEnabled(o instanceof EditablePiece); if (inUseModel.size() > 1) { removeButton.setEnabled(index > 0); + copyButton.setEnabled(index > 0); } else { removeButton.setEnabled(index == 0); + copyButton.setEnabled(index == 0); } + pasteButton.setEnabled(clipBoard != null); moveUpButton.setEnabled(index > 1); moveDownButton.setEnabled(index > 0 && index < inUseModel.size() - 1); @@ -335,8 +342,8 @@ propsButton.setText("Properties"); - propsButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { + propsButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { int index = inUseList.getSelectedIndex(); if (index >= 0) { edit(index); @@ -350,11 +357,11 @@ controls.add(inUsePanel); - moveUpDownPanel.setLayout(new javax.swing.BoxLayout(moveUpDownPanel, 1)); + moveUpDownPanel.setLayout(new BoxLayout(moveUpDownPanel, BoxLayout.Y_AXIS)); moveUpButton.setText("Move Up"); - moveUpButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { + moveUpButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { int index = inUseList.getSelectedIndex(); if (index > 1 && index < inUseModel.size()) { moveDecoratorUp(index); @@ -366,8 +373,8 @@ moveDownButton.setText("Move Down"); - moveDownButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { + moveDownButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { int index = inUseList.getSelectedIndex(); if (index > 0 && index < inUseModel.size() - 1) { moveDecoratorDown(index); @@ -376,7 +383,36 @@ } ); moveUpDownPanel.add(moveDownButton); + + copyButton.setText("Copy"); + copyButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + pasteButton.setEnabled(true); + int index = inUseList.getSelectedIndex(); + Decorator target = (Decorator) inUseModel.get(index); + try { + String type = target.myGetType(); + String state = target.myGetState(); + clipBoard = (Decorator) GameModule.getGameModule().createPiece(type, null); + clipBoard.mySetState(state); + } + catch (Exception e) { + clipBoard = null; + } + }}); + moveUpDownPanel.add(copyButton); + pasteButton.setText("Paste"); + pasteButton.setEnabled(clipBoard != null); + pasteButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + Decorator c = (Decorator) GameModule.getGameModule().createPiece(clipBoard.myGetType(), null); + c.mySetState(clipBoard.myGetState()); + c.setInner((GamePiece) inUseModel.lastElement()); + inUseModel.addElement(c); + }}); + moveUpDownPanel.add(pasteButton); + controls.add(moveUpDownPanel); add(controls); @@ -547,7 +583,7 @@ protected void addTrait(Decorator c) { try { - c = (Decorator) c.getClass().newInstance(); + c = c.getClass().newInstance(); c.setInner((GamePiece) inUseModel.lastElement()); inUseModel.addElement(c); } @@ -558,21 +594,23 @@ } - private javax.swing.JPanel availablePanel; - private javax.swing.JScrollPane availableScroll; - private javax.swing.JList availableList; - private javax.swing.JButton helpButton; - private javax.swing.JButton importButton; - private javax.swing.JPanel addRemovePanel; - private javax.swing.JButton addButton; - private javax.swing.JButton removeButton; - private javax.swing.JPanel inUsePanel; - private javax.swing.JScrollPane inUseScroll; - private javax.swing.JList inUseList; - private javax.swing.JButton propsButton; - private javax.swing.JPanel moveUpDownPanel; - private javax.swing.JButton moveUpButton; - private javax.swing.JButton moveDownButton; + private JPanel availablePanel; + private JScrollPane availableScroll; + private JList availableList; + private JButton helpButton; + private JButton importButton; + private JPanel addRemovePanel; + private JButton addButton; + private JButton removeButton; + private JPanel inUsePanel; + private JScrollPane inUseScroll; + private JList inUseList; + private JButton propsButton; + private JPanel moveUpDownPanel; + private JButton moveUpButton; + private JButton moveDownButton; + protected JButton copyButton; + protected JButton pasteButton; private static class Renderer extends DefaultListCellRenderer { private static final long serialVersionUID = 1L; Modified: VASSAL-src/branches/uckelman-merge/VASSAL/i18n/VASSAL.properties =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/i18n/VASSAL.properties 2007-04-24 20:49:01 UTC (rev 1974) +++ VASSAL-src/branches/uckelman-merge/VASSAL/i18n/VASSAL.properties 2007-04-24 20:54:36 UTC (rev 1975) @@ -16,7 +16,7 @@ BasicLogger.unable_to_write=Unable to write to {0} BasicLogger.replay_commencing=New game loaded BasicLogger.replay_completed=End of Logfile -BasicLogger.dont_prompt_again=Don't prompt again +BasicLogger.dont_prompt_again=Don''t prompt again BasicLogger.logfile_written=Logfile written. BasicLogger.undo_icon=Undo button icon: BasicLogger.unsaved_log=Unsaved log @@ -29,7 +29,7 @@ BasicLogger.prompt_new_log_before=Prompt to start new Log File before a Replay? BasicLogger.prompt_new_log_after=Prompt to start new Log File after a Replay? BasicLogger.save_log=You are writing a logfile.\nSave now? -BasicLogger.cant_log=Can't log a LogCommand +BasicLogger.cant_log=Can''t log a LogCommand BasicLogger.start_new_log_file={0}. Start new Logfile? BasicLogger.begin_logfile=Begin Logfile BasicLogger.end_logfile=End Logfile @@ -47,7 +47,7 @@ BoardPicker.select_board=Select board BoardPicker.clear=Clear BoardPicker.must_define=Must define at least one board in {0} -BoardPicker.more_than_one=More than one board named '{0}' in {1} +BoardPicker.more_than_one=More than one board named ''{0}'' in {1} BoardPicker.board_not_found=Board {0} not found BoardPicker.select_default=Select Default Board Setup @@ -76,7 +76,7 @@ Chat.looking_for_a_game=Looking for a game Chat.message_composer=Message Composer Chat.away_from_keyboard=Away from keyboard -Chat.im_back=I'm back +Chat.im_back=I''m back Chat.new_game=New Game: Chat.active_games=Active Games Chat.current_game=Current Game @@ -112,7 +112,7 @@ Chatter.game_messages_preference=Game messages: Chatter.system_message_preference=System messages: Chatter.my_text_preference=My text messages: -Chatter.other_text_preference=Other's text messages: +Chatter.other_text_preference=Other''s text messages: Chatter.undo_message=* UNDO: {0} # Deck @@ -159,11 +159,11 @@ GameModule.frame_title={0} controls GameModule.open_error=Module {0} is already open GameModule.save_module=Save Module? -GameModule.save_error=Couldn't save module.\n{0} +GameModule.save_error=Couldn''t save module.\n{0} GameModule.save_error_short=Unable to save GameModule.version_error=This module was created using version {0} of the VASSAL engine.\n\ You are using version {1}\n\ - It's recommended you upgrade to the latest version of the VASSAL engine. + It''s recommended you upgrade to the latest version of the VASSAL engine. GameModule.version_error_short=Older version in use # GameState @@ -215,7 +215,7 @@ # GlobalOptions GlobalOptions.use_combined=Use combined application window (requires restart)? GlobalOptions.smooth_scaling=Smooth image scaling? -GlobalOptions.center_on_move=Center on opponent's moves? +GlobalOptions.center_on_move=Center on opponent''s moves? GlobalOptions.auto_report=Auto-report moves? GlobalOptions.mark_moved=Mark moved pieces? GlobalOptions.error=Error @@ -297,11 +297,11 @@ ModuleExtension.cannot_remove=Cannot remove Extension ModuleExtension.save_extension=Save Extension? -ModuleExtension.extension_built=Extension '{0}' was built for module {1} -ModuleExtension.wrong_module_version=Extension '{0}' was built for module version {1}. You are running version {2}. It's recommended you upgrade to the latest version of {3} -ModuleExtension.wrong_vassal_version=Extension '{0}' was created using version {1} of the VASSAL engine\nYou are using version {2}. It's recommended you upgrade to the latest version of the VASSAL engine. -ModuleExtension.wrong_extension_version=Game saved with version {0} of extension '{1}', you are running version {2}. Please upgrade to the latest version of this extension. -ModuleExtension.load_extension=This game was saved with extension '{0}' loaded. You do not have this extension loaded. Place the file into the '{1}' folder to load it +ModuleExtension.extension_built=Extension ''{0}'' was built for module {1} +ModuleExtension.wrong_module_version=Extension ''{0}'' was built for module version {1}. You are running version {2}. It''s recommended you upgrade to the latest version of {3} +ModuleExtension.wrong_vassal_version=Extension ''{0}'' was created using version {1} of the VASSAL engine\nYou are using version {2}. It''s recommended you upgrade to the latest version of the VASSAL engine. +ModuleExtension.wrong_extension_version=Game saved with version {0} of extension ''{1}'', you are running version {2}. Please upgrade to the latest version of this extension. +ModuleExtension.load_extension=This game was saved with extension ''{0}'' loaded. You do not have this extension loaded. Place the file into the ''{1}'' folder to load it # Notes Window Notes.notes=Notes @@ -309,7 +309,7 @@ Notes.name=Name Notes.visible_to_all=Visible to all Notes.visible_once_revealed=Visible once revealed -Notes.has_revealed={0} has revealed message '{1}' +Notes.has_revealed={0} has revealed message ''{1}'' Notes.scenario=Scenario Notes.revealed=Revealed Notes.public=Public @@ -319,7 +319,7 @@ Notes.delayed=Delayed Notes.delayed_note=Delayed Note Notes.invisible=Invisible to others -Notes.has_created={0} has created message '{1}' +Notes.has_created={0} has created message ''{1}'' Notes.date_time=Date/Time Notes.note_name=Note Name Notes.note_exists=A note of this name already exists @@ -331,7 +331,7 @@ Peer2Peer.invite_failed=Invite failed Peer2Peer.direct_connection=Direct Connection Peer2Peer.your_ip_address=Your IP address is {0}:{1} -Peer2Peer.other_players_address=Enter another player's address below and hit the "Invite" button. +Peer2Peer.other_players_address=Enter another player''s address below and hit the "Invite" button. Peer2Peer.invite=Invite Peer2Peer.address_port=address:port Peer2Peer.invalid_format=Invalid format <host>:<port> @@ -395,7 +395,7 @@ # Server related messages Server.lost_connection=Lost connection to server Server.bad_address=Bad server address {0}: No port specified -Server.bad_address2=Bad server address '{0}' +Server.bad_address2=Bad server address ''{0}'' Server.bad_address3=Unable to determine server address Server.peer_to_peer=Defaulting to peer-to-peer mode Server.empty_response=Empty response @@ -416,7 +416,7 @@ Tutorial.load_tutorial=Load the tutorial? Tutorial.tutorial=Tutorial Tutorial.unable_to_launch=Unable to launch tutorial {0} -Tutorial.dont_ask=Don't ask me again +Tutorial.dont_ask=Don''t ask me again # Browser support BrowserSupport.unable_to_launch=Unable to launch browser window This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |