]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/gui/profile/ProfileChart.java
Version 18.5, July 2016
[GpsPrune.git] / tim / prune / gui / profile / ProfileChart.java
index 770a211ea777535d900bb43bfed109c047b771a5..6e219967ad60748f460b416dc0539e3725cb4e52 100644 (file)
@@ -4,10 +4,13 @@ import java.awt.Color;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
 import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
+
 import javax.swing.JLabel;
 import javax.swing.JMenuItem;
 import javax.swing.JPopupMenu;
@@ -15,6 +18,8 @@ import javax.swing.JPopupMenu;
 import tim.prune.I18nManager;
 import tim.prune.config.ColourScheme;
 import tim.prune.config.Config;
+import tim.prune.data.Field;
+import tim.prune.data.FieldList;
 import tim.prune.data.TrackInfo;
 import tim.prune.gui.GenericDisplay;
 
@@ -23,6 +28,17 @@ import tim.prune.gui.GenericDisplay;
  */
 public class ProfileChart extends GenericDisplay implements MouseListener
 {
+       /** Inner class to handle popup menu clicks */
+       class MenuClicker implements ActionListener
+       {
+               private Field _field = null;
+               MenuClicker(Field inField) {_field = inField;}
+               /** React to menu click by changing the field */
+               public void actionPerformed(ActionEvent arg0) {
+                       changeView(_field);
+               }
+       }
+
        /** Current scale factor in x direction*/
        private double _xScaleFactor = 0.0;
        /** Data to show on chart */
@@ -40,8 +56,6 @@ public class ProfileChart extends GenericDisplay implements MouseListener
        private static final Dimension MINIMUM_SIZE = new Dimension(200, 110);
        /** Colour to use for text if no data found */
        private static final Color COLOR_NODATA_TEXT = Color.GRAY;
-       /** Chart type */
-       private static enum ChartType {ALTITUDE, SPEED, VERT_SPEED};
 
 
        /**
@@ -75,6 +89,9 @@ public class ProfileChart extends GenericDisplay implements MouseListener
        public void paint(Graphics g)
        {
                super.paint(g);
+               // Set antialiasing depending on Config
+               ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                       Config.getConfigBoolean(Config.KEY_ANTIALIAS) ? RenderingHints.VALUE_ANTIALIAS_ON : RenderingHints.VALUE_ANTIALIAS_OFF);
                ColourScheme colourScheme = Config.getColourScheme();
                paintBackground(g, colourScheme);
                if (_track != null && _track.getNumPoints() > 0)
@@ -119,8 +136,7 @@ public class ProfileChart extends GenericDisplay implements MouseListener
 
                        // horizontal lines for scale - set to round numbers eg 500
                        int lineScale = getLineScale(minValue, maxValue);
-                       int scaleValue = (int) (minValue/lineScale + 1) * lineScale;
-                       if (minValue < 0.0) {scaleValue -= lineScale;}
+                       double scaleValue = Math.ceil(minValue/lineScale) * lineScale;
                        int x = 0, y = 0;
                        final int zeroY = height - BORDER_WIDTH - (int) (yScaleFactor * (0.0 - minValue));
 
@@ -206,7 +222,7 @@ public class ProfileChart extends GenericDisplay implements MouseListener
                                        if (y < (BORDER_WIDTH + textHeight)) {
                                                y = BORDER_WIDTH + textHeight;
                                        }
-                                       g.drawString(""+scaleValue, BORDER_WIDTH + 5, y);
+                                       g.drawString(""+(int)scaleValue, BORDER_WIDTH + 5, y);
                                        scaleValue += lineScale;
                                }
                        }
@@ -248,30 +264,45 @@ public class ProfileChart extends GenericDisplay implements MouseListener
        /**
         * Make the popup menu for right-clicking the chart
         */
-       private void makePopup()
+       private synchronized void makePopup()
        {
                _popup = new JPopupMenu();
                JMenuItem altItem = new JMenuItem(I18nManager.getText("fieldname.altitude"));
                altItem.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e)
                        {
-                               changeView(ChartType.ALTITUDE);
+                               changeView(Field.ALTITUDE);
                        }});
                _popup.add(altItem);
                JMenuItem speedItem = new JMenuItem(I18nManager.getText("fieldname.speed"));
                speedItem.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e)
                        {
-                               changeView(ChartType.SPEED);
+                               changeView(Field.SPEED);
                        }});
                _popup.add(speedItem);
                JMenuItem vertSpeedItem = new JMenuItem(I18nManager.getText("fieldname.verticalspeed"));
                vertSpeedItem.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e)
                        {
-                               changeView(ChartType.VERT_SPEED);
+                               changeView(Field.VERTICAL_SPEED);
                        }});
                _popup.add(vertSpeedItem);
+               // Go through track's master field list, see if any other fields to list
+               boolean addSeparator = true;
+               FieldList fields = _track.getFieldList();
+               for (int i=0; i<fields.getNumFields(); i++)
+               {
+                       Field field = fields.getField(i);
+                       if (!field.isBuiltIn())
+                       {
+                               if (addSeparator) {_popup.addSeparator();}
+                               addSeparator = false;
+                               JMenuItem item = new JMenuItem(field.getName());
+                               item.addActionListener(new MenuClicker(field));
+                               _popup.add(item);
+                       }
+               }
        }
 
        /**
@@ -309,6 +340,10 @@ public class ProfileChart extends GenericDisplay implements MouseListener
                if (inUpdateType != SELECTION_CHANGED) {
                        _data.init(Config.getUnitSet());
                }
+               // Update the menu if necessary
+               if ((inUpdateType & DATA_ADDED_OR_REMOVED) > 0) {
+                       makePopup();
+               }
                repaint();
        }
 
@@ -346,19 +381,31 @@ public class ProfileChart extends GenericDisplay implements MouseListener
 
        /**
         * Called by clicking on popup menu to change the view
-        * @param inType selected chart type
+        * @param inField field to show
         */
-       private void changeView(ChartType inType)
+       private void changeView(Field inField)
        {
-               if (inType == ChartType.ALTITUDE && !(_data instanceof AltitudeData))
+               if (inField == Field.ALTITUDE)
                {
-                       _data = new AltitudeData(_track);
+                       if (!(_data instanceof AltitudeData)) {
+                               _data = new AltitudeData(_track);
+                       }
+               }
+               else if (inField == Field.SPEED) {
+                       if (!(_data instanceof SpeedData)) {
+                               _data = new SpeedData(_track);
+                       }
                }
-               else if (inType == ChartType.SPEED && !(_data instanceof SpeedData)) {
-                       _data = new SpeedData(_track);
+               else if (inField == Field.VERTICAL_SPEED) {
+                       if (!(_data instanceof VerticalSpeedData)) {
+                               _data = new VerticalSpeedData(_track);
+                       }
                }
-               else if (inType == ChartType.VERT_SPEED && !(_data instanceof VerticalSpeedData)) {
-                       _data = new VerticalSpeedData(_track);
+               else
+               {
+                       if (!(_data instanceof ArbitraryData) || ((ArbitraryData)_data).getField() != inField) {
+                               _data = new ArbitraryData(_track, inField);
+                       }
                }
                _data.init(Config.getUnitSet());
                repaint();