package edu.mbl.jif.gui.imaging;
import edu.mbl.jif.gui.imaging.zoom.ImagePanelZoomable;
import edu.mbl.jif.gui.imaging.zoom.core.ZoomGraphics;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractButton;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JToggleButton;
import javax.swing.event.MouseInputAdapter;
/**
* PointMarker - when enabled, allows points to be marked by clicking the mouse on a point.
* Marked points are displayed/overlayed on the image pane. A list of points is maintained.
*
* @todo Add action/button to getMarkedPoints...
*
* @author GBH
* // Modes:
// 1) set a visible marker at one reference point;
// 2) repeatedly mark points, adding them to an ArrayList, until mode is cancelled
// add any points that are clicked to the list of marked points
// Clear the list of marked points
*/
public class PointMarker implements ImageViewerPlugin {
ImagePanelZoomable iPane;
private boolean showMarkedPoints = true;
GraphicOverlay overlay;
ArrayList<Point> markedPointsList = new ArrayList<Point>();
MouseListenerPointMarker mListenerPointMarker = new MouseListenerPointMarker();
public PointMarker(ImagePanelZoomable iPane) {
this.iPane = iPane;
overlay = new GraphicOverlay() {
public void drawGraphicOverlay(ZoomGraphics zg) {
if (isShowMarkedPoints()) {
for (Point p : markedPointsList) {
int wid = 3;
zg.setColor(Color.black);
zg.setStroke(new BasicStroke(2.0f));
zg.drawRect(p.x, p.y, wid, wid);
zg.setColor(Color.yellow);
zg.setStroke(new BasicStroke(1.0f));
zg.drawRect(p.x, p.y, wid, wid);
}
}
}
};
}
public void toggleMarkReferencePoint(boolean on) {
if (on) {
iPane.setMouseInputAdapter(mListenerPointMarker);
// for custom Cursor
Toolkit toolkit = Toolkit.getDefaultToolkit();
URL url = getClass().getResource("icons/pointCursor.gif");
Image cursorImage = toolkit.getImage(url);
Point cursorHotSpot = new Point(15, 15);
Cursor customCursor = toolkit.createCustomCursor(cursorImage, cursorHotSpot, "Cursor");
iPane.setCursor(customCursor);
//iPane.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
} else {
iPane.restoreDefaultMouseInputAdapter();
iPane.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
}
}
private void markCurrentPoint(MouseEvent e) {
Point2D zc = iPane.toUserSpace(e.getX(), e.getY());
int x = (int) (zc.getX());
int y = (int) (zc.getY());
Point p = new Point(x, y);
System.out.println("Marked point: " + p);
markedPointsList.add(p);
}
public ArrayList<Point> getMarkedPoints() {
return markedPointsList;
}
public void clearMarkedPoints() {
markedPointsList.clear();
}
public void setShowMarkedPoints(boolean t) {
showMarkedPoints = t;
}
private boolean isShowMarkedPoints() {
return showMarkedPoints;
}
class MouseListenerPointMarker
extends MouseInputAdapter {
public void mouseClicked(MouseEvent e) {
markCurrentPoint(e);
}
public void mousePressed(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
iPane.valuePoint(e);
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
@Override
public List<AbstractButton> getButtons() {
List<AbstractButton> buttons = new ArrayList<AbstractButton>();
// JToggleButton and JButton are both javax.swing.AbstractButton
// Toggle button
JToggleButton buttonPoint = new JToggleButton();
buttonPoint.setMargin(new Insets(0, 0, 0, 0));
buttonPoint.setMinimumSize(new Dimension(16, 16));
buttonPoint.setToolTipText("Mark reference point");
try {
buttonPoint.setIcon(new ImageIcon(PointMarker.class.getResource("icons/markPoint.png")));
} catch (Exception e) {
e.printStackTrace();
}
buttonPoint.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent itemEvent) {
int state = itemEvent.getStateChange();
if (state == ItemEvent.SELECTED) {
toggleMarkReferencePoint(true);
} else {
toggleMarkReferencePoint(false);
}
}
});
buttonPoint.setToolTipText("Mark reference point");
buttonPoint.setMargin(new Insets(0, 0, 0, 0));
buttonPoint.setMinimumSize(new Dimension(16, 16));
buttons.add(buttonPoint);
// Clear Points button
JButton buttonClearPoints = new JButton();
buttonClearPoints.setMargin(new Insets(0, 0, 0, 0));
buttonClearPoints.setMinimumSize(new Dimension(16, 16));
buttonClearPoints.setToolTipText("Clear marked points");
try {
buttonClearPoints.setIcon(new ImageIcon(PointMarker.class.getResource(
"icons/markPointClear.png")));
} catch (Exception e) {
e.printStackTrace();
}
buttonClearPoints.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
clearMarkedPoints();
}
});
buttons.add(buttonClearPoints);
return buttons;
}
@Override
public GraphicOverlay getOverlay() {
return this.overlay;
}
}