/**
* Copyright 2014
* SMEdit https://github.com/StarMade/SMEdit
* SMTools https://github.com/StarMade/SMTools
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
**/
package jo.sm.ui;
import java.awt.Component;
import java.awt.KeyEventDispatcher;
import java.awt.Window;
import java.awt.event.KeyEvent;
import java.util.logging.Logger;
import jo.sm.data.SparseMatrix;
import jo.sm.logic.GridLogic;
import jo.sm.logic.StarMadeLogic;
import jo.sm.ship.data.Block;
import jo.vecmath.Point3i;
import jo.vecmath.logic.Point3iLogic;
public class RenderPanelKeyEventDispatcher implements KeyEventDispatcher {
private static final int PAN_XM = 'A';
private static final int PAN_XP = 'D';
private static final int PAN_YM = 'W';
private static final int PAN_YP = 'S';
private static final int PAN_ZM = 'Q';
private static final int PAN_ZP = 'E';
private static final int SELECTION_MOVE = 0;
private static final int SELECTION_MOVE_UPPER = 0x40;
private static final int SELECTION_MOVE_LOWER = 0x80;
private static final int SELECTION_NUDGE = 0x200;
private static final Logger LOG = Logger.getLogger(RenderPanelKeyEventDispatcher.class.getName());
private final AWTRenderPanel mPanel;
public RenderPanelKeyEventDispatcher(AWTRenderPanel panel) {
mPanel = panel;
}
@Override
public boolean dispatchKeyEvent(KeyEvent ev) {
if (!isFocused()) {
return false;
}
if (ev.getID() == KeyEvent.KEY_PRESSED) {
doKeyDown(ev.getKeyCode(), ev.getModifiersEx());
} else if (ev.getID() == KeyEvent.KEY_RELEASED) {
doKeyUp(ev.getKeyCode(), ev.getModifiersEx());
}
return false;
}
public void doKeyDown(int keyCode, int keyMod) {
//System.out.println("code="+Integer.toHexString(keyCode)+", mod="+Integer.toHexString(keyMod));
Point3i lower = StarMadeLogic.getInstance().getSelectedLower();
Point3i upper = StarMadeLogic.getInstance().getSelectedUpper();
if ((lower != null) && (upper != null)) {
normalize(lower, upper);
if (keyMod == SELECTION_MOVE_UPPER) {
doMoveUpperSelection(keyCode, upper);
} else if (keyMod == SELECTION_MOVE_LOWER) {
doMoveLowerSelection(keyCode, lower);
} else if (keyMod == SELECTION_MOVE) {
doMoveSelection(keyCode, lower, upper);
} else if (keyMod == SELECTION_NUDGE) {
doNudgeSelection(keyCode, lower, upper);
}
mPanel.updateTiles();
} else {
doPan(keyCode, keyMod);
}
}
private void normalize(Point3i lower, Point3i upper) {
Point3i l = Point3iLogic.min(lower, upper);
Point3i u = Point3iLogic.max(lower, upper);
lower.set(l);
upper.set(u);
}
private void doPan(int keyCode, int keyMod) {
if (keyMod == 0) {
Point3i delta = keyToDelta(keyCode, null);
mPanel.mPOVTranslate.x += delta.x;
mPanel.mPOVTranslate.y += delta.y;
mPanel.mPOVTranslate.z += delta.z;
mPanel.updateTransform();
}
}
private void doMoveUpperSelection(int keyCode, Point3i upper) {
keyToDelta(keyCode, upper);
}
private void doMoveLowerSelection(int keyCode, Point3i lower) {
keyToDelta(keyCode, lower);
}
private void doMoveSelection(int keyCode, Point3i lower, Point3i upper) {
keyToDelta(keyCode, lower);
keyToDelta(keyCode, upper);
}
private void doNudgeSelection(int keyCode, Point3i lower, Point3i upper) {
mPanel.getUndoer().checkpoint(StarMadeLogic.getModel());
SparseMatrix<Block> clip = GridLogic.extract(StarMadeLogic.getModel(), lower, upper);
GridLogic.delete(StarMadeLogic.getModel(), lower, upper);
keyToDelta(keyCode, lower);
keyToDelta(keyCode, upper);
GridLogic.insert(StarMadeLogic.getModel(), clip, lower);
}
private Point3i keyToDelta(int keyCode, Point3i delta) {
if (delta == null) {
delta = new Point3i();
}
if (keyCode == PAN_XP) {
delta.x++;
} else if (keyCode == PAN_XM) {
delta.x--;
} else if (keyCode == PAN_YP) {
delta.y++;
} else if (keyCode == PAN_YM) {
delta.y--;
} else if (keyCode == PAN_ZP) {
delta.z++;
} else if (keyCode == PAN_ZM) {
delta.z--;
}
return delta;
}
public void doKeyUp(int keyCode, int keyMod) {
}
private boolean isFocused() {
for (Component c = mPanel; c != null; c = c.getParent()) {
if (c instanceof Window) {
if (((Window) c).isActive()) {
return true;
}
}
}
return false;
}
}