package org.docear.plugin.core.ui.wizard;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.SwingUtilities;
/**
* @author genzmehr@docear.org
*
*/
public class WizardMouseAdapter extends MouseAdapter {
public static final int BORDER_RIGHT = 0x1;
public static final int BORDER_BOTTOM = 0x2;
public static final int BORDER_LEFT = 0x4;
public static final int BORDER_TOP = 0x8;
private static final int RESIZE_SENSE_WIDTH = 5;
private int resizeSensor = 0;
private final Wizard wizard;
private Point point;
private List<ComponentDragListener> dragListeners;
/***********************************************************************************
* CONSTRUCTORS
**********************************************************************************/
public WizardMouseAdapter(Wizard wizard) {
this.wizard = wizard;
}
/***********************************************************************************
* METHODS
**********************************************************************************/
@Override
public void mouseDragged(MouseEvent e) {
Point tempPoint = e.getPoint();
SwingUtilities.convertPointToScreen(tempPoint, e.getComponent());
if(point != null) {
int dx = tempPoint.x-point.x;
int dy = tempPoint.y-point.y;
ComponentDragEvent event = new ComponentDragEvent(e.getComponent(), dx, dy, getDirectionSensor());
dispatchDragEvent(event);
}
point = tempPoint;
e.consume();
}
public void addComponentDragListener(ComponentDragListener listener) {
if(this.dragListeners == null) {
this.dragListeners = new ArrayList<ComponentDragListener>();
}
this.dragListeners.add(listener);
}
public void removeComponentDragListener(ComponentDragListener listener) {
if(this.dragListeners != null) {
this.dragListeners.remove(listener);
if(this.dragListeners.size() == 0) {
this.dragListeners = null;
}
}
}
private void dispatchDragEvent(ComponentDragEvent event) {
if(dragListeners != null) {
for (int i=dragListeners.size()-1; i >= 0; i--) {
if(event.consumed()) {
break;
}
dragListeners.get(i).componentDragged(event);
}
}
}
private void dispatchResizeCursorEvent(AdjustResizeCursorEvent event) {
if(dragListeners != null) {
for (int i=dragListeners.size()-1; i >= 0; i--) {
if(event.consumed()) {
break;
}
dragListeners.get(i).componentAdjustResizeCursor(event);
}
}
}
@Override
public void mouseMoved(MouseEvent e) {
Point tempPoint = e.getPoint();
SwingUtilities.convertPointToScreen(tempPoint, e.getComponent());
point = tempPoint;
if(wizard.isResizable()) {
resizeSensor = 0;
// if(e.getPoint().x < RESIZE_SENSE_WIDTH) {
// resizeSensor |= BORDER_LEFT;
// }
// if(e.getPoint().y < RESIZE_SENSE_WIDTH) {
// resizeSensor |= BORDER_TOP;
// }
if(e.getPoint().x > (e.getComponent().getWidth()-RESIZE_SENSE_WIDTH)) {
resizeSensor |= BORDER_RIGHT;
}
if(e.getPoint().y > (e.getComponent().getHeight()-RESIZE_SENSE_WIDTH)) {
resizeSensor |= BORDER_BOTTOM;
}
dispatchResizeCursorEvent(new AdjustResizeCursorEvent(e.getComponent(), resizeSensor));
e.consume();
}
}
private int getDirectionSensor() {
int sensor = 0;
if((resizeSensor & (BORDER_TOP | BORDER_BOTTOM)) > 0) {
sensor |= ComponentDragEvent.DIRECTION_VERTICAL;
}
if((resizeSensor & (BORDER_LEFT | BORDER_RIGHT)) > 0) {
sensor |= ComponentDragEvent.DIRECTION_HORIZONTAL;
}
return sensor;
}
public boolean isResizeArea() {
return resizeSensor > 0;
}
/***********************************************************************************
* REQUIRED METHODS FOR INTERFACES
**********************************************************************************/
}