+ * @param inApp App object for callbacks
+ * @param inTrackInfo track info object
+ */
+ public MapCanvas(App inApp, TrackInfo inTrackInfo)
+ {
+ _app = inApp;
+ _trackInfo = inTrackInfo;
+ _track = inTrackInfo.getTrack();
+ _selection = inTrackInfo.getSelection();
+ _mapPosition = new MapPosition();
+ addMouseListener(this);
+ addMouseMotionListener(this);
+ addMouseWheelListener(this);
+ addKeyListener(this);
+
+ // Make listener for changes to controls
+ ItemListener itemListener = new ItemListener() {
+ public void itemStateChanged(ItemEvent e)
+ {
+ _recalculate = true;
+ repaint();
+ }
+ };
+ // Make special listener for changes to map checkbox
+ ItemListener mapCheckListener = new ItemListener() {
+ public void itemStateChanged(ItemEvent e)
+ {
+ _tileManager.clearMemoryCaches();
+ _recalculate = true;
+ Config.setConfigBoolean(Config.KEY_SHOW_MAP, e.getStateChange() == ItemEvent.SELECTED);
+ UpdateMessageBroker.informSubscribers(); // to let menu know
+ }
+ };
+ _topPanel = new JPanel();
+ _topPanel.setLayout(new FlowLayout());
+ _topPanel.setOpaque(false);
+ // Make slider for transparency
+ _transparencySlider = new JSlider(0, 5, 0);
+ _transparencySlider.setPreferredSize(new Dimension(100, 20));
+ _transparencySlider.setMajorTickSpacing(1);
+ _transparencySlider.setSnapToTicks(true);
+ _transparencySlider.setOpaque(false);
+ _transparencySlider.addChangeListener(new ChangeListener() {
+ public void stateChanged(ChangeEvent e)
+ {
+ _recalculate = true;
+ repaint();
+ }
+ });
+ _transparencySlider.setFocusable(false); // stop slider from stealing keyboard focus
+ _topPanel.add(_transparencySlider);
+ // Add checkbox button for enabling scale bar
+ _scaleCheckBox = new JCheckBox(IconManager.getImageIcon(IconManager.SCALEBAR_BUTTON), true);
+ _scaleCheckBox.setSelectedIcon(IconManager.getImageIcon(IconManager.SCALEBAR_BUTTON_ON));
+ _scaleCheckBox.setOpaque(false);
+ _scaleCheckBox.setToolTipText(I18nManager.getText("menu.map.showscalebar"));
+ _scaleCheckBox.addItemListener(new ItemListener() {
+ public void itemStateChanged(ItemEvent e) {
+ _scaleBar.setVisible(_scaleCheckBox.isSelected());
+ }
+ });
+ _scaleCheckBox.setFocusable(false); // stop button from stealing keyboard focus
+ _topPanel.add(_scaleCheckBox);
+ // Add checkbox button for enabling maps or not
+ _mapCheckBox = new JCheckBox(IconManager.getImageIcon(IconManager.MAP_BUTTON), false);
+ _mapCheckBox.setSelectedIcon(IconManager.getImageIcon(IconManager.MAP_BUTTON_ON));
+ _mapCheckBox.setOpaque(false);
+ _mapCheckBox.setToolTipText(I18nManager.getText("menu.map.showmap"));
+ _mapCheckBox.addItemListener(mapCheckListener);
+ _mapCheckBox.setFocusable(false); // stop button from stealing keyboard focus
+ _topPanel.add(_mapCheckBox);
+ // Add checkbox button for enabling autopan or not
+ _autopanCheckBox = new JCheckBox(IconManager.getImageIcon(IconManager.AUTOPAN_BUTTON), true);
+ _autopanCheckBox.setSelectedIcon(IconManager.getImageIcon(IconManager.AUTOPAN_BUTTON_ON));
+ _autopanCheckBox.setOpaque(false);
+ _autopanCheckBox.setToolTipText(I18nManager.getText("menu.map.autopan"));
+ _autopanCheckBox.addItemListener(itemListener);
+ _autopanCheckBox.setFocusable(false); // stop button from stealing keyboard focus
+ _topPanel.add(_autopanCheckBox);
+ // Add checkbox button for connecting points or not
+ _connectCheckBox = new JCheckBox(IconManager.getImageIcon(IconManager.POINTS_DISCONNECTED_BUTTON), true);
+ _connectCheckBox.setSelectedIcon(IconManager.getImageIcon(IconManager.POINTS_CONNECTED_BUTTON));
+ _connectCheckBox.setOpaque(false);
+ _connectCheckBox.setToolTipText(I18nManager.getText("menu.map.connect"));
+ _connectCheckBox.addItemListener(itemListener);
+ _connectCheckBox.setFocusable(false); // stop button from stealing keyboard focus
+ _topPanel.add(_connectCheckBox);
+
+ // Add zoom in, zoom out buttons
+ _sidePanel = new JPanel();
+ _sidePanel.setLayout(new BoxLayout(_sidePanel, BoxLayout.Y_AXIS));
+ _sidePanel.setOpaque(false);
+ JButton zoomInButton = new JButton(IconManager.getImageIcon(IconManager.ZOOM_IN_BUTTON));
+ zoomInButton.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
+ zoomInButton.setContentAreaFilled(false);
+ zoomInButton.setToolTipText(I18nManager.getText("menu.map.zoomin"));
+ zoomInButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e)
+ {
+ zoomIn();
+ }
+ });
+ zoomInButton.setFocusable(false); // stop button from stealing keyboard focus
+ _sidePanel.add(zoomInButton);
+ JButton zoomOutButton = new JButton(IconManager.getImageIcon(IconManager.ZOOM_OUT_BUTTON));
+ zoomOutButton.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
+ zoomOutButton.setContentAreaFilled(false);
+ zoomOutButton.setToolTipText(I18nManager.getText("menu.map.zoomout"));
+ zoomOutButton.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e)
+ {
+ zoomOut();
+ }
+ });
+ zoomOutButton.setFocusable(false); // stop button from stealing keyboard focus
+ _sidePanel.add(zoomOutButton);
+
+ // Bottom panel for scale bar
+ _scaleBar = new ScaleBar();
+
+ // add control panels to this one
+ setLayout(new BorderLayout());
+ _topPanel.setVisible(false);
+ _sidePanel.setVisible(false);
+ add(_topPanel, BorderLayout.NORTH);
+ add(_sidePanel, BorderLayout.WEST);
+ add(_scaleBar, BorderLayout.SOUTH);
+ // Make popup menu
+ makePopup();
+ }
+
+
+ /**
+ * Make the popup menu for right-clicking the map
+ */
+ private void makePopup()
+ {
+ _popup = new JPopupMenu();
+ JMenuItem zoomInItem = new JMenuItem(I18nManager.getText("menu.map.zoomin"));
+ zoomInItem.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e)
+ {
+ zoomIn();
+ }});
+ zoomInItem.setEnabled(true);
+ _popup.add(zoomInItem);
+ JMenuItem zoomOutItem = new JMenuItem(I18nManager.getText("menu.map.zoomout"));
+ zoomOutItem.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e)
+ {
+ zoomOut();
+ }});
+ zoomOutItem.setEnabled(true);
+ _popup.add(zoomOutItem);
+ JMenuItem zoomFullItem = new JMenuItem(I18nManager.getText("menu.map.zoomfull"));
+ zoomFullItem.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e)
+ {
+ zoomToFit();
+ _recalculate = true;
+ repaint();
+ }});
+ zoomFullItem.setEnabled(true);
+ _popup.add(zoomFullItem);
+ _popup.addSeparator();
+ // Set background
+ JMenuItem setMapBgItem = new JMenuItem(
+ I18nManager.getText(FunctionLibrary.FUNCTION_SET_MAP_BG.getNameKey()));
+ setMapBgItem.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e)
+ {
+ FunctionLibrary.FUNCTION_SET_MAP_BG.begin();
+ }});
+ _popup.add(setMapBgItem);
+ // new point option
+ JMenuItem newPointItem = new JMenuItem(I18nManager.getText("menu.map.newpoint"));
+ newPointItem.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e)
+ {
+ double lat = MapUtils.getLatitudeFromY(_mapPosition.getYFromPixels(_popupMenuY, getHeight()));
+ double lon = MapUtils.getLongitudeFromX(_mapPosition.getXFromPixels(_popupMenuX, getWidth()));
+ _app.createPoint(new DataPoint(new Latitude(lat, Coordinate.FORMAT_NONE),
+ new Longitude(lon, Coordinate.FORMAT_NONE), null));
+ }});
+ newPointItem.setEnabled(true);
+ _popup.add(newPointItem);
+ }
+
+
+ /**
+ * Zoom to fit the current data area