/* RulerSignalTool.java created 2007-10-05
*
*/
package org.signalml.app.view.signal;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import javax.swing.JLayeredPane;
import javax.swing.SwingUtilities;
import org.signalml.app.util.IconUtils;
import org.signalml.plugin.export.signal.AbstractSignalTool;
/** RulerSignalTool
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class RulerSignalTool extends AbstractSignalTool {
private Point dragStart = null;
private SignalPlot plot;
private RulerMeasurmentPlot measurmentPlot;
private boolean measurmentVisible = false;
public RulerSignalTool(SignalView signalView) {
super(signalView);
measurmentPlot = new RulerMeasurmentPlot();
}
@Override
public Cursor getDefaultCursor() {
return IconUtils.getCrosshairCursor();
}
@Override
public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
Object source = e.getSource();
if (!(source instanceof SignalPlot)) {
plot = null;
return;
}
plot = (SignalPlot) source;
dragStart = e.getPoint();
Point origin = plot.getViewport().getViewPosition();
measurmentPlot.setStartParameters(dragStart, origin);
setEngaged(true);
e.consume();
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
dragStart = null;
hideMeasurment();
setEngaged(false);
plot = null;
e.consume();
}
}
@Override
public void mouseDragged(MouseEvent e) {
if (plot != null) {
if (SwingUtilities.isLeftMouseButton(e)) {
Point point = e.getPoint();
Rectangle r = new Rectangle(point.x, point.y, 1, 1);
((SignalPlot)e.getSource()).scrollRectToVisible(r);
measureTo(point);
}
}
}
private void showMeasurment() {
if (plot != null) {
if (!measurmentVisible) {
Dimension size = plot.getViewport().getExtentSize();
JLayeredPane layeredPane = plot.getRootPane().getLayeredPane();
Point location = SwingUtilities.convertPoint(plot.getViewport(), new Point(0,0), layeredPane);
measurmentPlot.setBounds(location.x, location.y, size.width, size.height);
layeredPane.add(measurmentPlot, new Integer(JLayeredPane.DRAG_LAYER));
measurmentVisible = true;
}
}
}
private void hideMeasurment() {
if (plot != null) {
if (measurmentVisible) {
JLayeredPane layeredPane = plot.getRootPane().getLayeredPane();
layeredPane.remove(measurmentPlot);
measurmentVisible = false;
plot.repaint();
}
}
}
private void measureTo(Point point) {
if (plot != null) {
Dimension size = plot.getSize();
Point corrPoint = new Point(
Math.max(0, Math.min(size.width, point.x)),
Math.max(0, Math.min(size.height, point.y))
);
Point origin = plot.getViewport().getViewPosition();
Point2D signalSize = plot.getDistanceInSignalSpace(dragStart, corrPoint);
measurmentPlot.setValueMeasurementControversial(plot.isDistanceControversial(dragStart, corrPoint));
measurmentPlot.setEndParameters(
corrPoint,
Math.round(signalSize.getX()*1000F) / 1000F,
Math.round(signalSize.getY()*1000F) / 1000F,
origin
);
showMeasurment();
}
}
}