/* ZoomSignalTool.java created 2007-10-15
*
*/
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 javax.swing.JLayeredPane;
import javax.swing.SwingUtilities;
import org.signalml.app.config.ZoomSignalSettings;
import org.signalml.app.util.IconUtils;
import org.signalml.plugin.export.signal.AbstractSignalTool;
/** ZoomSignalTool
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public class ZoomSignalTool extends AbstractSignalTool {
private SignalPlot plot;
private ZoomSignalPlot zoomPlot;
private ZoomSignalSettings settings;
public ZoomSignalTool(SignalView signalView) {
super(signalView);
zoomPlot = new ZoomSignalPlot();
settings = new ZoomSignalSettings();
}
@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;
Point point = e.getPoint();
int channel = plot.toChannelSpace(point);
if (e.isControlDown()) {
Dimension zoomSize = settings.getZoomSize();
int width = Math.min(600, zoomSize.width * 2);
int height = Math.min(600, zoomSize.height * 2);
Dimension size = new Dimension(width, height);
zoomPlot.setPreferredSize(size);
zoomPlot.setFactor(2*settings.getFactor());
} else {
zoomPlot.setPreferredSize(settings.getZoomSize());
zoomPlot.setFactor(settings.getFactor());
}
zoomPlot.setParameters(plot, point, channel);
showZoom(point);
setEngaged(true);
e.consume();
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
hideZoom();
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);
if (settings.isChannelSwitching()) {
int channel = plot.toChannelSpace(point);
zoomPlot.setParameters(point, channel);
} else {
zoomPlot.setFocusPoint(point);
}
positionZoom(point, null);
}
}
}
public ZoomSignalSettings getSettings() {
return settings;
}
public void setSettings(ZoomSignalSettings settings) {
if (settings == null) {
throw new NullPointerException("No settings");
}
this.settings = settings;
}
private void positionZoom(Point point, JLayeredPane layeredPane) {
if (plot != null) {
if (layeredPane == null) {
layeredPane = plot.getRootPane().getLayeredPane();
}
Point location = SwingUtilities.convertPoint(plot, point, layeredPane);
Dimension size = zoomPlot.getPreferredSize();
zoomPlot.setBounds(location.x-(size.width/2), location.y-(size.height/2), size.width, size.height);
}
}
private void showZoom(Point point) {
if (plot != null) {
zoomPlot.setVisible(true);
JLayeredPane layeredPane = plot.getRootPane().getLayeredPane();
positionZoom(point, layeredPane);
layeredPane.add(zoomPlot, new Integer(JLayeredPane.DRAG_LAYER));
}
}
private void hideZoom() {
if (plot != null) {
JLayeredPane layeredPane = plot.getRootPane().getLayeredPane();
layeredPane.remove(zoomPlot);
plot.getRootPane().repaint();
}
}
}