|
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();
|