From: Frederick W. <fre...@us...> - 2012-01-10 21:23:50
|
LocalisedText.properties | 1 data/18AL/Map.xml | 2 - data/Properties.xml | 1 rails/ui/swing/MapPanel.java | 42 ++++++++++++++++++---- rails/ui/swing/ORPanel.java | 63 +++++++++++++++++++++++++-------- rails/ui/swing/hexmap/HexMapImage.java | 16 +++++++- 6 files changed, 101 insertions(+), 24 deletions(-) New commits: commit fe8675fe0c3ec8691b2460593f331a8535f872a4 Author: Frederick Weld <fre...@gm...> Date: Tue Jan 10 22:17:48 2012 +0100 Transformed fit-to zoom from one-time zoom to permanent auto-zoom The fit-to-xyz zoom options are now check box menu items. The selected option is permanent in the sense that MapPanel resizing will lead automatically lead to the selected/active fit-to-xyz option. In addition, added a new map config option to define what the default zoom option is when starting a game. Furthermore, fixed a legacy issue with initial mapImage resizing that had been marked with FIXME. diff --git a/LocalisedText.properties b/LocalisedText.properties index b3875f2..6deba63 100644 --- a/LocalisedText.properties +++ b/LocalisedText.properties @@ -182,6 +182,7 @@ Config.label.font.ui.style=Font style Config.label.local.player.name=Local player (for pbem) Config.label.locale=Language setting Config.label.map.autoscroll=Map autoscroll +Config.label.map.defaultZoomFitOption=Default zoom fit option Config.label.map.displayCurrentRoutes=Display routes of active company Config.label.map.image.display=Display background map Config.label.map.highlightHexes=Highlight company locations diff --git a/data/18AL/Map.xml b/data/18AL/Map.xml index 8bf10ff..b04770f 100644 --- a/data/18AL/Map.xml +++ b/data/18AL/Map.xml @@ -1,5 +1,5 @@ <Map tileOrientation="NS" letterOrientation="vertical" even="A"> - <Image file="18AL/18AL_Map_gamekit.svg" x="-2" y="-24" scale="0.384"/> + <Image file="18AL/18AL_Map_gamekit.svg" x="-2" y="-25" scale="0.386"/> <Hex name="A2" tile="0"/> <Hex name="A4" tile="-912" orientation="2" value="40,50" city="Nashville"/> <Hex name="B1" tile="-901" value="40,30" city="Corinth"/> diff --git a/data/Properties.xml b/data/Properties.xml index 13cb9ff..6f89262 100644 --- a/data/Properties.xml +++ b/data/Properties.xml @@ -30,6 +30,7 @@ <Section name="Map"> <Property name="map.autoscroll" type="BOOLEAN" /> <Property name="map.zoomstep" type="INTEGER" /> + <Property name="map.defaultZoomFitOption" type="LIST" values="none,fit to window,fit to width,fit to height" /> <Property name="map.image.display" type="BOOLEAN" /> <Property name="map.displayCurrentRoutes" type="BOOLEAN" /> <Property name="map.highlightHexes" type="BOOLEAN" /> diff --git a/rails/ui/swing/MapPanel.java b/rails/ui/swing/MapPanel.java index 6175b9b..23e4a24 100644 --- a/rails/ui/swing/MapPanel.java +++ b/rails/ui/swing/MapPanel.java @@ -2,6 +2,8 @@ package rails.ui.swing; import java.awt.*; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; import java.awt.event.KeyEvent; import java.util.List; @@ -33,6 +35,10 @@ public class MapPanel extends JPanel { private JLayeredPane layeredPane; private Dimension originalMapSize; private Dimension currentMapSize; + + //active fit-to zoom options + private boolean fitToWidth = false; + private boolean fitToHeight = false; protected static Logger log = Logger.getLogger(MapPanel.class.getPackage().getName()); @@ -78,6 +84,14 @@ public class MapPanel extends JPanel { setSize(originalMapSize); setLocation(25, 25); + //add listener for auto fit upon resize events + addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + super.componentResized(e); + zoomFit (fitToWidth, fitToHeight); + } + }); } @@ -122,15 +136,13 @@ public class MapPanel extends JPanel { layeredPane.setPreferredSize(currentMapSize); map.setBounds(0, 0, currentMapSize.width, currentMapSize.height); if (mapImage != null) { - mapImage.setBounds(0, 0, currentMapSize.width, currentMapSize.height); - mapImage.setPreferredSize(currentMapSize); - mapImage.zoom(map.getZoomStep()); - // FIXME setBounds() seems to be sufficient to resize a JSVGCanvas, but it doesn't always work... + mapImage.setBoundsAndResize(currentMapSize,map.getZoomStep()); } layeredPane.revalidate(); } public void zoom (boolean in) { + removeFitToOption(); map.zoom(in); adjustToNewMapZoom(); } @@ -141,6 +153,8 @@ public class MapPanel extends JPanel { * determined on top of that. */ private void zoomFit (boolean fitToWidth, boolean fitToHeight) { + if (!fitToWidth && !fitToHeight) return; + ImageLoader imageLoader = GameUIManager.getImageLoader(); int zoomStep = map.getZoomStep(); @@ -212,16 +226,30 @@ public class MapPanel extends JPanel { adjustToNewMapZoom(); } + private void fitToOption (boolean fitToWidth, boolean fitToHeight) { + //ignore if nothing has changed + if (this.fitToWidth == fitToWidth && this.fitToHeight == fitToHeight ) return; + + this.fitToWidth = fitToWidth; + this.fitToHeight = fitToHeight; + zoomFit(fitToWidth, fitToHeight); + } + public void fitToWindow () { - zoomFit (true, true); + fitToOption (true, true); } public void fitToWidth () { - zoomFit (true, false); + fitToOption (true, false); } public void fitToHeight () { - zoomFit (false, true); + fitToOption (false, true); + } + + public void removeFitToOption () { + fitToWidth = false; + fitToHeight = false; } public void keyPressed(KeyEvent e) { diff --git a/rails/ui/swing/ORPanel.java b/rails/ui/swing/ORPanel.java index 03bbc19..959d644 100644 --- a/rails/ui/swing/ORPanel.java +++ b/rails/ui/swing/ORPanel.java @@ -214,17 +214,14 @@ implements ActionListener, KeyListener, RevenueListener { zoomOut.addActionListener(this); zoomOut.setEnabled(true); zoomMenu.add(zoomOut); - fitToWindow = new JMenuItem("Fit to window"); - fitToWindow.addActionListener(this); - fitToWindow.setEnabled(true); + fitToWindow = createFitToMenuItem("Fit to window"); + if (fitToWindow.isSelected()) orWindow.getMapPanel().fitToWindow(); zoomMenu.add(fitToWindow); - fitToWidth = new JMenuItem("Fit to width"); - fitToWidth.addActionListener(this); - fitToWidth.setEnabled(true); + fitToWidth = createFitToMenuItem("Fit to width"); + if (fitToWidth.isSelected()) orWindow.getMapPanel().fitToWidth(); zoomMenu.add(fitToWidth); - fitToHeight = new JMenuItem("Fit to height"); - fitToHeight.addActionListener(this); - fitToHeight.setEnabled(true); + fitToHeight = createFitToMenuItem("Fit to height"); + if (fitToHeight.isSelected()) orWindow.getMapPanel().fitToHeight(); zoomMenu.add(fitToHeight); calibrateMap = new JMenuItem("CalibrateMap"); calibrateMap.addActionListener(this); @@ -239,6 +236,18 @@ implements ActionListener, KeyListener, RevenueListener { addKeyListener(this); } + private JCheckBoxMenuItem createFitToMenuItem(String name) { + JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem(name); + menuItem.addActionListener(this); + menuItem.setEnabled(true); + + //check whether this is the default fit to option + if (name.equalsIgnoreCase(Config.get("map.defaultZoomFitOption"))) { + menuItem.setSelected(true); + } + return menuItem; + } + public void recreate(OperatingRound or) { log.debug("ORPanel.recreate() called"); @@ -814,20 +823,44 @@ implements ActionListener, KeyListener, RevenueListener { orUIManager.processAction(command, executedActions); } else if (source == zoomIn) { + fitToWindow.setSelected(false); + fitToWidth.setSelected(false); + fitToHeight.setSelected(false); orWindow.getMapPanel().zoom(true); redrawRoutes(); } else if (source == zoomOut) { + fitToWindow.setSelected(false); + fitToWidth.setSelected(false); + fitToHeight.setSelected(false); orWindow.getMapPanel().zoom(false); redrawRoutes(); } else if (source == fitToWindow) { - orWindow.getMapPanel().fitToWindow(); - redrawRoutes(); + if (fitToWindow.isSelected()) { + fitToWidth.setSelected(false); + fitToHeight.setSelected(false); + orWindow.getMapPanel().fitToWindow(); + redrawRoutes(); + } else { + orWindow.getMapPanel().removeFitToOption(); + } } else if (source == fitToWidth) { - orWindow.getMapPanel().fitToWidth(); - redrawRoutes(); + if (fitToWidth.isSelected()) { + fitToWindow.setSelected(false); + fitToHeight.setSelected(false); + orWindow.getMapPanel().fitToWidth(); + redrawRoutes(); + } else { + orWindow.getMapPanel().removeFitToOption(); + } } else if (source == fitToHeight) { - orWindow.getMapPanel().fitToHeight(); - redrawRoutes(); + if (fitToHeight.isSelected()) { + fitToWindow.setSelected(false); + fitToWidth.setSelected(false); + orWindow.getMapPanel().fitToHeight(); + redrawRoutes(); + } else { + orWindow.getMapPanel().removeFitToOption(); + } } else if (source == calibrateMap) { MapManager mapManager = orUIManager.getMap().getMapManager(); String offsetX = JOptionPane.showInputDialog(this, "Change translation in X-dimension", mapManager.getMapXOffset()); diff --git a/rails/ui/swing/hexmap/HexMapImage.java b/rails/ui/swing/hexmap/HexMapImage.java index 06a7af5..ec64685 100644 --- a/rails/ui/swing/hexmap/HexMapImage.java +++ b/rails/ui/swing/hexmap/HexMapImage.java @@ -34,6 +34,8 @@ public final class HexMapImage extends JSVGCanvas { private double zoomFactor = 1; // defined dynamically if zoomStep changed private int zoomStep = 10; // default value, can be overwritten in config private boolean initialized = false; + private Dimension initialMapSize = null; + private int initialZoomStep = 0; public void init(MapManager mapManager,HexMap hexMap) { @@ -82,8 +84,10 @@ public final class HexMapImage extends JSVGCanvas { if (!initialized) { // store the rendering Transform initialTransform = getRenderingTransform(); - scaleMap(); initialized = true; + + //catch up on setting the bounds (if bounds setting were called before rendering prepare) + if (initialMapSize != null) setBoundsAndResize(initialMapSize,initialZoomStep); } addGVTTreeRendererListener(null); } @@ -108,6 +112,16 @@ public final class HexMapImage extends JSVGCanvas { setRenderingTransform (at, true); } + public void setBoundsAndResize (Dimension currentMapSize,int zoomStep) { + if (initialized) { + setBounds(0, 0, currentMapSize.width, currentMapSize.height); + setPreferredSize(currentMapSize); + zoom(zoomStep); + } else { + initialMapSize = currentMapSize; + initialZoomStep = zoomStep; + } + } public void zoom (boolean in) { if (in) zoomStep++; else zoomStep--; zoom(); |