Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 32 additions & 2 deletions src/VASSAL/build/module/Map.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.AffineTransform;
Expand Down Expand Up @@ -182,7 +184,7 @@
* A Map may contain many different {@link Buildable} subcomponents. Components which are added directly to a Map are
* contained in the <code>VASSAL.build.module.map</code> package
*/
public class Map extends AbstractConfigurable implements GameComponent, MouseListener, MouseMotionListener, DropTargetListener, Configurable,
public class Map extends AbstractConfigurable implements GameComponent, MouseListener, MouseMotionListener, MouseWheelListener, DropTargetListener, Configurable,
UniqueIdManager.Identifyable, ToolBarComponent, MutablePropertiesContainer, PropertySource, PlayerRoster.SideChangeListener {
protected static boolean changeReportingEnabled = true;
protected String mapID = ""; //$NON-NLS-1$
Expand All @@ -209,7 +211,9 @@ public class Map extends AbstractConfigurable implements GameComponent, MouseLis
protected String markUnmovedTooltip = Resources.getString("Map.mark_unmoved"); //$NON-NLS-1$
protected MouseListener multicaster = null;
protected ArrayList<MouseListener> mouseListenerStack =
new ArrayList<MouseListener>();
new ArrayList<MouseListener>();
protected ArrayList<MouseWheelListener> mouseWheelListenerStack =
new ArrayList<MouseWheelListener>();
protected List<Board> boards = new CopyOnWriteArrayList<Board>();
protected int[][] boardWidths; // Cache of board widths by row/column
protected int[][] boardHeights; // Cache of board heights by row/column
Expand Down Expand Up @@ -243,6 +247,7 @@ public void propertyChange(PropertyChangeEvent evt) {
public Map() {
getView();
theMap.addMouseListener(this);
theMap.addMouseWheelListener(this);
if (shouldDockIntoMainWindow()) {
toolBar.setLayout(new MigLayout("ins 0,gapx 0,hidemode 3"));
}
Expand Down Expand Up @@ -1207,6 +1212,14 @@ public void pushMouseListener(MouseListener l) {
mouseListenerStack.add(l);
}

/**
* MouseWheelListeners on a map may be pushed and popped onto a stack.
* Only the top listener on the stack receives mouse wheel events.
*/
public void pushMouseWheelListener(MouseWheelListener l) {
mouseWheelListenerStack.add(l);
}

/**
* MouseListeners on a map may be pushed and popped onto a stack. Only the top listener on the stack receives mouse
* events
Expand All @@ -1215,6 +1228,14 @@ public void popMouseListener() {
mouseListenerStack.remove(mouseListenerStack.size()-1);
}

/**
* MouseWheelListeners on a map may be pushed and popped onto a stack. Only the top listener on the stack receives mouse
* wheel events
*/
public void popMouseWheelListener() {
mouseWheelListenerStack.remove(mouseWheelListenerStack.size()-1);
}

public void mouseEntered(MouseEvent e) {
}

Expand Down Expand Up @@ -1242,6 +1263,15 @@ else if (multicaster != null) {
}
}

@Override
public void mouseWheelMoved(MouseWheelEvent e) {
if (mouseWheelListenerStack.isEmpty()) {
return;
}

mouseWheelListenerStack.get(mouseWheelListenerStack.size() - 1).mouseWheelMoved(e);
}

/**
* Mouse events are first translated into map coordinates. Then the event is forwarded to the top MouseListener in the
* stack, if any, otherwise forwarded to all LocalMouseListeners
Expand Down
23 changes: 22 additions & 1 deletion src/VASSAL/build/module/map/Scroller.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,16 @@
import VASSAL.build.module.Map;
import VASSAL.configure.BooleanConfigurer;
import VASSAL.i18n.Resources;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;

/**
* This component listens to key events on a Map window and
* scrolls the map. Depending on the USE_ARROWS attribute,
* will use number keypad or arrow keys, or will offer a
* preferences setting for the user to choose
*/
public class Scroller extends AbstractBuildable implements KeyListener {
public class Scroller extends AbstractBuildable implements KeyListener, MouseWheelListener {
/**
* The attribute name for whether to use arrow keys
* instead of number keypad. Should be one of ALWAYS, NEVER, or PROMPT
Expand All @@ -52,6 +54,7 @@ public class Scroller extends AbstractBuildable implements KeyListener {
public void addTo(Buildable parent) {
map = (Map) parent;
map.getView().addKeyListener(this);
map.getView().addMouseWheelListener(this);

final BooleanConfigurer c = new BooleanConfigurer(
USE_ARROWS,
Expand Down Expand Up @@ -143,4 +146,22 @@ public void keyTyped(KeyEvent e) {
noEcho = 0;
}
}

@Override
public void mouseWheelMoved(MouseWheelEvent event) {
int dx = 0;
int dy;
int direction = event.getWheelRotation();
if (direction > 0)
{
dy = 1;
}
else
{
dy = -1;
}

map.scroll(dx * xStep, dy * yStep);
event.consume();
}
}
25 changes: 25 additions & 0 deletions src/VASSAL/build/module/map/Zoomer.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
Expand Down Expand Up @@ -658,6 +660,29 @@ public void addTo(Buildable b) {
map.getToolBar().add(zoomInButton);
map.getToolBar().add(zoomPickButton);
map.getToolBar().add(zoomOutButton);


MouseWheelListener mouseWheelListener = new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent event) {
if(!event.isControlDown()) {
return;
}

int direction = event.getWheelRotation();
if (direction > 0)
{
zoomOut();
}
else
{
zoomIn();
}
event.consume();
}
};

map.pushMouseWheelListener(mouseWheelListener);
}

public String getAttributeValueString(String key) {
Expand Down