Update of /cvsroot/rails/18xx/rails/ui/swing In directory sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv4117/rails/ui/swing Modified Files: UpgradesPanel.java RemainingTilesWindow.java ORPanel.java GUIToken.java ImageLoader.java MapPanel.java Log Message: Map made zoomable. Index: UpgradesPanel.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/ui/swing/UpgradesPanel.java,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** UpgradesPanel.java 5 Nov 2009 22:50:38 -0000 1.19 --- UpgradesPanel.java 15 Dec 2009 18:56:10 -0000 1.20 *************** *** 201,205 **** private BufferedImage getHexImage(int tileId) { ! return GameUIManager.getImageLoader().getTile(tileId); } --- 201,205 ---- private BufferedImage getHexImage(int tileId) { ! return GameUIManager.getImageLoader().getTile(tileId, 10); } Index: ImageLoader.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/ui/swing/ImageLoader.java,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** ImageLoader.java 15 Jan 2009 20:53:28 -0000 1.12 --- ImageLoader.java 15 Dec 2009 18:56:11 -0000 1.13 *************** *** 7,14 **** --- 7,17 ---- import javax.imageio.ImageIO; + import javax.xml.parsers.DocumentBuilder; + import javax.xml.parsers.DocumentBuilderFactory; import org.apache.batik.transcoder.*; import org.apache.batik.transcoder.image.ImageTranscoder; import org.apache.log4j.Logger; + import org.w3c.dom.Document; import rails.ui.swing.hexmap.GUIHex; *************** *** 21,25 **** public class ImageLoader { ! private static HashMap<String, BufferedImage> tileMap; private static int svgWidth = 60; --- 24,31 ---- public class ImageLoader { ! private static Map<Integer, Map<Integer, BufferedImage>> tileMap; ! ! private static Map<Integer, Document> svgMap; ! private static double[] zoomFactors = new double[21]; private static int svgWidth = 60; *************** *** 65,69 **** } ! private void loadTile(int tileID) { BufferedImage image = null; --- 71,75 ---- } ! private BufferedImage loadTile(int tileID, double zoomFactor) { BufferedImage image = null; *************** *** 74,83 **** // If loading the GIF fails, try loading the SVG. log.warn("Attempting to load SVG version of tile " + tileID); ! image = getSVGTile(tileID); } } else { ! image = getSVGTile(tileID); if (image == null) { // If loading the SVG fails, try loading the GIF. --- 80,89 ---- // If loading the GIF fails, try loading the SVG. log.warn("Attempting to load SVG version of tile " + tileID); ! image = getSVGTile(tileID, zoomFactor); } } else { ! image = getSVGTile(tileID, zoomFactor); if (image == null) { // If loading the SVG fails, try loading the GIF. *************** *** 86,101 **** } } ! ! /* Image will be stored, even if null, to prevent further searches. */ ! tileMap.put(Integer.toString(tileID), image); } ! private BufferedImage getSVGTile(int tileID) { String fn = "tile" + Integer.toString(tileID) + ".svg"; ! log.debug("Loading tile " + fn); BufferedImage image = null; try { InputStream stream = ResourceLoader.getInputStream(fn, directories); if (stream != null) { --- 92,106 ---- } } ! return image; } ! private BufferedImage getSVGTile(int tileID, double zoomFactor) { String fn = "tile" + Integer.toString(tileID) + ".svg"; ! //log.debug("Loading SVG tile " + fn); BufferedImage image = null; try { + /* InputStream stream = ResourceLoader.getInputStream(fn, directories); if (stream != null) { *************** *** 109,112 **** --- 114,144 ---- image = t.getImage(); } + */ + // Experimental new version, that stacks the XML to allow zooming + if (svgMap == null) { + svgMap = new HashMap<Integer, Document>(64); + } + if (!svgMap.containsKey(tileID)) { + Document doc = null; + // Step 1: create a DocumentBuilderFactory and setNamespaceAware + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setNamespaceAware(true); + // Step 2: create a DocumentBuilder + DocumentBuilder db = dbf.newDocumentBuilder(); + + // Step 3: parse the input file to get a Document object + doc = + db.parse(ResourceLoader.getInputStream(fn, + directories)); + // Cache the doc + svgMap.put(tileID, doc); + } + BufferedImageTranscoder t = new BufferedImageTranscoder(); + t.addTranscodingHint(ImageTranscoder.KEY_WIDTH, new Float(svgWidth * zoomFactor)); + t.addTranscodingHint(ImageTranscoder.KEY_HEIGHT, new Float(svgHeight * zoomFactor)); + TranscoderInput input = new TranscoderInput(svgMap.get(tileID)); + t.transcode(input, null); + image = t.getImage(); + } catch (Exception e) { log.error("SVG transcoding for tile id " + tileID + " failed with " *************** *** 120,124 **** private BufferedImage getGIFTile(int tileID) { String fn = "tile" + Integer.toString(tileID) + ".gif"; ! log.debug("Loading tile " + fn); BufferedImage image = null; --- 152,156 ---- private BufferedImage getGIFTile(int tileID) { String fn = "tile" + Integer.toString(tileID) + ".gif"; ! //log.debug("Loading tile " + fn); BufferedImage image = null; *************** *** 137,149 **** } ! public BufferedImage getTile(int tileID) { ! // Check for cached copy before loading from disk. ! if (!tileMap.containsKey(Integer.toString(tileID))) loadTile(tileID); - return tileMap.get(Integer.toString(tileID)); } public ImageLoader() { - tileMap = new HashMap<String, BufferedImage>(); directories.add(tileRootDir + svgTileDir); directories.add(tileRootDir + gifTileDir); --- 169,199 ---- } ! public BufferedImage getTile(int tileID, int zoomStep) { ! ! if (tileMap == null) { ! tileMap = new HashMap<Integer, Map<Integer, BufferedImage>>(64); ! } ! if (!tileMap.containsKey(tileID)) { ! tileMap.put(tileID, new HashMap<Integer, BufferedImage>(4)); ! } ! if (!tileMap.get(tileID).containsKey(zoomStep)) { ! BufferedImage image = loadTile(tileID, getZoomFactor(zoomStep)); ! tileMap.get(tileID).put(zoomStep, image); ! } ! ! return tileMap.get(tileID).get(zoomStep); ! } ! ! public double getZoomFactor (int zoomStep) { ! if (zoomStep < 0) zoomStep = 0; ! else if (zoomStep > 20) zoomStep = 20; ! if (zoomFactors[zoomStep] == 0.0) { ! zoomFactors[zoomStep] = 1.0 * Math.pow(2.0, 0.25*(zoomStep-10)); ! } ! return zoomFactors[zoomStep]; } public ImageLoader() { directories.add(tileRootDir + svgTileDir); directories.add(tileRootDir + gifTileDir); Index: RemainingTilesWindow.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/ui/swing/RemainingTilesWindow.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** RemainingTilesWindow.java 17 Nov 2009 19:31:27 -0000 1.7 --- RemainingTilesWindow.java 15 Dec 2009 18:56:11 -0000 1.8 *************** *** 74,78 **** tile = tmgr.getTile(tileId); ! hexImage = GameUIManager.getImageLoader().getTile(tileId); hexIcon = new ImageIcon(hexImage); hexIcon.setImage(hexIcon.getImage().getScaledInstance( --- 74,78 ---- tile = tmgr.getTile(tileId); ! hexImage = GameUIManager.getImageLoader().getTile(tileId, 10); hexIcon = new ImageIcon(hexImage); hexIcon.setImage(hexIcon.getImage().getScaledInstance( Index: ORPanel.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/ui/swing/ORPanel.java,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** ORPanel.java 13 Dec 2009 16:39:47 -0000 1.34 --- ORPanel.java 15 Dec 2009 18:56:11 -0000 1.35 *************** *** 52,55 **** --- 52,57 ---- private JMenu specialMenu; private JMenu loansMenu; + private JMenu zoomMenu; + private JMenuItem zoomIn, zoomOut; private ActionMenuItem takeLoans; private ActionMenuItem repayLoans; *************** *** 177,181 **** if (hasCompanyLoans) { loansMenu = new JMenu (LocalText.getText("LOANS")); ! specialMenu.setEnabled(true); takeLoans = new ActionMenuItem (LocalText.getText("TakeLoans")); --- 179,183 ---- if (hasCompanyLoans) { loansMenu = new JMenu (LocalText.getText("LOANS")); ! loansMenu.setEnabled(true); takeLoans = new ActionMenuItem (LocalText.getText("TakeLoans")); *************** *** 194,197 **** --- 196,211 ---- } + zoomMenu = new JMenu("Zoom"); + zoomMenu.setEnabled(true); + zoomIn = new JMenuItem("In"); + zoomIn.addActionListener(this); + zoomIn.setEnabled(true); + zoomMenu.add(zoomIn); + zoomOut = new JMenuItem("Out"); + zoomOut.addActionListener(this); + zoomOut.setEnabled(true); + zoomMenu.add(zoomOut); + menuBar.add(zoomMenu); + add(menuBar, BorderLayout.NORTH); *************** *** 529,532 **** --- 543,550 ---- orUIManager.processAction(command, executedActions); + } else if (source == zoomIn) { + orWindow.getMapPanel().zoomIn(); + } else if (source == zoomOut) { + orWindow.getMapPanel().zoomOut(); } else { orUIManager.processAction(command, null); Index: GUIToken.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/ui/swing/GUIToken.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** GUIToken.java 13 Dec 2009 21:13:39 -0000 1.8 --- GUIToken.java 15 Dec 2009 18:56:11 -0000 1.9 *************** *** 3,8 **** import java.awt.*; ! import java.awt.geom.*; ! import javax.swing.*; /** --- 3,9 ---- import java.awt.*; ! import java.awt.geom.Ellipse2D; ! ! import javax.swing.JPanel; /** *************** *** 25,29 **** private static final Font largeTokenFont = new Font("Helvetica", Font.BOLD, 12); ! public void paintComponent(Graphics g) { clear(g); Graphics2D g2d = (Graphics2D) g; --- 26,31 ---- private static final Font largeTokenFont = new Font("Helvetica", Font.BOLD, 12); ! @Override ! public void paintComponent(Graphics g) { clear(g); Graphics2D g2d = (Graphics2D) g; *************** *** 76,80 **** } ! public GUIToken(Color fc, Color bc, String name, int x, int y, double diameter) { super(); --- 78,82 ---- } ! public GUIToken(Color fc, Color bc, String name, int xCenter, int yCenter, double diameter) { super(); *************** *** 84,88 **** this.diameter = diameter; ! circle = new Ellipse2D.Double(x, y, diameter, diameter); this.setForeground(fgColor); --- 86,91 ---- this.diameter = diameter; ! circle = new Ellipse2D.Double(xCenter - 0.5*diameter, ! yCenter-0.5*diameter, diameter, diameter); this.setForeground(fgColor); *************** *** 104,108 **** } ! public String getName() { return name; } --- 107,112 ---- } ! @Override ! public String getName() { return name; } Index: MapPanel.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/ui/swing/MapPanel.java,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** MapPanel.java 2 Nov 2009 23:30:34 -0000 1.11 --- MapPanel.java 15 Dec 2009 18:56:11 -0000 1.12 *************** *** 2,17 **** package rails.ui.swing; import javax.swing.*; import org.apache.log4j.Logger; ! import rails.game.*; import rails.game.action.LayTile; import rails.game.action.LayToken; ! import rails.ui.swing.hexmap.*; ! ! import java.awt.*; ! import java.awt.event.*; ! import java.util.List; /** --- 2,17 ---- package rails.ui.swing; + import java.awt.BorderLayout; + import java.awt.event.KeyEvent; + import java.util.List; + import javax.swing.*; import org.apache.log4j.Logger; ! import rails.game.MapManager; import rails.game.action.LayTile; import rails.game.action.LayToken; ! import rails.ui.swing.hexmap.HexMap; /** *************** *** 48,56 **** scrollPane = new JScrollPane(map); - scrollPane.setSize(map.getPreferredSize()); add(scrollPane, BorderLayout.CENTER); ! setSize(map.getPreferredSize().width, map.getPreferredSize().height); setLocation(25, 25); } --- 48,57 ---- scrollPane = new JScrollPane(map); add(scrollPane, BorderLayout.CENTER); ! scrollPane.setSize(map.getPreferredSize()); ! ! setSize(map.getPreferredSize().width, map.getPreferredSize().height); setLocation(25, 25); } *************** *** 65,68 **** --- 66,77 ---- } + public void zoomIn() { + map.zoomIn(); + } + + public void zoomOut() { + map.zoomOut(); + } + public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_F1) { |