帆软报表设计器源代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

196 lines
6.3 KiB

package com.fr.grid;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.KeyStroke;
import com.fr.design.mainframe.ElementCasePane;
import com.fr.report.stable.ReportConstants;
public class GridKeyAction extends AbstractAction {
private Grid grid;
private String actionKey;
private boolean isShift;
public GridKeyAction(Grid grid, String actionKey, boolean isShift) {
this.grid = grid;
this.actionKey = actionKey;
this.isShift = isShift;
}
/**
* 注册默认的InputMap和ActionMap.
*/
protected static void initGridInputActionMap(Grid grid) {
InputMap inputMap = grid.getInputMap();
ActionMap actionMap = grid.getActionMap();
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "left");
actionMap.put("left", new GridKeyAction(grid, "left", false));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, InputEvent.SHIFT_MASK), "left_shift");
actionMap.put("left_shift", new GridKeyAction(grid, "left", true));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "right");
actionMap.put("right", new GridKeyAction(grid, "right", false));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, InputEvent.SHIFT_MASK), "right_shift");
actionMap.put("right_shift", new GridKeyAction(grid, "right", true));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "up");
actionMap.put("up", new GridKeyAction(grid, "up", false));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, InputEvent.SHIFT_MASK), "up_shift");
actionMap.put("up_shift", new GridKeyAction(grid, "up", true));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "down");
actionMap.put("down", new GridKeyAction(grid, "down", false));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, InputEvent.SHIFT_MASK), "down_shift");
actionMap.put("down_shift", new GridKeyAction(grid, "down", true));
// Enter + Tab
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0), "enter");
actionMap.put("enter", new GridKeyAction(grid, "enter", false));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.SHIFT_MASK), "enter_shift");
actionMap.put("enter_shift", new GridKeyAction(grid, "enter", true));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "tab");
actionMap.put("tab", new GridKeyAction(grid, "tab", false));
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, InputEvent.SHIFT_MASK), "tab_shift");
actionMap.put("tab_shift", new GridKeyAction(grid, "tab", true));
}
public void actionPerformed(ActionEvent e) {
if ("left".equals(actionKey)) {
selectionMove(ReportConstants.MOVE_DIRECTION_LEFT);
} else if ("right".equals(actionKey)) {
selectionMove(ReportConstants.MOVE_DIRECTION_RIGHT);
} else if ("up".equals(actionKey)) {
selectionMove(ReportConstants.MOVE_DIRECTION_UP);
} else if ("down".equals(actionKey)) {
selectionMove(ReportConstants.MOVE_DIRECTION_DOWN);
} else if ("enter".equals(actionKey)) {
enterKeyPressed();
} else if ("tab".equals(actionKey)) {
tabKeyPressed();
}
}
private void enterKeyPressed() {
if (grid.isCellEditing()) {
grid.stopEditing();
}
selectionMove(ReportConstants.MOVE_DIRECTION_DOWN);
}
private void tabKeyPressed() {
if (grid.isCellEditing()) {
grid.stopEditing();
}
selectionMove(ReportConstants.MOVE_DIRECTION_RIGHT);
}
/**
* Tab, Enter Move
*/
private void selectionMove(int direction) {
ElementCasePane ePane = grid.getElementCasePane();
if (direction == ReportConstants.MOVE_DIRECTION_DOWN) {
ePane.getSelection().moveDown(ePane);
} else if (direction == ReportConstants.MOVE_DIRECTION_RIGHT) {
ePane.getSelection().moveRight(ePane);
} else if (direction == ReportConstants.MOVE_DIRECTION_UP) {
ePane.getSelection().moveUp(ePane);
} else if (direction == ReportConstants.MOVE_DIRECTION_LEFT) {
ePane.getSelection().moveLeft(ePane);
}
ePane.repaint();
}
private static abstract class Helper {
public abstract int getCoordinate(Rectangle rect);
public abstract int getSize(Rectangle rect);
public abstract int getOppoCoordinate(Rectangle rect);
public abstract int getOppoSize(Rectangle rect);
public abstract Rectangle asRect(int coordinate, int oppoCoordinate, int size, int oppoSize);
}
private static abstract class VisibleHelper {
public abstract void ensureVisible(ElementCasePane reportPane, Rectangle rect);
}
private static final Helper UNION_LEFT = new Helper() {
@Override
public int getCoordinate(Rectangle rect) {
return rect.x;
}
@Override
public int getSize(Rectangle rect) {
return rect.width;
}
@Override
public int getOppoCoordinate(Rectangle rect) {
return rect.y;
}
@Override
public int getOppoSize(Rectangle rect) {
return rect.height;
}
@Override
public Rectangle asRect(int coordinate, int oppoCoordinate, int size, int oppoSize) {
return new Rectangle(coordinate, oppoCoordinate, size, oppoSize);
}
};
private static final VisibleHelper LEFT = new VisibleHelper() {
@Override
public void ensureVisible(ElementCasePane reportPane, Rectangle rect) {
reportPane.ensureColumnRowVisible(rect.x + rect.width - 1, rect.y);
}
};
private static final Helper UNION_UP = new Helper() {
@Override
public int getCoordinate(Rectangle rect) {
return UNION_LEFT.getOppoCoordinate(rect);
}
@Override
public int getSize(Rectangle rect) {
return UNION_LEFT.getOppoSize(rect);
}
@Override
public int getOppoCoordinate(Rectangle rect) {
return UNION_LEFT.getCoordinate(rect);
}
@Override
public int getOppoSize(Rectangle rect) {
return UNION_LEFT.getSize(rect);
}
@Override
public Rectangle asRect(int coordinate, int oppoCoordinate, int size, int oppoSize) {
return new Rectangle(oppoCoordinate, coordinate, oppoSize, size);
}
};
private static final VisibleHelper UP = new VisibleHelper() {
@Override
public void ensureVisible(ElementCasePane reportPane, Rectangle rect) {
reportPane.ensureColumnRowVisible(rect.x, rect.y + rect.height - 1);
}
};
}