/*
* Copyright (c) 2014 tabletoptool.com team.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* rptools.com team - initial implementation
* tabletoptool.com team - further development
*/
package com.t3.model.grid;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.geom.Area;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.Action;
import javax.swing.KeyStroke;
import com.t3.client.tool.PointerTool;
import com.t3.model.CellPoint;
import com.t3.model.MovementKey;
import com.t3.model.TokenFootprint;
import com.t3.model.ZonePoint;
import com.t3.xstreamversioned.version.SerializationVersion;
@SerializationVersion(0)
public class GridlessGrid extends Grid {
private static List<TokenFootprint> footprintList;
// @formatter:off
private static final GridCapabilities GRID_CAPABILITIES= new GridCapabilities() {
@Override
public boolean isPathingSupported() {return false;}
@Override
public boolean isSnapToGridSupported() {return false;}
@Override
public boolean isPathLineSupported() {return false;}
@Override
public boolean isSecondDimensionAdjustmentSupported() {return false;}
@Override
public boolean isCoordinatesSupported() {return false;}
};
// @formatter:on
private static final int[] FACING_ANGLES = new int[] { -135, -90, -45, 0, 45, 90, 135, 180 };
@Override
public List<TokenFootprint> getFootprints() {
if (footprintList == null)
footprintList = loadFootprints("gridlessGridFootprints.xml");
return footprintList;
}
@Override
public int[] getFacingAngles() {
return FACING_ANGLES;
}
/*
* May as well use the same keys as for the square grid...
*/
@Override
public void installMovementKeys(PointerTool callback, Map<KeyStroke, Action> actionMap) {
if (movementKeys == null) {
movementKeys = new HashMap<KeyStroke, Action>(18); // This is 13/0.75, rounded up
Rectangle r = getFootprint(null).getBounds(this);
movementKeys.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD7, 0), new MovementKey(callback, -r.width, -r.height));
movementKeys.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD8, 0), new MovementKey(callback, 0, -r.height));
movementKeys.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD9, 0), new MovementKey(callback, r.width, -r.height));
movementKeys.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD4, 0), new MovementKey(callback, -r.width, 0));
// movementKeys.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD5, 0), new MovementKey(callback, 0, 0));
movementKeys.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD6, 0), new MovementKey(callback, r.width, 0));
movementKeys.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD1, 0), new MovementKey(callback, -r.width, r.height));
movementKeys.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD2, 0), new MovementKey(callback, 0, r.height));
movementKeys.put(KeyStroke.getKeyStroke(KeyEvent.VK_NUMPAD3, 0), new MovementKey(callback, r.width, r.height));
movementKeys.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), new MovementKey(callback, -r.width, 0));
movementKeys.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), new MovementKey(callback, r.width, 0));
movementKeys.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), new MovementKey(callback, 0, -r.height));
movementKeys.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), new MovementKey(callback, 0, r.height));
}
actionMap.putAll(movementKeys);
}
@Override
public void uninstallMovementKeys(Map<KeyStroke, Action> actionMap) {
if (movementKeys != null) {
for (KeyStroke key : movementKeys.keySet()) {
actionMap.remove(key);
}
}
}
@Override
public Rectangle getBounds(CellPoint cp) {
return new Rectangle(cp.x, cp.y, getSize(), getSize());
}
@Override
public ZonePoint convert(CellPoint cp) {
return new ZonePoint(cp.x, cp.y);
}
@Override
public CellPoint convert(ZonePoint zp) {
return new CellPoint(zp.x, zp.y);
}
@Override
protected Area createCellShape(int size) {
// Doesn't do this
return null;
}
@Override
public GridCapabilities getCapabilities() {
return GRID_CAPABILITIES;
}
@Override
public double getCellWidth() {
return getSize();
}
@Override
public double getCellHeight() {
return getSize();
}
}