X-Git-Url: https://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fgui%2FProfileChart.java;h=7c7b4c513f09156dd14709c9ca5df346da871193;hb=1ee49ae3c8ef3aa2e63eadd458531e5f8bd4f92c;hp=22724b5f6a431d674396f626393e6c8d2ca1d464;hpb=da0b1f449260a0b4a94318006382a9039726ef3e;p=GpsPrune.git diff --git a/tim/prune/gui/ProfileChart.java b/tim/prune/gui/ProfileChart.java index 22724b5..7c7b4c5 100644 --- a/tim/prune/gui/ProfileChart.java +++ b/tim/prune/gui/ProfileChart.java @@ -6,6 +6,9 @@ import java.awt.Graphics; import java.awt.event.MouseEvent; import tim.prune.I18nManager; +import tim.prune.config.ColourScheme; +import tim.prune.config.Config; +import tim.prune.data.Altitude; import tim.prune.data.AltitudeRange; import tim.prune.data.Track; import tim.prune.data.TrackInfo; @@ -15,13 +18,10 @@ import tim.prune.data.TrackInfo; */ public class ProfileChart extends GenericChart { + /** Current scale factor in x direction*/ private double _xScaleFactor = 0.0; + /** Possible altitude scales to use */ private static final int[] ALTITUDE_SCALES = {10000, 5000, 2000, 1000, 500, 200, 100, 50}; - private static final Color COLOR_LINES = Color.GRAY; - private static final Color COLOR_ALT_BARS = Color.BLUE; - private static final Color COLOR_SELECTED = Color.RED; - private static final Color COLOR_SELECTED_BG = Color.ORANGE; - private static final Color COLOR_ALT_SCALE = Color.RED; /** @@ -47,34 +47,45 @@ public class ProfileChart extends GenericChart { int width = getWidth(); int height = getHeight(); - AltitudeRange altitudeRange = _track.getAltitudeRange(); - int minAltitude = altitudeRange.getMinimum(); - int maxAltitude = altitudeRange.getMaximum(); + + // Set up colours + final Color barColour = Config.getColourScheme().getColour(ColourScheme.IDX_POINT); + final Color rangeColour = Config.getColourScheme().getColour(ColourScheme.IDX_SELECTION); + final Color currentColour = Config.getColourScheme().getColour(ColourScheme.IDX_PRIMARY); + final Color secondColour = Config.getColourScheme().getColour(ColourScheme.IDX_SECONDARY); + final Color lineColour = Config.getColourScheme().getColour(ColourScheme.IDX_LINES); // message if no altitudes in track - if (minAltitude < 0 || maxAltitude < 0 - || minAltitude == maxAltitude) + if (!_track.hasAltitudeData()) { - g.setColor(COLOR_LINES); + g.setColor(lineColour); g.drawString(I18nManager.getText("display.noaltitudes"), 50, height/2); return; } // altitude profile + AltitudeRange altitudeRange = _track.getAltitudeRange(); + int minAltitude = altitudeRange.getMinimum(); + int maxAltitude = altitudeRange.getMaximum(); int numPoints = _track.getNumPoints(); - _xScaleFactor = 1.0 * (width - 2 * BORDER_WIDTH) / numPoints; - double yScaleFactor = 1.0 * (height - 2 * BORDER_WIDTH) / - (altitudeRange.getMaximum() - minAltitude); + _xScaleFactor = 1.0 * (width - 2 * BORDER_WIDTH - 1) / numPoints; + double yScaleFactor = 1.0 * (height - 2 * BORDER_WIDTH) / (maxAltitude - minAltitude); int barWidth = (int) (_xScaleFactor + 1.0); int selectedPoint = _trackInfo.getSelection().getCurrentPointIndex(); + // selection start, end + int selectionStart = -1, selectionEnd = -1; + if (_trackInfo.getSelection().hasRangeSelected()) { + selectionStart = _trackInfo.getSelection().getStart(); + selectionEnd = _trackInfo.getSelection().getEnd(); + } // horizontal lines for scale - set to round numbers eg 500m int lineScale = getLineScale(minAltitude, maxAltitude); int altitude = 0; - int y = 0; + int x = 0, y = 0; if (lineScale > 1) { - g.setColor(COLOR_LINES); + g.setColor(lineColour); while (altitude < maxAltitude) { if (altitude > minAltitude) @@ -86,35 +97,50 @@ public class ProfileChart extends GenericChart } } - // loop through points - int chartFormat = altitudeRange.getFormat(); - for (int p = 0; p < numPoints; p++) + try { - int x = (int) (_xScaleFactor * p); - if (p == selectedPoint) + // loop through points + Altitude.Format chartFormat = altitudeRange.getFormat(); + g.setColor(barColour); + for (int p = 0; p < numPoints; p++) { - g.setColor(COLOR_SELECTED_BG); - g.fillRect(BORDER_WIDTH + x, BORDER_WIDTH+1, barWidth, height-2*BORDER_WIDTH-2); - g.setColor(COLOR_SELECTED); - } - else - { - g.setColor(COLOR_ALT_BARS); + x = (int) (_xScaleFactor * p) + 1; + if (p == selectionStart) + g.setColor(rangeColour); + else if (p == (selectionEnd+1)) + g.setColor(barColour); + if (_track.getPoint(p).getAltitude().isValid()) + { + altitude = _track.getPoint(p).getAltitude().getValue(chartFormat); + y = (int) (yScaleFactor * (altitude - minAltitude)); + g.fillRect(BORDER_WIDTH+x, height-BORDER_WIDTH - y, barWidth, y); + } } - if (_track.getPoint(p).getAltitude().isValid()) + // current point (make sure it's drawn last) + if (selectedPoint > -1) { - altitude = _track.getPoint(p).getAltitude().getValue(chartFormat); - y = (int) (yScaleFactor * (altitude - minAltitude)); - g.fillRect(BORDER_WIDTH+x, height-BORDER_WIDTH - y, barWidth, y); + Altitude alt = _track.getPoint(selectedPoint).getAltitude(); + if (alt.isValid()) + { + x = (int) (_xScaleFactor * selectedPoint) + 1; + g.setColor(secondColour); + g.fillRect(BORDER_WIDTH + x, BORDER_WIDTH+1, barWidth, height-2*BORDER_WIDTH-2); + g.setColor(currentColour); + altitude = alt.getValue(chartFormat); + y = (int) (yScaleFactor * (altitude - minAltitude)); + g.fillRect(BORDER_WIDTH + x, height-BORDER_WIDTH - y, barWidth, y); + } } } + catch (NullPointerException npe) { // ignore, probably due to data being changed + } // Draw numbers on top of the graph to mark scale if (lineScale > 1) { int textHeight = g.getFontMetrics().getHeight(); altitude = 0; y = 0; - g.setColor(COLOR_ALT_SCALE); + g.setColor(currentColour); while (altitude < maxAltitude) { if (altitude > minAltitude) @@ -203,7 +229,13 @@ public class ProfileChart extends GenericChart { // work out which data point is nearest and select it int pointNum = (int) ((e.getX() - BORDER_WIDTH) / _xScaleFactor); - _trackInfo.getSelection().selectPoint(pointNum); + // If shift clicked, then extend selection + if (e.isShiftDown()) { + _trackInfo.extendSelection(pointNum); + } + else { + _trackInfo.selectPoint(pointNum); + } } } }