package edu.mbl.jif.gui.imaging.zoom.util;
import edu.mbl.jif.gui.imaging.zoom.core.ZoomJPanel;
import edu.mbl.jif.gui.imaging.zoom.core.ZoomScrollPane;
import edu.mbl.jif.utils.ResourceManager;
import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
/**
* ZoomScrollPane reacts to user's mouse click.
* also a demo of how to use zoomscrollpane and zoomjpanel *
* @author Qiang Yu (qiangyu@gmail.com)
*/
public class MouseSensitiveZSP
extends ZoomScrollPane implements MouseMotionListener, MouseListener
{
public final static int ZOOMOUT_MODE = -1; //in this mode, mouse left-click zooms out
public final static int DEFAULT_MODE = 0; //in this mode, nothing follows mouse-click
public final static int ZOOMIN_MODE = 1; //in this mode, mouse left-click zooms in
private boolean mouseInteractionEnabled = false;
private Cursor zoomInCursor = null, zoomOutCursor = null,
defaultCursor = null;
private int mode = DEFAULT_MODE;
/**
* varibles help draw feedbacks
*/
BasicStroke dashed = new BasicStroke(1.0f, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER, 2.0f, new float[] {2.0f}, 0.0f);
double zoomffactor = 0.5;
int dragStartX = -1, dragStartY = -1;
Rectangle zoomRect = null;
Color zoomRectColor = Color.LIGHT_GRAY;
// GBH: Added ROI selection functions
Rectangle roiRect = null;
Color roiRectColor = Color.YELLOW;
ZoomJPanel view;
/**
* ctor
* @param view
* @param vsbPolicy
* @param hsbPolicy
*/
public MouseSensitiveZSP (ZoomJPanel view, int vsbPolicy, int hsbPolicy) {
super(view, vsbPolicy, hsbPolicy);
this.view = view;
}
/**
* ctor
* @param view
*/
public MouseSensitiveZSP (ZoomJPanel view) {
super(view);
this.view = view;
}
/**
* whether to enable mouse interaction or not
* if mouse interaction is enabled, users can use mouse to do zooming based
* on current mode (ZOOMIN_MODE, ZOOMOUT_MODE)
* @param enable
*/
public void enableMouseInteraction (boolean enable) {
mouseInteractionEnabled = enable;
if (zoomInCursor == null) {
ResourceManager rm = new ResourceManager(
"edu/mbl/jif/gui/imaging/zoom/util/resources/images");
Toolkit tk = Toolkit.getDefaultToolkit();
zoomInCursor = tk.createCustomCursor(rm.getImage("zoomin_cursor.gif"),
new Point(15, 15), "zoomin");
zoomOutCursor = tk.createCustomCursor(rm.getImage("zoomoutcursor.gif"),
new Point(15, 15), "zoomout");
defaultCursor = new Cursor(Cursor.DEFAULT_CURSOR);
}
if (mouseInteractionEnabled) {
zoomPanel.addMouseListener(this);
zoomPanel.addMouseMotionListener(this);
} else {
zoomPanel.removeMouseListener(this);
zoomPanel.removeMouseMotionListener(this);
mode = DEFAULT_MODE;
}
}
/**
* Set Current Zoom Mode
* @param m
*/
public void setZoomMode (int m) {
mode = m;
}
/**
* Get Current Zoom Mode
* @return
*/
public int getZoomMode () {
return mode;
}
public Rectangle getRoiRect () {
return roiRect;
}
public Rectangle setRoiRect (Rectangle roiNew) {
Rectangle roiWas = roiRect;
roiRect = roiNew;
return roiWas;
}
// public void paintRoiRect() {
// ZoomGraphics g = (ZoomGraphics) zoomPanel.getGraphics();
// g.setXORMode(roiRectColor);
// Stroke p = g.getStroke();
// g.setStroke(dashed);
// if (roiRect != null) {
// g.drawRect(roiRect.x, roiRect.y, roiRect.width, roiRect.height);
// }
// super.zoomPanel.paintFront(g);
// g.setPaintMode();
// g.setStroke(p);
// g.dispose();
// }
/**
* mouse event handlers
*/
public void mouseDragged (MouseEvent e) {
if (mode == ZOOMIN_MODE) {
roiRect = null;
Graphics2D g = (Graphics2D) zoomPanel.getGraphics();
g.setXORMode(zoomRectColor);
Stroke p = g.getStroke();
g.setStroke(dashed);
if (zoomRect != null) {
g.drawRect(zoomRect.x, zoomRect.y, zoomRect.width, zoomRect.height);
}
zoomRect = new Rectangle((dragStartX <= e.getX()) ? dragStartX : e.getX(),
(dragStartY <= e.getY()) ? dragStartY : e.getY(),
Math.abs(e.getX() - dragStartX), Math.abs(e.getY() - dragStartY));
g.drawRect(zoomRect.x, zoomRect.y, zoomRect.width, zoomRect.height);
g.setPaintMode();
g.setStroke(p);
g.dispose();
} else { // Select ROI mode
zoomRect = null;
Graphics2D g = (Graphics2D) zoomPanel.getGraphics();
g.setXORMode(roiRectColor);
Stroke p = g.getStroke();
g.setStroke(dashed);
if (roiRect != null) {
g.drawRect(roiRect.x, roiRect.y, roiRect.width, roiRect.height);
}
roiRect = new Rectangle((dragStartX <= e.getX()) ? dragStartX : e.getX(),
(dragStartY <= e.getY()) ? dragStartY : e.getY(),
Math.abs(e.getX() - dragStartX), Math.abs(e.getY() - dragStartY));
g.drawRect(roiRect.x, roiRect.y, roiRect.width, roiRect.height);
g.setPaintMode();
g.setStroke(p);
g.dispose();
}
}
public void mouseMoved (MouseEvent e) {
System.out.println("x, y: " + e.getX() + ", " + e.getY());
Point2D.Double zc = toUserSpace(e.getX(), e.getY());
System.out.println("UserSpace = " + zc);
// if((zc.getX() < imageWidth-1) &&
// (zc.getX() < imageWidth-1) ){}
}
public void mouseClicked (MouseEvent e) {
if ((mode == ZOOMIN_MODE) || (mode == ZOOMOUT_MODE)) {
doMouseZoom(e.getX(), e.getY());
} else {
roiRect = null;
zoomPanel.repaint();
}
}
public void mouseEntered (MouseEvent e) {
if (mode == ZOOMIN_MODE) {
zoomPanel.setCursor(zoomInCursor);
}
if (mode == ZOOMOUT_MODE) {
zoomPanel.setCursor(zoomOutCursor);
}
if (mode == DEFAULT_MODE) {
zoomPanel.setCursor(defaultCursor);
}
}
public void mouseExited (MouseEvent e) {
zoomPanel.setCursor(defaultCursor);
}
public void mousePressed (MouseEvent e) {
dragStartX = e.getX();
dragStartY = e.getY();
}
public void mouseReleased (MouseEvent e) {
if (mode == ZOOMIN_MODE) {
if (zoomRect != null) {
Graphics2D g = (Graphics2D) zoomPanel.getGraphics();
g.setXORMode(zoomRectColor);
Stroke p = g.getStroke();
g.setStroke(dashed);
if (zoomRect != null) {
g.drawRect(zoomRect.x, zoomRect.y, zoomRect.width, zoomRect.height);
}
if ((zoomRect.width >= 3) && (zoomRect.height >= 3)) {
doMouseZoom(zoomRect);
}
zoomRect = null;
g.setPaintMode();
g.setStroke(p);
g.dispose();
}
} else if (mode == DEFAULT_MODE) {
if (roiRect != null) {
Graphics2D g = (Graphics2D) zoomPanel.getGraphics();
g.setXORMode(roiRectColor);
Stroke p = g.getStroke();
g.setStroke(dashed);
if (roiRect != null) {
g.drawRect(roiRect.x, roiRect.y, roiRect.width, roiRect.height);
}
g.setPaintMode();
g.setStroke(p);
g.dispose();
}
}
}
/**
* if mouse dragged,
* zoom the rectangle formed by mouse dragging so that it fills the whole window
* @param r
*/
private void doMouseZoom (Rectangle r) {
zoomRectangleToWholeWindow(r);
}
/**
* if mouse clicked, doing the zoom with the point clicked as the zoom center
* @param zcx
* @param zcy
*/
private void doMouseZoom (int zcx, int zcy) {
double zfx = zoomPanel.getZoomFactorX(), zfy = zoomPanel.getZoomFactorY();
if (mode == ZOOMIN_MODE) {
zfx /= zoomffactor;
zfy /= zoomffactor;
} else {
zfx *= zoomffactor;
zfy *= zoomffactor;
}
Point2D.Double zc = toUserSpace(zcx, zcy);
zoom(zc.x, zc.y, zfx, zfy);
}
}