/*
* ChartSelector.java
*
* Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.app.gui.chart;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
/**
* @author Andrew Rambaut
* @version $Id: TreePaneSelector.java 822 2007-10-26 13:50:26Z rambaut $
*/
public class ChartSelector implements MouseListener, MouseMotionListener {
public ChartSelector(JChart chart) {
this.chart = chart;
chart.addMouseListener(this);
chart.addMouseMotionListener(this);
}
public boolean isCrossHairCursor() {
return crossHairCursor;
}
public void setCrossHairCursor(boolean crossHairCursor) {
this.crossHairCursor = crossHairCursor;
}
private void setupCursor() {
if (crossHairCursor) {
chart.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
} else {
chart.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
chart.repaint();
}
public void mouseClicked(MouseEvent mouseEvent) {
// Node selectedNode = treePane.getNodeAt((Graphics2D) treePane.getGraphics(), mouseEvent.getPoint());
// if (!mouseEvent.isShiftDown()) {
// treePane.clearSelection();
// }
//
// SelectionMode mode = selectionMode;
// if (mouseEvent.isAltDown()) {
// if (mode == SelectionMode.NODE) {
// mode = SelectionMode.CLADE;
// } else if (mode == SelectionMode.CLADE) {
// mode = SelectionMode.NODE;
// }
// }
//
// treePane.addSelectedNode(selectedNode);
}
public void mousePressed(MouseEvent mouseEvent) {
// This is used for dragging in combination with mouseDragged
// in the MouseMotionListener, below.
dragPoint = new Point2D.Double(mouseEvent.getPoint().getX(), mouseEvent.getPoint().getY());
if (!mouseEvent.isShiftDown()) {
chart.clearSelection();
}
}
public void mouseReleased(MouseEvent mouseEvent) {
if (chart == null) {
return;
}
double x1 = Math.min(dragPoint.getX(), mouseEvent.getPoint().getX());
double y1 = Math.min(dragPoint.getY(), mouseEvent.getPoint().getY());
double x2 = Math.max(dragPoint.getX(), mouseEvent.getPoint().getX());
double y2 = Math.max(dragPoint.getY(), mouseEvent.getPoint().getY());
chart.selectPoints(new Rectangle2D.Double(x1, y1, x2 - x1, y2 - y1), mouseEvent.isShiftDown());
chart.setDragRectangle(null);
}
public void mouseEntered(MouseEvent mouseEvent) {
}
public void mouseExited(MouseEvent mouseEvent) {
}
public void mouseMoved(MouseEvent mouseEvent) {
}
public void mouseDragged(MouseEvent mouseEvent) {
if (dragPoint == null) {
return;
}
double x1 = Math.min(dragPoint.getX(), mouseEvent.getPoint().getX());
double y1 = Math.min(dragPoint.getY(), mouseEvent.getPoint().getY());
double x2 = Math.max(dragPoint.getX(), mouseEvent.getPoint().getX());
double y2 = Math.max(dragPoint.getY(), mouseEvent.getPoint().getY());
chart.setDragRectangle(new Rectangle2D.Double(x1, y1, x2 - x1, y2 - y1));
// chart.scrollPointToVisible(mouseEvent.getPoint());
}
private JChart chart;
private Point2D dragPoint = null;
private boolean crossHairCursor = false;
}