vassalengine-svn Mailing List for VASSAL Engine (Page 319)
Brought to you by:
rodneykinney,
uckelman
You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(2) |
Oct
(187) |
Nov
(124) |
Dec
(101) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(51) |
Feb
(91) |
Mar
(139) |
Apr
(84) |
May
(151) |
Jun
(125) |
Jul
(54) |
Aug
(49) |
Sep
(89) |
Oct
(111) |
Nov
(19) |
Dec
(189) |
2008 |
Jan
(150) |
Feb
(231) |
Mar
(218) |
Apr
(111) |
May
(199) |
Jun
(71) |
Jul
(178) |
Aug
(149) |
Sep
(68) |
Oct
(204) |
Nov
(219) |
Dec
(121) |
2009 |
Jan
(288) |
Feb
(192) |
Mar
(255) |
Apr
(99) |
May
(142) |
Jun
(111) |
Jul
(84) |
Aug
(102) |
Sep
(70) |
Oct
(152) |
Nov
(114) |
Dec
(53) |
2010 |
Jan
(71) |
Feb
(134) |
Mar
(50) |
Apr
(168) |
May
(123) |
Jun
(44) |
Jul
(99) |
Aug
(85) |
Sep
(126) |
Oct
(160) |
Nov
(85) |
Dec
(80) |
2011 |
Jan
(41) |
Feb
(14) |
Mar
(22) |
Apr
(5) |
May
(1) |
Jun
(5) |
Jul
(41) |
Aug
(64) |
Sep
(63) |
Oct
(112) |
Nov
(54) |
Dec
(3) |
2012 |
Jan
(33) |
Feb
(32) |
Mar
(25) |
Apr
(31) |
May
(49) |
Jun
(17) |
Jul
(46) |
Aug
(54) |
Sep
(79) |
Oct
(34) |
Nov
(9) |
Dec
(103) |
2013 |
Jan
(6) |
Feb
(22) |
Mar
(50) |
Apr
(62) |
May
(61) |
Jun
(43) |
Jul
(27) |
Aug
(7) |
Sep
(33) |
Oct
(40) |
Nov
(62) |
Dec
(13) |
2014 |
Jan
(33) |
Feb
(23) |
Mar
(13) |
Apr
|
May
|
Jun
(87) |
Jul
(25) |
Aug
(10) |
Sep
(7) |
Oct
|
Nov
|
Dec
(12) |
2015 |
Jan
|
Feb
|
Mar
(5) |
Apr
(2) |
May
(12) |
Jun
|
Jul
|
Aug
|
Sep
(4) |
Oct
(1) |
Nov
(1) |
Dec
|
2016 |
Jan
(3) |
Feb
|
Mar
(2) |
Apr
(14) |
May
(4) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(6) |
Nov
(10) |
Dec
(3) |
2017 |
Jan
(3) |
Feb
|
Mar
|
Apr
|
May
|
Jun
(3) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2019 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(33) |
Nov
(5) |
Dec
|
2020 |
Jan
|
Feb
|
Mar
(43) |
Apr
(41) |
May
(70) |
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
From: <uck...@us...> - 2006-11-20 23:11:32
|
Revision: 1473 http://svn.sourceforge.net/vassalengine/?rev=1473&view=rev Author: uckelman Date: 2006-11-20 15:11:28 -0800 (Mon, 20 Nov 2006) Log Message: ----------- Use native file chooser on Windows and Mac OS. Modified Paths: -------------- VASSAL-src/branches/uckelman-svg/VASSAL/build/GameModule.java VASSAL-src/branches/uckelman-svg/VASSAL/build/module/GameState.java VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/ImageSaver.java VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/TextSaver.java VASSAL-src/branches/uckelman-svg/VASSAL/configure/AudioClipConfigurer.java VASSAL-src/branches/uckelman-svg/VASSAL/configure/DirectoryConfigurer.java VASSAL-src/branches/uckelman-svg/VASSAL/configure/FileConfigurer.java VASSAL-src/branches/uckelman-svg/VASSAL/configure/IconConfigurer.java VASSAL-src/branches/uckelman-svg/VASSAL/configure/ImageConfigurer.java VASSAL-src/branches/uckelman-svg/VASSAL/configure/ModuleUpdaterDialog.java VASSAL-src/branches/uckelman-svg/VASSAL/configure/SoundConfigurer.java VASSAL-src/branches/uckelman-svg/VASSAL/counters/Deck.java VASSAL-src/branches/uckelman-svg/VASSAL/counters/ImagePicker.java VASSAL-src/branches/uckelman-svg/VASSAL/tools/ArchiveWriter.java VASSAL-src/branches/uckelman-svg/VASSAL/tools/ExtensionFileFilter.java Added Paths: ----------- VASSAL-src/branches/uckelman-svg/VASSAL/tools/AudioFileFilter.java VASSAL-src/branches/uckelman-svg/VASSAL/tools/DirectoryFileFilter.java VASSAL-src/branches/uckelman-svg/VASSAL/tools/FileChooser.java VASSAL-src/branches/uckelman-svg/VASSAL/tools/FileFilter.java VASSAL-src/branches/uckelman-svg/VASSAL/tools/ImageFileFilter.java Modified: VASSAL-src/branches/uckelman-svg/VASSAL/build/GameModule.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/build/GameModule.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/build/GameModule.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -33,7 +33,6 @@ import java.util.Random; import java.util.Vector; import javax.swing.JComponent; -import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; @@ -81,6 +80,7 @@ import VASSAL.preferences.Prefs; import VASSAL.tools.ArchiveWriter; import VASSAL.tools.DataArchive; +import VASSAL.tools.FileChooser; import VASSAL.tools.KeyStrokeListener; import VASSAL.tools.KeyStrokeSource; import VASSAL.tools.ToolBarComponent; @@ -108,7 +108,7 @@ protected String vassalVersionCreated = "0.0"; protected String gameName = DEFAULT_NAME; protected String lastSavedConfiguration; - protected JFileChooser fileChooser; + protected FileChooser fileChooser; protected FileDialog fileDialog; protected java.util.Map globalProperties = new HashMap(); @@ -492,10 +492,10 @@ * @return a common FileChooser so that recent file locations * can be remembered */ - public JFileChooser getFileChooser() { + public FileChooser getFileChooser() { if (fileChooser == null) { getPrefs().addOption(null, new DirectoryConfigurer(SAVE_DIR, null)); - fileChooser = new JFileChooser(); + fileChooser = new FileChooser(getFrame()); File f = (File) getPrefs().getValue(SAVE_DIR); if (f != null) { fileChooser.setCurrentDirectory(f); @@ -505,10 +505,10 @@ fileChooser.resetChoosableFileFilters(); fileChooser.rescanCurrentDirectory(); } + return fileChooser; - } + } - /** * @deprecated Use {@link #getFileChooser} instead. */ @@ -567,13 +567,10 @@ getGameState().setup(false); cancelled = getGameState().isGameStarted(); if (!cancelled) { - if (fileDialog != null - && fileDialog.getDirectory() != null) { - getPrefs().getOption(SAVE_DIR).setValue(fileDialog.getDirectory()); + if (fileChooser != null) { + getPrefs().getOption(SAVE_DIR) + .setValue(fileChooser.getCurrentDirectory()); } - else if (fileChooser != null) { - getPrefs().getOption(SAVE_DIR).setValue(fileChooser.getCurrentDirectory()); - } getPrefs().write(); if (getDataArchive() instanceof ArchiveWriter && !buildString().equals(lastSavedConfiguration)) { Modified: VASSAL-src/branches/uckelman-svg/VASSAL/build/module/GameState.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/build/module/GameState.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/build/module/GameState.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -25,12 +25,12 @@ import java.util.Enumeration; import java.util.Hashtable; import java.util.Vector; -import javax.swing.JFileChooser; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import VASSAL.build.GameModule; import VASSAL.command.Command; import VASSAL.counters.GamePiece; +import VASSAL.tools.FileChooser; /** * The GameState represents the state of the game currently being played. Only one game can be open at once. @@ -176,8 +176,8 @@ * {@link Command}, which is then executed. The command read from the * file should be that returned by {@link #getRestoreCommand} */ public void loadGame() { - JFileChooser fc = GameModule.getGameModule().getFileChooser(); - if (fc.showOpenDialog(null) != JFileChooser.APPROVE_OPTION) return; + FileChooser fc = GameModule.getGameModule().getFileChooser(); + if (fc.showOpenDialog() != FileChooser.APPROVE_OPTION) return; File f = fc.getSelectedFile(); if (f.exists()) { @@ -241,23 +241,11 @@ } private File getSaveFile() { - File outputFile = null; - JFileChooser fc = GameModule.getGameModule().getFileChooser(); - File sf = fc.getSelectedFile(); - if (sf != null) { - String name = sf.getPath(); - if (name != null) { - int index = name.lastIndexOf('.'); - if (index > 0) { - name = name.substring(0, index) + ".sav"; - fc.setSelectedFile(new File(name)); - } - } - } + FileChooser fc = GameModule.getGameModule().getFileChooser(); + fc.selectDotSavFile(); + if (fc.showSaveDialog() != FileChooser.APPROVE_OPTION) return null; - if (fc.showSaveDialog(null) != JFileChooser.APPROVE_OPTION) return null; - - outputFile = fc.getSelectedFile(); + File outputFile = fc.getSelectedFile(); if (outputFile.exists() && shouldConfirmOverwrite() && JOptionPane.NO_OPTION == Modified: VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/ImageSaver.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/ImageSaver.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/ImageSaver.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -34,7 +34,6 @@ import java.io.IOException; import java.io.OutputStream; import javax.imageio.ImageIO; -import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JWindow; @@ -52,6 +51,7 @@ import VASSAL.configure.ConfigurerFactory; import VASSAL.configure.IconConfigurer; import VASSAL.tools.BackgroundTask; +import VASSAL.tools.FileChooser; import VASSAL.tools.LaunchButton; /** @@ -143,9 +143,13 @@ catch (NumberFormatException ex) { } } - JFileChooser fc = GameModule.getGameModule().getFileChooser(); - fc.setSelectedFile(new File(fc.getCurrentDirectory(), GameModule.getGameModule().getGameName() + "Map.png")); - if (fc.showSaveDialog(null) != JFileChooser.CANCEL_OPTION) { + + FileChooser fc = GameModule.getGameModule().getFileChooser(); + fc.setSelectedFile( + new File(fc.getCurrentDirectory(), + GameModule.getGameModule().getGameName() + "Map.png")); + + if (fc.showSaveDialog(map.getView()) == FileChooser.APPROVE_OPTION) { final int sectionCount = sections; final String fileName = fc.getSelectedFile().getPath(); final JWindow w = new JWindow((Frame) SwingUtilities.getAncestorOfClass(Frame.class, map.getView())); Modified: VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/TextSaver.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/TextSaver.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/TextSaver.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -35,6 +35,7 @@ import VASSAL.configure.ConfigurerFactory; import VASSAL.configure.IconConfigurer; import VASSAL.counters.GamePiece; +import VASSAL.tools.FileChooser; import VASSAL.tools.LaunchButton; public class TextSaver extends AbstractConfigurable { @@ -112,11 +113,9 @@ } protected void writeMapAsText() { - javax.swing.JFileChooser fc - = GameModule.getGameModule().getFileChooser(); - if (fc.showSaveDialog(null) == javax.swing.JFileChooser.CANCEL_OPTION) { - return; - } + FileChooser fc = GameModule.getGameModule().getFileChooser(); + if (fc.showSaveDialog(map.getView()) != FileChooser.APPROVE_OPTION) return; + try { PrintWriter p = new PrintWriter (new FileOutputStream(fc.getSelectedFile().getPath())); Modified: VASSAL-src/branches/uckelman-svg/VASSAL/configure/AudioClipConfigurer.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/configure/AudioClipConfigurer.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/configure/AudioClipConfigurer.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -18,10 +18,10 @@ */ package VASSAL.configure; -import javax.swing.JFileChooser; import VASSAL.build.module.Documentation; import VASSAL.tools.ArchiveWriter; -import VASSAL.tools.ExtensionFileFilter.AudioFileFilter; +import VASSAL.tools.AudioFileFilter; +import VASSAL.tools.FileChooser; /** * Class for selecting an AudioClip while editing a module and adding it to @@ -31,10 +31,11 @@ * */ public class AudioClipConfigurer extends FileConfigurer { - private static final JFileChooser fc; + private static final FileChooser fc; static { - fc = new JFileChooser(Documentation.getDocumentationBaseDir()); + fc = new FileChooser(null); + fc.setCurrentDirectory(Documentation.getDocumentationBaseDir()); fc.setFileFilter(new AudioFileFilter()); } @@ -43,9 +44,10 @@ this.archive = archive; } - protected JFileChooser initFileChooser() { + protected FileChooser initFileChooser() { return fc; } + protected void addToArchive(java.io.File f) { archive.addSound(f.getPath(), f.getName()); } Modified: VASSAL-src/branches/uckelman-svg/VASSAL/configure/DirectoryConfigurer.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/configure/DirectoryConfigurer.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/configure/DirectoryConfigurer.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -19,24 +19,31 @@ package VASSAL.configure; import java.io.File; -import javax.swing.JFileChooser; import VASSAL.build.module.Documentation; +import VASSAL.tools.FileChooser; +import VASSAL.tools.DirectoryFileFilter; /** * A Configurer for picking file directories */ public class DirectoryConfigurer extends FileConfigurer { - private static final JFileChooser fc = new Pan(); + private static final FileChooser fc; + static { + fc = new FileChooser(null); + fc.setFileFilter(new DirectoryFileFilter()); + fc.setFileSelectionMode(FileChooser.DIRECTORIES_ONLY); + } + public DirectoryConfigurer(String key, String name) { super(key, name); setValue(new File(System.getProperty("user.home"))); + fc.setCurrentDirectory(Documentation.getDocumentationBaseDir()); } public void setValue(Object o) { File f = (File) o; - if (f != null - && !f.isDirectory()) { + if (f != null && !f.isDirectory()) { f = null; } super.setValue(f); @@ -50,26 +57,8 @@ if (getValue() != null) { fc.setCurrentDirectory((File) getValue()); } - if (fc.showOpenDialog(null) != JFileChooser.CANCEL_OPTION) { + if (fc.showOpenDialog(getControls()) == FileChooser.APPROVE_OPTION) { setValue(fc.getSelectedFile()); } } - - private static class Pan extends JFileChooser { - private Pan() { - setCurrentDirectory(Documentation.getDocumentationBaseDir()); - setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); - setFileFilter(new javax.swing.filechooser.FileFilter() { - public boolean accept(File f) { - return f.isDirectory(); - } - - public String getDescription() { - return "Directory"; - } - }); - } - } } - - Modified: VASSAL-src/branches/uckelman-svg/VASSAL/configure/FileConfigurer.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/configure/FileConfigurer.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/configure/FileConfigurer.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -21,24 +21,24 @@ import java.io.File; import javax.swing.BoxLayout; import javax.swing.JButton; -import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import VASSAL.build.module.Documentation; import VASSAL.tools.ArchiveWriter; +import VASSAL.tools.FileChooser; /** * A Configurer for java.io.File values */ public class FileConfigurer extends Configurer { - private JFileChooser globalFileChooser; + private FileChooser globalFileChooser; protected VASSAL.tools.ArchiveWriter archive; protected JPanel p; protected JTextField tf; - protected JFileChooser fc; + protected FileChooser fc; protected boolean editable; public FileConfigurer(String key, String name) { @@ -48,9 +48,10 @@ editable = true; } - protected JFileChooser initFileChooser() { + protected FileChooser initFileChooser() { if (globalFileChooser == null) { - globalFileChooser = new JFileChooser(Documentation.getDocumentationBaseDir()); + globalFileChooser = new FileChooser(null); + globalFileChooser.setCurrentDirectory(Documentation.getDocumentationBaseDir()); } return globalFileChooser; } @@ -141,7 +142,7 @@ } public void chooseNewValue() { - if (fc.showOpenDialog(null) == JFileChooser.CANCEL_OPTION) { + if (fc.showOpenDialog(getControls()) != FileChooser.APPROVE_OPTION) { setValue((Object) null); } else { Modified: VASSAL-src/branches/uckelman-svg/VASSAL/configure/IconConfigurer.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/configure/IconConfigurer.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/configure/IconConfigurer.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -12,10 +12,11 @@ import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; -import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; import VASSAL.build.GameModule; +import VASSAL.tools.FileChooser; +import VASSAL.tools.ImageFileFilter; /* * $Id$ @@ -113,15 +114,17 @@ } private void selectImage() { - JFileChooser fc = GameModule.getGameModule().getFileChooser(); - if (fc.showOpenDialog(controls) == JFileChooser.CANCEL_OPTION) { + FileChooser fc = GameModule.getGameModule().getFileChooser(); + fc.setFileFilter(new ImageFileFilter()); + + if (fc.showOpenDialog(getControls()) != FileChooser.APPROVE_OPTION) { setValue(null); } else { File f = fc.getSelectedFile(); - if (f != null - && f.exists()) { - GameModule.getGameModule().getArchiveWriter().addImage(f.getPath(),f.getName()); + if (f != null && f.exists()) { + GameModule.getGameModule().getArchiveWriter() + .addImage(f.getPath(),f.getName()); setValue(f.getName()); } } Modified: VASSAL-src/branches/uckelman-svg/VASSAL/configure/ImageConfigurer.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/configure/ImageConfigurer.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/configure/ImageConfigurer.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -19,20 +19,21 @@ package VASSAL.configure; import java.io.File; -import javax.swing.JFileChooser; import VASSAL.build.module.Documentation; import VASSAL.tools.ArchiveWriter; -import VASSAL.tools.ExtensionFileFilter.ImageFileFilter; +import VASSAL.tools.FileChooser; +import VASSAL.tools.ImageFileFilter; /** * A Configurer for {@link java.awt.Image} values. Allows the user to select an * image file and writes it to a {@link ArchiveWriter}. */ public class ImageConfigurer extends FileConfigurer { - private static final JFileChooser fc; + private static final FileChooser fc; static { - fc = new JFileChooser(Documentation.getDocumentationBaseDir()); + fc = new FileChooser(null); + fc.setCurrentDirectory(Documentation.getDocumentationBaseDir()); fc.setFileFilter(new ImageFileFilter()); } @@ -42,7 +43,7 @@ editable = false; } - protected JFileChooser initFileChooser() { + protected FileChooser initFileChooser() { return fc; } Modified: VASSAL-src/branches/uckelman-svg/VASSAL/configure/ModuleUpdaterDialog.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/configure/ModuleUpdaterDialog.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/configure/ModuleUpdaterDialog.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -31,11 +31,11 @@ import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JDialog; -import javax.swing.JFileChooser; import javax.swing.JOptionPane; import VASSAL.build.GameModule; import VASSAL.build.module.documentation.HelpFile; import VASSAL.build.module.documentation.HelpWindow; +import VASSAL.tools.FileChooser; import VASSAL.tools.ZipUpdater; public class ModuleUpdaterDialog extends JDialog { @@ -58,8 +58,9 @@ }); saveButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - JFileChooser fc = GameModule.getGameModule().getFileChooser(); - if (fc.showSaveDialog(null) != JFileChooser.APPROVE_OPTION) return; + FileChooser fc = GameModule.getGameModule().getFileChooser(); + if (fc.showSaveDialog(getOwner()) != FileChooser.APPROVE_OPTION) + return; File output = fc.getSelectedFile(); ZipUpdater updater = null; @@ -102,5 +103,4 @@ pack(); setLocationRelativeTo(getOwner()); } - } Modified: VASSAL-src/branches/uckelman-svg/VASSAL/configure/SoundConfigurer.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/configure/SoundConfigurer.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/configure/SoundConfigurer.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -30,12 +30,13 @@ import java.net.URL; import javax.swing.BoxLayout; import javax.swing.JButton; -import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import VASSAL.build.GameModule; import VASSAL.build.module.documentation.HelpFile; +import VASSAL.tools.AudioFileFilter; +import VASSAL.tools.FileChooser; /** * Configurer for specifying an AudioClip. This class is intended to allow @@ -162,13 +163,15 @@ } public void chooseClip() { - JFileChooser fc = GameModule.getGameModule().getFileChooser(); - fc.showOpenDialog(GameModule.getGameModule().getFrame()); - File f = fc.getSelectedFile(); - if (f == null) { + // FIXME: add a file filter here? + FileChooser fc = GameModule.getGameModule().getFileChooser(); + fc.setFileFilter(new AudioFileFilter()); + + if (fc.showOpenDialog(getControls()) != FileChooser.APPROVE_OPTION) { setValue(NO_VALUE); } else { + File f = fc.getSelectedFile(); setValue(f.getName()); } } Modified: VASSAL-src/branches/uckelman-svg/VASSAL/counters/Deck.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/counters/Deck.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/counters/Deck.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -41,7 +41,6 @@ import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JDialog; -import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; @@ -58,6 +57,7 @@ import VASSAL.command.CommandEncoder; import VASSAL.command.NullCommand; import VASSAL.configure.ColorConfigurer; +import VASSAL.tools.FileChooser; import VASSAL.tools.FormattedString; import VASSAL.tools.KeyStrokeListener; import VASSAL.tools.ScrollPane; @@ -836,8 +836,7 @@ } private File getSaveFileName() { - File outputFile = null; - JFileChooser fc = GameModule.getGameModule().getFileChooser(); + FileChooser fc = GameModule.getGameModule().getFileChooser(); File sf = fc.getSelectedFile(); if (sf != null) { String name = sf.getPath(); @@ -850,9 +849,10 @@ } } - if (fc.showSaveDialog(null) != JFileChooser.APPROVE_OPTION) return null; + if (fc.showSaveDialog(map.getView()) != FileChooser.APPROVE_OPTION) + return null; - outputFile = fc.getSelectedFile(); + File outputFile = fc.getSelectedFile(); if (outputFile.exists() && shouldConfirmOverwrite() && JOptionPane.NO_OPTION == @@ -904,21 +904,10 @@ } private File getLoadFileName() { - JFileChooser fc = GameModule.getGameModule().getFileChooser(); - - File sf = fc.getSelectedFile(); - if (sf != null) { - String name = sf.getName(); - if (name != null) { - int index = name.lastIndexOf('.'); - if (index > 0) { - name = name.substring(0, index) + ".sav"; - fc.setSelectedFile(new File(name)); - } - } - } - - if (fc.showOpenDialog(null) != JFileChooser.APPROVE_OPTION) return null; + FileChooser fc = GameModule.getGameModule().getFileChooser(); + fc.selectDotSavFile(); + if (fc.showOpenDialog(map.getView()) != FileChooser.APPROVE_OPTION) + return null; return fc.getSelectedFile(); } Modified: VASSAL-src/branches/uckelman-svg/VASSAL/counters/ImagePicker.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/counters/ImagePicker.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/counters/ImagePicker.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -37,8 +37,9 @@ import javax.swing.JTextArea; import javax.swing.SwingUtilities; import VASSAL.build.GameModule; +import VASSAL.tools.FileChooser; +import VASSAL.tools.ImageFileFilter; import VASSAL.tools.ScrollPane; -import VASSAL.tools.ExtensionFileFilter.ImageFileFilter; public class ImagePicker extends javax.swing.JPanel implements MouseListener, ItemListener { private static final long serialVersionUID = 1L; @@ -151,12 +152,12 @@ } public void pickImage() { - javax.swing.JFileChooser fc = GameModule.getGameModule().getFileChooser(); + FileChooser fc = GameModule.getGameModule().getFileChooser(); fc.setFileFilter(new ImageFileFilter()); - if (fc.showOpenDialog(null) == javax.swing.JFileChooser.APPROVE_OPTION + if (fc.showOpenDialog(this) == FileChooser.APPROVE_OPTION && fc.getSelectedFile().exists()) { - String name = fc.getName(fc.getSelectedFile()); + String name = fc.getSelectedFile().getName(); GameModule.getGameModule().getArchiveWriter() .addImage(fc.getSelectedFile().getPath(), name); select.setModel(new DefaultComboBoxModel( Modified: VASSAL-src/branches/uckelman-svg/VASSAL/tools/ArchiveWriter.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/tools/ArchiveWriter.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/tools/ArchiveWriter.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -35,6 +35,7 @@ import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; import VASSAL.build.module.Documentation; +import VASSAL.tools.FileChooser; /** * An ArchiveWriter is a writeable DataArchive. New files may be added with the @@ -208,10 +209,9 @@ */ public void write() throws IOException { if (archiveName == null) { - javax.swing.JFileChooser fc = - new javax.swing.JFileChooser(Documentation.getDocumentationBaseDir()); - if (fc.showSaveDialog(null) == javax.swing.JFileChooser.CANCEL_OPTION) - return; + FileChooser fc = new FileChooser(null); + fc.setCurrentDirectory(Documentation.getDocumentationBaseDir()); + if (fc.showSaveDialog() != FileChooser.APPROVE_OPTION) return; archiveName = fc.getSelectedFile().getPath(); } Added: VASSAL-src/branches/uckelman-svg/VASSAL/tools/AudioFileFilter.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/tools/AudioFileFilter.java (rev 0) +++ VASSAL-src/branches/uckelman-svg/VASSAL/tools/AudioFileFilter.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -0,0 +1,17 @@ +package VASSAL.tools; + +import VASSAL.tools.ExtensionFileFilter; + +/** + * A FileFilter for AIFF, AU, and WAV files. Used by file choosers to + * filter out files which aren't audio files. + */ +public class AudioFileFilter extends ExtensionFileFilter { + public static final String[] types = { + ".aiff", ".au", ".wav" + }; + + public AudioFileFilter() { + super("Audio files", types); + } +} Added: VASSAL-src/branches/uckelman-svg/VASSAL/tools/DirectoryFileFilter.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/tools/DirectoryFileFilter.java (rev 0) +++ VASSAL-src/branches/uckelman-svg/VASSAL/tools/DirectoryFileFilter.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -0,0 +1,16 @@ + +package VASSAL.tools; + +import java.io.File; + +import VASSAL.tools.FileFilter; + +public class DirectoryFileFilter extends FileFilter { + public boolean accept(File f) { + return f.isDirectory(); + } + + public String getDescription() { + return "Directories"; + } +} Modified: VASSAL-src/branches/uckelman-svg/VASSAL/tools/ExtensionFileFilter.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/tools/ExtensionFileFilter.java 2006-11-18 14:27:50 UTC (rev 1472) +++ VASSAL-src/branches/uckelman-svg/VASSAL/tools/ExtensionFileFilter.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -1,8 +1,9 @@ package VASSAL.tools; import java.io.File; -import javax.swing.filechooser.FileFilter; +import VASSAL.tools.FileFilter; + /** * A generic by-extension FileFilter. * @@ -41,32 +42,4 @@ public String getDescription() { return desc; } - - /** - * A FileFilter for GIF, JPEG, PNG, and SVG images. Used by file choosers - * to filter out files which aren't images. - */ - public static class ImageFileFilter extends ExtensionFileFilter { - public static final String[] types = { - ".gif", ".jpg", ".jpeg", ".png", ".svg" - }; - - public ImageFileFilter() { - super("Image files", types); - } - } - - /** - * A FileFilter for AIFF, AU, and WAV files. Used by file choosers to - * filter out files which aren't audio files. - */ - public static class AudioFileFilter extends ExtensionFileFilter { - public static final String[] types = { - ".aiff", ".au", ".wav" - }; - - public AudioFileFilter() { - super("Audio files", types); - } - } } Added: VASSAL-src/branches/uckelman-svg/VASSAL/tools/FileChooser.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/tools/FileChooser.java (rev 0) +++ VASSAL-src/branches/uckelman-svg/VASSAL/tools/FileChooser.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -0,0 +1,189 @@ + +package VASSAL.tools; + +import java.awt.Component; +import java.awt.FileDialog; +import java.awt.Frame; +import java.io.File; +import javax.swing.JFileChooser; +import javax.swing.SwingUtilities; + +import VASSAL.tools.FileFilter; + +public class FileChooser { + protected JFileChooser fc; + + protected File fd_cur; + protected String fd_title; + protected FileFilter fd_filter; + + protected Component parent; + + public final static int APPROVE_OPTION = JFileChooser.APPROVE_OPTION; + public final static int CANCEL_OPTION = JFileChooser.CANCEL_OPTION; + public final static int ERROR_OPTION = JFileChooser.ERROR_OPTION; + + public final static int FILES_ONLY = JFileChooser.FILES_ONLY; + public final static int DIRECTORIES_ONLY = JFileChooser.DIRECTORIES_ONLY; + public final static int FILES_AND_DIRECTORIES = + JFileChooser.FILES_AND_DIRECTORIES; + + public FileChooser(Component parent) { + // determine what OS this is + String os = System.getProperty("os.name"); + if (os == null) { + // should not happen! + fc = new JFileChooser(); + } + else if (os.startsWith("Windows") || + os.startsWith("Mac OS")) { + // use a native file chooser on Windows and Mac OS + fc = null; + } + else { + // use a Swing file chooser anywhere without a good native one + fc = new JFileChooser(); + } + + this.parent = parent; + } + + public File getCurrentDirectory() { + if (fc != null) return fc.getCurrentDirectory(); + else if (fd_cur == null) return null; + else if (fd_cur.isDirectory()) return fd_cur; + else return fd_cur.getParentFile(); + } + + public void setCurrentDirectory(File dir) { + if (fc != null) fc.setCurrentDirectory(dir); + else fd_cur = dir; + } + + public void rescanCurrentDirectory() { + if (fc != null) fc.rescanCurrentDirectory(); + } + + public File getSelectedFile() { + if (fc != null) return fc.getSelectedFile(); + else if (fd_cur.isFile()) return fd_cur; + else return null; + } + + public void setSelectedFile(File file) { + if (fc != null) fc.setSelectedFile(file); + else fd_cur = file; + } + + public void selectDotSavFile() { + File file = getSelectedFile(); + if (file != null) { + String name = file.getPath(); + if (name != null) { + int index = name.lastIndexOf('.'); + if (index > 0) { + name = name.substring(0, index) + ".sav"; + setSelectedFile(new File(name)); + } + } + } + } + + public int getFileSelectionMode() { + return fc != null ? fc.getFileSelectionMode() : FILES_ONLY; + } + + public void setFileSelectionMode(int mode) { + if (fc != null) fc.setFileSelectionMode(mode); + } + + public String getDialogTitle() { + return fc != null ? fc.getDialogTitle() : fd_title; + } + + public void setDialogTitle(String title) { + if (fc != null) fc.setDialogTitle(title); + else fd_title = title; + } + + protected FileDialog awt_file_dialog_init(Component parent) { + Frame frame = parent instanceof Frame ? (Frame) parent + : (Frame) SwingUtilities.getAncestorOfClass(Frame.class, parent); + FileDialog fd = new FileDialog(frame, fd_title); + fd.setModal(true); + fd.setFilenameFilter(fd_filter); + + if (fd_cur != null) { + if (fd_cur.isDirectory()) fd.setDirectory(fd_cur.getPath()); + else { + fd.setDirectory(fd_cur.getParent()); + fd.setFile(fd_cur.getName()); + } + } + + return fd; + } + + public int showOpenDialog() { + return showOpenDialog(parent); + } + + public int showOpenDialog(Component parent) { + if (fc != null) return fc.showOpenDialog(parent); + else { + FileDialog fd = awt_file_dialog_init(parent); + fd.setMode(FileDialog.LOAD); + fd.setVisible(true); + + if (fd.getFile() != null) { + fd_cur = new File(fd.getDirectory(), fd.getFile()); + return FileChooser.APPROVE_OPTION; + } + else return FileChooser.CANCEL_OPTION; + } + } + + public int showSaveDialog() { + return showSaveDialog(parent); + } + + public int showSaveDialog(Component parent) { + if (fc != null) return fc.showSaveDialog(parent); + else { + FileDialog fd = awt_file_dialog_init(parent); + fd.setMode(FileDialog.SAVE); + fd.setVisible(true); + + if (fd.getFile() != null) { + fd_cur = new File(fd.getDirectory(), fd.getFile()); + return FileChooser.APPROVE_OPTION; + } + else return FileChooser.CANCEL_OPTION; + } + } + + public FileFilter getFileFilter() { + if (fc != null) { + javax.swing.filechooser.FileFilter ff = fc.getFileFilter(); + return ff instanceof FileFilter ? (FileFilter) ff : null; + } + else return fd_filter; + } + + public void setFileFilter(FileFilter filter) { + if (fc != null) fc.setFileFilter(filter); + else fd_filter = filter; + } + + public void addChoosableFileFilter(FileFilter filter) { + if (fc != null) fc.addChoosableFileFilter(filter); + } + + public boolean removeChoosableFileFilter(FileFilter filter) { + return fc != null ? fc.removeChoosableFileFilter(filter) : false; + } + + public void resetChoosableFileFilters() { + if (fc != null) fc.resetChoosableFileFilters(); + } +} Added: VASSAL-src/branches/uckelman-svg/VASSAL/tools/FileFilter.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/tools/FileFilter.java (rev 0) +++ VASSAL-src/branches/uckelman-svg/VASSAL/tools/FileFilter.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -0,0 +1,37 @@ + +package VASSAL.tools; + +import java.io.File; + +/** + * The file filter abstract base class for {@link VASSAL.tools.FileChooser}. + * This class joins together the {@link javax.swing.filechooser.FileFilter} + * class and the {@link java.awt.FilenameFilter} interface so that a + * uniform file chooser may be used with {@link VASSAL.tools.FileChooser}, + * regardless of the actual (i.e., navive or Swing) file chooser displayed. + * + * @author uckelman + */ +public abstract class FileFilter extends javax.swing.filechooser.FileFilter + implements java.io.FilenameFilter { + /** + * The accept test used by Swing file choosers. + * + * @return Whether the given file is accepted by this filter. + */ + public abstract boolean accept(File f); + + /** + * The accept test used by AWT file choosers. + * + * @return Whether the given file is accepted by this filter. + */ + public boolean accept(File dir, String name) { + return accept(new File(dir, name)); + } + + /** + * @return A description of this filter to be displayed in the file chooser. + */ + public abstract String getDescription(); +} Added: VASSAL-src/branches/uckelman-svg/VASSAL/tools/ImageFileFilter.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/tools/ImageFileFilter.java (rev 0) +++ VASSAL-src/branches/uckelman-svg/VASSAL/tools/ImageFileFilter.java 2006-11-20 23:11:28 UTC (rev 1473) @@ -0,0 +1,17 @@ +package VASSAL.tools; + +import VASSAL.tools.ExtensionFileFilter; + +/** + * A FileFilter for GIF, JPEG, PNG, and SVG images. Used by file choosers + * to filter out files which aren't images. + */ +public class ImageFileFilter extends ExtensionFileFilter { + public static final String[] types = { + ".gif", ".jpg", ".jpeg", ".png", ".svg" + }; + + public ImageFileFilter() { + super("Image files", types); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <uck...@us...> - 2006-11-18 14:27:54
|
Revision: 1472 http://svn.sourceforge.net/vassalengine/?rev=1472&view=rev Author: uckelman Date: 2006-11-18 06:27:50 -0800 (Sat, 18 Nov 2006) Log Message: ----------- Merged from trunk 1469, 1470. Modified Paths: -------------- VASSAL-src/branches/uckelman-svg/VASSAL/Info.java VASSAL-src/branches/uckelman-svg/VASSAL/counters/PropertiesPieceFilter.java VASSAL-src/branches/uckelman-svg/VASSAL/counters/SetGlobalProperty.java Modified: VASSAL-src/branches/uckelman-svg/VASSAL/Info.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/Info.java 2006-11-18 11:28:02 UTC (rev 1471) +++ VASSAL-src/branches/uckelman-svg/VASSAL/Info.java 2006-11-18 14:27:50 UTC (rev 1472) @@ -30,7 +30,7 @@ * Class for storing release-related information */ public final class Info { - private static final String VERSION = "2.9.2"; + private static final String VERSION = "2.9.4"; private static Boolean is2dEnabled; private static Boolean isDndEnabled; /** This class should not be instantiated */ Modified: VASSAL-src/branches/uckelman-svg/VASSAL/counters/PropertiesPieceFilter.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/counters/PropertiesPieceFilter.java 2006-11-18 11:28:02 UTC (rev 1471) +++ VASSAL-src/branches/uckelman-svg/VASSAL/counters/PropertiesPieceFilter.java 2006-11-18 14:27:50 UTC (rev 1472) @@ -32,7 +32,8 @@ Pattern.compile(">"), Pattern.compile("<"), Pattern.compile("=~"), - Pattern.compile("=")}; + Pattern.compile("="), + Pattern.compile("!~")}; private static final Pattern AND = Pattern.compile("&&"); private static final Pattern OR = Pattern.compile("\\|\\|"); @@ -102,6 +103,8 @@ case 6: f = new EQ(name, value); break; + case 7: + f = new NOT_MATCH(name,value); } } break; @@ -222,4 +225,14 @@ return Pattern.matches(value, property); } } + + private static class NOT_MATCH extends MATCH { + public NOT_MATCH(String name, String value) { + super(name, value); + } + + public boolean accept(GamePiece piece) { + return !super.accept(piece); + } + } } Modified: VASSAL-src/branches/uckelman-svg/VASSAL/counters/SetGlobalProperty.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/counters/SetGlobalProperty.java 2006-11-18 11:28:02 UTC (rev 1471) +++ VASSAL-src/branches/uckelman-svg/VASSAL/counters/SetGlobalProperty.java 2006-11-18 14:27:50 UTC (rev 1472) @@ -61,8 +61,8 @@ public static final String NAMED_ZONE = "Named Zone"; public static final String NAMED_MAP = "Named Map"; protected String description; - protected String propertyLevel = CURRENT_ZONE; - protected String searchName = ""; + protected String propertyLevel; + protected String searchName; protected Decorator dec; public SetGlobalProperty() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <swa...@us...> - 2006-11-18 11:28:05
|
Revision: 1471 http://svn.sourceforge.net/vassalengine/?rev=1471&view=rev Author: swampwallaby Date: 2006-11-18 03:28:02 -0800 (Sat, 18 Nov 2006) Log Message: ----------- Obscurable: Fix Peek Command PrivateMap: Disable buttons for inaccesible windows Zone, PolygonEditor: Zone Editor Scroll at Edges Modified Paths: -------------- VASSAL-src/branches/swampwallaby-merge/VASSAL/build/module/PrivateMap.java VASSAL-src/branches/swampwallaby-merge/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java VASSAL-src/branches/swampwallaby-merge/VASSAL/build/module/map/boardPicker/board/mapgrid/Zone.java VASSAL-src/branches/swampwallaby-merge/VASSAL/counters/Obscurable.java Modified: VASSAL-src/branches/swampwallaby-merge/VASSAL/build/module/PrivateMap.java =================================================================== --- VASSAL-src/branches/swampwallaby-merge/VASSAL/build/module/PrivateMap.java 2006-11-18 06:54:34 UTC (rev 1470) +++ VASSAL-src/branches/swampwallaby-merge/VASSAL/build/module/PrivateMap.java 2006-11-18 11:28:02 UTC (rev 1471) @@ -185,6 +185,7 @@ if (isAccessibleTo(newSide)) { ((View)getView()).enableListeners(); } + launchButton.setEnabled(isAccessibleTo(PlayerRoster.getMySide())); } public boolean shouldDockIntoMainWindow() { @@ -211,6 +212,7 @@ else if (isAccessibleTo(PlayerRoster.getMySide())) { ((View) theMap).enableListeners(); } + launchButton.setEnabled(isAccessibleTo(PlayerRoster.getMySide())); } public void setBoards(Enumeration boardList) { Modified: VASSAL-src/branches/swampwallaby-merge/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java =================================================================== --- VASSAL-src/branches/swampwallaby-merge/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java 2006-11-18 06:54:34 UTC (rev 1470) +++ VASSAL-src/branches/swampwallaby-merge/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java 2006-11-18 11:28:02 UTC (rev 1471) @@ -35,13 +35,16 @@ import java.awt.geom.Point2D; import javax.swing.JFrame; import javax.swing.JPanel; +import javax.swing.JScrollPane; import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; import javax.swing.event.MouseInputAdapter; import VASSAL.tools.SequenceEncoder; public class PolygonEditor extends JPanel { private Polygon polygon; private int selected = -1; + protected JScrollPane myScroll; public PolygonEditor(Polygon p) { polygon = p; @@ -62,6 +65,10 @@ this.polygon = polygon; } + public void setScroll(JScrollPane scroll) { + myScroll = scroll; + } + private void setupForCreate() { DefineRectangle dr = new DefineRectangle(); addMouseListener(dr); @@ -166,6 +173,9 @@ // implements java.awt.event.MouseMotionListener public void mouseDragged(MouseEvent e) { moveSelectedPoint(e); + if (SwingUtilities.isLeftMouseButton(e)) { + scrollAtEdge(e.getPoint(), 15); + } repaint(); } @@ -205,6 +215,30 @@ } } } + + public void scrollAtEdge(Point evtPt, int dist) { + + Point p = new Point(evtPt.x - myScroll.getViewport().getViewPosition().x, + evtPt.y - myScroll.getViewport().getViewPosition().y); + int dx = 0, dy = 0; + if (p.x < dist && p.x >= 0) + dx = -1; + if (p.x >= myScroll.getViewport().getSize().width - dist + && p.x < myScroll.getViewport().getSize().width) + dx = 1; + if (p.y < dist && p.y >= 0) + dy = -1; + if (p.y >= myScroll.getViewport().getSize().height - dist + && p.y < myScroll.getViewport().getSize().height) + dy = 1; + + if (dx != 0 || dy != 0) { + Rectangle r = new Rectangle(myScroll.getViewport().getViewRect()); + r.translate(2 * dist * dx, 2 * dist * dy); + r = r.intersection(new Rectangle(new Point(0, 0), getPreferredSize())); + scrollRectToVisible(r); + } + } } private class DefineRectangle extends MouseInputAdapter { Modified: VASSAL-src/branches/swampwallaby-merge/VASSAL/build/module/map/boardPicker/board/mapgrid/Zone.java =================================================================== --- VASSAL-src/branches/swampwallaby-merge/VASSAL/build/module/map/boardPicker/board/mapgrid/Zone.java 2006-11-18 06:54:34 UTC (rev 1470) +++ VASSAL-src/branches/swampwallaby-merge/VASSAL/build/module/map/boardPicker/board/mapgrid/Zone.java 2006-11-18 11:28:02 UTC (rev 1471) @@ -437,6 +437,7 @@ private PolygonEditor editor; private Board board; private JDialog frame; + protected AdjustableSpeedScrollPane scroll; public Editor(final Zone zone) { super(PATH, null); @@ -488,7 +489,9 @@ }); direct.setAlignmentX(0.0f); frame.getContentPane().add(direct); - frame.getContentPane().add(new AdjustableSpeedScrollPane(editor)); + scroll = new AdjustableSpeedScrollPane(editor); + editor.setScroll(scroll); + frame.getContentPane().add(scroll); JPanel buttonPanel = new JPanel(); JButton closeButton = new JButton("Ok"); closeButton.addActionListener(new ActionListener() { Modified: VASSAL-src/branches/swampwallaby-merge/VASSAL/counters/Obscurable.java =================================================================== --- VASSAL-src/branches/swampwallaby-merge/VASSAL/counters/Obscurable.java 2006-11-18 06:54:34 UTC (rev 1470) +++ VASSAL-src/branches/swampwallaby-merge/VASSAL/counters/Obscurable.java 2006-11-18 11:28:02 UTC (rev 1471) @@ -70,7 +70,8 @@ protected String maskName = "?"; protected PieceAccess access = PlayerAccess.getInstance(); - protected KeyCommand[] commands; + protected KeyCommand[] commandsWithPeek; + protected KeyCommand[] commandsWithoutPeek; protected KeyCommand hide; protected KeyCommand peek; @@ -123,7 +124,7 @@ } maskName = st.nextToken(maskName); access = PieceAccessConfigurer.decode(st.nextToken(null)); - commands = null; + commandsWithPeek = null; hide = null; peek = null; } @@ -342,7 +343,7 @@ } public KeyCommand[] myGetKeyCommands() { - if (commands == null) { + if (commandsWithPeek == null) { List l = new ArrayList(); GamePiece outer = Decorator.getOutermost(this); @@ -355,35 +356,27 @@ hide = new KeyCommand(hideCommand, keyCommand, outer); if (hideCommand.length() > 0) { l.add(hide); + commandsWithoutPeek = new KeyCommand[] {hide}; } + else { + commandsWithoutPeek = new KeyCommand[0]; + } // Peek Command peek = new KeyCommand("Peek", peekKey, outer); - if (obscuredToOthers() && displayStyle == PEEK && peekKey != null) { + if (displayStyle == PEEK && peekKey != null) { l.add(peek); } - commands = (KeyCommand[]) l.toArray(new KeyCommand[l.size()]); + commandsWithPeek = (KeyCommand[]) l.toArray(new KeyCommand[l.size()]); } - return commands; + if (obscuredToOthers() && displayStyle == PEEK && peekKey != null) { + return commandsWithPeek; + } + else { + return commandsWithoutPeek; + } -// if (commands == null) { -// commands = new KeyCommand[2]; -// if (keyCommand == null) { // Backwards compatibility with VASL classes -// keyCommand = KeyStroke.getKeyStroke(obscureKey, InputEvent.CTRL_MASK); -// } -// commands[0] = new KeyCommand(hideCommand, keyCommand, Decorator.getOutermost(this)); -// commands[1] = new KeyCommand("Peek", peekKey, Decorator.getOutermost(this)); -// } -// commands[0].setEnabled(isMaskable()); -// if (obscuredToOthers() -// && displayStyle == PEEK -// && peekKey != null) { -// return commands; -// } -// else { -// return new KeyCommand[]{commands[0]}; -// } } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rod...@us...> - 2006-11-18 06:54:34
|
Revision: 1470 http://svn.sourceforge.net/vassalengine/?rev=1470&view=rev Author: rodneykinney Date: 2006-11-17 22:54:34 -0800 (Fri, 17 Nov 2006) Log Message: ----------- Bug fix: NullPointer in Load Deck. Merge from uckelman-merge@1468 Modified Paths: -------------- VASSAL-src/trunk/VASSAL/counters/Deck.java Modified: VASSAL-src/trunk/VASSAL/counters/Deck.java =================================================================== --- VASSAL-src/trunk/VASSAL/counters/Deck.java 2006-11-18 06:52:31 UTC (rev 1469) +++ VASSAL-src/trunk/VASSAL/counters/Deck.java 2006-11-18 06:54:34 UTC (rev 1470) @@ -906,12 +906,15 @@ private File getLoadFileName() { JFileChooser fc = GameModule.getGameModule().getFileChooser(); - String name = fc.getSelectedFile().getPath(); - if (name != null) { - int index = name.lastIndexOf('.'); - if (index > 0) { - name = name.substring(0, index) + ".sav"; - fc.setSelectedFile(new File(name)); + File sf = fc.getSelectedFile(); + if (sf != null) { + String name = sf.getName(); + if (name != null) { + int index = name.lastIndexOf('.'); + if (index > 0) { + name = name.substring(0, index) + ".sav"; + fc.setSelectedFile(new File(name)); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rod...@us...> - 2006-11-18 06:52:32
|
Revision: 1469 http://svn.sourceforge.net/vassalengine/?rev=1469&view=rev Author: rodneykinney Date: 2006-11-17 22:52:31 -0800 (Fri, 17 Nov 2006) Log Message: ----------- PropertiesPieceFilter: Add !~ (does not match regex) SetGlobalProperty bug fix: don't reset on edit Modified Paths: -------------- VASSAL-src/trunk/VASSAL/Info.java VASSAL-src/trunk/VASSAL/counters/PropertiesPieceFilter.java VASSAL-src/trunk/VASSAL/counters/SetGlobalProperty.java Modified: VASSAL-src/trunk/VASSAL/Info.java =================================================================== --- VASSAL-src/trunk/VASSAL/Info.java 2006-11-17 20:45:35 UTC (rev 1468) +++ VASSAL-src/trunk/VASSAL/Info.java 2006-11-18 06:52:31 UTC (rev 1469) @@ -30,7 +30,7 @@ * Class for storing release-related information */ public final class Info { - private static final String VERSION = "2.9.3"; + private static final String VERSION = "2.9.4"; private static Boolean is2dEnabled; private static Boolean isDndEnabled; /** This class should not be instantiated */ Modified: VASSAL-src/trunk/VASSAL/counters/PropertiesPieceFilter.java =================================================================== --- VASSAL-src/trunk/VASSAL/counters/PropertiesPieceFilter.java 2006-11-17 20:45:35 UTC (rev 1468) +++ VASSAL-src/trunk/VASSAL/counters/PropertiesPieceFilter.java 2006-11-18 06:52:31 UTC (rev 1469) @@ -32,7 +32,8 @@ Pattern.compile(">"), Pattern.compile("<"), Pattern.compile("=~"), - Pattern.compile("=")}; + Pattern.compile("="), + Pattern.compile("!~")}; private static final Pattern AND = Pattern.compile("&&"); private static final Pattern OR = Pattern.compile("\\|\\|"); @@ -102,6 +103,8 @@ case 6: f = new EQ(name, value); break; + case 7: + f = new NOT_MATCH(name,value); } } break; @@ -222,4 +225,14 @@ return Pattern.matches(value, property); } } + + private static class NOT_MATCH extends MATCH { + public NOT_MATCH(String name, String value) { + super(name, value); + } + + public boolean accept(GamePiece piece) { + return !super.accept(piece); + } + } } Modified: VASSAL-src/trunk/VASSAL/counters/SetGlobalProperty.java =================================================================== --- VASSAL-src/trunk/VASSAL/counters/SetGlobalProperty.java 2006-11-17 20:45:35 UTC (rev 1468) +++ VASSAL-src/trunk/VASSAL/counters/SetGlobalProperty.java 2006-11-18 06:52:31 UTC (rev 1469) @@ -61,8 +61,8 @@ public static final String NAMED_ZONE = "Named Zone"; public static final String NAMED_MAP = "Named Map"; protected String description; - protected String propertyLevel = CURRENT_ZONE; - protected String searchName = ""; + protected String propertyLevel; + protected String searchName; protected Decorator dec; public SetGlobalProperty() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <uck...@us...> - 2006-11-17 20:46:06
|
Revision: 1468 http://svn.sourceforge.net/vassalengine/?rev=1468&view=rev Author: uckelman Date: 2006-11-17 12:45:35 -0800 (Fri, 17 Nov 2006) Log Message: ----------- Merged from uckelman-svg 1467. Modified Paths: -------------- VASSAL-src/branches/uckelman-merge/VASSAL/counters/Deck.java Modified: VASSAL-src/branches/uckelman-merge/VASSAL/counters/Deck.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/counters/Deck.java 2006-11-17 20:42:55 UTC (rev 1467) +++ VASSAL-src/branches/uckelman-merge/VASSAL/counters/Deck.java 2006-11-17 20:45:35 UTC (rev 1468) @@ -906,12 +906,15 @@ private File getLoadFileName() { JFileChooser fc = GameModule.getGameModule().getFileChooser(); - String name = fc.getSelectedFile().getPath(); - if (name != null) { - int index = name.lastIndexOf('.'); - if (index > 0) { - name = name.substring(0, index) + ".sav"; - fc.setSelectedFile(new File(name)); + File sf = fc.getSelectedFile(); + if (sf != null) { + String name = sf.getName(); + if (name != null) { + int index = name.lastIndexOf('.'); + if (index > 0) { + name = name.substring(0, index) + ".sav"; + fc.setSelectedFile(new File(name)); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <uck...@us...> - 2006-11-17 20:43:03
|
Revision: 1467 http://svn.sourceforge.net/vassalengine/?rev=1467&view=rev Author: uckelman Date: 2006-11-17 12:42:55 -0800 (Fri, 17 Nov 2006) Log Message: ----------- Fixed bug #1598030, Deck Load commands generate Null Pointer. Modified Paths: -------------- VASSAL-src/branches/uckelman-svg/VASSAL/counters/Deck.java Modified: VASSAL-src/branches/uckelman-svg/VASSAL/counters/Deck.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/counters/Deck.java 2006-11-17 14:42:23 UTC (rev 1466) +++ VASSAL-src/branches/uckelman-svg/VASSAL/counters/Deck.java 2006-11-17 20:42:55 UTC (rev 1467) @@ -906,12 +906,15 @@ private File getLoadFileName() { JFileChooser fc = GameModule.getGameModule().getFileChooser(); - String name = fc.getSelectedFile().getPath(); - if (name != null) { - int index = name.lastIndexOf('.'); - if (index > 0) { - name = name.substring(0, index) + ".sav"; - fc.setSelectedFile(new File(name)); + File sf = fc.getSelectedFile(); + if (sf != null) { + String name = sf.getName(); + if (name != null) { + int index = name.lastIndexOf('.'); + if (index > 0) { + name = name.substring(0, index) + ".sav"; + fc.setSelectedFile(new File(name)); + } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tsp...@us...> - 2006-11-17 14:42:23
|
Revision: 1466 http://svn.sourceforge.net/vassalengine/?rev=1466&view=rev Author: tspindler Date: 2006-11-17 06:42:23 -0800 (Fri, 17 Nov 2006) Log Message: ----------- New branch for Torsten. Added Paths: ----------- VASSAL-src/branches/tspindler/ Copied: VASSAL-src/branches/tspindler (from rev 1465, VASSAL-src/trunk) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tsp...@us...> - 2006-11-17 14:41:44
|
Revision: 1465 http://svn.sourceforge.net/vassalengine/?rev=1465&view=rev Author: tspindler Date: 2006-11-17 06:41:43 -0800 (Fri, 17 Nov 2006) Log Message: ----------- Remove old branch Removed Paths: ------------- VASSAL-src/branches/tspindler/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <swa...@us...> - 2006-11-16 03:35:22
|
Revision: 1464 http://svn.sourceforge.net/vassalengine/?rev=1464&view=rev Author: swampwallaby Date: 2006-11-15 19:35:23 -0800 (Wed, 15 Nov 2006) Log Message: ----------- Recreate swampwallaby-merge from trunk@1457 Added Paths: ----------- VASSAL-src/branches/swampwallaby-merge/ Copied: VASSAL-src/branches/swampwallaby-merge (from rev 1463, VASSAL-src/trunk) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <swa...@us...> - 2006-11-16 03:34:01
|
Revision: 1463 http://svn.sourceforge.net/vassalengine/?rev=1463&view=rev Author: swampwallaby Date: 2006-11-15 19:33:57 -0800 (Wed, 15 Nov 2006) Log Message: ----------- Recreate new swampwallaby-merge Removed Paths: ------------- VASSAL-src/branches/swampwallaby-merge/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <uck...@us...> - 2006-11-15 22:49:59
|
Revision: 1462 http://svn.sourceforge.net/vassalengine/?rev=1462&view=rev Author: uckelman Date: 2006-11-15 14:49:59 -0800 (Wed, 15 Nov 2006) Log Message: ----------- Merged trunk 1456, 1457. Modified Paths: -------------- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/GlobalKeyCommand.java VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/MassKeyCommand.java VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/StackMetrics.java VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java Modified: VASSAL-src/branches/uckelman-merge/VASSAL/build/module/GlobalKeyCommand.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/GlobalKeyCommand.java 2006-11-15 22:48:26 UTC (rev 1461) +++ VASSAL-src/branches/uckelman-merge/VASSAL/build/module/GlobalKeyCommand.java 2006-11-15 22:49:59 UTC (rev 1462) @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import VASSAL.build.Buildable; import VASSAL.build.GameModule; import VASSAL.build.module.map.MassKeyCommand; @@ -30,21 +29,14 @@ * {@link VASSAL.build.GameModule} and applies to all maps */ public class GlobalKeyCommand extends MassKeyCommand { - public void addTo(Buildable parent) { - ((GameModule) parent).getToolBar().add(getLaunchButton()); - } - public void removeFrom(Buildable parent) { - ((GameModule) parent).getToolBar().remove(getLaunchButton()); - } - - public void apply() { + public void apply() { List l = new ArrayList(); for (Iterator it = Map.getAllMaps(); it.hasNext();) { l.add(it.next()); } GameModule.getGameModule().sendAndLog( globalCommand.apply((Map[]) l.toArray(new Map[l.size()]), - filter)); + getFilter())); } } Modified: VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/MassKeyCommand.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/MassKeyCommand.java 2006-11-15 22:48:26 UTC (rev 1461) +++ VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/MassKeyCommand.java 2006-11-15 22:49:59 UTC (rev 1462) @@ -43,6 +43,7 @@ import VASSAL.build.module.Map; import VASSAL.build.module.documentation.HelpFile; import VASSAL.build.module.gamepieceimage.StringEnumConfigurer; +import VASSAL.build.module.properties.PropertySource; import VASSAL.configure.Configurer; import VASSAL.configure.ConfigurerFactory; import VASSAL.configure.HotKeyConfigurer; @@ -60,6 +61,7 @@ import VASSAL.counters.PropertiesPieceFilter; import VASSAL.tools.FormattedString; import VASSAL.tools.LaunchButton; +import VASSAL.tools.ToolBarComponent; /** * Adds a button to a map window toolbar. Hitting the button applies a particular key command to all pieces on that map @@ -91,6 +93,8 @@ protected String checkProperty; protected String checkValue; protected String propertiesFilter; + protected PropertySource propertySource; + protected boolean filterIsDynamic; protected PieceFilter filter; private Map map; protected GlobalCommand globalCommand = new GlobalCommand(); @@ -106,8 +110,15 @@ } public void addTo(Buildable parent) { - map = (Map) parent; - map.getToolBar().add(launch); + if (parent instanceof Map) { + map = (Map) parent; + } + if (parent instanceof ToolBarComponent) { + ((ToolBarComponent)parent).getToolBar().add(launch); + } + if (parent instanceof PropertySource) { + propertySource = (PropertySource) parent; + } } public void apply() { @@ -115,7 +126,7 @@ } public void apply(Map m) { - GameModule.getGameModule().sendAndLog(globalCommand.apply(m, filter)); + GameModule.getGameModule().sendAndLog(globalCommand.apply(m, getFilter())); } public Class[] getAllowableConfigureComponents() { @@ -316,15 +327,24 @@ } public void removeFrom(Buildable parent) { - map.getToolBar().remove(launch); + if (parent instanceof ToolBarComponent) { + ((ToolBarComponent)parent).getToolBar().remove(launch); + } } + public PieceFilter getFilter() { + if (filterIsDynamic) { + buildFilter(); + } + return filter; + } + private void buildFilter() { if (checkValue != null) { propertiesFilter = checkProperty + "=" + checkValue; } if (propertiesFilter != null) { - filter = PropertiesPieceFilter.parse(propertiesFilter); + filter = PropertiesPieceFilter.parse(new FormattedString(propertiesFilter).getText(propertySource)); } if (filter != null && condition != null) { filter = new BooleanAndPieceFilter(filter, new PieceFilter() { @@ -394,6 +414,7 @@ } else if (PROPERTIES_FILTER.equals(key)) { propertiesFilter = (String) value; + filterIsDynamic = propertiesFilter != null && propertiesFilter.indexOf('$') >= 0; buildFilter(); } else if (CONDITION.equals(key)) { @@ -420,4 +441,5 @@ launch.setAttribute(key, value); } } + } Modified: VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/StackMetrics.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/StackMetrics.java 2006-11-15 22:48:26 UTC (rev 1461) +++ VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/StackMetrics.java 2006-11-15 22:49:59 UTC (rev 1462) @@ -464,7 +464,7 @@ if (index < 0) { throw new RuntimeException(c.getId() + " is not contained in " + parent.getId()); } - Point[] pos = new Point[index + 1]; + Point[] pos = new Point[parent.getPieceCount()]; getContents(parent, pos, null, null, 0, 0); return pos[index]; } Modified: VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java 2006-11-15 22:48:26 UTC (rev 1461) +++ VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java 2006-11-15 22:49:59 UTC (rev 1462) @@ -119,7 +119,6 @@ } } catch (NumberFormatException e) { - e.printStackTrace(); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <uck...@us...> - 2006-11-15 22:48:31
|
Revision: 1461 http://svn.sourceforge.net/vassalengine/?rev=1461&view=rev Author: uckelman Date: 2006-11-15 14:48:26 -0800 (Wed, 15 Nov 2006) Log Message: ----------- Merged trunk 1456, 1457. Modified Paths: -------------- VASSAL-src/branches/uckelman-svg/VASSAL/build/module/GlobalKeyCommand.java VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/MassKeyCommand.java VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/StackMetrics.java VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java Modified: VASSAL-src/branches/uckelman-svg/VASSAL/build/module/GlobalKeyCommand.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/build/module/GlobalKeyCommand.java 2006-11-15 20:55:42 UTC (rev 1460) +++ VASSAL-src/branches/uckelman-svg/VASSAL/build/module/GlobalKeyCommand.java 2006-11-15 22:48:26 UTC (rev 1461) @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import VASSAL.build.Buildable; import VASSAL.build.GameModule; import VASSAL.build.module.map.MassKeyCommand; @@ -30,21 +29,14 @@ * {@link VASSAL.build.GameModule} and applies to all maps */ public class GlobalKeyCommand extends MassKeyCommand { - public void addTo(Buildable parent) { - ((GameModule) parent).getToolBar().add(getLaunchButton()); - } - public void removeFrom(Buildable parent) { - ((GameModule) parent).getToolBar().remove(getLaunchButton()); - } - - public void apply() { + public void apply() { List l = new ArrayList(); for (Iterator it = Map.getAllMaps(); it.hasNext();) { l.add(it.next()); } GameModule.getGameModule().sendAndLog( globalCommand.apply((Map[]) l.toArray(new Map[l.size()]), - filter)); + getFilter())); } } Modified: VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/MassKeyCommand.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/MassKeyCommand.java 2006-11-15 20:55:42 UTC (rev 1460) +++ VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/MassKeyCommand.java 2006-11-15 22:48:26 UTC (rev 1461) @@ -43,6 +43,7 @@ import VASSAL.build.module.Map; import VASSAL.build.module.documentation.HelpFile; import VASSAL.build.module.gamepieceimage.StringEnumConfigurer; +import VASSAL.build.module.properties.PropertySource; import VASSAL.configure.Configurer; import VASSAL.configure.ConfigurerFactory; import VASSAL.configure.HotKeyConfigurer; @@ -60,6 +61,7 @@ import VASSAL.counters.PropertiesPieceFilter; import VASSAL.tools.FormattedString; import VASSAL.tools.LaunchButton; +import VASSAL.tools.ToolBarComponent; /** * Adds a button to a map window toolbar. Hitting the button applies a particular key command to all pieces on that map @@ -91,6 +93,8 @@ protected String checkProperty; protected String checkValue; protected String propertiesFilter; + protected PropertySource propertySource; + protected boolean filterIsDynamic; protected PieceFilter filter; private Map map; protected GlobalCommand globalCommand = new GlobalCommand(); @@ -106,8 +110,15 @@ } public void addTo(Buildable parent) { - map = (Map) parent; - map.getToolBar().add(launch); + if (parent instanceof Map) { + map = (Map) parent; + } + if (parent instanceof ToolBarComponent) { + ((ToolBarComponent)parent).getToolBar().add(launch); + } + if (parent instanceof PropertySource) { + propertySource = (PropertySource) parent; + } } public void apply() { @@ -115,7 +126,7 @@ } public void apply(Map m) { - GameModule.getGameModule().sendAndLog(globalCommand.apply(m, filter)); + GameModule.getGameModule().sendAndLog(globalCommand.apply(m, getFilter())); } public Class[] getAllowableConfigureComponents() { @@ -316,15 +327,24 @@ } public void removeFrom(Buildable parent) { - map.getToolBar().remove(launch); + if (parent instanceof ToolBarComponent) { + ((ToolBarComponent)parent).getToolBar().remove(launch); + } } + public PieceFilter getFilter() { + if (filterIsDynamic) { + buildFilter(); + } + return filter; + } + private void buildFilter() { if (checkValue != null) { propertiesFilter = checkProperty + "=" + checkValue; } if (propertiesFilter != null) { - filter = PropertiesPieceFilter.parse(propertiesFilter); + filter = PropertiesPieceFilter.parse(new FormattedString(propertiesFilter).getText(propertySource)); } if (filter != null && condition != null) { filter = new BooleanAndPieceFilter(filter, new PieceFilter() { @@ -394,6 +414,7 @@ } else if (PROPERTIES_FILTER.equals(key)) { propertiesFilter = (String) value; + filterIsDynamic = propertiesFilter != null && propertiesFilter.indexOf('$') >= 0; buildFilter(); } else if (CONDITION.equals(key)) { @@ -420,4 +441,5 @@ launch.setAttribute(key, value); } } + } Modified: VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/StackMetrics.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/StackMetrics.java 2006-11-15 20:55:42 UTC (rev 1460) +++ VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/StackMetrics.java 2006-11-15 22:48:26 UTC (rev 1461) @@ -464,7 +464,7 @@ if (index < 0) { throw new RuntimeException(c.getId() + " is not contained in " + parent.getId()); } - Point[] pos = new Point[index + 1]; + Point[] pos = new Point[parent.getPieceCount()]; getContents(parent, pos, null, null, 0, 0); return pos[index]; } Modified: VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java 2006-11-15 20:55:42 UTC (rev 1460) +++ VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java 2006-11-15 22:48:26 UTC (rev 1461) @@ -119,7 +119,6 @@ } } catch (NumberFormatException e) { - e.printStackTrace(); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <swa...@us...> - 2006-11-15 20:55:46
|
Revision: 1460 http://svn.sourceforge.net/vassalengine/?rev=1460&view=rev Author: swampwallaby Date: 2006-11-15 12:55:42 -0800 (Wed, 15 Nov 2006) Log Message: ----------- Commit ready for upgrade to 3.2 Modified Paths: -------------- VSQL-src/trunk/.classpath Added Paths: ----------- VSQL-src/trunk/Inventory/TorstenInventory.java VSQL-src/trunk/bin/ VSQL-src/trunk/samlords/ VSQL-src/trunk/samlords/NewZone.java VSQL-src/trunk/samlords/SamLordsCommandEncoder.java VSQL-src/trunk/samlords/ZoneControl.java VSQL-src/trunk/samlords/ZoneHighlight.java VSQL-src/trunk/samlords/ZoneProperty.java VSQL-src/trunk/samlords/ZonedGrid.java VSQL-src/trunk/samlords/ZonedGridHighlighter.java Modified: VSQL-src/trunk/.classpath =================================================================== --- VSQL-src/trunk/.classpath 2006-11-15 20:54:46 UTC (rev 1459) +++ VSQL-src/trunk/.classpath 2006-11-15 20:55:42 UTC (rev 1460) @@ -1,8 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path=""/> - <classpathentry exported="true" kind="src" path="/VASSAL"/> <classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> - <classpathentry kind="lib" path="D:/eclipse312/libraries/jep-2.4.0/dist/jep-2.4.0.jar"/> + <classpathentry combineaccessrules="false" kind="src" path="/VASSAL-merge"/> <classpathentry kind="output" path="bin"/> </classpath> Added: VSQL-src/trunk/Inventory/TorstenInventory.java =================================================================== --- VSQL-src/trunk/Inventory/TorstenInventory.java (rev 0) +++ VSQL-src/trunk/Inventory/TorstenInventory.java 2006-11-15 20:55:42 UTC (rev 1460) @@ -0,0 +1,1203 @@ +/* + * $Id: Inventory.java,v 1.7 2006/06/30 05:53:26 rodneykinney Exp $ + * + * Copyright (c) 2000-2005 by Rodney Kinney, Brent Easton, Torsten Spindler + * + * 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 Inventory; + +import java.awt.Component; +import java.awt.Graphics; +import java.awt.Rectangle; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.File; +import java.net.MalformedURLException; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Vector; + +import javax.swing.Box; +import javax.swing.BoxLayout; +import javax.swing.Icon; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JOptionPane; +import javax.swing.JPopupMenu; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTree; +import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; +import javax.swing.event.TreeModelEvent; +import javax.swing.event.TreeModelListener; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultTreeCellRenderer; +import javax.swing.tree.TreeCellRenderer; +import javax.swing.tree.TreeModel; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; + +import VASSAL.build.AbstractConfigurable; +import VASSAL.build.AutoConfigurable; +import VASSAL.build.Buildable; +import VASSAL.build.GameModule; +import VASSAL.build.module.Chatter; +import VASSAL.build.module.GameComponent; +import VASSAL.build.module.PlayerRoster; +import VASSAL.build.module.documentation.HelpFile; +import VASSAL.build.module.map.MenuDisplayer; +import VASSAL.build.module.properties.PropertySource; +import VASSAL.command.Command; +import VASSAL.command.NullCommand; +import VASSAL.configure.Configurer; +import VASSAL.configure.ConfigurerFactory; +import VASSAL.configure.GamePieceFormattedStringConfigurer; +import VASSAL.configure.HotKeyConfigurer; +import VASSAL.configure.IconConfigurer; +import VASSAL.configure.StringArrayConfigurer; +import VASSAL.configure.StringEnum; +import VASSAL.configure.VisibilityCondition; +import VASSAL.counters.BoundsTracker; +import VASSAL.counters.GamePiece; +import VASSAL.counters.PieceCloner; +import VASSAL.counters.PieceFilter; +import VASSAL.counters.PieceIterator; +import VASSAL.counters.Properties; +import VASSAL.counters.PropertiesPieceFilter; +import VASSAL.counters.Stack; +import VASSAL.preferences.PositionOption; +import VASSAL.tools.FormattedString; +import VASSAL.tools.LaunchButton; + +public class TorstenInventory extends AbstractConfigurable implements GameComponent { + protected LaunchButton launch; + protected CounterInventory results; + protected JTree tree; + + public static final String VERSION = "2.0"; + public static final String HOTKEY = "hotkey"; + public static final String BUTTON_TEXT = "text"; + public static final String NAME = "name"; + public static final String ICON = "icon"; + public static final String TOOLTIP = "tooltip"; + public static final String DEST = "destination"; + + /* + * For use in formatted text output. + */ + final protected String mapSeparator = "\n"; + final protected String groupSeparator = " "; + + /* + * Options Destination - Chat, Dialog, File. + */ + public static final String DEST_CHAT = "Chat Window"; + public static final String DEST_DIALOG = "Dialog Window"; + public static final String DEST_TREE = "Tree Window"; + protected String destination = DEST_TREE; + + public static final String FILTER = "include"; + protected String piecePropertiesFilter = ""; + + public static final String GROUP_BY = "groupBy"; + protected String[] groupBy = {""}; + + public static final String NON_LEAF_FORMAT = "nonLeafFormat"; + protected String nonLeafFormat = "$PropertyValue$"; + + public static final String NON_LEAF_LOW_FORMAT = "nonLeafLowFormat"; + protected String nonLeafLowFormat = "$PropertyValue$"; + + public static final String CENTERONPIECE = "centerOnPiece"; + protected boolean centerOnPiece = true; + + public static final String FORWARD_KEYSTROKE = "forwardKeystroke"; + protected boolean forwardKeystroke = true; + + public static final String SHOW_MENU = "showMenu"; + protected boolean showMenu = true; + + public static final String SIDES = "sides"; + protected String[] sides = null; + + public static final String KEYSTROKE = "keystroke"; + protected KeyStroke keyStroke = null; + + public static final String CUTBELOWROOT = "cutRoot"; + protected int cutBelowRoot = 0; + + public static final String CUTABOVELEAVES = "cutLeaves"; + protected int cutAboveLeaves = 0; + + public static final String LEAF_FORMAT = "leafFormat"; + protected String pieceFormat = "$PieceName$"; + + public static final String PIECE_ZOOM = "pieceZoom"; + protected double pieceZoom = .25; + + public static final String DRAW_PIECES = "drawPieces"; + protected boolean drawPieces = true; + + public static final String FOLDERS_ONLY = "foldersOnly"; + protected boolean foldersOnly = false; + + protected JDialog frame; + + public TorstenInventory() { + ActionListener al = new ActionListener() { + public void actionPerformed(ActionEvent e) { + launch(); + } + }; + launch = new LaunchButton(null, TOOLTIP, BUTTON_TEXT, HOTKEY, ICON, al); + setAttribute(NAME, "Inventory"); + setAttribute(BUTTON_TEXT, "Inventory"); + setAttribute(TOOLTIP, "Show inventory of all pieces"); + setAttribute(ICON, "/images/inventory.gif"); + launch.setEnabled(false); + launch.setVisible(false); + } + + public static String getConfigureTypeName() { + return "Game Piece Inventory Window"; + } + + public void addTo(Buildable b) { + launch.setAlignmentY(0.0F); + GameModule.getGameModule().getToolBar().add(getComponent()); + GameModule.getGameModule().getGameState().addGameComponent(this); + frame = new JDialog(GameModule.getGameModule().getFrame()); + frame.setTitle(getConfigureName()); + String key = "Inventory." + getConfigureName(); + GameModule.getGameModule().getPrefs().addOption(new PositionOption(key, frame)); + frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); + frame.getContentPane().add(initTree()); + frame.getContentPane().add(initButtons()); + frame.setSize(150, 350); + } + + /** + * Construct an explorer like interface for the selected counters + */ + protected Component initTree() { + // Initialize the tree to be displayed from the results tree + tree = new JTree(); + tree.setRootVisible(false); + tree.setShowsRootHandles(true); + tree.setCellRenderer(initTreeCellRenderer()); + tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); + // If wanted center on a selected counter + tree.addTreeSelectionListener(new TreeSelectionListener() { + public void valueChanged(TreeSelectionEvent e) { + if (centerOnPiece) { + GamePiece piece = getSelectedCounter(); + if (piece != null) + piece.getMap().centerAt(piece.getPosition()); + } + } + }); + tree.addMouseListener(new MouseAdapter() { + public void mouseReleased(MouseEvent e) { + if (showMenu && e.isMetaDown()) { + final TreePath path = tree.getPathForLocation(e.getX(), e.getY()); + if (path != null) { + if (path.getLastPathComponent() instanceof CounterNode) { + final CounterNode node = (CounterNode) path.getLastPathComponent(); + final GamePiece p = node.getCounter().getPiece(); + JPopupMenu menu = MenuDisplayer.createPopup(p); + menu.addPropertyChangeListener("visible", new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + if (Boolean.FALSE.equals(evt.getNewValue())) { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + refresh(); + } + }); + } + } + }); + menu.show(tree, e.getX(), e.getY()); + } + } + } + } + }); + tree.addKeyListener(new HotKeySender()); + + JScrollPane scrollPane = new JScrollPane(tree, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + return scrollPane; + } + + protected TreeCellRenderer initTreeCellRenderer() { + return new DefaultTreeCellRenderer() { + + public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { + super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf && !foldersOnly, row, hasFocus); + if (value instanceof CounterNode) { + final GamePiece piece = ((CounterNode) value).getCounter().getPiece(); + if (piece != null) { + final Rectangle r = piece.getShape().getBounds(); + r.x = (int) Math.round(r.x * pieceZoom); + r.y = (int) Math.round(r.y * pieceZoom); + r.width = (int) Math.round(r.width * pieceZoom); + r.height = (int) Math.round(r.height * pieceZoom); + setIcon(new Icon() { + + public int getIconHeight() { + return r.height; + } + + public int getIconWidth() { + return r.width; + } + + public void paintIcon(Component c, Graphics g, int x, int y) { + piece.draw(g, -r.x, -r.y, c, pieceZoom); + } + + }); + } + } + return this; + } + + }; + } + + protected Component initButtons() { + Box buttonBox = Box.createHorizontalBox(); + JButton refreshButton = new JButton("Refresh"); + refreshButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + refresh(); + } + }); + buttonBox.add(refreshButton); + JButton closeButton = new JButton("Close"); + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + frame.setVisible(false); + } + }); + buttonBox.add(closeButton); + return buttonBox; + } + + public GamePiece getSelectedCounter() { + GamePiece piece = null; + CounterNode node = (CounterNode) tree.getLastSelectedPathComponent(); + if (node != null && node.isLeaf()) { + piece = node.getCounter().getPiece(); + } + return piece; + } + + protected Component getComponent() { + return launch; + } + + public void removeFrom(Buildable b) { + GameModule.getGameModule().getToolBar().remove(getComponent()); + GameModule.getGameModule().getGameState().removeGameComponent(this); + } + + public void add(Buildable b) { + } + + public void remove(Buildable b) { + } + + protected void launch() { + refresh(); + frame.setVisible(true); + } + + private void buildTreeModel() { + ArrayList path = new ArrayList(); + for (int i = 0; i < groupBy.length; i++) + path.add(groupBy[i]); + results = new CounterInventory(new Counter(this.getConfigureName()), path); + + PieceIterator pi = new PieceIterator(GameModule.getGameModule().getGameState().getPieces(), new Selector(piecePropertiesFilter)); + + while (pi.hasMoreElements()) { + ArrayList groups = new ArrayList(); + GamePiece p = pi.nextPiece(); + + for (int i = 0; i < groupBy.length; i++) { + if (groupBy[i].length() > 0) { + String prop = (String) p.getProperty(groupBy[i]); + if (prop != null) + groups.add(p.getProperty(groupBy[i])); + } + } + + int count = 1; + if (nonLeafFormat.length() > 0) + count = getTotalValue(p); + + Counter c; + c = new Counter(p, groups, count, pieceFormat); + // Store + results.insert(c); + } + } + + protected int getTotalValue(GamePiece p) { + String s = (String) p.getProperty(nonLeafFormat); + int count = 1; + try { + count = Integer.parseInt(s); + } + catch (Exception e) { + count = 1; + } + + return count; + } + + public VASSAL.build.module.documentation.HelpFile getHelpFile() { + File dir = VASSAL.build.module.Documentation.getDocumentationBaseDir(); + dir = new File(dir, "ReferenceManual"); + try { + return new HelpFile(null, new File(dir, "Inventory.htm")); + } + catch (MalformedURLException ex) { + return null; + } + } + + public Class[] getAllowableConfigureComponents() { + return new Class[0]; + } + + public String[] getAttributeDescriptions() { + return new String[] {"Name", "Button text", "Button icon", "Hotkey", "Tooltip", "Show only pieces matching these properties", "Sort and Group By Properties", + "Label for folders", "Label for lowest level folders", + "Show only folders", "Label for pieces", "Center on selected piece", "Forward key strokes to selected piece", + "Show right-click menu of piece", "Draw piece images", "Zoom factor", "Available to these sides"}; + } + + public Class[] getAttributeTypes() { + return new Class[] {String.class, String.class, IconConfig.class, KeyStroke.class, String.class, String.class, String[].class, String.class, + String.class, Boolean.class, + PieceFormatConfig.class, Boolean.class, Boolean.class, Boolean.class, Boolean.class, Double.class, String[].class}; + } + + public String[] getAttributeNames() { + return new String[] {NAME, BUTTON_TEXT, ICON, HOTKEY, TOOLTIP, FILTER, GROUP_BY, NON_LEAF_FORMAT, NON_LEAF_LOW_FORMAT, FOLDERS_ONLY, LEAF_FORMAT, CENTERONPIECE, + FORWARD_KEYSTROKE, SHOW_MENU, DRAW_PIECES, PIECE_ZOOM, SIDES}; + } + + public static class IconConfig implements ConfigurerFactory { + public Configurer getConfigurer(AutoConfigurable c, String key, String name) { + return new IconConfigurer(key, name, "/images/inventory.gif"); + } + } + public static class PieceFormatConfig implements ConfigurerFactory { + public Configurer getConfigurer(AutoConfigurable c, String key, String name) { + return new GamePieceFormattedStringConfigurer(key, name); + } + } + + public void setAttribute(String key, Object o) { + if (NAME.equals(key)) { + setConfigureName((String) o); + } + else if (FILTER.equals(key)) { + piecePropertiesFilter = (String) o; + } + else if (GROUP_BY.equals(key)) { + if (o instanceof String) { + o = StringArrayConfigurer.stringToArray((String) o); + } + groupBy = (String[]) o; + } + else if (NON_LEAF_FORMAT.equals(key)) { + nonLeafFormat = (String) o; + } + else if (NON_LEAF_LOW_FORMAT.equals(key)) { + nonLeafLowFormat = (String) o; + } + else if (LEAF_FORMAT.equals(key)) { + pieceFormat = (String) o; + } + else if (CENTERONPIECE.equals(key)) { + centerOnPiece = getBooleanValue(o); + } + else if (SHOW_MENU.equals(key)) { + showMenu = getBooleanValue(o); + } + else if (DRAW_PIECES.equals(key)) { + drawPieces = getBooleanValue(o); + } + else if (FOLDERS_ONLY.equals(key)) { + foldersOnly = getBooleanValue(o); + cutAboveLeaves = foldersOnly ? 1 : 0; + } + else if (PIECE_ZOOM.equals(key)) { + if (o instanceof String) { + o = Double.valueOf((String) o); + } + pieceZoom = ((Double) o).doubleValue(); + } + else if (FORWARD_KEYSTROKE.equals(key)) { + forwardKeystroke = getBooleanValue(o); + } + else if (SIDES.equals(key)) { + if (o instanceof String) { + o = StringArrayConfigurer.stringToArray((String) o); + } + sides = (String[]) o; + } + else if (KEYSTROKE.equals(key)) { + if (o instanceof String) { + o = HotKeyConfigurer.decode((String) o); + } + keyStroke = (KeyStroke) o; + } + else if (CUTBELOWROOT.equals(key)) { + if (o instanceof String) + cutBelowRoot = Integer.parseInt((String) o); + else { + cutBelowRoot = ((Integer) o).intValue(); + } + } + else if (CUTABOVELEAVES.equals(key)) { + if (o instanceof String) + cutAboveLeaves = Integer.parseInt((String) o); + else { + cutAboveLeaves = ((Integer) o).intValue(); + } + } + + else { + launch.setAttribute(key, o); + } + } + + private VisibilityCondition piecesVisible = new VisibilityCondition() { + public boolean shouldBeVisible() { + return !foldersOnly; + } + }; + + public VisibilityCondition getAttributeVisibility(String name) { + if (PIECE_ZOOM.equals(name)) { + return new VisibilityCondition() { + public boolean shouldBeVisible() { + return drawPieces && !foldersOnly; + } + }; + } + else if (LEAF_FORMAT.equals(name) || CENTERONPIECE.equals(name) || FORWARD_KEYSTROKE.equals(name) || SHOW_MENU.equals(name) || DRAW_PIECES.equals(name)) { + return piecesVisible; + } + else { + return super.getAttributeVisibility(name); + } + } + + /** + * @param o + */ + protected boolean getBooleanValue(Object o) { + if (o instanceof String) { + o = new Boolean((String) o); + } + return ((Boolean) o).booleanValue(); + } + + public String getAttributeValueString(String key) { + if (NAME.equals(key)) { + return getConfigureName(); + } + else if (FILTER.equals(key)) { + return piecePropertiesFilter; + } + else if (GROUP_BY.equals(key)) { + return StringArrayConfigurer.arrayToString(groupBy); + } + else if (NON_LEAF_FORMAT.equals(key)) { + return nonLeafFormat; + } + else if (NON_LEAF_LOW_FORMAT.equals(key)) { + return nonLeafLowFormat; + } + else if (LEAF_FORMAT.equals(key)) { + return pieceFormat; + } + else if (CENTERONPIECE.equals(key)) { + return String.valueOf(centerOnPiece); + } + else if (FORWARD_KEYSTROKE.equals(key)) { + return String.valueOf(forwardKeystroke); + } + else if (SHOW_MENU.equals(key)) { + return String.valueOf(showMenu); + } + else if (DRAW_PIECES.equals(key)) { + return String.valueOf(drawPieces); + } + else if (FOLDERS_ONLY.equals(key)) { + return String.valueOf(foldersOnly); + } + else if (PIECE_ZOOM.equals(key)) { + return String.valueOf(pieceZoom); + } + else if (SIDES.equals(key)) { + return StringArrayConfigurer.arrayToString(sides); + } + else if (KEYSTROKE.equals(key)) { + return HotKeyConfigurer.encode(keyStroke); + } + else if (CUTBELOWROOT.equals(key)) { + return cutBelowRoot + ""; + } + else if (CUTABOVELEAVES.equals(key)) { + return cutAboveLeaves + ""; + } + else { + return launch.getAttributeValueString(key); + } + } + + public Command getRestoreCommand() { + return null; + } + + public void setup(boolean gameStarting) { + launch.setEnabled(gameStarting && enabledForPlayersSide()); + launch.setVisible(launch.isEnabled()); + } + + protected boolean enabledForPlayersSide() { + if (sides == null || sides.length == 0) + return true; + for (int i = 0; i < sides.length; i++) { + if (sides[i].equalsIgnoreCase(PlayerRoster.getMySide())) + return true; + } + return false; + } + + protected void executeCommand() { + if (destination.equals(DEST_CHAT)) { + Command c = new NullCommand(); + String res[] = results.getResultStringArray(); + + for (int i = 0; i < res.length; i++) { + c.append(new Chatter.DisplayText(GameModule.getGameModule().getChatter(), res[i])); + } + c.execute(); + GameModule.getGameModule().sendAndLog(c); + } + else if (destination.equals(DEST_DIALOG)) { + String res[] = results.getResultStringArray(); + String text = ""; + for (int i = 0; i < res.length; i++) { + text += res[i] + "\n"; + } + JTextArea textArea = new JTextArea(text); + textArea.setEditable(false); + + JScrollPane scrollPane = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); + + JOptionPane.showMessageDialog(GameModule.getGameModule().getFrame(), scrollPane, getConfigureName(), JOptionPane.PLAIN_MESSAGE); + } + else if (destination.equals(DEST_TREE)) { + initTree(); + } + } + + /** + * @return Command which only has some text in. The actual processing is done + * within the pieces. + */ + protected Command sendHotKeyToPieces(final KeyStroke keyStroke) { + Command c = new NullCommand(); + final TreePath[] tp = tree.getSelectionPaths(); + // set to not get duplicates + HashSet pieces = new HashSet(); + for (int i = 0; i < tp.length; i++) { + CounterNode node = (CounterNode) tp[i].getLastPathComponent(); + if (node.isLeaf()) { + pieces.add(node.getCounter().getPiece()); + } + else { + for (Iterator j = node.iterator(); j.hasNext();) { + CounterNode childNode = (CounterNode) j.next(); + if (childNode.isLeaf()) + pieces.add(childNode.getCounter().getPiece()); + } + } + } + for (Iterator i = pieces.iterator(); i.hasNext();) { + GamePiece piece = (GamePiece) i.next(); + GameModule.getGameModule().sendAndLog(piece.keyEvent(keyStroke)); + } + return c; + } + + protected Command myUndoCommand() { + return null; + } + + private void refresh() { + // Make an attempt to keep the same nodes expanded + Set expanded = new HashSet(); + for (int i = 0, n = tree.getRowCount(); i < n; ++i) { + if (tree.isExpanded(i)) { + expanded.add(tree.getPathForRow(i).getLastPathComponent().toString()); + } + } + buildTreeModel(); + tree.setModel(results); + for (int i = 0; i < tree.getRowCount(); ++i) { + if (expanded.contains(tree.getPathForRow(i).getLastPathComponent().toString())) { + tree.expandRow(i); + } + } + } + + public class HotKeySender implements KeyListener { + BoundsTracker tracker; + + public void keyCommand(KeyStroke stroke) { + if (forwardKeystroke) { + CounterNode node = (CounterNode) tree.getLastSelectedPathComponent(); + if (node != null) { + Command comm = getCommand(node, stroke); + if (comm != null && !comm.isNull()) { + tracker.repaint(); + GameModule.getGameModule().sendAndLog(comm); + tracker = null; + refresh(); + } + } + } + } + + protected Command getCommand(CounterNode node, KeyStroke stroke) { + GamePiece p = node.getCounter() == null ? null : node.getCounter().getPiece(); + Command comm = null; + if (p != null) { + // Save state first + p.setProperty(Properties.SNAPSHOT, PieceCloner.getInstance().clonePiece(p)); + if (tracker == null) { + tracker = new BoundsTracker(); + tracker.addPiece(p); + } + comm = p.keyEvent(stroke); + } + else { + comm = new NullCommand(); + for (int i = 0, n = node.getChildCount(); i < n; ++i) { + comm = comm.append(getCommand((CounterNode) node.getChild(i), stroke)); + } + } + return comm; + } + + public void keyPressed(KeyEvent e) { + keyCommand(KeyStroke.getKeyStrokeForEvent(e)); + } + + public void keyReleased(KeyEvent e) { + keyCommand(KeyStroke.getKeyStrokeForEvent(e)); + } + + public void keyTyped(KeyEvent e) { + keyCommand(KeyStroke.getKeyStrokeForEvent(e)); + } + + } + public static class Dest extends StringEnum { + public String[] getValidValues(AutoConfigurable target) { + return new String[] {DEST_CHAT, DEST_DIALOG, DEST_TREE}; + } + } + + /** + * Holds static information of and a reference to a gamepiece. Pay attention + * to the equals method. It checks if two pieces can be found under the same + * path! + * + * @author Brent Easton and Torsten Spindler + * + */ + public class Counter implements PropertySource { + // The gamepiece is stored here to allow dynamic changes of name, location + // and so forth + protected GamePiece piece; + protected ArrayList groups; + protected int value; + // Only used when no piece is defined + protected String localName; + protected FormattedString format; + protected FormattedString childlessFormat; + protected CounterNode node; + + public Counter(String name) { + this(null, null, 0, nonLeafFormat, nonLeafLowFormat); + this.localName = name; + } + + public Counter(GamePiece piece, ArrayList groups, int value, String format) { + this(piece, groups, value, format, ""); + } + + public Counter(GamePiece piece, ArrayList groups, int value, String format, String childlessFormat) { + this.piece = piece; + this.value = value; + this.groups = groups; + this.format = new FormattedString(format); + this.childlessFormat = new FormattedString(childlessFormat); + } + + // piece can be null, so provide a alternate name + public String getName() { + if (piece != null) + return piece.getName(); + return localName; + } + + public int hashCode() { + return getName().hashCode(); + } + + public String toString() { + if (node != null && node.isLeafParent()) { + return childlessFormat.getText(this); + } + else { + return format.getText(this); + } + } + + public String[] getPath() { + String[] retString = new String[groups.size()]; + for (int i = 0; i < groups.size(); i++) + retString[i] = (String) groups.get(i); + return retString; + } + + public int getValue() { + return value; + } + + public void setValue(int value) { + this.value = value; + } + + public GamePiece getPiece() { + return piece; + } + + public void setPiece(GamePiece piece) { + this.piece = piece; + } + + public boolean equals(Object o) { + if (!(o instanceof Counter)) + return false; + Counter c = (Counter) o; + return getPath().equals(c.getPath()); + } + + public Object getProperty(Object key) { + Object value = null; + String s = (String) key; + if (s.startsWith("sum_")) { + if (piece != null) { + value = piece.getProperty(s.substring(4)); + } + else { + int sum = 0; + int n = results.getChildCount(node); + for (int i = 0; i < n; ++i) { + try { + CounterNode childNode = (CounterNode) results.getChild(node, i); + sum += Integer.parseInt((String) (childNode.getCounter()).getProperty(key)); + } + catch (NumberFormatException e) { + sum++; + } + } + value = String.valueOf(sum); + } + } + else if (s.equals("count")) { + value = String.valueOf(results.getChildCount(node)); + } + else if ("PropertyValue".equals(s)) { + return localName; + } + else if (piece != null) { + value = piece.getProperty(key); + } + return value; + } + + public void setNode(CounterNode node) { + this.node = node; + } + + } + + /** + * Filter to select pieces required + * + * @author Brent Easton + */ + protected class Selector implements PieceFilter { + + protected PieceFilter filter; + + public Selector(String include) { + if (include != null && include.length() > 0) { + filter = PropertiesPieceFilter.parse(include); + } + } + + public boolean accept(GamePiece piece) { + // Honor visibility + + if (Boolean.TRUE.equals(piece.getProperty(Properties.INVISIBLE_TO_ME))) + return false; + + // Ignore Stacks, pieces are reported individually from GameState + if (piece instanceof Stack) + return false; + + // Don't report pieces with no map + if (piece.getMap() == null) + return false; + + // Check for marker + if (filter != null) { + return filter.accept(piece); + } + + // Default Accept piece + return true; + } + + } + + /** + * CounterNode for the result tree. + * + * @author spindler + * + */ + public class CounterNode { + protected final String entry; + protected final Counter counter; + protected List children; + protected int level; + + // protected int depth; + + public CounterNode(final String entry, final Counter counter, final int level) { + this(entry, counter); + this.level = level; + } + + protected CounterNode(String entry, Counter counter) { + this.level = 0; + // this.depth = 0; + this.entry = entry; + this.counter = counter; + counter.setNode(this); + children = new ArrayList(); + } + + public String toString() { + if (counter != null) + return counter.toString(); + return getEntry(); + } + + protected String separator() { + StringBuffer sep = new StringBuffer(); + if (children.isEmpty()) { + sep.append(groupSeparator); + } + else { + sep.append(mapSeparator); + for (int i = 0; i < getLevel(); i++) + sep.append(groupSeparator); + } + return sep.toString(); + } + + public String toResultString() { + StringBuffer name = new StringBuffer(); + + name.append(separator()); + + if (counter != null) + name.append(counter.toString()); + else + name.append(getEntry()); + + for (Iterator i = children.iterator(); i.hasNext();) { + CounterNode child = (CounterNode) i.next(); + name.append(child.toResultString()); + } + return name.toString(); + } + + public String getEntry() { + return entry; + } + + public Counter getCounter() { + return counter; + } + + public void addChild(final CounterNode counterNode) { + children.add(counterNode); + } + + public void addChild(final int i, final CounterNode counterNode) { + children.add(i, counterNode); + } + + public void removeChild(CounterNode child) { + children.remove(child); + } + + public int getChildCount() { + return children.size(); + } + + public boolean isLeaf() { + return children.isEmpty(); + } + + public Object getChild(final int index) { + return children.get(index); + } + + public int getIndexOfChild(final Object child) { + return children.indexOf(child); + } + + public int getLevel() { + return level; + } + + public void setLevel(final int level) { + this.level = level; + } + + public int updateValues() { + int value = 0; + if (counter != null) + value = counter.getValue(); + + // inform children about update + for (Iterator i = children.iterator(); i.hasNext();) { + CounterNode child = (CounterNode) i.next(); + value += child.updateValues(); + } + + // save new value in counter + counter.setValue(value); + return counter.getValue(); + } + + public Iterator iterator() { + return children.iterator(); + } + + public void cutLevel(int cut) { + if (cut == 0) { + children.clear(); + return; + } + for (Iterator i = children.iterator(); i.hasNext();) { + CounterNode child = (CounterNode) i.next(); + child.cutLevel(cut - 1); + } + } + + public void cutLeaves() { + List toBeRemoved = new ArrayList(); + for (Iterator i = children.iterator(); i.hasNext();) { + CounterNode child = (CounterNode) i.next(); + if (child.isLeaf()) { + toBeRemoved.add(child); + } + else + child.cutLeaves(); + } + for (Iterator i = toBeRemoved.iterator(); i.hasNext();) { + CounterNode removeMe = (CounterNode) i.next(); + children.remove(removeMe); + } + } + + // Are all my children leaves? + public boolean isLeafParent() { + return !isLeaf() && ((CounterNode) children.get(0)).isLeaf(); + } + + } + + public class CounterInventory implements TreeModel { + // Needed for TreeModel + private Vector treeModelListeners = new Vector(); + // This contains shortcuts to the nodes of the tree + protected Map inventory; + // The start of the tree + protected CounterNode root; + // Text view of the tree + protected String resultString; + // The path determines where a counter is found in the tree + protected ArrayList path; + // Small speed up, only update values in tree when something has changed + protected boolean changed; + + public CounterInventory(Counter c, ArrayList path) { + this.root = new CounterNode(c.getName(), c); + this.path = path; + this.inventory = new HashMap(); + changed = true; + } + + /** + * insert counter into the tree. It is not sorted in any way. + * + * @param counter + */ + public void insert(Counter counter) { + String[] path = counter.getPath(); + StringBuffer hash = new StringBuffer(); + + CounterNode insertNode = root; + CounterNode newNode = null; + for (int j = 0; path != null && j < path.length; j++) { + hash.append(path[j]); + if (inventory.get(hash.toString()) == null) { + newNode = new CounterNode(path[j], new Counter(path[j]), insertNode.getLevel() + 1); + inventory.put(hash.toString(), newNode); + insertNode.addChild(newNode); + } + insertNode = (CounterNode) inventory.get(hash.toString()); + } + newNode = new CounterNode(counter.toString(), counter, insertNode.getLevel() + 1); + insertNode.addChild(newNode); + changed = true; + } + + private void updateEntries() { + root.updateValues(); + } + + /** + * Deliver information of the tree as text. + * + * @return String + */ + public String getResultString() { + if (changed) + updateTree(); + changed = false; + return root.toResultString(); + } + + /** + * Compatibility for DisplayResults class. + * + * @return String[] + */ + public String[] getResultStringArray() { + return new String[] {getResultString()}; + } + + public Object getRoot() { + if (changed) + updateTree(); + return root; + } + + private void updateTree() { + updateEntries(); + if (cutBelowRoot > 0) + root.cutLevel(cutBelowRoot); + for (int i = cutAboveLeaves; i > 0; i--) + root.cutLeaves(); + changed = false; + } + + public int getChildCount(Object parent) { + CounterNode counter = (CounterNode) parent; + return counter.getChildCount(); + } + + public boolean isLeaf(Object node) { + CounterNode counter = (CounterNode) node; + return counter.isLeaf(); + } + + public void addTreeModelListener(TreeModelListener l) { + treeModelListeners.add(l); + } + + public void removeTreeModelListener(TreeModelListener l) { + treeModelListeners.remove(l); + } + + public void fireNodesRemoved(Object[] path, int[] childIndices, Object[] children) { + TreeModelEvent e = new TreeModelEvent(this, path, childIndices, children); + for (Enumeration en = treeModelListeners.elements(); en.hasMoreElements();) { + ((TreeModelListener) en.nextElement()).treeNodesRemoved(e); + } + + } + + public Object getChild(Object parent, int index) { + CounterNode counter = (CounterNode) parent; + return counter.getChild(index); + } + + public int getIndexOfChild(Object parent, Object child) { + CounterNode counter = (CounterNode) parent; + return counter.getIndexOfChild(child); + } + + public void valueForPathChanged(TreePath path, Object newValue) { + throw new RuntimeException("No idea what to do!"); + + } + } +} Added: VSQL-src/trunk/samlords/NewZone.java =================================================================== --- VSQL-src/trunk/samlords/NewZone.java (rev 0) +++ VSQL-src/trunk/samlords/NewZone.java 2006-11-15 20:55:42 UTC (rev 1460) @@ -0,0 +1,423 @@ +/* + * $Id: Zone.java 965 2006-09-03 16:34:05 +0000 (Sun, 03 Sep 2006) rodneykinney $ + * + * 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 samlords; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GridLayout; +import java.awt.Point; +import java.awt.Polygon; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.geom.AffineTransform; +import java.awt.geom.Area; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.HashMap; +import java.util.StringTokenizer; + +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; + +import org.w3c.dom.Element; + +import VASSAL.build.AutoConfigurable; +import VASSAL.build.Buildable; +import VASSAL.build.GameModule; +import VASSAL.build.module.Map; +import VASSAL.build.module.map.boardPicker.Board; +import VASSAL.build.module.map.boardPicker.board.HexGrid; +import VASSAL.build.module.map.boardPicker.board.MapGrid; +import VASSAL.build.module.map.boardPicker.board.RegionGrid; +import VASSAL.build.module.map.boardPicker.board.SquareGrid; +import VASSAL.build.module.map.boardPicker.board.mapgrid.PolygonEditor; +import VASSAL.build.module.properties.GlobalProperties; +import VASSAL.build.module.properties.GlobalPropertiesContainer; +import VASSAL.build.module.properties.PropertySource; +import VASSAL.configure.Configurer; +import VASSAL.configure.ConfigurerFactory; +import VASSAL.configure.FormattedStringConfigurer; +import VASSAL.tools.FormattedString; + +public class NewZone extends VASSAL.build.module.map.boardPicker.board.mapgrid.Zone implements PropertySource, GlobalPropertiesContainer { + public static final String NAME = "name"; + public static final String PATH = "path"; + public static final String USE_PARENT_GRID = "useParentGrid"; + public static final String LOCATION_FORMAT = "locationFormat"; + public static final String GRID_LOCATION = "gridLocation"; + + protected String locationFormat = "$" + NAME + "$"; + protected FormattedString format = new FormattedString(); + protected Polygon myPolygon; + protected MapGrid grid = null; + protected ZonedGrid parentGrid; + protected boolean useParentGrid; + protected ZoneHighlight highlighter; + + protected int lastBoundsX = -1; + protected int lastBoundsY = -1; + protected double lastScale = -1; + protected Shape lastScaledShape = null; + protected Shape lastTransformedShape = null; + protected Polygon lastPolygon = null; + + protected java.util.Map globalProperties = new HashMap(); + protected PropertyChangeListener globalPropertyListener; + + public NewZone() { + myPolygon = new Polygon(); + } + + public String getName() { + return name; + } + + public String[] getAttributeNames() { + String s[] = {NAME, LOCATION_FORMAT, PATH, USE_PARENT_GRID}; + return s; + } + + public String[] getAttributeDescriptions() { + return new String[]{ + "Name", + "Location Format", + "Shape", + "Use board's grid"}; + } + + public Class[] getAttributeTypes() { + return new Class[]{ + String.class, + LocationFormatConfig.class, + ShapeEditor.class, + Boolean.class}; + } + + public static class LocationFormatConfig implements ConfigurerFactory { + public Configurer getConfigurer(AutoConfigurable c, String key, String name) { + return new FormattedStringConfigurer(key, name, new String[]{NAME, GRID_LOCATION}); + } + } + + public static class ShapeEditor implements ConfigurerFactory { + public Configurer getConfigurer(AutoConfigurable c, String key, String name) { + return new Editor((NewZone) c); + } + } + + public void addTo(Buildable b) { + parentGrid = (ZonedGrid) b; + parentGrid.addZone(this); + } + + public void removeFrom(Buildable b) { + ((ZonedGrid) b).removeZone(this); + } + + public static String getConfigureTypeName() { + return "Zone"; + } + + public VASSAL.build.module.documentation.HelpFile getHelpFile() { + return null; + } + + public String getAttributeValueString(String key) { + if (NAME.equals(key)) { + return getConfigureName(); + } + else if (PATH.equals(key)) { + return PolygonEditor.polygonToString(myPolygon); + } + else if (LOCATION_FORMAT.equals(key)) { + return locationFormat; + } + else if (USE_PARENT_GRID.equals(key)) { + return String.valueOf(useParentGrid); + } + return null; + } + + public void setAttribute(String key, Object val) { + if (val == null) + return; + + if (NAME.equals(key)) { + setConfigureName((String) val); + } + else if (PATH.equals(key)) { + PolygonEditor.reset(myPolygon,(String) val); + } + else if (LOCATION_FORMAT.equals(key)) { + locationFormat = (String) val; + } + else if (USE_PARENT_GRID.equals(key)) { + useParentGrid = "true".equals(val) || Boolean.TRUE.equals(val); + } + } + + public Class[] getAllowableConfigureComponents() { + return useParentGrid ? new Class[]{} : new Class[]{HexGrid.class, SquareGrid.class, RegionGrid.class}; + } + + public String locationName(Point p) { + format.setFormat(locationFormat); + format.setProperty(NAME, getConfigureName()); + String gridLocation = null; + if (getGrid() != null) { + gridLocation = getGrid().locationName(p); + } + format.setProperty(GRID_LOCATION, gridLocation); + return format.getText(); + } + + public boolean contains(Point p) { + return myPolygon.contains(p); + } + + /** + * Snap to the grid in this zone, + */ + public Point snapTo(Point p) { + Point snap = p; + if (getGrid() != null) { + snap = getGrid().snapTo(p); + } + return snap; + } + + public Dimension getSize() { + return myPolygon.getBounds().getSize(); + } + + public void removeGrid(MapGrid grid) { + if (this.grid == grid) { + grid = null; + } + } + + public Board getBoard() { + return parentGrid.getBoard(); + } + + public Map getMap() { + return getBoard().getMap(); + } + + public void setGrid(MapGrid m) { + grid = m; + } + + public MapGrid getGrid() { + if (useParentGrid) { + return parentGrid != null ? parentGrid.getBackgroundGrid() : null; + } + return grid; + } + + public ZonedGrid getParent() { + return parentGrid; + } + + public Shape getShape() { + return myPolygon; + } + + public Rectangle getBounds() { + Rectangle r = myPolygon.getBounds(); + return r; + } + + public void setHighlight(ZoneHighlight h) { + highlighter = h; + } + + public void draw(Graphics g, Rectangle bounds, Rectangle visibleRect, double scale, boolean reversed) { + if ((getGrid() != null && getGrid().isVisible()) || highlighter != null) { + Graphics2D g2d = (Graphics2D) g; + Shape oldClip = g2d.getClip(); + Area newClip = new Area(visibleRect); + Shape s = getCachedShape(myPolygon, bounds.x, bounds.y, scale); + newClip.intersect(new Area(s)); + g2d.setClip(newClip); + if (getGrid() != null && getGrid().isVisible()) { + getGrid().draw(g, bounds, visibleRect, scale, reversed); + } + if (highlighter != null) { + highlighter.draw(g2d, s, scale); + } + g2d.setClip(oldClip); + } + } + + protected Shape getScaledShape(Polygon myPolygon, double scale) { + if (scale == lastScale && lastPolygon == myPolygon && lastScaledShape != null) { + return lastScaledShape; + } + AffineTransform transform = AffineTransform.getScaleInstance(scale, scale); + lastScaledShape = transform.createTransformedShape(myPolygon); + lastScale = scale; + lastPolygon = myPolygon; + + return lastScaledShape; + } + + protected Shape getCachedShape(Polygon poly, int x, int y, double scale) { + if (poly.equals(lastPolygon) && x == lastBoundsX && y == lastBoundsY && scale == lastScale) { + return lastTransformedShape; + } + Shape scaled = getScaledShape(myPolygon, scale); + AffineTransform transform = AffineTransform.getTranslateInstance(x, y); + lastTransformedShape = transform.createTransformedShape(scaled); + + lastPolygon = myPolygon; + lastBoundsX = x; + lastBoundsY = y; + lastScale = scale; + + return lastTransformedShape; + } + + public static class Editor extends Configurer { + private JButton button; + private PolygonEditor editor; + private Board board; + private JDialog frame; + + public Editor(final NewZone zone) { + super(PATH, null); + button = new JButton("Define Shape"); + button.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + init(zone); + } + }); + editor = new PolygonEditor(new Polygon(zone.myPolygon.xpoints,zone.myPolygon.ypoints,zone.myPolygon.npoints)) { + protected void paintBackground(Graphics g) { + if (board != null) { + board.draw(g, 0, 0, 1.0, editor); + } + else { + super.paintBackground(g); + } + } + }; + frame = new JDialog((Frame)null,zone.getConfigureName(),true); + frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS)); + JPanel labels = new JPanel(); + labels.setLayout(new GridLayout(2,2)); + labels.add(new JLabel("Drag to create initial shape")); + labels.add(new JLabel("Right-click to add point")); + labels.add(new JLabel("Left-click to move points")); + labels.add(new JLabel("DEL to remove point")); + labels.setAlignmentX(0.0f); + frame.getContentPane().add(labels); + JButton direct = new JButton("Set Coordinates directly"); + direct.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String newShape = JOptionPane.showInputDialog(frame,"Enter x,y coordinates of polygon vertices,\nseparated by spaces", + PolygonEditor.polygonToString(editor.getPolygon()).replace(';',' ')); + if (newShape != null) { + StringBuffer buffer = new StringBuffer(); + StringTokenizer st = new StringTokenizer(newShape); + while (st.hasMoreTokens()) { + buffer.append(st.nextToken()); + if (st.hasMoreTokens()) { + buffer.append(';'); + } + } + newShape = buffer.toString(); + PolygonEditor.reset(editor.getPolygon(),newShape); + editor.repaint(); + } + } + }); + direct.setAlignmentX(0.0f); + frame.getContentPane().add(direct); + frame.getContentPane().add(new JScrollPane(editor)); + JPanel buttonPanel = new JPanel(); + JButton closeButton = new JButton("Ok"); + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setValue((Object) getValueString()); + frame.setVisible(false); + GameModule.getGameModule().getDataArchive().clearScaledImageCache(); + } + }); + buttonPanel.add(closeButton); + frame.getContentPane().add(buttonPanel); + } + + private void init(NewZone zone) { + board = zone.getBoard(); + if (board != null) { + board.fixImage(editor); + } + editor.setPreferredSize(board != null ? board.getSize() : new Dimension(600,600)); + frame.pack(); + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + frame.setSize(Math.min(frame.getWidth(),d.width*2/3),Math.min(frame.getHeight(),d.height*2/3)); + frame.setVisible(true); + } + + public Component getControls() { + return button; + } + + public String getValueString() { + return PolygonEditor.polygonToString(editor.getPolygon()); + } + + public void setValue(String s) { + PolygonEditor.reset(editor.getPolygon(),s); + } + } + + public Object getProperty(Object key) { + Object value = null; + value = globalProperties.get(key); + if (value == null) { + value = getMap().getProperty(key); + } + return value; + } + + public PropertyChangeListener getPropertyListener() { + if (globalPropertyListener == null) { + globalPropertyListener = new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent evt) { + globalProperties.put(evt.getPropertyName(), evt.getNewValue()); + getMap().repaint(); + } + }; + } + return globalPropertyListener; + } +} Added: VSQL-src/trunk/samlords/SamLordsCommandEncoder.java =================================================================== --- VSQL-src/trunk/samlords/SamLordsCommandEncoder.java (rev 0) +++ VSQL-src/trunk/samlords/SamLordsCommandEncoder.java 2006-11-15 20:55:42 UTC (rev 1460) @@ -0,0 +1,33 @@ +/* + * $Id: ZoneCommandEncoder.java 925 2006-06-18 12:50:15Z swampwallaby $ + * + * Copyright (c) 2000-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 samlords; + +import VASSAL.build.module.BasicCommandEncoder; +import VASSAL.counters.Decorator; +import VASSAL.counters.GamePiece; + +public class SamLordsCommandEncoder extends BasicCommandEncoder { + + public Decorator createDecorator(String type, GamePiece inner) { + if (type.startsWith(ZoneControl.ID)) { + return new ZoneControl(type, inner); + } + return super.createDecorator(type, inner); + } +} Added: VSQL-src/trunk/samlords/ZoneControl.java =================================================================== --- VSQL-src/trunk/samlords/ZoneControl.java (rev 0) +++ VSQL-src/trunk/samlords/ZoneControl.java 2006-11-15 20:55:42 UTC (rev 1460) @@ -0,0 +1,193 @@ +package samlords; + +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 VASSAL.build.module.documentation.HelpFile; +import VASSAL.command.Command; +import VASSAL.configure.HotKeyConfigurer; +import VASSAL.configure.StringConfigurer; +import VASSAL.configure.StringEnumConfigurer; +import VASSAL.counters.Decorator; +import VASSAL.counters.EditablePiece; +import VASSAL.counters.GamePiece; +import VASSAL.counters.KeyCommand; +import VASSAL.counters.PieceEditor; +import VASSAL.tools.FormattedString; +import VASSAL.tools.SequenceEncoder; + +/* + * $Id: ZoneControl.java 888 2006-03-29 14:08:36 +0000 (Wed, 29 Mar 2006) rodneykinney $ + * + * 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. + */ + +/** + * A trait that controls a Zone Highlighter + */ +public class ZoneControl extends Decorator implements EditablePiece { + public static final String ID = "zonec;"; + public static final String VALUE = "to specific value"; + public static final String MENU = "manually using highlighter menu"; + public static final String[] OPTIONS = new String[] {MENU, VALUE}; + + protected KeyCommand[] keyCommands; + protected KeyCommand controlCommand; + protected String commandName; + protected KeyStroke key; + protected String mode; + protected FormattedString value = new FormattedString(""); + + public ZoneControl() { + this(ID + "Control;C", null); + } + + public ZoneControl(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.nextKeyStroke('D'); + mode = st.nextToken(VALUE); + value.setFormat(st.nextToken("")); + keyCommands = null; + } + + public String myGetType() { + SequenceEncoder se = new SequenceEncoder(';'); + se.append(commandName).append(key).append(mode).append(value.getFormat()); + return ID + se.getValue(); + } + + protected KeyCommand[] myGetKeyCommands() { + if (keyCommands == null) { + controlCommand = new KeyCommand(commandName, key, Decorator.getOutermost(this)); + if (commandName.length() > 0) { + keyCommands = new KeyCommand[]{controlCommand}; + } + else { + keyCommands = new KeyCommand[0]; + } + } + controlCommand.setEnabled(getMap() != null); + return keyCommands; + } + + public String myGetState() { + return ""; + } + + public Command myKeyEvent(KeyStroke stroke) { + Command c = null; + if (controlCommand != null && controlCommand.matches(stroke)) { + if (getMap() != null) { + NewZone z = (NewZone) getMap().findZone(getPosition()); + if (z != null) { + if (mode.equals(MENU)) { + z.getParent().setZoneHighlight(z); + } + else { + z.getParent().setZoneHighlight(z, value.getText(Decorator.getOutermost(this))); + } + } + } + } + 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 "Zone Control"; + } + + public HelpFile getHelpFile() { + return null; + } + + public static class Ed implements PieceEditor { + protected StringConfigurer nameInput; + protected HotKeyConfigurer keyInput; + protected StringConfigurer valueInput; + protected StringEnumConfigurer modeInput; + protected JPanel controls; + + public Ed(ZoneControl 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 HotKeyConfigurer(null, "Keyboard Command: ", p.key); + controls.add(keyInput.getControls()); + + modeInput = new StringEnumConfigurer(null, "Set Zone Owner ", OPTIONS); + modeInput.setValue(p.mode); + controls.add(modeInput.getControls()); + + valueInput = new StringConfigurer(null, "Control name: ", p.value.getFormat()); + controls.add(valueInput.getControls()); + + } + + public Component getControls() { + return controls; + } + + public String getType() { + SequenceEncoder se = new SequenceEncoder(';'); + se.append(nameInput.getValueString()).append((KeyStroke) keyInput.getValue()) + .append(modeInput.getValueString()).append(valueInput.getValueString()); + return ID + se.getValue(); + } + + public String getState() { + return ""; + } + } +} Added: VSQL-src/trunk/samlords/ZoneHighlight.java =================================================================== --- VSQL-src/trunk/samlords/ZoneHighlight.java (rev 0) +++ VSQL-src/trunk/samlords/ZoneHighlight.java 2006-11-15 20:55:42 UTC ... [truncated message content] |
From: <swa...@us...> - 2006-11-15 20:54:51
|
Revision: 1459 http://svn.sourceforge.net/vassalengine/?rev=1459&view=rev Author: swampwallaby Date: 2006-11-15 12:54:46 -0800 (Wed, 15 Nov 2006) Log Message: ----------- Merged up to trunk@1457 Modified Paths: -------------- VASSAL-src/branches/swampwallaby-jep/.classpath VASSAL-src/branches/swampwallaby-jep/VASSAL/Info.java VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/ChartWindow.java VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/PrivateMap.java VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/BoardPicker.java VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/KeyBufferer.java VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/MassKeyCommand.java VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/PieceMover.java VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/StackMetrics.java VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/Board.java VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/BoardSlot.java VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/board/mapgrid/Zone.java VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/properties/GlobalProperty.java VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Deck.java VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/DragBuffer.java VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/DynamicProperty.java VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/GlobalCommand.java VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Labeler.java VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/PieceDefiner.java VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/PieceSorter.java VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/SetGlobalProperty.java VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Stack.java VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Translate.java VASSAL-src/branches/swampwallaby-jep/VASSAL/tools/ComponentSplitter.java VASSAL-src/branches/swampwallaby-jep/VASSAL/tools/Sort.java Modified: VASSAL-src/branches/swampwallaby-jep/.classpath =================================================================== --- VASSAL-src/branches/swampwallaby-jep/.classpath 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/.classpath 2006-11-15 20:54:46 UTC (rev 1459) @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path=""/> + <classpathentry combineaccessrules="false" kind="src" path="/VASSAL-libraries"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> - <classpathentry combineaccessrules="false" kind="src" path="/VASSAL-libraries"/> <classpathentry kind="output" path="bin"/> </classpath> Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/Info.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/Info.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/Info.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -30,7 +30,7 @@ * Class for storing release-related information */ public final class Info { - private static final String VERSION = "2.9b2"; + private static final String VERSION = "2.9.3"; private static Boolean is2dEnabled; private static Boolean isDndEnabled; /** This class should not be instantiated */ Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/ChartWindow.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/ChartWindow.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/ChartWindow.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -30,6 +30,8 @@ import VASSAL.build.GameModule; import VASSAL.build.Widget; import VASSAL.build.module.documentation.HelpFile; +import VASSAL.build.widget.BoxWidget; +import VASSAL.build.widget.ListWidget; import VASSAL.build.widget.MapWidget; import VASSAL.build.widget.PanelWidget; import VASSAL.build.widget.TabWidget; @@ -147,6 +149,8 @@ VASSAL.build.widget.HtmlChart.class, TabWidget.class, PanelWidget.class, + BoxWidget.class, + ListWidget.class, MapWidget.class}; } Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/PrivateMap.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/PrivateMap.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/PrivateMap.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -181,13 +181,10 @@ public void sideChanged(String oldSide, String newSide) { super.sideChanged(oldSide, newSide); - setup(true); + ((View)getView()).disableListeners(); if (isAccessibleTo(newSide)) { ((View)getView()).enableListeners(); } - else { - ((View)getView()).disableListeners(); - } } public boolean shouldDockIntoMainWindow() { Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/BoardPicker.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/BoardPicker.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/BoardPicker.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -28,8 +28,12 @@ import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; import java.util.HashSet; +import java.util.Iterator; +import java.util.List; import java.util.Set; import java.util.Vector; import javax.swing.BoxLayout; @@ -315,19 +319,19 @@ public void setBoards(Enumeration bdEnum) { reset(); - Vector v = new Vector(); + List l = new ArrayList(); while (bdEnum.hasMoreElements()) { - v.addElement(bdEnum.nextElement()); + l.add(bdEnum.nextElement()); } - for (Enumeration e = v.elements(); e.hasMoreElements();) { - Board b = (Board) e.nextElement(); + for (Iterator e = l.iterator(); e.hasNext();) { + Board b = (Board) e.next(); if (b.relativePosition().x > nx - 1) addColumn(); if (b.relativePosition().y > ny - 1) addRow(); } - for (Enumeration e = v.elements(); e.hasMoreElements();) { - Board b = (Board) e.nextElement(); + for (Iterator e = l.iterator(); e.hasNext();) { + Board b = (Board) e.next(); getSlot(b.relativePosition().x + nx * b.relativePosition().y).setBoard(b); } pack(); @@ -365,7 +369,7 @@ * the user via the dialog or from reading a savefile */ public Enumeration getCurrentBoards() { - return currentBoards == null ? new Vector().elements() + return currentBoards == null ? Collections.enumeration(Collections.EMPTY_LIST) : currentBoards.elements(); } @@ -476,7 +480,7 @@ reset(); } else if (okButton == e.getSource()) { - currentBoards = pickBoards(); + currentBoards = new Vector(getBoardsFromControls()); setVisible(false); } else if (cancelButton == e.getSource()) { @@ -485,8 +489,20 @@ } } + /** + * @deprecated use {@link #getBoardsFromControls()} + * @return + */ public Vector pickBoards() { - Vector v = new Vector(); + return new Vector(getBoardsFromControls()); + } + + /** + * Return the list of boards as specified in the current controls + * @return + */ + public List getBoardsFromControls() { + List boardList = new ArrayList(); if (controls != null) { // Adjust the bounds of each board according to its relative position for (int i = 0; i < nx; ++i) { @@ -494,12 +510,12 @@ Board b = getSlot(i + nx * j).getBoard(); if (b != null) { b.relativePosition().move(i, j); - v.addElement(b); + boardList.add(b); } } } } - return v; + return boardList; } public void reset() { @@ -629,6 +645,9 @@ Point p = new Point(st.nextInt(0),st.nextInt(0)); Board b = getBoard(name); if (b != null) { + if (bds.contains(b)) { + b = b.copy(); + } b.setReversed(reversed); b.relativePosition().move(p.x, p.y); b.fixImage(GameModule.getGameModule().getFrame()); Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/KeyBufferer.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/KeyBufferer.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/KeyBufferer.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -18,10 +18,13 @@ */ package VASSAL.build.module.map; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; +import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; +import java.awt.Stroke; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; @@ -41,8 +44,11 @@ import VASSAL.counters.Stack; /** - * This component listens for mouse clicks on a map. - * If the user clicks on a {@link GamePiece}, that piece is added to the {@link KeyBuffer} + * This component listens for mouse clicks on a map and draws the selection + * rectangle. + * If the user clicks on a {@link GamePiece}, that piece is added to the + * {@link KeyBuffer}. {@link #draw(Graphics, Map)} is responsible for + * drawing the mouse selection rectangle. * * @see Map#addLocalMouseListener */ @@ -177,10 +183,12 @@ public void draw(Graphics g, Map map) { if (selection != null) { - g.setColor(color); - for (int i = 0; i < thickness; ++i) { - g.drawRect(selection.x + i, selection.y + i, selection.width, selection.height); - } + Graphics2D g2d = (Graphics2D) g; + Stroke str = g2d.getStroke(); + g2d.setStroke(new BasicStroke(thickness)); + g2d.setColor(color); + g2d.drawRect(selection.x, selection.y, selection.width, selection.height); + g2d.setStroke(str); } } Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/MassKeyCommand.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/MassKeyCommand.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/MassKeyCommand.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -43,6 +43,7 @@ import VASSAL.build.module.Map; import VASSAL.build.module.documentation.HelpFile; import VASSAL.build.module.gamepieceimage.StringEnumConfigurer; +import VASSAL.build.module.properties.PropertySource; import VASSAL.configure.Configurer; import VASSAL.configure.ConfigurerFactory; import VASSAL.configure.HotKeyConfigurer; @@ -58,8 +59,10 @@ import VASSAL.counters.GlobalCommand; import VASSAL.counters.PieceFilter; import VASSAL.tools.Expression; +import VASSAL.counters.PropertiesPieceFilter; import VASSAL.tools.FormattedString; import VASSAL.tools.LaunchButton; +import VASSAL.tools.ToolBarComponent; /** * Adds a button to a map window toolbar. Hitting the button applies a particular key command to all pieces on that map @@ -91,6 +94,8 @@ protected String checkProperty; protected String checkValue; protected Expression propertiesFilter; + protected PropertySource propertySource; + protected boolean filterIsDynamic; protected PieceFilter filter; private Map map; protected GlobalCommand globalCommand = new GlobalCommand(); @@ -106,8 +111,15 @@ } public void addTo(Buildable parent) { - map = (Map) parent; - map.getToolBar().add(launch); + if (parent instanceof Map) { + map = (Map) parent; + } + if (parent instanceof ToolBarComponent) { + ((ToolBarComponent)parent).getToolBar().add(launch); + } + if (parent instanceof PropertySource) { + propertySource = (PropertySource) parent; + } } public void apply() { @@ -115,7 +127,7 @@ } public void apply(Map m) { - GameModule.getGameModule().sendAndLog(globalCommand.apply(m, filter)); + GameModule.getGameModule().sendAndLog(globalCommand.apply(m, getFilter())); } public Class[] getAllowableConfigureComponents() { @@ -240,6 +252,7 @@ typeConfig.setValue(FIXED); intConfig.setValue(i); } + intConfig.getControls().setVisible(FIXED.equals(typeConfig.getValueString())); } } super.setValue(o); @@ -315,9 +328,18 @@ } public void removeFrom(Buildable parent) { - map.getToolBar().remove(launch); + if (parent instanceof ToolBarComponent) { + ((ToolBarComponent)parent).getToolBar().remove(launch); + } } + public PieceFilter getFilter() { + if (filterIsDynamic) { + buildFilter(); + } + return filter; + } + private void buildFilter() { if (checkValue != null) { propertiesFilter.setExpression(checkProperty + "=\"" + checkValue + "\""); @@ -401,6 +423,7 @@ } else if (PROPERTIES_FILTER.equals(key)) { propertiesFilter.setExpression((String) value); + // filterIsDynamic = propertiesFilter != null && propertiesFilter.indexOf('$') >= 0; buildFilter(); } else if (CONDITION.equals(key)) { @@ -427,4 +450,5 @@ launch.setAttribute(key, value); } } + } Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/PieceMover.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/PieceMover.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/PieceMover.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -16,7 +16,6 @@ * License along with this library; if not, copies are available * at http://www.opensource.org. */ - /* * Who Date Req Id Details * Brent Easton 12-Mar-04 914553 Use correct maps when coomparing clicks @@ -93,12 +92,9 @@ * This is a MouseListener that moves pieces onto a Map window */ public class PieceMover extends AbstractBuildable implements MouseListener, GameComponent, Comparator { - /** The Preferences key for autoreporting moves. */ public static final String AUTO_REPORT = "autoReport"; - protected static final String OFFMAP = "offmap"; - protected Map map; protected Point dragBegin; private GamePiece dragging; @@ -129,11 +125,9 @@ } /** - * When the user completes a drag-drop operation, the pieces being dragged - * will either be combined with an existing piece on the map or else placed on - * the map without stack. This method returns a {@link PieceFinder} instance - * that determines which {@link GamePiece} (if any) to combine the - * being-dragged pieces with. + * When the user completes a drag-drop operation, the pieces being dragged will either be combined with an existing + * piece on the map or else placed on the map without stack. This method returns a {@link PieceFinder} instance that + * determines which {@link GamePiece} (if any) to combine the being-dragged pieces with. * * @return */ @@ -189,12 +183,10 @@ } /** - * When the user clicks on the map, a piece from the map is selected by the - * dragTargetSelector. What happens to that piece is determined by the - * {@link PieceVisitorDispatcher} instance returned by this method. The - * default implementation does the following: If a Deck, add the top piece to - * the drag buffer If a stack, add it to the drag buffer Otherwise, add the - * piece and any other multi-selected pieces to the drag buffer + * When the user clicks on the map, a piece from the map is selected by the dragTargetSelector. What happens to that + * piece is determined by the {@link PieceVisitorDispatcher} instance returned by this method. The default + * implementation does the following: If a Deck, add the top piece to the drag buffer If a stack, add it to the drag + * buffer Otherwise, add the piece and any other multi-selected pieces to the drag buffer * * @see #createDragTargetSelector * @return @@ -247,10 +239,8 @@ } /** - * Returns the {@link PieceFinder} instance that will select a - * {@link GamePiece} for processing when the user clicks on the map. The - * default implementation is to return the first piece whose shape contains - * the point clicked on. + * Returns the {@link PieceFinder} instance that will select a {@link GamePiece} for processing when the user clicks + * on the map. The default implementation is to return the first piece whose shape contains the point clicked on. * * @return */ @@ -345,7 +335,7 @@ } public String[] getAttributeNames() { - return new String[] {ICON_NAME}; + return new String[]{ICON_NAME}; } public String getAttributeValueString(String key) { @@ -371,11 +361,9 @@ if (!loc.equals(p.getPosition())) { c = markMoved(p, true); } - if (p.getParent() instanceof Deck) { - Deck d = (Deck) p.getParent(); - ChangeTracker tracker = new ChangeTracker(p); - p.setProperty(Properties.OBSCURED_BY, d.isFaceDown() && !d.isDrawFaceUp() ? GameModule.getUserId() : null); - c = c == null ? tracker.getChangeCommand() : c.append(tracker.getChangeCommand()); + if (p.getParent() != null) { + Command removedCommand = p.getParent().pieceRemoved(p); + c = c == null ? removedCommand : c.append(removedCommand); } return c; } @@ -416,8 +404,7 @@ } /** - * moves pieces in DragBuffer to point p by generating a Command for each - * element in Dragbuffer + * moves pieces in DragBuffer to point p by generating a Command for each element in Dragbuffer * * @param map * Map @@ -426,22 +413,18 @@ */ public Command movePieces(Map map, Point p) { PieceIterator it = DragBuffer.getBuffer().getIterator(); - if (!it.hasMoreElements()) { return null; } - Point offset = null; Command comm = new NullCommand(); - // Map of Point->List<GamePiece> of pieces to merge with at a given location // There is potentially one piece for each Game Piece Layer HashMap mergeTargets = new HashMap(); while (it.hasMoreElements()) { dragging = it.nextPiece(); /* - * Take a copy of the pieces in dragging. If it is a stack, it is - * cleared by the merging process + * Take a copy of the pieces in dragging. If it is a stack, it is cleared by the merging process */ GamePiece[] draggedPieces; if (dragging instanceof Stack) { @@ -452,9 +435,8 @@ } } else { - draggedPieces = new GamePiece[] {dragging}; + draggedPieces = new GamePiece[]{dragging}; } - if (offset != null) { p = new Point(dragging.getPosition().x + offset.x, dragging.getPosition().y + offset.y); } @@ -501,7 +483,6 @@ comm = comm.append(movedPiece(dragging, mergeWith.getPosition())); comm = comm.append(map.getStackMetrics().merge(mergeWith, dragging)); } - if (map.getMoveKey() != null) { applyKeyAfterMove(draggedPieces, comm, map.getMoveKey()); } @@ -537,10 +518,8 @@ /** Place the clicked-on piece into the {@link DragBuffer} */ protected void selectMovablePieces(MouseEvent e) { - GamePiece p = map.findPiece(e.getPoint(), dragTargetSelector); dragBegin = e.getPoint(); - if (p != null) { EventFilter filter = (EventFilter) p.getProperty(Properties.MOVE_EVENT_FILTER); if (filter == null || !filter.rejectEvent(e)) { @@ -553,19 +532,15 @@ else { DragBuffer.getBuffer().clear(); } - // show/hide selection boxes map.repaint(); } /** @deprecated use #selectMovablePieces(MouseEvent) */ protected void selectMovablePieces(Point point) { - GamePiece p = map.findPiece(point, dragTargetSelector); dragBegin = point; - selectionProcessor.accept(p); - // show/hide selection boxes map.repaint(); } @@ -575,9 +550,8 @@ } /** - * Return true if this point is "close enough" to the point at which the user - * pressed the mouse to be considered a mouse click (such that no moves are - * done) + * Return true if this point is "close enough" to the point at which the user pressed the mouse to be considered a + * mouse click (such that no moves are done) */ public boolean isClick(Point pt) { boolean isClick = false; @@ -587,7 +561,8 @@ if (useGrid) { PieceIterator it = DragBuffer.getBuffer().getIterator(); GamePiece dragging = it.hasMoreElements() ? it.nextPiece() : null; - useGrid = dragging != null && !Boolean.TRUE.equals(dragging.getProperty(Properties.IGNORE_GRID)); + useGrid = dragging != null && !Boolean.TRUE.equals(dragging.getProperty(Properties.IGNORE_GRID)) + && (dragging.getParent() == null || !dragging.getParent().isExpanded()); } if (useGrid) { if (map.equals(DragBuffer.getBuffer().getFromMap())) { @@ -633,18 +608,15 @@ } /** - * Implement Comparator to sort the contents of the drag buffer before - * completing the drag. This sorts the contents to be in the same order as the - * pieces were in their original parent stack. + * Implement Comparator to sort the contents of the drag buffer before completing the drag. This sorts the contents to + * be in the same order as the pieces were in their original parent stack. */ public int compare(Object o1, Object o2) { return pieceSorter.compare(o1, o2); } - /** - * Implements a psudo-cursor that follows the mouse cursor when user drags - * gamepieces. Supports map zoom by resizing cursor when it enters a drop - * target of type Map.View + * Implements a psudo-cursor that follows the mouse cursor when user drags gamepieces. Supports map zoom by resizing + * cursor when it enters a drop target of type Map.View * * @author Jim Urbas * @version 0.4.2 @@ -653,17 +625,13 @@ // NOTE: DragSource.isDragImageSupported() returns false for j2sdk1.4.2_02 on // Windows 2000 static public class DragHandler implements DragGestureListener, DragSourceListener, DragSourceMotionListener, DropTargetListener { - final int CURSOR_ALPHA = 127; // psuedo cursor is 50% transparent final int EXTRA_BORDER = 4; // psuedo cursor is includes a 4 pixel border - static private DragHandler theDragHandler = null; // singleton pattern - private JLabel dragCursor; // An image label. Lives on current DropTarget's // LayeredPane. private Point drawOffset = new Point(); // translates event coords to local // drawing coords - private Rectangle boundingBox; // image bounds private int originalPieceOffsetX; // How far drag STARTED from gamepiece's // center @@ -675,11 +643,9 @@ private int currentPieceOffsetY; // I.e. on current map (which may have // different zoom private double dragCursorZoom = 1.0; // Current cursor scale (zoom) - Component dragWin; // the component that initiated the drag operation Component dropWin; // the drop target the mouse is currently over JLayeredPane drawWin; // the component that owns our psuedo-cursor - // Seems there can be only one DropTargetListener a drop target. After we // process a drop target // event, we manually pass the event on to this listener. @@ -694,9 +660,8 @@ } /** - * Creates a new DropTarget and hooks us into the beginning of a - * DropTargetListener chain. DropTarget events are not multicast; there can - * be only one "true" listener + * Creates a new DropTarget and hooks us into the beginning of a DropTargetListener chain. DropTarget events are not + * multicast; there can be only one "true" listener */ static public DropTarget makeDropTarget(Component theComponent, int dndContants, DropTargetListener dropTargetListener) { if (dropTargetListener != null) { @@ -754,8 +719,7 @@ } /** - * creates or moves cursor object to given JLayeredPane. Usually called by - * setDrawWinToOwnerOf() + * creates or moves cursor object to given JLayeredPane. Usually called by setDrawWinToOwnerOf() */ private void setDrawWin(JLayeredPane newDrawWin) { if (newDrawWin != drawWin) { @@ -764,7 +728,6 @@ dragCursor.getParent().remove(dragCursor); } drawWin = newDrawWin; - calcDrawOffset(); dragCursor.setVisible(false); drawWin.add(dragCursor, JLayeredPane.DRAG_LAYER); @@ -772,9 +735,8 @@ } /** - * creates or moves cursor object to given window. Called when drag - * operation begins in a window or the cursor is dragged over a new - * drop-target window + * creates or moves cursor object to given window. Called when drag operation begins in a window or the cursor is + * dragged over a new drop-target window */ public void setDrawWinToOwnerOf(Component newDropWin) { if (newDropWin != null) { @@ -786,10 +748,9 @@ } /** - * Installs the cursor image into our dragCursor JLabel. Sets current zoom. - * Should be called at beginning of drag and whenever zoom changes. INPUT: - * DragBuffer.getBuffer OUTPUT: dragCursorZoom cursorOffCenterX - * cursorOffCenterY boundingBox + * Installs the cursor image into our dragCursor JLabel. Sets current zoom. Should be called at beginning of drag + * and whenever zoom changes. INPUT: DragBuffer.getBuffer OUTPUT: dragCursorZoom cursorOffCenterX cursorOffCenterY + * boundingBox */ private void makeDragCursor(double zoom) { // create the cursor if necessary @@ -797,11 +758,9 @@ dragCursor = new JLabel(); dragCursor.setVisible(false); } - dragCursorZoom = zoom; currentPieceOffsetX = (int) (originalPieceOffsetX / dragPieceOffCenterZoom * zoom + 0.5); currentPieceOffsetY = (int) (originalPieceOffsetY / dragPieceOffCenterZoom * zoom + 0.5); - // get the piece(s) our cursor will be based on PieceIterator dragContents = DragBuffer.getBuffer().getIterator(); List relativePositions = new ArrayList(); @@ -814,7 +773,6 @@ boundingBox.y *= zoom; calcDrawOffset(); relativePositions.add(new Point(0, 0)); - while (dragContents.hasMoreElements()) { GamePiece nextPiece = dragContents.nextPiece(); Rectangle r = nextPiece.getShape().getBounds(); @@ -828,10 +786,8 @@ boundingBox.add(r); relativePositions.add(p); } - int width = boundingBox.width + EXTRA_BORDER * 2; int height = boundingBox.height + EXTRA_BORDER * 2; - BufferedImage cursorImage = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR); Graphics2D graphics = cursorImage.createGraphics(); int index = 0; @@ -841,7 +797,6 @@ piece.draw(graphics, EXTRA_BORDER - boundingBox.x + pos.x, EXTRA_BORDER - boundingBox.y + pos.y, dragCursor, zoom); } dragCursor.setSize(width, height); - // Make bitmap 50% transparent WritableRaster alphaRaster = cursorImage.getAlphaRaster(); int size = width * height; @@ -851,7 +806,6 @@ if (alphaArray[i] == 255) alphaArray[i] = CURSOR_ALPHA; } - // ... feather the cursor, since traits can extend arbitraily far out from // bounds final int FEATHER_WIDTH = EXTRA_BORDER; @@ -874,7 +828,6 @@ } // ... apply the alpha to the image alphaRaster.setPixels(0, 0, width, height, alphaArray); - // store the bitmap in the cursor dragCursor.setIcon(new ImageIcon(cursorImage)); } @@ -886,7 +839,6 @@ // PIECE uses SCALED, OWNER (arbitrary) coordinate system // // /////////////////////////////////////////////////////////////////////////////////// - /** Fires after user begins moving the mouse several pixels over a map. */ public void dragGestureRecognized(DragGestureEvent dge) { if (DragBuffer.getBuffer().getIterator().hasMoreElements()) { @@ -894,20 +846,17 @@ GamePiece piece = DragBuffer.getBuffer().getIterator().nextPiece(); Point mousePosition = map == null ? dge.getDragOrigin() : map.componentCoordinates(dge.getDragOrigin()); Point piecePosition = map == null ? piece.getPosition() : map.componentCoordinates(piece.getPosition()); - // If DragBuffer holds a piece with invalid coordinates (for example, a // card drawn from a deck), // drag from center of piece if (piecePosition.x <= 0 || piecePosition.y <= 0) { piecePosition = mousePosition; } - // Pieces in an expanded stack need to be offset if (piece.getParent() != null && piece.getParent().isExpanded() && map != null) { Point offset = piece.getMap().getStackMetrics().relativePosition(piece.getParent(), piece); piecePosition.translate(offset.x, offset.y); } - originalPieceOffsetX = piecePosition.x - mousePosition.x; // dragging // from UL // results in @@ -915,18 +864,13 @@ // offsets originalPieceOffsetY = piecePosition.y - mousePosition.y; dragPieceOffCenterZoom = map == null ? 1.0 : map.getZoom(); - dragWin = dge.getComponent(); drawWin = null; dropWin = null; - makeDragCursor(dragPieceOffCenterZoom); - setDrawWinToOwnerOf(dragWin); - SwingUtilities.convertPointToScreen(mousePosition, drawWin); moveDragCursor(mousePosition.x, mousePosition.y); - // begin dragging try { dge.startDrag(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR), new StringSelection(""), this); // DEBUG @@ -957,14 +901,12 @@ public void dropActionChanged(DragSourceDragEvent e) { } - // /////////////////////////////////////////////////////////////////////////////////// // DRAG SOURCE MOTION LISTENER INTERFACE // // EVENT uses UNSCALED, SCREEN coordinate system // // /////////////////////////////////////////////////////////////////////////////////// - // Used to check for real mouse movement. // Warning: dragMouseMoved fires 8 times for each point on development // system (Win2k) @@ -972,7 +914,6 @@ /** Moves cursor after mouse */ public void dragMouseMoved(DragSourceDragEvent event) { - if (!event.getLocation().equals(lastDragLocation)) { lastDragLocation = event.getLocation(); moveDragCursor(event.getX(), event.getY()); @@ -987,7 +928,6 @@ // // EVENT uses UNSCALED, DROP-TARGET coordinate system // /////////////////////////////////////////////////////////////////////////////////// - /** switches current drawWin when mouse enters a new DropTarget */ public void dragEnter(DropTargetDragEvent event) { Component newDropWin = event.getDropTargetContext().getComponent(); @@ -999,22 +939,19 @@ setDrawWinToOwnerOf(event.getDropTargetContext().getComponent()); dropWin = newDropWin; } - DropTargetListener forward = getListener(event); if (forward != null) forward.dragEnter(event); } /** - * Last event of the drop operation. We adjust the drop point for off-center - * drag, remove the cursor, and pass the event along listener chain. + * Last event of the drop operation. We adjust the drop point for off-center drag, remove the cursor, and pass the + * event along listener chain. */ public void drop(DropTargetDropEvent event) { removeDragCursor(); - // EVENT uses UNSCALED, DROP-TARGET coordinate system event.getLocation().translate(currentPieceOffsetX, currentPieceOffsetY); - DropTargetListener forward = getListener(event); if (forward != null) forward.drop(event); @@ -1041,5 +978,4 @@ forward.dropActionChanged(event); } } - } Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/StackMetrics.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/StackMetrics.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/StackMetrics.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -470,7 +470,7 @@ if (index < 0) { throw new RuntimeException(c.getId() + " is not contained in " + parent.getId()); } - Point[] pos = new Point[index + 1]; + Point[] pos = new Point[parent.getPieceCount()]; getContents(parent, pos, null, null, 0, 0); return pos[index]; } Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/Board.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/Board.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/Board.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -35,6 +35,7 @@ import javax.swing.JOptionPane; import VASSAL.build.AbstractConfigurable; import VASSAL.build.Buildable; +import VASSAL.build.Builder; import VASSAL.build.GameModule; import VASSAL.build.module.GameComponent; import VASSAL.build.module.Map; @@ -307,6 +308,12 @@ public MapGrid getGrid() { return grid; } + + public Board copy() { + Board b = new Board(); + b.build(getBuildElement(Builder.createNewDocument())); + return b; + } public void fixImage(Component map) { Cleanup.init(); Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/BoardSlot.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/BoardSlot.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/BoardSlot.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -93,6 +93,9 @@ } else { Board b = picker.getBoard((String) boards.getSelectedItem()); + if (picker.getBoardsFromControls().contains(b)) { + b = b.copy(); + } setBoard(b); } } Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -119,7 +119,6 @@ } } catch (NumberFormatException e) { - e.printStackTrace(); } } } Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/board/mapgrid/Zone.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/board/mapgrid/Zone.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/map/boardPicker/board/mapgrid/Zone.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -508,7 +508,7 @@ board.fixImage(editor); } editor.setPreferredSize(board != null ? board.getSize() : DEFAULT_SIZE); - Rectangle polyBounds = editor.getPolygon().getBoundingBox(); + Rectangle polyBounds = editor.getPolygon().getBounds(); Point polyCenter = new Point(polyBounds.x + polyBounds.width/2, polyBounds.y + polyBounds.height/2); if (!editor.getVisibleRect().contains(polyCenter)) { Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/properties/GlobalProperty.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/properties/GlobalProperty.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/build/module/properties/GlobalProperty.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -148,6 +148,7 @@ public void addTo(Buildable parent) { // Initialize property with current values + setPropertyValue(initialValue); propertyChangeSupport.addPropertyChangeListener(((GlobalPropertiesContainer) parent).getPropertyListener()); propertyChangeSupport.firePropertyChange(getConfigureName(), null, propertyValue); tempToolbar.setDelegate((ToolBarComponent) parent); @@ -180,6 +181,9 @@ } public void setup(boolean gameStarting) { + if (!gameStarting) { + setPropertyValue(initialValue); // Set value back to default for next New Game + } return; } Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Deck.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Deck.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Deck.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -215,7 +215,7 @@ public boolean isDrawFaceUp() { return drawFaceUp; } - + public void setDrawFaceUp(boolean drawFaceUp) { this.drawFaceUp = drawFaceUp; } @@ -535,7 +535,17 @@ public boolean isFaceDown() { return faceDown; } + + public Command pieceAdded(GamePiece p) { + return null; + } + public Command pieceRemoved(GamePiece p) { + ChangeTracker tracker = new ChangeTracker(p); + p.setProperty(Properties.OBSCURED_BY, isFaceDown() && !isDrawFaceUp() ? GameModule.getUserId() : null); + return tracker.getChangeCommand(); + } + public void setFaceDown(boolean faceDown) { this.faceDown = faceDown; } Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/DragBuffer.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/DragBuffer.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/DragBuffer.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -24,11 +24,12 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import java.util.Collections; +import java.util.Comparator; import java.util.Enumeration; import java.util.Vector; import javax.swing.JFrame; import VASSAL.build.module.Map; -import VASSAL.tools.Sort; public class DragBuffer { private static DragBuffer theBuffer; @@ -196,8 +197,19 @@ return c; } - public void sort(Sort.Comparator comp) { - Sort.quicksort(pieces, comp); + public void sort(Comparator comp) { + try { + Collections.sort(pieces, comp); + } + catch (Exception e) { + } } + + /** + * @deprecated Use {@link #sort(Comparator)} instead. + */ + public void sort(VASSAL.tools.Sort.Comparator comp) { + sort((Comparator) comp); + } } Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/DynamicProperty.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/DynamicProperty.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/DynamicProperty.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -140,7 +140,9 @@ if (key.equals(getKey())) { setValue((String) value); } - super.setProperty(key, value); + else { + super.setProperty(key, value); + } } public String myGetState() { Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/GlobalCommand.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/GlobalCommand.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/GlobalCommand.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -115,11 +115,8 @@ public Object visitDeck(Deck d) { Object target = null; - if (selectFromDeck < 0) { - target = visitStack(d); - } - else if (selectFromDeck > 0) { - d.setDragCount(selectFromDeck); + if (selectFromDeck != 0) { + d.setDragCount(selectFromDeck < 0 ? d.getPieceCount() : selectFromDeck); for (PieceIterator it = d.drawCards(); it.hasMoreElements();) { apply(it.nextPiece()); } Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Labeler.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Labeler.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Labeler.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -26,6 +26,7 @@ import java.awt.Image; import java.awt.Point; import java.awt.Rectangle; +import java.awt.RenderingHints; import java.awt.Shape; import java.awt.geom.AffineTransform; import java.awt.geom.Area; @@ -215,6 +216,7 @@ g.drawRect(x0, y0, width, height); } g.setColor(fgColor); + ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); g.drawString(" " + text + " ", x0, y0 + g.getFontMetrics().getHeight() - g.getFontMetrics().getDescent()); } @@ -338,6 +340,7 @@ int height = lbl.getHeight(); BufferedImage im = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR); Graphics g = im.createGraphics(); + ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); if (textBg != null) { g.setColor(textBg); g.fillRect(0, 0, width, height); Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/PieceDefiner.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/PieceDefiner.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/PieceDefiner.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -391,10 +391,10 @@ if (selp2 != null) { selp2.setInner(sel); } + ((GamePiece) inUseModel.lastElement()).setProperty(Properties.OUTER, null); inUseModel.setElementAt(selp1, index); inUseModel.setElementAt(sel, index + 1); inUseList.setSelectedIndex(index + 1); - ((GamePiece) inUseModel.lastElement()).setProperty(Properties.OUTER, null); refresh(); } Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/PieceSorter.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/PieceSorter.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/PieceSorter.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -19,7 +19,6 @@ package VASSAL.counters; import java.util.Comparator; -import VASSAL.tools.Sort; /** * Sorts GamePieces according to their position: @@ -31,7 +30,6 @@ public int compare(Object o1, Object o2) { GamePiece p1 = (GamePiece) o1; GamePiece p2 = (GamePiece) o2; - int result = 0; if (p1.getMap() == null && p2.getMap() == null) { return 0; } @@ -41,8 +39,10 @@ else if (p2.getMap() == null) { return -1; } + + int result = 0; if (p1.getMap() != p2.getMap()) { - result = new Sort.Alpha().compare(p1.getMap().getId(), p2.getMap().getId()); + result = p1.getMap().getId().compareTo(p2.getMap().getId()); } else { Stack s1 = p1 instanceof Stack ? (Stack) p1 : p1.getParent(); Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/SetGlobalProperty.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/SetGlobalProperty.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/SetGlobalProperty.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -31,7 +31,6 @@ import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import VASSAL.build.GameModule; -import VASSAL.build.module.Chatter; import VASSAL.build.module.Map; import VASSAL.build.module.documentation.HelpFile; import VASSAL.build.module.map.boardPicker.board.mapgrid.Zone; Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Stack.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Stack.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Stack.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -106,6 +106,15 @@ expanded = expanded && pieceCount > 1; } } + + /** + * Perform some action on a GamePiece that has just been removed this Stack + * @param p + * @return a {@link Command} that performs the equivalent action when executed + */ + public Command pieceRemoved(GamePiece p) { + return null; + } protected void insertPieceAt(GamePiece p, int index) { if (pieceCount >= contents.length) { @@ -201,6 +210,15 @@ insertChild(p, pos); } } + + /** + * Perform some action on a GamePiece that has just been added to this Stack + * @param p + * @return a {@link Command} that performs the equivalent action when executed + */ + public Command pieceAdded(GamePiece p) { + return null; + } /** * If the <code>obs</code> parameter is a {@link Map}, delegate drawing of Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Translate.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Translate.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/counters/Translate.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -355,6 +355,7 @@ private java.util.List innerPieces = new ArrayList(); public void run() { + mover = null; Command comm = new NullCommand(); for (Iterator it = moves.iterator(); it.hasNext();) { final Move move = (Move) it.next(); @@ -413,7 +414,6 @@ } } GameModule.getGameModule().sendAndLog(comm); - mover = null; } public void add(Map map, GamePiece piece, Point pos) { Modified: VASSAL-src/branches/swampwallaby-jep/VASSAL/tools/ComponentSplitter.java =================================================================== --- VASSAL-src/branches/swampwallaby-jep/VASSAL/tools/ComponentSplitter.java 2006-11-15 20:30:26 UTC (rev 1458) +++ VASSAL-src/branches/swampwallaby-jep/VASSAL/tools/ComponentSplitter.java 2006-11-15 20:54:46 UTC (rev 1459) @@ -46,19 +46,21 @@ import VASSAL.Info; /** - * Provides support for hidden panels. - * Use the split methods to create an instance of {@link SplitPane}, - * which can then be manipulated to show and hide the panel + * Provides support for hidden panels. Use the split methods to create an instance of {@link SplitPane}, which can then + * be manipulated to show and hide the panel */ public class ComponentSplitter { - /** - * Create a new hideable panel to the right of the base component. The base component is replaced - * by a {@link SplitPane} - * @param base the base component - * @param hideableComponent the hideable component - * @param resizeOnVisibilityChange If true, the containing window will expand or shrink to an appropriate size - * when the hideable component is shown or hidden + * Create a new hideable panel to the right of the base component. The base component is replaced by a + * {@link SplitPane} + * + * @param base + * the base component + * @param hideableComponent + * the hideable component + * @param resizeOnVisibilityChange + * If true, the containing window will expand or shrink to an appropriate size when the hideable component is + * shown or hidden * @return the {@link SplitPane} containing the two components */ public SplitPane splitRight(Component base, Component hideableComponent, boolean resizeOnVisibilityChange) { @@ -66,12 +68,16 @@ } /** - * Create a new hideable panel to the left of the base component. The base component is replaced - * by a {@link SplitPane} - * @param base the base component - * @param hideableComponent the hideable component - * @param resizeOnVisibilityChange If true, the containing window will expand or shrink to an appropriate size - * when the hideable component is shown or hidden + * Create a new hideable panel to the left of the base component. The base component is replaced by a + * {@link SplitPane} + * + * @param base + * the base component + * @param hideableComponent + * the hideable component + * @param resizeOnVisibilityChange + * If true, the containing window will expand or shrink to an appropriate size when the hideable component is + * shown or hidden * @return the {@link SplitPane} containing the two components */ public SplitPane splitLeft(Component base, Component hideableComponent, boolean resizeOnVisibilityChange) { @@ -79,12 +85,16 @@ } /** - * Create a new hideable panel to the bottom of the base component. The base component is replaced - * by a {@link SplitPane} - * @param base the base component - * @param hideableComponent the hideable component - * @param resizeOnVisibilityChange If true, the containing window will expand or shrink to an appropriate size - * when the hideable component is shown or hidden + * Create a new hideable panel to the bottom of the base component. The base component is replaced by a + * {@link SplitPane} + * + * @param base + * the base component + * @param hideableComponent + * the hideable component + * @param resizeOnVisibilityChange + * If true, the containing window will expand or shrink to an appropriate size when the hideable component is + * shown or hidden * @return the {@link SplitPane} containing the two components */ public SplitPane splitBottom(Component base, Component hideableComponent, boolean resizeOnVisibilityChange) { @@ -92,12 +102,15 @@ } /** - * Create a new hideable panel to the top of the base component. The base component is replaced - * by a {@link SplitPane} - * @param base the base component - * @param hideableComponent the hideable component - * @param resizeOnVisibilityChange If true, the containing window will expand or shrink to an appropriate size - * when the hideable component is shown or hidden + * Create a new hideable panel to the top of the base component. The base component is replaced by a {@link SplitPane} + * + * @param base + * the base component + * @param hideableComponent + * the hideable component + * @param resizeOnVisibilityChange + * If true, the containing window will expand or shrink to an appropriate size when the hideable component is + * shown or hidden * @return the {@link SplitPane} containing the two components */ public SplitPane splitTop(Component base, Component hideableComponent, boolean resizeOnVisibilityChange) { @@ -106,15 +119,17 @@ /** * Search the containment hierarchy for the index-th {@link SplitPane} ancestor of a target component - * @param c the target component - * @param index If -1, return the last {@link SplitPane} ancestor + * + * @param c + * the target component + * @param index + * If -1, return the last {@link SplitPane} ancestor * @return the {@link SplitPane} ancestor, or the original component if none is found */ public Component getSplitAncestor(Component c, int index) { Component next = SwingUtilities.getAncestorOfClass(SplitPane.class, c); int count = -1; - while (next != null - && (index < 0 || count++ < index)) { + while (next != null && (index < 0 || count++ < index)) { c = next; next = SwingUtilities.getAncestorOfClass(SplitPane.class, c); } @@ -125,7 +140,7 @@ int index = -1; Container parent = base.getParent(); if (base.getParent() != null) { - for (int i = 0,n = base.getParent().getComponentCount(); i < n; ++i) { + for (int i = 0, n = base.getParent().getComponentCount(); i < n; ++i) { if (base == base.getParent().getComponent(i)) { index = i; break; @@ -138,11 +153,10 @@ } return split; } - /** - * Contains methods to automatically show/hide one of its components (the "hideable" component) while the other - * (the "base" component) remains always visible. Can optionally change the size of its top level ancestorExtension - * when the component is shown/hidden. The hideable component is initially hidden + * Contains methods to automatically show/hide one of its components (the "hideable" component) while the other (the + * "base" component) remains always visible. Can optionally change the size of its top level ancestorExtension when + * the component is shown/hidden. The hideable component is initially hidden */ public static class SplitPane extends JSplitPane { private boolean resizeOnVisibilityChange; @@ -156,10 +170,13 @@ /** * Initialize the SplitPane with the two component + * * @param hideableComponent * @param baseComponent - * @param hideablePosition one of {@link #HIDE_TOP}, {@link #HIDE_BOTTOM}, {@link #HIDE_LEFT} or {@link #HIDE_RIGHT} - * @param resizeOnVisibilityChange If true, resize the top-level ancestor when the hideable component is shown/hidden + * @param hideablePosition + * one of {@link #HIDE_TOP}, {@link #HIDE_BOTTOM}, {@link #HIDE_LEFT} or {@link #HIDE_RIGHT} + * @param resizeOnVisibilityChange + * If true, resize the top-level ancestor when the hideable component is shown/hidden */ public SplitPane(Component hideableComponent, Component baseComponent, int hideablePosition, boolean resizeOnVisibilityChange) { super(HIDE_TOP == hideablePosition || HIDE_BOTTOM == hideablePosition ? VERTICAL_SPLIT : HORIZONTAL_SPLIT); @@ -169,21 +186,21 @@ ((JComponent) hideableComponent).setMinimumSize(new Dimension(0, 0)); } switch (hideablePosition) { - case HIDE_LEFT: - setLeftComponent(hideableComponent); - setRightComponent(baseComponent); - break; - case HIDE_RIGHT: - setRightComponent(hideableComponent); - setLeftComponent(baseComponent); - break; - case HIDE_TOP: - setTopComponent(hideableComponent); - setBottomComponent(baseComponent); - break; - case HIDE_BOTTOM: - setBottomComponent(hideableComponent); - setTopComponent(baseComponent); + case HIDE_LEFT: + setLeftComponent(hideableComponent); + setRightComponent(baseComponent); + break; + case HIDE_RIGHT: + setRightComponent(hideableComponent); + setLeftComponent(baseComponent); + break; + case HIDE_TOP: + setTopComponent(hideableComponent); + setBottomComponent(baseComponent); + break; + case HIDE_BOTTOM: + setBottomComponent(hideableComponent); + setTopComponent(baseComponent); } setBorder(null); setResizeWeight(HIDE_LEFT == hideablePosition || HIDE_TOP == hideablePosition ? 0.0 : 1.0); @@ -206,17 +223,17 @@ public Component getHideableComponent() { Component c = null; switch (hideablePosition) { - case HIDE_LEFT: - c = getLeftComponent(); - break; - case HIDE_RIGHT: - c = getRightComponent(); - break; - case HIDE_TOP: - c = getTopComponent(); - break; - case HIDE_BOTTOM: - c = getBottomComponent(); + case HIDE_LEFT: + c = getLeftComponent(); + break; + case HIDE_RIGHT: + c = getRightComponent(); + break; + case HIDE_TOP: + c = getTopComponent(); + break; + case HIDE_BOTTOM: + c = getBottomComponent(); } return c; } @@ -227,17 +244,17 @@ public Component getBaseComponent() { Component c = null; switch (hideablePosition) { - case HIDE_LEFT: - c = getRightComponent(); - break; - case HIDE_RIGHT: - c = getLeftComponent(); - break; - case HIDE_TOP: - c = getBottomComponent(); - break; - case HIDE_BOTTOM: - c = getTopComponent(); + case HIDE_LEFT: + c = getRightComponent(); + break; + case HIDE_RIGHT: + c = getLeftComponent(); + break; + case HIDE_TOP: + c = getBottomComponent(); + break; + case HIDE_BOTTOM: + c = getTopComponent(); } return c; } @@ -248,27 +265,27 @@ protected int getBaseComponentSize() { int size = -1; switch (getOrientation()) { - case VERTICAL_SPLIT: - size = getBaseComponent().getSize().height; - break; - case HORIZONTAL_SPLIT: - size = getBaseComponent().getSize().width; + case VERTICAL_SPLIT: + size = getBaseComponent().getSize().height; + break; + case HORIZONTAL_SPLIT: + size = getBaseComponent().getSize().width; } return size; } /** - * + * * @return the size of the hideable component along the axis of orientation */ protected int getHideableComponentSize() { int size = -1; switch (getOrientation()) { - case VERTICAL_SPLIT: - size = getHideableComponent().getSize().height; - break; - case HORIZONTAL_SPLIT: - size = getHideableComponent().getSize().width; + case VERTICAL_SPLIT: + size = getHideableComponent().getSize().height; + break; + case HORIZONTAL_SPLIT: + size = getHideableComponent().getSize().width; } return size; } @@ -280,14 +297,14 @@ Container ancestor = getTopLevelAncestor(); if (ancestor != null) { switch (hideablePosition) { - case HIDE_LEFT: - case HIDE_RIGHT: - ancestor.setSize(new Dimension(ancestor.getSize().width - getHideableComponent().getSize().width, ancestor.getSize().height - getDividerSize())); - break; - case HIDE_TOP: - case HIDE_BOTTOM: - ancestor.setSize(new Dimension(ancestor.getSize().width, ancestor.getSize().height - getHideableComponent().getSize().height - getDividerSize())); - break; + case HIDE_LEFT: + case HIDE_RIGHT: + ancestor.setSize(new Dimension(ancestor.getSize().width - getHideableComponent().getSize().width, ancestor.getSize().height - getDividerSize())); + break; + case HIDE_TOP: + case HIDE_BOTTOM: + ancestor.setSize(new Dimension(ancestor.getSize().width, ancestor.getSize().height - getHideableComponent().getSize().height - getDividerSize())); + break; } ancestor.validate(); } @@ -297,13 +314,13 @@ ((BasicSplitPaneUI) getUI()).getDivider().setVisible(false); getHideableComponent().setVisible(false); switch (hideablePosition) { - case HIDE_LEFT: - case HIDE_TOP: - ... [truncated message content] |
From: <swa...@us...> - 2006-11-15 20:30:46
|
Revision: 1458 http://svn.sourceforge.net/vassalengine/?rev=1458&view=rev Author: swampwallaby Date: 2006-11-15 12:30:26 -0800 (Wed, 15 Nov 2006) Log Message: ----------- Zones now integrated - delete Removed Paths: ------------- VASSAL-src/branches/swampwallaby-zones/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rod...@us...> - 2006-11-15 14:39:02
|
Revision: 1457 http://svn.sourceforge.net/vassalengine/?rev=1457&view=rev Author: rodneykinney Date: 2006-11-15 06:38:26 -0800 (Wed, 15 Nov 2006) Log Message: ----------- Draw selection rectangle more efficiently. Merge from uckelman-merge@1455 Modified Paths: -------------- VASSAL-src/trunk/VASSAL/build/module/map/KeyBufferer.java Modified: VASSAL-src/trunk/VASSAL/build/module/map/KeyBufferer.java =================================================================== --- VASSAL-src/trunk/VASSAL/build/module/map/KeyBufferer.java 2006-11-15 14:36:16 UTC (rev 1456) +++ VASSAL-src/trunk/VASSAL/build/module/map/KeyBufferer.java 2006-11-15 14:38:26 UTC (rev 1457) @@ -18,10 +18,13 @@ */ package VASSAL.build.module.map; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; +import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; +import java.awt.Stroke; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; @@ -41,8 +44,11 @@ import VASSAL.counters.Stack; /** - * This component listens for mouse clicks on a map. - * If the user clicks on a {@link GamePiece}, that piece is added to the {@link KeyBuffer} + * This component listens for mouse clicks on a map and draws the selection + * rectangle. + * If the user clicks on a {@link GamePiece}, that piece is added to the + * {@link KeyBuffer}. {@link #draw(Graphics, Map)} is responsible for + * drawing the mouse selection rectangle. * * @see Map#addLocalMouseListener */ @@ -177,10 +183,12 @@ public void draw(Graphics g, Map map) { if (selection != null) { - g.setColor(color); - for (int i = 0; i < thickness; ++i) { - g.drawRect(selection.x + i, selection.y + i, selection.width, selection.height); - } + Graphics2D g2d = (Graphics2D) g; + Stroke str = g2d.getStroke(); + g2d.setStroke(new BasicStroke(thickness)); + g2d.setColor(color); + g2d.drawRect(selection.x, selection.y, selection.width, selection.height); + g2d.setStroke(str); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rod...@us...> - 2006-11-15 14:36:30
|
Revision: 1456 http://svn.sourceforge.net/vassalengine/?rev=1456&view=rev Author: rodneykinney Date: 2006-11-15 06:36:16 -0800 (Wed, 15 Nov 2006) Log Message: ----------- MassKeyCommand: substitute global properties Modified Paths: -------------- VASSAL-src/trunk/VASSAL/build/module/GlobalKeyCommand.java VASSAL-src/trunk/VASSAL/build/module/map/MassKeyCommand.java VASSAL-src/trunk/VASSAL/build/module/map/StackMetrics.java VASSAL-src/trunk/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java Modified: VASSAL-src/trunk/VASSAL/build/module/GlobalKeyCommand.java =================================================================== --- VASSAL-src/trunk/VASSAL/build/module/GlobalKeyCommand.java 2006-11-14 16:05:41 UTC (rev 1455) +++ VASSAL-src/trunk/VASSAL/build/module/GlobalKeyCommand.java 2006-11-15 14:36:16 UTC (rev 1456) @@ -21,7 +21,6 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import VASSAL.build.Buildable; import VASSAL.build.GameModule; import VASSAL.build.module.map.MassKeyCommand; @@ -30,21 +29,14 @@ * {@link VASSAL.build.GameModule} and applies to all maps */ public class GlobalKeyCommand extends MassKeyCommand { - public void addTo(Buildable parent) { - ((GameModule) parent).getToolBar().add(getLaunchButton()); - } - public void removeFrom(Buildable parent) { - ((GameModule) parent).getToolBar().remove(getLaunchButton()); - } - - public void apply() { + public void apply() { List l = new ArrayList(); for (Iterator it = Map.getAllMaps(); it.hasNext();) { l.add(it.next()); } GameModule.getGameModule().sendAndLog( globalCommand.apply((Map[]) l.toArray(new Map[l.size()]), - filter)); + getFilter())); } } Modified: VASSAL-src/trunk/VASSAL/build/module/map/MassKeyCommand.java =================================================================== --- VASSAL-src/trunk/VASSAL/build/module/map/MassKeyCommand.java 2006-11-14 16:05:41 UTC (rev 1455) +++ VASSAL-src/trunk/VASSAL/build/module/map/MassKeyCommand.java 2006-11-15 14:36:16 UTC (rev 1456) @@ -43,6 +43,7 @@ import VASSAL.build.module.Map; import VASSAL.build.module.documentation.HelpFile; import VASSAL.build.module.gamepieceimage.StringEnumConfigurer; +import VASSAL.build.module.properties.PropertySource; import VASSAL.configure.Configurer; import VASSAL.configure.ConfigurerFactory; import VASSAL.configure.HotKeyConfigurer; @@ -60,6 +61,7 @@ import VASSAL.counters.PropertiesPieceFilter; import VASSAL.tools.FormattedString; import VASSAL.tools.LaunchButton; +import VASSAL.tools.ToolBarComponent; /** * Adds a button to a map window toolbar. Hitting the button applies a particular key command to all pieces on that map @@ -91,6 +93,8 @@ protected String checkProperty; protected String checkValue; protected String propertiesFilter; + protected PropertySource propertySource; + protected boolean filterIsDynamic; protected PieceFilter filter; private Map map; protected GlobalCommand globalCommand = new GlobalCommand(); @@ -106,8 +110,15 @@ } public void addTo(Buildable parent) { - map = (Map) parent; - map.getToolBar().add(launch); + if (parent instanceof Map) { + map = (Map) parent; + } + if (parent instanceof ToolBarComponent) { + ((ToolBarComponent)parent).getToolBar().add(launch); + } + if (parent instanceof PropertySource) { + propertySource = (PropertySource) parent; + } } public void apply() { @@ -115,7 +126,7 @@ } public void apply(Map m) { - GameModule.getGameModule().sendAndLog(globalCommand.apply(m, filter)); + GameModule.getGameModule().sendAndLog(globalCommand.apply(m, getFilter())); } public Class[] getAllowableConfigureComponents() { @@ -316,15 +327,24 @@ } public void removeFrom(Buildable parent) { - map.getToolBar().remove(launch); + if (parent instanceof ToolBarComponent) { + ((ToolBarComponent)parent).getToolBar().remove(launch); + } } + public PieceFilter getFilter() { + if (filterIsDynamic) { + buildFilter(); + } + return filter; + } + private void buildFilter() { if (checkValue != null) { propertiesFilter = checkProperty + "=" + checkValue; } if (propertiesFilter != null) { - filter = PropertiesPieceFilter.parse(propertiesFilter); + filter = PropertiesPieceFilter.parse(new FormattedString(propertiesFilter).getText(propertySource)); } if (filter != null && condition != null) { filter = new BooleanAndPieceFilter(filter, new PieceFilter() { @@ -394,6 +414,7 @@ } else if (PROPERTIES_FILTER.equals(key)) { propertiesFilter = (String) value; + filterIsDynamic = propertiesFilter != null && propertiesFilter.indexOf('$') >= 0; buildFilter(); } else if (CONDITION.equals(key)) { @@ -420,4 +441,5 @@ launch.setAttribute(key, value); } } + } Modified: VASSAL-src/trunk/VASSAL/build/module/map/StackMetrics.java =================================================================== --- VASSAL-src/trunk/VASSAL/build/module/map/StackMetrics.java 2006-11-14 16:05:41 UTC (rev 1455) +++ VASSAL-src/trunk/VASSAL/build/module/map/StackMetrics.java 2006-11-15 14:36:16 UTC (rev 1456) @@ -464,7 +464,7 @@ if (index < 0) { throw new RuntimeException(c.getId() + " is not contained in " + parent.getId()); } - Point[] pos = new Point[index + 1]; + Point[] pos = new Point[parent.getPieceCount()]; getContents(parent, pos, null, null, 0, 0); return pos[index]; } Modified: VASSAL-src/trunk/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java =================================================================== --- VASSAL-src/trunk/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java 2006-11-14 16:05:41 UTC (rev 1455) +++ VASSAL-src/trunk/VASSAL/build/module/map/boardPicker/board/mapgrid/PolygonEditor.java 2006-11-15 14:36:16 UTC (rev 1456) @@ -119,7 +119,6 @@ } } catch (NumberFormatException e) { - e.printStackTrace(); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <uck...@us...> - 2006-11-14 16:05:45
|
Revision: 1455 http://svn.sourceforge.net/vassalengine/?rev=1455&view=rev Author: uckelman Date: 2006-11-14 08:05:41 -0800 (Tue, 14 Nov 2006) Log Message: ----------- * Draw selection rectangle more efficiently. * Document that KeyBufferer is responsible for drawing the selection rectangle. * Merged from uckelman-svg 1448, 1454. Modified Paths: -------------- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/KeyBufferer.java Modified: VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/KeyBufferer.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/KeyBufferer.java 2006-11-14 15:51:31 UTC (rev 1454) +++ VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/KeyBufferer.java 2006-11-14 16:05:41 UTC (rev 1455) @@ -18,10 +18,13 @@ */ package VASSAL.build.module.map; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; +import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; +import java.awt.Stroke; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; @@ -41,8 +44,11 @@ import VASSAL.counters.Stack; /** - * This component listens for mouse clicks on a map. - * If the user clicks on a {@link GamePiece}, that piece is added to the {@link KeyBuffer} + * This component listens for mouse clicks on a map and draws the selection + * rectangle. + * If the user clicks on a {@link GamePiece}, that piece is added to the + * {@link KeyBuffer}. {@link #draw(Graphics, Map)} is responsible for + * drawing the mouse selection rectangle. * * @see Map#addLocalMouseListener */ @@ -177,10 +183,12 @@ public void draw(Graphics g, Map map) { if (selection != null) { - g.setColor(color); - for (int i = 0; i < thickness; ++i) { - g.drawRect(selection.x + i, selection.y + i, selection.width, selection.height); - } + Graphics2D g2d = (Graphics2D) g; + Stroke str = g2d.getStroke(); + g2d.setStroke(new BasicStroke(thickness)); + g2d.setColor(color); + g2d.drawRect(selection.x, selection.y, selection.width, selection.height); + g2d.setStroke(str); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <uck...@us...> - 2006-11-14 15:51:39
|
Revision: 1453 http://svn.sourceforge.net/vassalengine/?rev=1453&view=rev Author: uckelman Date: 2006-11-14 07:40:31 -0800 (Tue, 14 Nov 2006) Log Message: ----------- Merged trunk 1448:HEAD to pick up missed merge. Modified Paths: -------------- VASSAL-src/branches/uckelman-merge/VASSAL/Info.java VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/BoardPicker.java VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/boardPicker/Board.java VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/boardPicker/BoardSlot.java Modified: VASSAL-src/branches/uckelman-merge/VASSAL/Info.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/Info.java 2006-11-12 20:56:16 UTC (rev 1452) +++ VASSAL-src/branches/uckelman-merge/VASSAL/Info.java 2006-11-14 15:40:31 UTC (rev 1453) @@ -30,7 +30,7 @@ * Class for storing release-related information */ public final class Info { - private static final String VERSION = "2.9.2"; + private static final String VERSION = "2.9.3"; private static Boolean is2dEnabled; private static Boolean isDndEnabled; /** This class should not be instantiated */ Modified: VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/BoardPicker.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/BoardPicker.java 2006-11-12 20:56:16 UTC (rev 1452) +++ VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/BoardPicker.java 2006-11-14 15:40:31 UTC (rev 1453) @@ -28,8 +28,12 @@ import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; import java.util.HashSet; +import java.util.Iterator; +import java.util.List; import java.util.Set; import java.util.Vector; import javax.swing.BoxLayout; @@ -315,19 +319,19 @@ public void setBoards(Enumeration bdEnum) { reset(); - Vector v = new Vector(); + List l = new ArrayList(); while (bdEnum.hasMoreElements()) { - v.addElement(bdEnum.nextElement()); + l.add(bdEnum.nextElement()); } - for (Enumeration e = v.elements(); e.hasMoreElements();) { - Board b = (Board) e.nextElement(); + for (Iterator e = l.iterator(); e.hasNext();) { + Board b = (Board) e.next(); if (b.relativePosition().x > nx - 1) addColumn(); if (b.relativePosition().y > ny - 1) addRow(); } - for (Enumeration e = v.elements(); e.hasMoreElements();) { - Board b = (Board) e.nextElement(); + for (Iterator e = l.iterator(); e.hasNext();) { + Board b = (Board) e.next(); getSlot(b.relativePosition().x + nx * b.relativePosition().y).setBoard(b); } pack(); @@ -365,7 +369,7 @@ * the user via the dialog or from reading a savefile */ public Enumeration getCurrentBoards() { - return currentBoards == null ? new Vector().elements() + return currentBoards == null ? Collections.enumeration(Collections.EMPTY_LIST) : currentBoards.elements(); } @@ -476,7 +480,7 @@ reset(); } else if (okButton == e.getSource()) { - currentBoards = pickBoards(); + currentBoards = new Vector(getBoardsFromControls()); setVisible(false); } else if (cancelButton == e.getSource()) { @@ -485,8 +489,20 @@ } } + /** + * @deprecated use {@link #getBoardsFromControls()} + * @return + */ public Vector pickBoards() { - Vector v = new Vector(); + return new Vector(getBoardsFromControls()); + } + + /** + * Return the list of boards as specified in the current controls + * @return + */ + public List getBoardsFromControls() { + List boardList = new ArrayList(); if (controls != null) { // Adjust the bounds of each board according to its relative position for (int i = 0; i < nx; ++i) { @@ -494,12 +510,12 @@ Board b = getSlot(i + nx * j).getBoard(); if (b != null) { b.relativePosition().move(i, j); - v.addElement(b); + boardList.add(b); } } } } - return v; + return boardList; } public void reset() { @@ -629,6 +645,9 @@ Point p = new Point(st.nextInt(0),st.nextInt(0)); Board b = getBoard(name); if (b != null) { + if (bds.contains(b)) { + b = b.copy(); + } b.setReversed(reversed); b.relativePosition().move(p.x, p.y); b.fixImage(GameModule.getGameModule().getFrame()); Modified: VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/boardPicker/Board.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/boardPicker/Board.java 2006-11-12 20:56:16 UTC (rev 1452) +++ VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/boardPicker/Board.java 2006-11-14 15:40:31 UTC (rev 1453) @@ -35,6 +35,7 @@ import javax.swing.JOptionPane; import VASSAL.build.AbstractConfigurable; import VASSAL.build.Buildable; +import VASSAL.build.Builder; import VASSAL.build.GameModule; import VASSAL.build.module.GameComponent; import VASSAL.build.module.Map; @@ -307,6 +308,12 @@ public MapGrid getGrid() { return grid; } + + public Board copy() { + Board b = new Board(); + b.build(getBuildElement(Builder.createNewDocument())); + return b; + } public void fixImage(Component map) { Cleanup.init(); Modified: VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/boardPicker/BoardSlot.java =================================================================== --- VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/boardPicker/BoardSlot.java 2006-11-12 20:56:16 UTC (rev 1452) +++ VASSAL-src/branches/uckelman-merge/VASSAL/build/module/map/boardPicker/BoardSlot.java 2006-11-14 15:40:31 UTC (rev 1453) @@ -93,6 +93,9 @@ } else { Board b = picker.getBoard((String) boards.getSelectedItem()); + if (picker.getBoardsFromControls().contains(b)) { + b = b.copy(); + } setBoard(b); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <uck...@us...> - 2006-11-14 15:51:39
|
Revision: 1454 http://svn.sourceforge.net/vassalengine/?rev=1454&view=rev Author: uckelman Date: 2006-11-14 07:51:31 -0800 (Tue, 14 Nov 2006) Log Message: ----------- Added comment indicating that the KeyBufferer draws the selection rectangle. Modified Paths: -------------- VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/KeyBufferer.java Modified: VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/KeyBufferer.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/KeyBufferer.java 2006-11-14 15:40:31 UTC (rev 1453) +++ VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/KeyBufferer.java 2006-11-14 15:51:31 UTC (rev 1454) @@ -44,8 +44,11 @@ import VASSAL.counters.Stack; /** - * This component listens for mouse clicks on a map. - * If the user clicks on a {@link GamePiece}, that piece is added to the {@link KeyBuffer} + * This component listens for mouse clicks on a map and draws the selection + * rectangle. + * If the user clicks on a {@link GamePiece}, that piece is added to the + * {@link KeyBuffer}. {@link #draw(Graphics, Map)} is responsible for + * drawing the mouse selection rectangle. * * @see Map#addLocalMouseListener */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <uck...@us...> - 2006-11-12 20:56:29
|
Revision: 1452 http://svn.sourceforge.net/vassalengine/?rev=1452&view=rev Author: uckelman Date: 2006-11-12 12:56:16 -0800 (Sun, 12 Nov 2006) Log Message: ----------- Initial version. Added Paths: ----------- VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/Whiteboard.java Added: VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/Whiteboard.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/Whiteboard.java (rev 0) +++ VASSAL-src/branches/uckelman-svg/VASSAL/build/module/map/Whiteboard.java 2006-11-12 20:56:16 UTC (rev 1452) @@ -0,0 +1,450 @@ + +package VASSAL.build.module.map; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.GraphicsEnvironment; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.Stroke; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.geom.Ellipse2D; +import java.awt.geom.GeneralPath; +import java.awt.image.BufferedImage; +import java.beans.PropertyChangeListener; +import java.util.Iterator; +import java.util.LinkedList; + +import javax.swing.ButtonGroup; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JColorChooser; +import javax.swing.JComboBox; +import javax.swing.JFormattedTextField; +import javax.swing.JPopupMenu; +import javax.swing.JSpinner; +import javax.swing.JToggleButton; +import javax.swing.SpinnerNumberModel; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; + +import VASSAL.build.AbstractConfigurable; +import VASSAL.build.Buildable; +import VASSAL.build.Configurable; +import VASSAL.build.module.Map; +import VASSAL.build.module.documentation.HelpFile; +import VASSAL.configure.Configurer; + +public class Whiteboard extends AbstractConfigurable + implements Buildable, + Configurable, + Drawable, + MouseListener, + MouseMotionListener { + + public static final int MOVE = 0; + public static final int LINE = 1; + public static final int RECT = 2; + public static final int OVAL = 3; + public static final int TEXT = 4; + public static final int LAST = 5; + + public static final String[][] tInfo = { + { "Move", "/images/hand.png" }, + { "Line", "/images/squiggle.png" }, + { "Rectangle", "/images/rectangle.png" }, + { "Ellipse", "/images/ellipse.png" }, + { "Text", null } + }; + + protected JToggleButton[] bn; + protected int curtool; + + protected Map map; + + protected GeneralPath path; + protected Point anchor; + protected Rectangle rect; + protected Ellipse2D.Float oval; + protected Color color; + protected int size; + + protected LinkedList doodles; + + protected boolean visible = true; + protected long lastRelease = 0; + + protected JToggleButton moveBn, lineBn, rectBn, ovalBn; + + protected JButton colorBn; + protected BufferedImage swatch; + + protected JSpinner sizeSp; + protected SpinnerNumberModel sizeSNM; + + protected JComboBox fontCB; + + public Whiteboard() { + doodles = new LinkedList(); + color = Color.red; + + ActionListener al = new ActionListener() { + public void actionPerformed(ActionEvent e) { + try { + setTool(Integer.parseInt(e.getActionCommand())); + } + catch (NumberFormatException ex) { + } + } + }; + + ButtonGroup bnGroup = new ButtonGroup(); + + moveBn = new JToggleButton( + new ImageIcon(getClass().getResource(tInfo[MOVE][1]))); + moveBn.setActionCommand(String.valueOf(MOVE)); + moveBn.addActionListener(al); + + lineBn = new JToggleButton( + new ImageIcon(getClass().getResource(tInfo[LINE][1]))); + lineBn.setActionCommand(String.valueOf(LINE)); + lineBn.addActionListener(al); + + rectBn = new JToggleButton( + new ImageIcon(getClass().getResource(tInfo[RECT][1]))); + rectBn.setActionCommand(String.valueOf(RECT)); + rectBn.addActionListener(al); + + ovalBn = new JToggleButton( + new ImageIcon(getClass().getResource(tInfo[OVAL][1]))); + ovalBn.setActionCommand(String.valueOf(OVAL)); + ovalBn.addActionListener(al); + + bnGroup.add(moveBn); + bnGroup.add(lineBn); + bnGroup.add(rectBn); + bnGroup.add(ovalBn); + + //////////////////////////////////////////////////////////////////// + // color button + //////////////////////////////////////////////////////////////////// + swatch = new BufferedImage(18, 18, BufferedImage.TYPE_4BYTE_ABGR); + Graphics g = swatch.getGraphics(); + g.setColor(Color.black); + g.drawRect(0, 0, 17, 17); + g.setColor(color); + g.fillRect(1, 1, 16, 16); + + final JColorChooser cpicker = new JColorChooser(); + final JPopupMenu cpop = new JPopupMenu(); + cpop.insert(cpicker, 0); + + colorBn = new JButton(new ImageIcon(swatch)); + colorBn.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + cpicker.setColor(color); + cpop.show(colorBn, 0, colorBn.getHeight()); + } + }); + + cpop.addPopupMenuListener(new PopupMenuListener() { + public void popupMenuCanceled(PopupMenuEvent e) { + } + + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + Color newc = cpicker.getColor(); + if (newc != null && newc != color) { + Graphics g = swatch.getGraphics(); + g.setColor(newc); + g.fillRect(1, 1, 16, 16); + color = newc; + } + } + + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + } + }); + + //////////////////////////////////////////////////////////////////// + // size spinner + //////////////////////////////////////////////////////////////////// + sizeSNM = new SpinnerNumberModel(new Integer(10), new Integer(1), + null, new Integer(1)); + sizeSp = new JSpinner(sizeSNM); + ((JSpinner.DefaultEditor)(sizeSp.getEditor())) + .getTextField().setColumns(2); + sizeSp.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + size = sizeSNM.getNumber().intValue(); + } + }); + + //////////////////////////////////////////////////////////////////// + // font selector + //////////////////////////////////////////////////////////////////// + GraphicsEnvironment ge = + GraphicsEnvironment.getLocalGraphicsEnvironment(); + String[] fonts = ge.getAvailableFontFamilyNames(); + fontCB = new JComboBox(fonts); + } + + public void setTool(int tool) { + if (curtool == MOVE && tool != MOVE) { + map.pushMouseListener(this); + } + else if (curtool != MOVE && tool == MOVE) { + map.popMouseListener(); + } + + curtool = tool; + } + + public boolean isVisible() { + return visible; + } + + public void setVisible(boolean state) { + visible = state; + } + + public void setup(boolean show) { + moveBn.setEnabled(show); + lineBn.setEnabled(show); + rectBn.setEnabled(show); + ovalBn.setEnabled(show); + + colorBn.setEnabled(show); + sizeSp.setEnabled(show); + fontCB.setEnabled(show); + } + + /////////////////////////////////////////////////////////////////////// + // MouseListener + /////////////////////////////////////////////////////////////////////// + public void mouseClicked(MouseEvent e) { + } + + public void mousePressed(MouseEvent e) { + if (!visible) return; + + switch (curtool) { + case LINE: + path = new GeneralPath(); + doodles.add(new Doodle(path, color, size)); + anchor = map.componentCoordinates(e.getPoint()); + path.moveTo(anchor.x, anchor.y); + break; + case RECT: + anchor = map.componentCoordinates(e.getPoint()); + rect = new Rectangle(anchor.x, anchor.y, 0, 0); + doodles.add(new Doodle(rect, color, size)); + break; + case OVAL: + anchor = map.componentCoordinates(e.getPoint()); + oval = new Ellipse2D.Float(anchor.x, anchor.y, 0, 0); + doodles.add(new Doodle(oval, color, size)); + break; + default: + } + } + + public void mouseReleased(MouseEvent e) { + } + + public void mouseEntered(MouseEvent e) { + } + + public void mouseExited(MouseEvent e) { + } + + /////////////////////////////////////////////////////////////////////// + // MouseMotionListener + /////////////////////////////////////////////////////////////////////// + public void mouseDragged(MouseEvent e) { + if (!visible) return; + + switch (curtool) { + case MOVE: + return; + case LINE: + anchor = map.componentCoordinates(e.getPoint()); + path.lineTo(anchor.x, anchor.y); + break; + case RECT: + if (e.isShiftDown()) { + rect.width = rect.height = Math.max( + Math.abs(e.getX() - anchor.x), + Math.abs(e.getY() - anchor.y)); + rect.x = e.getX() < anchor.x ? anchor.x - rect.width : anchor.x; + rect.y = e.getY() < anchor.y ? anchor.y - rect.height : anchor.y; + } + else { + rect.x = Math.min(e.getX(), anchor.x); + rect.y = Math.min(e.getY(), anchor.y); + rect.width = Math.abs(e.getX() - anchor.x); + rect.height = Math.abs(e.getY() - anchor.y); + } + break; + case OVAL: + if (e.isShiftDown()) { + oval.width = oval.height = Math.max( + Math.abs(e.getX() - anchor.x), + Math.abs(e.getY() - anchor.y)); + oval.x = e.getX() < anchor.x ? anchor.x - oval.width : anchor.x; + oval.y = e.getY() < anchor.y ? anchor.y - oval.height : anchor.y; + } + else { + oval.x = Math.min(e.getX(), anchor.x); + oval.y = Math.min(e.getY(), anchor.y); + oval.width = Math.abs(e.getX() - anchor.x); + oval.height = Math.abs(e.getY() - anchor.y); + } + break; + default: + } + + map.repaint(); + } + + public void mouseMoved(MouseEvent e) { + } + + /////////////////////////////////////////////////////////////////////// + // Drawable + /////////////////////////////////////////////////////////////////////// + public void draw(Graphics g, Map map) { + if (!visible || doodles.isEmpty()) return; + + Graphics2D g2d = (Graphics2D) g; + Stroke str = g2d.getStroke(); + + for (Iterator i = doodles.iterator(); i.hasNext(); ) { + Doodle d = (Doodle) i.next(); + g2d.setStroke(new BasicStroke(d.size)); + g2d.setColor(d.color); + g2d.draw(d.shape); + } + + g2d.setStroke(str); + } + + public boolean drawAboveCounters() { + return true; + } + + /////////////////////////////////////////////////////////////////////// + // Buildable + /////////////////////////////////////////////////////////////////////// + public void add(Buildable child) { + } + + public void addTo(Buildable parent) { + map = (Map) parent; + map.getView().addMouseMotionListener(this); + map.addDrawComponent(this); + + map.getToolBar().add(moveBn); + map.getToolBar().add(lineBn); + map.getToolBar().add(rectBn); + map.getToolBar().add(ovalBn); + + map.getToolBar().add(colorBn); + map.getToolBar().add(sizeSp); + map.getToolBar().add(fontCB); + } + + public void build(Element e) { + } + + public Element getBuildElement(Document doc) { + return doc.createElement(getClass().getName()); + } + + /////////////////////////////////////////////////////////////////////// + // Configurable + /////////////////////////////////////////////////////////////////////// + public void addPropertyChangeListener(PropertyChangeListener l) { + } + + public HelpFile getHelpFile() { + return null; + } + + public void removeFrom(Buildable parent) { + map = (Map) parent; + map.removeDrawComponent(this); + + map.getToolBar().remove(moveBn); + map.getToolBar().remove(lineBn); + map.getToolBar().remove(rectBn); + map.getToolBar().remove(ovalBn); + + map.getToolBar().remove(colorBn); + map.getToolBar().remove(sizeSp); + map.getToolBar().remove(fontCB); + } + + /////////////////////////////////////////////////////////////////////// + // AbstractConfigurable + /////////////////////////////////////////////////////////////////////// + public String[] getAttributeDescriptions() { + return new String[0]; + } + + public Class[] getAttributeTypes() { + return new Class[0]; + } + + public Configurable[] getConfigureComponents() { + return new Configurable[0]; + } + + public Class[] getAllowableConfigureComponents() { + return new Class[0]; + } + + /////////////////////////////////////////////////////////////////////// + // AbstractBuildable + /////////////////////////////////////////////////////////////////////// + public String[] getAttributeNames() { + return new String[0]; + } + + public String getAttributeValueString(String key) { + return null; + } + + public void setAttribute(String key, Object value) { + } + + /////////////////////////////////////////////////////////////////////// + + public static String getConfigureTypeName() { + return "Whiteboard"; + } + + public static class Doodle { + public Color color; + public Shape shape; + public int size; + + public Doodle(Shape s, Color c, int sz) { + color = c; + shape = s; + size = sz; + } + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <uck...@us...> - 2006-11-12 12:49:17
|
Revision: 1451 http://svn.sourceforge.net/vassalengine/?rev=1451&view=rev Author: uckelman Date: 2006-11-12 04:49:12 -0800 (Sun, 12 Nov 2006) Log Message: ----------- Merged from trunk 1449, 1450. Modified Paths: -------------- VASSAL-src/branches/uckelman-svg/VASSAL/counters/DragBuffer.java VASSAL-src/branches/uckelman-svg/VASSAL/counters/PieceSorter.java VASSAL-src/branches/uckelman-svg/VASSAL/tools/Sort.java Modified: VASSAL-src/branches/uckelman-svg/VASSAL/counters/DragBuffer.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/counters/DragBuffer.java 2006-11-12 05:41:39 UTC (rev 1450) +++ VASSAL-src/branches/uckelman-svg/VASSAL/counters/DragBuffer.java 2006-11-12 12:49:12 UTC (rev 1451) @@ -24,11 +24,12 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import java.util.Collections; +import java.util.Comparator; import java.util.Enumeration; import java.util.Vector; import javax.swing.JFrame; import VASSAL.build.module.Map; -import VASSAL.tools.Sort; public class DragBuffer { private static DragBuffer theBuffer; @@ -196,8 +197,19 @@ return c; } - public void sort(Sort.Comparator comp) { - Sort.quicksort(pieces, comp); + public void sort(Comparator comp) { + try { + Collections.sort(pieces, comp); + } + catch (Exception e) { + } } + + /** + * @deprecated Use {@link #sort(Comparator)} instead. + */ + public void sort(VASSAL.tools.Sort.Comparator comp) { + sort((Comparator) comp); + } } Modified: VASSAL-src/branches/uckelman-svg/VASSAL/counters/PieceSorter.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/counters/PieceSorter.java 2006-11-12 05:41:39 UTC (rev 1450) +++ VASSAL-src/branches/uckelman-svg/VASSAL/counters/PieceSorter.java 2006-11-12 12:49:12 UTC (rev 1451) @@ -19,7 +19,6 @@ package VASSAL.counters; import java.util.Comparator; -import VASSAL.tools.Sort; /** * Sorts GamePieces according to their position: @@ -31,7 +30,6 @@ public int compare(Object o1, Object o2) { GamePiece p1 = (GamePiece) o1; GamePiece p2 = (GamePiece) o2; - int result = 0; if (p1.getMap() == null && p2.getMap() == null) { return 0; } @@ -41,8 +39,10 @@ else if (p2.getMap() == null) { return -1; } + + int result = 0; if (p1.getMap() != p2.getMap()) { - result = new Sort.Alpha().compare(p1.getMap().getId(), p2.getMap().getId()); + result = p1.getMap().getId().compareTo(p2.getMap().getId()); } else { Stack s1 = p1 instanceof Stack ? (Stack) p1 : p1.getParent(); Modified: VASSAL-src/branches/uckelman-svg/VASSAL/tools/Sort.java =================================================================== --- VASSAL-src/branches/uckelman-svg/VASSAL/tools/Sort.java 2006-11-12 05:41:39 UTC (rev 1450) +++ VASSAL-src/branches/uckelman-svg/VASSAL/tools/Sort.java 2006-11-12 12:49:12 UTC (rev 1451) @@ -30,6 +30,7 @@ /** * Quicksort implementation so we can sort using JRE 1.1 + * @deprecated Use {@link java.util.Collections.sort} instead. */ public class Sort { private static void swap(Vector v, int i, int j) { @@ -122,12 +123,17 @@ quicksort(v, 0, v.size() - 1, comp); } + /** + * @deprecated Use {@link java.util.Comparator} instead. + */ public static interface Comparator { public int compare(Object o1, Object o2); } /** * Compares two String objects + * @deprecated Use the natural ordering on Strings instead. + * @see java.lang.String.compareTo(String) */ public static class Alpha implements Comparator { public int compare(Object o1, Object o2) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rod...@us...> - 2006-11-12 05:41:41
|
Revision: 1450 http://svn.sourceforge.net/vassalengine/?rev=1450&view=rev Author: rodneykinney Date: 2006-11-11 21:41:39 -0800 (Sat, 11 Nov 2006) Log Message: ----------- Remove custom Sort class merge from uckelman-merge@1447 Modified Paths: -------------- VASSAL-src/trunk/VASSAL/counters/DragBuffer.java VASSAL-src/trunk/VASSAL/counters/PieceSorter.java VASSAL-src/trunk/VASSAL/tools/Sort.java Modified: VASSAL-src/trunk/VASSAL/counters/DragBuffer.java =================================================================== --- VASSAL-src/trunk/VASSAL/counters/DragBuffer.java 2006-11-12 05:33:50 UTC (rev 1449) +++ VASSAL-src/trunk/VASSAL/counters/DragBuffer.java 2006-11-12 05:41:39 UTC (rev 1450) @@ -24,11 +24,12 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; +import java.util.Collections; +import java.util.Comparator; import java.util.Enumeration; import java.util.Vector; import javax.swing.JFrame; import VASSAL.build.module.Map; -import VASSAL.tools.Sort; public class DragBuffer { private static DragBuffer theBuffer; @@ -196,8 +197,19 @@ return c; } - public void sort(Sort.Comparator comp) { - Sort.quicksort(pieces, comp); + public void sort(Comparator comp) { + try { + Collections.sort(pieces, comp); + } + catch (Exception e) { + } } + + /** + * @deprecated Use {@link #sort(Comparator)} instead. + */ + public void sort(VASSAL.tools.Sort.Comparator comp) { + sort((Comparator) comp); + } } Modified: VASSAL-src/trunk/VASSAL/counters/PieceSorter.java =================================================================== --- VASSAL-src/trunk/VASSAL/counters/PieceSorter.java 2006-11-12 05:33:50 UTC (rev 1449) +++ VASSAL-src/trunk/VASSAL/counters/PieceSorter.java 2006-11-12 05:41:39 UTC (rev 1450) @@ -19,7 +19,6 @@ package VASSAL.counters; import java.util.Comparator; -import VASSAL.tools.Sort; /** * Sorts GamePieces according to their position: @@ -31,7 +30,6 @@ public int compare(Object o1, Object o2) { GamePiece p1 = (GamePiece) o1; GamePiece p2 = (GamePiece) o2; - int result = 0; if (p1.getMap() == null && p2.getMap() == null) { return 0; } @@ -41,8 +39,10 @@ else if (p2.getMap() == null) { return -1; } + + int result = 0; if (p1.getMap() != p2.getMap()) { - result = new Sort.Alpha().compare(p1.getMap().getId(), p2.getMap().getId()); + result = p1.getMap().getId().compareTo(p2.getMap().getId()); } else { Stack s1 = p1 instanceof Stack ? (Stack) p1 : p1.getParent(); Modified: VASSAL-src/trunk/VASSAL/tools/Sort.java =================================================================== --- VASSAL-src/trunk/VASSAL/tools/Sort.java 2006-11-12 05:33:50 UTC (rev 1449) +++ VASSAL-src/trunk/VASSAL/tools/Sort.java 2006-11-12 05:41:39 UTC (rev 1450) @@ -30,6 +30,7 @@ /** * Quicksort implementation so we can sort using JRE 1.1 + * @deprecated Use {@link java.util.Collections.sort} instead. */ public class Sort { private static void swap(Vector v, int i, int j) { @@ -122,12 +123,17 @@ quicksort(v, 0, v.size() - 1, comp); } + /** + * @deprecated Use {@link java.util.Comparator} instead. + */ public static interface Comparator { public int compare(Object o1, Object o2); } /** * Compares two String objects + * @deprecated Use the natural ordering on Strings instead. + * @see java.lang.String.compareTo(String) */ public static class Alpha implements Comparator { public int compare(Object o1, Object o2) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <rod...@us...> - 2006-11-12 05:33:59
|
Revision: 1449 http://svn.sourceforge.net/vassalengine/?rev=1449&view=rev Author: rodneykinney Date: 2006-11-11 21:33:50 -0800 (Sat, 11 Nov 2006) Log Message: ----------- v2.9.3 BoardPicker: allow duplicate instances of Board with the same name Modified Paths: -------------- VASSAL-src/trunk/VASSAL/Info.java VASSAL-src/trunk/VASSAL/build/module/map/BoardPicker.java VASSAL-src/trunk/VASSAL/build/module/map/boardPicker/Board.java VASSAL-src/trunk/VASSAL/build/module/map/boardPicker/BoardSlot.java Modified: VASSAL-src/trunk/VASSAL/Info.java =================================================================== --- VASSAL-src/trunk/VASSAL/Info.java 2006-11-11 23:17:47 UTC (rev 1448) +++ VASSAL-src/trunk/VASSAL/Info.java 2006-11-12 05:33:50 UTC (rev 1449) @@ -30,7 +30,7 @@ * Class for storing release-related information */ public final class Info { - private static final String VERSION = "2.9.2"; + private static final String VERSION = "2.9.3"; private static Boolean is2dEnabled; private static Boolean isDndEnabled; /** This class should not be instantiated */ Modified: VASSAL-src/trunk/VASSAL/build/module/map/BoardPicker.java =================================================================== --- VASSAL-src/trunk/VASSAL/build/module/map/BoardPicker.java 2006-11-11 23:17:47 UTC (rev 1448) +++ VASSAL-src/trunk/VASSAL/build/module/map/BoardPicker.java 2006-11-12 05:33:50 UTC (rev 1449) @@ -28,8 +28,12 @@ import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Collections; import java.util.Enumeration; import java.util.HashSet; +import java.util.Iterator; +import java.util.List; import java.util.Set; import java.util.Vector; import javax.swing.BoxLayout; @@ -315,19 +319,19 @@ public void setBoards(Enumeration bdEnum) { reset(); - Vector v = new Vector(); + List l = new ArrayList(); while (bdEnum.hasMoreElements()) { - v.addElement(bdEnum.nextElement()); + l.add(bdEnum.nextElement()); } - for (Enumeration e = v.elements(); e.hasMoreElements();) { - Board b = (Board) e.nextElement(); + for (Iterator e = l.iterator(); e.hasNext();) { + Board b = (Board) e.next(); if (b.relativePosition().x > nx - 1) addColumn(); if (b.relativePosition().y > ny - 1) addRow(); } - for (Enumeration e = v.elements(); e.hasMoreElements();) { - Board b = (Board) e.nextElement(); + for (Iterator e = l.iterator(); e.hasNext();) { + Board b = (Board) e.next(); getSlot(b.relativePosition().x + nx * b.relativePosition().y).setBoard(b); } pack(); @@ -365,7 +369,7 @@ * the user via the dialog or from reading a savefile */ public Enumeration getCurrentBoards() { - return currentBoards == null ? new Vector().elements() + return currentBoards == null ? Collections.enumeration(Collections.EMPTY_LIST) : currentBoards.elements(); } @@ -476,7 +480,7 @@ reset(); } else if (okButton == e.getSource()) { - currentBoards = pickBoards(); + currentBoards = new Vector(getBoardsFromControls()); setVisible(false); } else if (cancelButton == e.getSource()) { @@ -485,8 +489,20 @@ } } + /** + * @deprecated use {@link #getBoardsFromControls()} + * @return + */ public Vector pickBoards() { - Vector v = new Vector(); + return new Vector(getBoardsFromControls()); + } + + /** + * Return the list of boards as specified in the current controls + * @return + */ + public List getBoardsFromControls() { + List boardList = new ArrayList(); if (controls != null) { // Adjust the bounds of each board according to its relative position for (int i = 0; i < nx; ++i) { @@ -494,12 +510,12 @@ Board b = getSlot(i + nx * j).getBoard(); if (b != null) { b.relativePosition().move(i, j); - v.addElement(b); + boardList.add(b); } } } } - return v; + return boardList; } public void reset() { @@ -629,6 +645,9 @@ Point p = new Point(st.nextInt(0),st.nextInt(0)); Board b = getBoard(name); if (b != null) { + if (bds.contains(b)) { + b = b.copy(); + } b.setReversed(reversed); b.relativePosition().move(p.x, p.y); b.fixImage(GameModule.getGameModule().getFrame()); Modified: VASSAL-src/trunk/VASSAL/build/module/map/boardPicker/Board.java =================================================================== --- VASSAL-src/trunk/VASSAL/build/module/map/boardPicker/Board.java 2006-11-11 23:17:47 UTC (rev 1448) +++ VASSAL-src/trunk/VASSAL/build/module/map/boardPicker/Board.java 2006-11-12 05:33:50 UTC (rev 1449) @@ -35,6 +35,7 @@ import javax.swing.JOptionPane; import VASSAL.build.AbstractConfigurable; import VASSAL.build.Buildable; +import VASSAL.build.Builder; import VASSAL.build.GameModule; import VASSAL.build.module.GameComponent; import VASSAL.build.module.Map; @@ -307,6 +308,12 @@ public MapGrid getGrid() { return grid; } + + public Board copy() { + Board b = new Board(); + b.build(getBuildElement(Builder.createNewDocument())); + return b; + } public void fixImage(Component map) { Cleanup.init(); Modified: VASSAL-src/trunk/VASSAL/build/module/map/boardPicker/BoardSlot.java =================================================================== --- VASSAL-src/trunk/VASSAL/build/module/map/boardPicker/BoardSlot.java 2006-11-11 23:17:47 UTC (rev 1448) +++ VASSAL-src/trunk/VASSAL/build/module/map/boardPicker/BoardSlot.java 2006-11-12 05:33:50 UTC (rev 1449) @@ -93,6 +93,9 @@ } else { Board b = picker.getBoard((String) boards.getSelectedItem()); + if (picker.getBoardsFromControls().contains(b)) { + b = b.copy(); + } setBoard(b); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |