source: josm/trunk/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java

Last change on this file was 18801, checked in by taylor.smock, 8 months ago

Fix #22832: Code cleanup and some simplification, documentation fixes (patch by gaben)

There should not be any functional changes in this patch; it is intended to do
the following:

  • Simplify and cleanup code (example: Arrays.asList(item) -> Collections.singletonList(item))
  • Fix typos in documentation (which also corrects the documentation to match what actually happens, in some cases)
  • Property svn:eol-style set to native
File size: 5.0 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.layer.gpx;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Component;
7import java.awt.GridBagLayout;
8import java.awt.event.ActionListener;
9import java.time.Instant;
10import java.time.ZoneId;
11import java.time.ZonedDateTime;
12
13import javax.swing.JCheckBox;
14import javax.swing.JPanel;
15import javax.swing.Timer;
16import javax.swing.event.ChangeListener;
17
18import org.openstreetmap.josm.gui.layer.GpxLayer;
19import org.openstreetmap.josm.gui.widgets.DateEditorWithSlider;
20import org.openstreetmap.josm.spi.preferences.Config;
21import org.openstreetmap.josm.tools.GBC;
22import org.openstreetmap.josm.tools.date.Interval;
23
24/**
25 * A panel that allows the user to input a date range he wants to filter the GPX data for.
26 */
27public class DateFilterPanel extends JPanel {
28 private final DateEditorWithSlider dateFrom = new DateEditorWithSlider(tr("From"));
29 private final DateEditorWithSlider dateTo = new DateEditorWithSlider(tr("To"));
30 private final JCheckBox noTimestampCb = new JCheckBox(tr("No timestamp"));
31 private final transient GpxLayer layer;
32
33 private transient ActionListener filterAppliedListener;
34
35 private final String prefDate0;
36 private final String prefDateMin;
37 private final String prefDateMax;
38
39 /**
40 * Create the panel to filter tracks on GPX layer {@code layer} by date
41 * Preferences will be stored in {@code preferencePrefix}
42 * If {@code enabled = true}, then the panel is created as active and filtering occurs immediately.
43 * @param layer GPX layer
44 * @param preferencePrefix preference prefix
45 * @param enabled panel initial enabled state
46 */
47 public DateFilterPanel(GpxLayer layer, String preferencePrefix, boolean enabled) {
48 super(new GridBagLayout());
49 prefDate0 = preferencePrefix+".showzerotimestamp";
50 prefDateMin = preferencePrefix+".mintime";
51 prefDateMax = preferencePrefix+".maxtime";
52 this.layer = layer;
53
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());
60
61 add(noTimestampCb, GBC.std().grid(1, 1).insets(0, 0, 5, 0));
62 add(dateFrom, GBC.std().grid(2, 1).fill(GBC.HORIZONTAL));
63 add(dateTo, GBC.eol().grid(3, 1).fill(GBC.HORIZONTAL));
64
65 setEnabled(enabled);
66
67 ChangeListener changeListener = e -> {
68 if (isEnabled()) applyFilterWithDelay();
69 };
70
71 dateFrom.addDateListener(changeListener);
72 dateTo.addDateListener(changeListener);
73 noTimestampCb.addChangeListener(changeListener);
74 }
75
76 private final Timer t = new Timer(200, e -> applyFilter());
77
78 /**
79 * Do filtering but little bit later (to reduce cpu load)
80 */
81 public void applyFilterWithDelay() {
82 if (t.isRunning()) {
83 t.restart();
84 } else {
85 t.start();
86 }
87 }
88
89 /**
90 * Applies the filter that was input by the user to the GPX track
91 */
92 public void applyFilter() {
93 t.stop();
94 filterTracksByDate();
95 if (filterAppliedListener != null)
96 filterAppliedListener.actionPerformed(null);
97 }
98
99 /**
100 * Called by other components when it is correct time to save date filtering parameters
101 */
102 public void saveInPrefs() {
103 Config.getPref().putLong(prefDateMin, dateFrom.getDate().toEpochMilli());
104 Config.getPref().putLong(prefDateMax, dateTo.getDate().toEpochMilli());
105 Config.getPref().putBoolean(prefDate0, noTimestampCb.isSelected());
106 }
107
108 /**
109 * If possible, load date range and "zero timestamp" option from preferences
110 * Called by other components when it is needed.
111 */
112 public void loadFromPrefs() {
113 long t1 = Config.getPref().getLong(prefDateMin, 0);
114 if (t1 != 0) dateFrom.setDate(Instant.ofEpochMilli(t1));
115 long t2 = Config.getPref().getLong(prefDateMax, 0);
116 if (t2 != 0) dateTo.setDate(Instant.ofEpochMilli(t2));
117 noTimestampCb.setSelected(Config.getPref().getBoolean(prefDate0, false));
118 }
119
120 /**
121 * Sets a listener that should be called after the filter was applied
122 * @param filterAppliedListener The listener to call
123 */
124 public void setFilterAppliedListener(ActionListener filterAppliedListener) {
125 this.filterAppliedListener = filterAppliedListener;
126 }
127
128 private void filterTracksByDate() {
129 Instant from = dateFrom.getDate();
130 Instant to = dateTo.getDate();
131 layer.filterTracksByDate(from, to, noTimestampCb.isSelected());
132 }
133
134 @Override
135 public final void setEnabled(boolean enabled) {
136 super.setEnabled(enabled);
137 for (Component c: getComponents()) {
138 c.setEnabled(enabled);
139 }
140 }
141}
Note: See TracBrowser for help on using the repository browser.