/*
* MouseHandler.java
*
* Created on 21 ��� 2006 �., 15:53
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package datechooser.controller;
import datechooser.model.DateChoose;
import datechooser.view.GridPane;
import java.awt.*;
import java.awt.event.*;
import java.io.Serializable;
import java.util.*;
import javax.swing.KeyStroke;
/**
* Handles mouse events: click (select/unselect), drag;
* keyboard support.<br>
* ��������� ���������������� ��������� ����:
* ������ (���������, ������ ���������).
* ����� ����, ������������ ������ � �����������.
* �������������.
* @author Androsov Vadim
* @since 1.0
*/
public class EventHandler
implements MouseListener,
MouseMotionListener,
KeyListener,
DateChooseController,
MouseWheelListener,
Serializable {
private Rectangle gridBounds;
private GridSelection tempSel;
private GridPane view;
private boolean mouseDown;
private boolean dragging;
private boolean dragStarted;
private boolean autoScroll;
private int previousLocation;
private int previousKey;
private long previousTime;
public EventHandler() {
tempSel = new GridSelection();
mouseDown = false;
setDragging(false);
setDragStarted(false);
previousLocation = KeyEvent.KEY_LOCATION_UNKNOWN;
previousKey = KeyEvent.VK_UNDEFINED;
previousTime = 0;
}
public void reBound() {
gridBounds = getView().getBounds();
}
private GridSelection getCell(int x, int y) {
tempSel.setColumn(
x / (gridBounds.width / getView().getModel().getColsCount()));
tempSel.setRow(
y / (gridBounds.height / (getView().getModel().getRowsCount() + 1)));
return tempSel;
}
protected void doSelect(MouseEvent e) {
GridSelection sel = getCell(e.getX(), e.getY());
if (sel.getRow() == 0) return;
if (getModel().select(sel.getRow() - 1, sel.getColumn())) {
if (!isMask(e.getModifiersEx(), MouseEvent.ALT_DOWN_MASK)) {
getModel().tryApplySelection();
}
}
getView().requestFocus();
}
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() > 1) {
getModel().commit();
return;
}
doSelect(e);
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
setDragging(false);
setDragStarted(false);
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
setDragging(false);
setDragStarted(false);
}
public void mouseDragged(MouseEvent e) {
setDragging(true);
doSelect(e);
}
public void mouseMoved(MouseEvent e) {
}
public void setView(GridPane palette) {
this.view = palette;
palette.addMouseListener(this);
palette.addMouseMotionListener(this);
palette.addKeyListener(this);
palette.addMouseWheelListener(this);
}
public GridPane getView() {
return view;
}
public DateChoose getModel() {
return getView().getModel();
}
private boolean isDuplet(int key, int keyLocation) {
// System.out.println("timing is " + (System.currentTimeMillis() - previousTime));
if (previousTime == 0) {
previousTime = System.currentTimeMillis();
} else if ((System.currentTimeMillis() - previousTime) > 130) {
previousTime = System.currentTimeMillis();
previousKey = key;
previousLocation = keyLocation;
return false;
}
boolean result = (key == previousKey) && (keyLocation != previousLocation);
if (!result) {
previousKey = key;
previousLocation = keyLocation;
}
return result;
}
protected void doShift(KeyEvent e) {
int code = e.getKeyCode();
// ��� �������� �� ������� ����������
if (isDuplet(code, e.getKeyLocation())) return;
switch (code) {
case KeyEvent.VK_UP:
getModel().shift(-1, 0);
break;
case KeyEvent.VK_DOWN:
getModel().shift(1, 0);
break;
case KeyEvent.VK_LEFT:
getModel().shift(0, -1);
break;
case KeyEvent.VK_RIGHT:
getModel().shift(0, 1);
break;
case KeyEvent.VK_PAGE_DOWN:
getModel().monthShift(-1);
break;
case KeyEvent.VK_PAGE_UP:
getModel().monthShift(1);
break;
case KeyEvent.VK_END:
getModel().yearShift(-1);
break;
case KeyEvent.VK_HOME:
getModel().yearShift(1);
break;
}
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
doShift(e);
}
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE){
getModel().tryApplySelection();
}
if (e.getKeyCode() == KeyEvent.VK_ENTER){
getModel().commit();
}
}
protected boolean isDragging() {
return dragging;
}
protected void setDragging(boolean dragging) {
this.dragging = dragging;
}
protected boolean isDragStarted() {
return dragStarted;
}
protected void setDragStarted(boolean dragStarted) {
if ((!dragStarted) && isDragStarted()) {
onDragEnd();
}
this.dragStarted = dragStarted;
if (dragStarted) {
onDragStart();
}
}
protected void onDragStart() {
setAutoScroll(getModel().isAutoScroll());
getModel().setAutoScroll(false);
}
protected void onDragEnd() {
getModel().setAutoScroll(isAutoScroll());
}
public boolean isAutoScroll() {
return autoScroll;
}
public void setAutoScroll(boolean autoScroll) {
this.autoScroll = autoScroll;
}
public void mouseWheelMoved(MouseWheelEvent e) {
getModel().shift(0, e.getWheelRotation() < 0 ? -1 : 1);
}
public static boolean isMask(int modifier, int mask) {
return (modifier & mask) == mask;
}
}