Changeset 17845 in josm for trunk/src


Ignore:
Timestamp:
2021-05-01T14:00:25+02:00 (4 years ago)
Author:
simon04
Message:

see #14176 - Introduce class Interval

Location:
trunk/src/org/openstreetmap/josm
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java

    r17748 r17845  
    3333import org.openstreetmap.josm.tools.ListenerList;
    3434import org.openstreetmap.josm.tools.ListeningCollection;
     35import org.openstreetmap.josm.tools.date.Interval;
    3536
    3637/**
     
    718719     * returns minimum and maximum timestamps in the track
    719720     * @param trk track to analyze
    720      * @return  minimum and maximum dates in array of 2 elements
    721      */
    722     public static Instant[] getMinMaxTimeForTrack(IGpxTrack trk) {
     721     * @return minimum and maximum as interval
     722     */
     723    public static Optional<Interval> getMinMaxTimeForTrack(IGpxTrack trk) {
    723724        final LongSummaryStatistics statistics = trk.getSegments().stream()
    724725                .flatMap(seg -> seg.getWayPoints().stream())
     
    726727                .summaryStatistics();
    727728        return statistics.getCount() == 0 || (statistics.getMin() == 0 && statistics.getMax() == 0)
    728                 ? null
    729                 : new Instant[]{Instant.ofEpochMilli(statistics.getMin()), Instant.ofEpochMilli(statistics.getMax())};
     729                ? Optional.empty()
     730                : Optional.of(new Interval(Instant.ofEpochMilli(statistics.getMin()), Instant.ofEpochMilli(statistics.getMax())));
    730731    }
    731732
     
    734735    * Warning: there are lot of track with broken timestamps,
    735736    * so we just ignore points from future and from year before 1970 in this method
    736     * @return minimum and maximum dates in array of 2 elements
     737    * @return minimum and maximum as interval
    737738    * @since 7319
    738739    */
    739     public synchronized Instant[] getMinMaxTimeForAllTracks() {
     740    public synchronized Optional<Interval> getMinMaxTimeForAllTracks() {
    740741        long now = System.currentTimeMillis();
    741742        final LongSummaryStatistics statistics = tracks.stream()
     
    746747                .summaryStatistics();
    747748        return statistics.getCount() == 0
    748                 ? new Instant[0]
    749                 : new Instant[]{Instant.ofEpochMilli(statistics.getMin()), Instant.ofEpochMilli(statistics.getMax())};
     749                ? Optional.empty()
     750                : Optional.of(new Interval(Instant.ofEpochMilli(statistics.getMin()), Instant.ofEpochMilli(statistics.getMax())));
    750751    }
    751752
  • trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java

    r17842 r17845  
    4040import org.openstreetmap.josm.tools.Logging;
    4141import org.openstreetmap.josm.tools.Utils;
    42 import org.openstreetmap.josm.tools.date.DateUtils;
     42import org.openstreetmap.josm.tools.date.Interval;
    4343
    4444import javax.swing.AbstractAction;
     
    5353import java.io.File;
    5454import java.time.Instant;
    55 import java.time.format.DateTimeFormatter;
    56 import java.time.format.FormatStyle;
    5755import java.util.ArrayList;
    5856import java.util.Arrays;
     
    157155     */
    158156    public static String getTimespanForTrack(IGpxTrack trk) {
    159         Instant[] bounds = GpxData.getMinMaxTimeForTrack(trk);
    160         return bounds != null ? formatTimespan(bounds) : "";
    161     }
    162 
    163     /**
    164      * Formats the timespan of the given track as a human readable string
    165      * @param bounds The bounds to format, i.e., an array containing the min/max date
    166      * @return The timespan as a string
    167      */
    168     public static String formatTimespan(Instant[] bounds) {
    169         String ts = "";
    170         DateTimeFormatter df = DateUtils.getDateFormatter(FormatStyle.SHORT);
    171         String earliestDate = df.format(bounds[0]);
    172         String latestDate = df.format(bounds[1]);
    173 
    174         if (earliestDate.equals(latestDate)) {
    175             DateTimeFormatter tf = DateUtils.getTimeFormatter(FormatStyle.SHORT);
    176             ts += earliestDate + ' ';
    177             ts += tf.format(bounds[0]) + " \u2013 " + tf.format(bounds[1]);
    178         } else {
    179             DateTimeFormatter dtf = DateUtils.getDateTimeFormatter(FormatStyle.SHORT, FormatStyle.MEDIUM);
    180             ts += dtf.format(bounds[0]) + " \u2013 " + dtf.format(bounds[1]);
    181         }
    182 
    183         ts += String.format(" (%s)", Utils.getDurationString(bounds[1].toEpochMilli() - bounds[0].toEpochMilli()));
    184         return ts;
     157        return GpxData.getMinMaxTimeForTrack(trk).map(Interval::format).orElse("");
    185158    }
    186159
     
    354327        long to = toDate.toEpochMilli();
    355328        for (IGpxTrack trk : data.getTracks()) {
    356             Instant[] t = GpxData.getMinMaxTimeForTrack(trk);
     329            Interval t = GpxData.getMinMaxTimeForTrack(trk).orElse(null);
    357330
    358331            if (t == null) continue;
    359             long tm = t[1].toEpochMilli();
     332            long tm = t.getEnd().toEpochMilli();
    360333            trackVisibility[i] = (tm == 0 && showWithoutDate) || (from <= tm && tm <= to);
    361334            i++;
  • trunk/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java

    r17841 r17845  
    5454import org.openstreetmap.josm.tools.ImageProvider;
    5555import org.openstreetmap.josm.tools.OpenBrowser;
     56import org.openstreetmap.josm.tools.date.Interval;
    5657
    5758/**
     
    8889            String name = (String) Optional.ofNullable(attr.get(GpxConstants.GPX_NAME)).orElse("");
    8990            String desc = (String) Optional.ofNullable(attr.get(GpxConstants.GPX_DESC)).orElse("");
    90             Instant[] time = GpxData.getMinMaxTimeForTrack(trk);
     91            Interval time = GpxData.getMinMaxTimeForTrack(trk).orElse(null);
    9192            String url = (String) Optional.ofNullable(attr.get("url")).orElse("");
    9293            tracks[i] = new Object[]{name, desc, time, trk.length(), url, trk};
     
    140141        t.setRowSorter(rowSorter);
    141142        rowSorter.setModel(model);
    142         rowSorter.setComparator(2, Comparator.comparing((Instant[] d) -> d == null ? Instant.MIN : d[0]));
     143        rowSorter.setComparator(2, Comparator.comparing((Interval d) -> d == null ? Instant.MIN : d.getStart()));
    143144        rowSorter.setComparator(3, Comparator.comparingDouble(length -> (double) length));
    144145        // default column widths
     
    150151            public Component getTableCellRendererComponent(
    151152                    JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    152                 if (value instanceof Instant[]) {
    153                     value = GpxLayer.formatTimespan(((Instant[]) value));
     153                if (value instanceof Interval) {
     154                    value = ((Interval) value).format();
    154155                }
    155156                return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
     
    327328                JComponent jc = (JComponent) c;
    328329                Object value = getValueAt(row, col);
    329                 jc.setToolTipText(col == 2 ? Arrays.toString((Instant[]) value) : String.valueOf(value));
     330                jc.setToolTipText(String.valueOf(value));
    330331                if (content.length > row
    331332                        && content[row].length > 5
  • trunk/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java

    r17842 r17845  
    2020import org.openstreetmap.josm.spi.preferences.Config;
    2121import org.openstreetmap.josm.tools.GBC;
     22import org.openstreetmap.josm.tools.date.Interval;
    2223
    2324/**
     
    5152        this.layer = layer;
    5253
    53         final Instant startTime, endTime;
    54         Instant[] bounds = layer.data.getMinMaxTimeForAllTracks();
    55         if (bounds.length == 0) {
    56             startTime = ZonedDateTime.of(2000, 1, 1, 0, 0, 0, 0, ZoneId.systemDefault()).toInstant();
    57             endTime = Instant.now();
    58         } else {
    59             startTime = bounds[0];
    60             endTime = bounds[1];
    61         }
    62 
    63         dateFrom.setDate(startTime);
    64         dateTo.setDate(endTime);
    65         dateFrom.setRange(startTime, endTime);
    66         dateTo.setRange(startTime, endTime);
     54        Interval interval = layer.data.getMinMaxTimeForAllTracks()
     55                .orElseGet(() -> new Interval(ZonedDateTime.of(2000, 1, 1, 0, 0, 0, 0, ZoneId.systemDefault()).toInstant(), Instant.now()));
     56        dateFrom.setDate(interval.getStart());
     57        dateTo.setDate(interval.getEnd());
     58        dateFrom.setRange(interval.getStart(), interval.getEnd());
     59        dateTo.setRange(interval.getStart(), interval.getEnd());
    6760
    6861        add(noTimestampCb, GBC.std().grid(1, 1).insets(0, 0, 5, 0));
  • trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java

    r17715 r17845  
    6060import org.openstreetmap.josm.tools.Stopwatch;
    6161import org.openstreetmap.josm.tools.Utils;
     62import org.openstreetmap.josm.tools.date.Interval;
    6263
    6364/**
     
    565566        double now = System.currentTimeMillis()/1000.0;
    566567        if (colored == ColorMode.TIME) {
    567             Instant[] bounds = data.getMinMaxTimeForAllTracks();
    568             if (bounds.length >= 2) {
    569                 minval = bounds[0].getEpochSecond();
    570                 maxval = bounds[1].getEpochSecond();
    571             } else {
    572                 minval = 0;
    573                 maxval = now;
    574             }
     568            Interval interval = data.getMinMaxTimeForAllTracks().orElse(new Interval(Instant.EPOCH, Instant.now()));
     569            minval = interval.getStart().getEpochSecond();
     570            maxval = interval.getEnd().getEpochSecond();
    575571            dateScale.setRange(minval, maxval);
    576572        }
Note: See TracChangeset for help on using the changeset viewer.