+
+
+ /**
+ * Respond to mouse click events
+ * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
+ */
+ public void mouseClicked(MouseEvent inE)
+ {
+ if (_track != null && _track.getNumPoints() > 0)
+ {
+ // select point if it's a left-click
+ if (!inE.isMetaDown())
+ {
+ int pointIndex = _track.getNearestPointIndexNew(
+ _mapPosition.getXFromPixels(inE.getX(), getWidth()),
+ _mapPosition.getYFromPixels(inE.getY(), getHeight()),
+ _mapPosition.getBoundsFromPixels(CLICK_SENSITIVITY), false);
+ _selection.selectPoint(pointIndex);
+ }
+ else
+ {
+ // show the popup menu for right-clicks
+ _popupMenuX = inE.getX();
+ _popupMenuY = inE.getY();
+ _popup.show(this, _popupMenuX, _popupMenuY);
+ }
+ }
+ }
+
+ /**
+ * Ignore mouse enter events
+ * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
+ */
+ public void mouseEntered(MouseEvent inE)
+ {
+ // ignore
+ }
+
+ /**
+ * Ignore mouse exited events
+ * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
+ */
+ public void mouseExited(MouseEvent inE)
+ {
+ // ignore
+ }
+
+ /**
+ * Ignore mouse pressed events
+ * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
+ */
+ public void mousePressed(MouseEvent inE)
+ {
+ // ignore
+ }
+
+ /**
+ * Respond to mouse released events
+ * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
+ */
+ public void mouseReleased(MouseEvent inE)
+ {
+ _recalculate = true;
+ if (_zoomDragging && Math.abs(_dragToX - _dragFromX) > 20 && Math.abs(_dragToY - _dragFromY) > 20)
+ {
+ //System.out.println("Finished zoom: " + _dragFromX + ", " + _dragFromY + " to " + _dragToX + ", " + _dragToY);
+ _mapPosition.zoomToPixels(_dragFromX, _dragToX, _dragFromY, _dragToY, getWidth(), getHeight());
+ }
+ _dragFromX = _dragFromY = -1;
+ _zoomDragging = false;
+ repaint();
+ }
+
+ /**
+ * Respond to mouse drag events
+ * @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
+ */
+ public void mouseDragged(MouseEvent inE)
+ {
+ if (!inE.isMetaDown())
+ {
+ // Left mouse drag - pan map by appropriate amount
+ _zoomDragging = false;
+ if (_dragFromX != -1)
+ {
+ panMap(_dragFromX - inE.getX(), _dragFromY - inE.getY());
+ _recalculate = true;
+ repaint();
+ }
+ _dragFromX = inE.getX();
+ _dragFromY = inE.getY();
+ }
+ else
+ {
+ // Right-click and drag - draw rectangle and control zoom
+ _zoomDragging = true;
+ if (_dragFromX == -1) {
+ _dragFromX = inE.getX();
+ _dragFromY = inE.getY();
+ }
+ _dragToX = inE.getX();
+ _dragToY = inE.getY();
+ repaint();
+ }
+ }
+
+ /**
+ * Respond to mouse move events without button pressed
+ * @param inEvent ignored
+ */
+ public void mouseMoved(MouseEvent inEvent)
+ {
+ // ignore
+ }
+
+ /**
+ * Respond to status bar message from broker
+ * @param inMessage message, ignored
+ */
+ public void actionCompleted(String inMessage)
+ {
+ // ignore
+ }
+
+ /**
+ * Respond to data updated message from broker
+ * @param inUpdateType type of update
+ */
+ public void dataUpdated(byte inUpdateType)
+ {
+ _recalculate = true;
+ if ((inUpdateType & DataSubscriber.DATA_ADDED_OR_REMOVED) > 0) {
+ _checkBounds = true;
+ }
+ repaint();
+ // enable or disable components
+ boolean hasData = _track.getNumPoints() > 0;
+ _topPanel.setVisible(hasData);
+ _sidePanel.setVisible(hasData);
+ // grab focus for the key presses
+ this.requestFocus();
+ }
+
+ /**
+ * Respond to key presses on the map canvas
+ * @param inE key event
+ */
+ public void keyPressed(KeyEvent inE)
+ {
+ int code = inE.getKeyCode();
+ // Check for meta key
+ if (inE.isControlDown())
+ {
+ // Check for arrow keys to zoom in and out
+ if (code == KeyEvent.VK_UP)
+ zoomIn();
+ else if (code == KeyEvent.VK_DOWN)
+ zoomOut();
+ // Key nav for next/prev point
+ else if (code == KeyEvent.VK_LEFT)
+ _selection.selectPreviousPoint();
+ else if (code == KeyEvent.VK_RIGHT)
+ _selection.selectNextPoint();
+ }
+ else
+ {
+ // Check for arrow keys to pan
+ int upwardsPan = 0;
+ if (code == KeyEvent.VK_UP)
+ upwardsPan = -PAN_DISTANCE;
+ else if (code == KeyEvent.VK_DOWN)
+ upwardsPan = PAN_DISTANCE;
+ int rightwardsPan = 0;
+ if (code == KeyEvent.VK_RIGHT)
+ rightwardsPan = PAN_DISTANCE;
+ else if (code == KeyEvent.VK_LEFT)
+ rightwardsPan = -PAN_DISTANCE;
+ panMap(rightwardsPan, upwardsPan);
+ // Check for delete key to delete current point
+ if (code == KeyEvent.VK_DELETE && _selection.getCurrentPointIndex() >= 0)
+ {
+ _app.deleteCurrentPoint();
+ }
+ }
+ }
+
+ /**
+ * @param inE key released event, ignored
+ */
+ public void keyReleased(KeyEvent e)
+ {
+ // ignore
+ }
+
+ /**
+ * @param inE key typed event, ignored
+ */
+ public void keyTyped(KeyEvent inE)
+ {
+ // ignore
+ }
+
+ /**
+ * @param inE mouse wheel event indicating scroll direction
+ */
+ public void mouseWheelMoved(MouseWheelEvent inE)
+ {
+ int clicks = inE.getWheelRotation();
+ if (clicks < 0)
+ zoomIn();
+ else if (clicks > 0)
+ zoomOut();
+ }