Fix out of memory crash with TimeUnit.
| .. | .. |
|---|
| 10 | 10 | import javax.swing.*; |
|---|
| 11 | 11 | import java.util.*; |
|---|
| 12 | 12 | |
|---|
| 13 | | -public class DateFieldAction extends TimeflowAction { |
|---|
| 13 | +public class DateFieldAction extends TimeflowAction |
|---|
| 14 | +{ |
|---|
| 15 | + public DateFieldAction(TimeflowApp app) |
|---|
| 16 | + { |
|---|
| 17 | + super(app, "Set Date Fields...", null, "Set date fields corresponding to start, end."); |
|---|
| 18 | + } |
|---|
| 14 | 19 | |
|---|
| 15 | | - public DateFieldAction(TimeflowApp app) |
|---|
| 16 | | - { |
|---|
| 17 | | - super(app, "Set Date Fields...", null, "Set date fields corresponding to start, end."); |
|---|
| 18 | | - } |
|---|
| 19 | | - |
|---|
| 20 | | - @Override |
|---|
| 21 | | - public void actionPerformed(ActionEvent e) { |
|---|
| 22 | | - DateFieldPanel.popWindow(app.model); |
|---|
| 23 | | - } |
|---|
| 20 | + @Override |
|---|
| 21 | + public void actionPerformed(ActionEvent e) |
|---|
| 22 | + { |
|---|
| 23 | + DateFieldPanel.popWindow(app.model); |
|---|
| 24 | + } |
|---|
| 24 | 25 | } |
|---|
| .. | .. |
|---|
| 6 | 6 | import java.net.URL; |
|---|
| 7 | 7 | import java.util.*; |
|---|
| 8 | 8 | |
|---|
| 9 | | -public class BasicAct implements Act { |
|---|
| 10 | | - |
|---|
| 11 | | - private HashMap data=new HashMap(); |
|---|
| 12 | | - private ActDB db; |
|---|
| 13 | | - |
|---|
| 14 | | - public BasicAct(ActDB db) |
|---|
| 15 | | - { |
|---|
| 16 | | - this.db=db; |
|---|
| 17 | | - } |
|---|
| 18 | | - |
|---|
| 9 | +public class BasicAct implements Act |
|---|
| 10 | +{ |
|---|
| 19 | 11 | |
|---|
| 20 | | - @Override |
|---|
| 21 | | - public String getString(Field field) { |
|---|
| 22 | | - return (String)data.get(field.getName()); |
|---|
| 23 | | - } |
|---|
| 24 | | - |
|---|
| 25 | | - public void setText(Field field, String text) |
|---|
| 26 | | - { |
|---|
| 27 | | - data.put(field.getName(), text); |
|---|
| 28 | | - } |
|---|
| 12 | + private HashMap data = new HashMap(); |
|---|
| 13 | + private ActDB db; |
|---|
| 29 | 14 | |
|---|
| 30 | | - @Override |
|---|
| 31 | | - public String[] getTextList(Field field) { |
|---|
| 32 | | - return (String[])data.get(field.getName()); |
|---|
| 33 | | - } |
|---|
| 34 | | - |
|---|
| 35 | | - public void setTextList(Field field, String[] list){ |
|---|
| 36 | | - data.put(field.getName(), list); |
|---|
| 37 | | - } |
|---|
| 15 | + public BasicAct(ActDB db) |
|---|
| 16 | + { |
|---|
| 17 | + this.db = db; |
|---|
| 18 | + } |
|---|
| 38 | 19 | |
|---|
| 39 | | - @Override |
|---|
| 40 | | - public double getValue(Field field) { |
|---|
| 41 | | - return (Double)data.get(field.getName()); |
|---|
| 42 | | - } |
|---|
| 43 | | - |
|---|
| 44 | | - public void setValue(Field field, double value) |
|---|
| 45 | | - { |
|---|
| 46 | | - data.put(field.getName(), value); |
|---|
| 47 | | - } |
|---|
| 20 | + @Override |
|---|
| 21 | + public String getString(Field field) |
|---|
| 22 | + { |
|---|
| 23 | + Object s = data.get(field.getName()); |
|---|
| 24 | + if (s == null) |
|---|
| 25 | + return null; |
|---|
| 26 | + return s.toString(); |
|---|
| 27 | + } |
|---|
| 48 | 28 | |
|---|
| 49 | | - @Override |
|---|
| 50 | | - public Object get(Field field) { |
|---|
| 51 | | - return data.get(field.getName()); |
|---|
| 52 | | - } |
|---|
| 29 | + public void setText(Field field, String text) |
|---|
| 30 | + { |
|---|
| 31 | + data.put(field.getName(), text); |
|---|
| 32 | + } |
|---|
| 53 | 33 | |
|---|
| 54 | | - @Override |
|---|
| 55 | | - public ActDB getDB() { |
|---|
| 56 | | - return db; |
|---|
| 57 | | - } |
|---|
| 34 | + @Override |
|---|
| 35 | + public String[] getTextList(Field field) |
|---|
| 36 | + { |
|---|
| 37 | + return (String[]) data.get(field.getName()); |
|---|
| 38 | + } |
|---|
| 58 | 39 | |
|---|
| 59 | | - @Override |
|---|
| 60 | | - public void set(Field field, Object value) { |
|---|
| 61 | | - data.put(field.getName(), value); |
|---|
| 62 | | - } |
|---|
| 40 | + public void setTextList(Field field, String[] list) |
|---|
| 41 | + { |
|---|
| 42 | + data.put(field.getName(), list); |
|---|
| 43 | + } |
|---|
| 63 | 44 | |
|---|
| 45 | + @Override |
|---|
| 46 | + public double getValue(Field field) |
|---|
| 47 | + { |
|---|
| 48 | + return (Double) data.get(field.getName()); |
|---|
| 49 | + } |
|---|
| 64 | 50 | |
|---|
| 65 | | - @Override |
|---|
| 66 | | - public RoughTime getTime(Field field) { |
|---|
| 67 | | - return (RoughTime)data.get(field.getName()); |
|---|
| 68 | | - } |
|---|
| 51 | + public void setValue(Field field, double value) |
|---|
| 52 | + { |
|---|
| 53 | + data.put(field.getName(), value); |
|---|
| 54 | + } |
|---|
| 69 | 55 | |
|---|
| 56 | + @Override |
|---|
| 57 | + public Object get(Field field) |
|---|
| 58 | + { |
|---|
| 59 | + return data.get(field.getName()); |
|---|
| 60 | + } |
|---|
| 70 | 61 | |
|---|
| 71 | | - @Override |
|---|
| 72 | | - public void setTime(Field field, RoughTime time) { |
|---|
| 73 | | - data.put(field.getName(), time); |
|---|
| 74 | | - |
|---|
| 75 | | - } |
|---|
| 62 | + @Override |
|---|
| 63 | + public ActDB getDB() |
|---|
| 64 | + { |
|---|
| 65 | + return db; |
|---|
| 66 | + } |
|---|
| 76 | 67 | |
|---|
| 68 | + @Override |
|---|
| 69 | + public void set(Field field, Object value) |
|---|
| 70 | + { |
|---|
| 71 | + data.put(field.getName(), value); |
|---|
| 72 | + } |
|---|
| 77 | 73 | |
|---|
| 78 | | - @Override |
|---|
| 79 | | - public URL getURL(Field field) { |
|---|
| 80 | | - return (URL)data.get(field.getName()); |
|---|
| 81 | | - } |
|---|
| 74 | + @Override |
|---|
| 75 | + public RoughTime getTime(Field field) |
|---|
| 76 | + { |
|---|
| 77 | + return (RoughTime) data.get(field.getName()); |
|---|
| 78 | + } |
|---|
| 82 | 79 | |
|---|
| 80 | + @Override |
|---|
| 81 | + public void setTime(Field field, RoughTime time) |
|---|
| 82 | + { |
|---|
| 83 | + data.put(field.getName(), time); |
|---|
| 83 | 84 | |
|---|
| 84 | | - @Override |
|---|
| 85 | | - public void setURL(Field field, URL url) { |
|---|
| 86 | | - data.put(field.getName(), url); |
|---|
| 87 | | - } |
|---|
| 85 | + } |
|---|
| 88 | 86 | |
|---|
| 87 | + @Override |
|---|
| 88 | + public URL getURL(Field field) |
|---|
| 89 | + { |
|---|
| 90 | + return (URL) data.get(field.getName()); |
|---|
| 91 | + } |
|---|
| 92 | + |
|---|
| 93 | + @Override |
|---|
| 94 | + public void setURL(Field field, URL url) |
|---|
| 95 | + { |
|---|
| 96 | + data.put(field.getName(), url); |
|---|
| 97 | + } |
|---|
| 89 | 98 | } |
|---|
| .. | .. |
|---|
| 106 | 106 | public String format() |
|---|
| 107 | 107 | { |
|---|
| 108 | 108 | //return units.formatFull(time); |
|---|
| 109 | | - return TimeUnit.SECOND.formatFull(time); |
|---|
| 109 | + String format = TimeUnit.REALTIME.formatFull(time); |
|---|
| 110 | + |
|---|
| 111 | + if (format.equals("00:00:00:00")) |
|---|
| 112 | + { |
|---|
| 113 | + format = TimeUnit.DAY.formatFull(time); |
|---|
| 114 | + } |
|---|
| 115 | + |
|---|
| 116 | + return format; |
|---|
| 110 | 117 | } |
|---|
| 111 | 118 | |
|---|
| 112 | 119 | public static int compare(RoughTime t1, RoughTime t2) |
|---|
| .. | .. |
|---|
| 13 | 13 | public static final TimeUnit HOUR = new TimeUnit("Hours", Calendar.HOUR_OF_DAY, 60 * 60 * 1000L, "HH:mm", "MMM d yyyy HH:mm"); |
|---|
| 14 | 14 | public static final TimeUnit MINUTE = new TimeUnit("Minutes", Calendar.MINUTE, 60 * 1000L, ":mm", "MMM d yyyy HH:mm"); |
|---|
| 15 | 15 | public static final TimeUnit SECOND = new TimeUnit("Seconds", Calendar.SECOND, 1000L, ":ss", "MMM d yyyy HH:mm:ss"); |
|---|
| 16 | | - public static final TimeUnit REALTIME = new TimeUnit("Realtime", Calendar.MILLISECOND, 8L, ":SSS", "MMM d yyyy HH:mm:ss:SSS"); |
|---|
| 16 | + public static final TimeUnit REALTIME = new TimeUnit("Realtime", Calendar.MILLISECOND, 1L, ":SS", "HH:mm:ss.SS"); |
|---|
| 17 | 17 | |
|---|
| 18 | 18 | public static final TimeUnit DECADE = multipleYears(10); |
|---|
| 19 | 19 | public static final TimeUnit CENTURY = multipleYears(100); |
|---|
| .. | .. |
|---|
| 101 | 101 | } |
|---|
| 102 | 102 | private static final int[] calendarUnits = |
|---|
| 103 | 103 | { |
|---|
| 104 | | - Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY, Calendar.DAY_OF_MONTH, Calendar.MONTH, Calendar.YEAR |
|---|
| 104 | + Calendar.MILLISECOND, Calendar.SECOND, Calendar.MINUTE, Calendar.HOUR_OF_DAY, Calendar.DAY_OF_MONTH, Calendar.MONTH, Calendar.YEAR |
|---|
| 105 | 105 | }; |
|---|
| 106 | 106 | |
|---|
| 107 | 107 | public RoughTime round(long timestamp, boolean up) |
|---|
| .. | .. |
|---|
| 128 | 128 | } |
|---|
| 129 | 129 | if (i == calendarUnits.length - 1) |
|---|
| 130 | 130 | { |
|---|
| 131 | | - throw new IllegalArgumentException("Unsupported Calendar Unit: " + calendarCode); |
|---|
| 131 | + //throw new IllegalArgumentException("Unsupported Calendar Unit: " + calendarCode); |
|---|
| 132 | 132 | } |
|---|
| 133 | 133 | c.set(calendarUnits[i], c.getMinimum(calendarUnits[i])); |
|---|
| 134 | 134 | } |
|---|
| .. | .. |
|---|
| 44 | 44 | // because then the guesser succeeds before it has a chance to try parsing days. |
|---|
| 45 | 45 | static |
|---|
| 46 | 46 | { |
|---|
| 47 | | - parsers.add(new DateTimeParser("yyyy-MM-ddzzzzzzzzzz", TimeUnit.DAY)); |
|---|
| 48 | | - parsers.add(new DateTimeParser("MMM dd yyyy HH:mm", TimeUnit.SECOND)); |
|---|
| 49 | | - parsers.add(new DateTimeParser("MMM/dd/yyyy HH:mm", TimeUnit.SECOND)); |
|---|
| 50 | | - parsers.add(new DateTimeParser("MM/dd/yy HH:mm", TimeUnit.SECOND)); |
|---|
| 51 | | - parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss", TimeUnit.SECOND)); |
|---|
| 52 | | - parsers.add(new DateTimeParser("MM/dd/yyyy HH:mm:ss", TimeUnit.SECOND)); |
|---|
| 53 | | - parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss zzzzzzzz", TimeUnit.SECOND)); |
|---|
| 54 | | - parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND)); |
|---|
| 55 | | - parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND)); |
|---|
| 56 | | - parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY)); |
|---|
| 57 | | - parsers.add(new DateTimeParser("yyyy-MM-dd", TimeUnit.DAY)); |
|---|
| 58 | | - parsers.add(new DateTimeParser("yyyyMMdd", TimeUnit.DAY)); |
|---|
| 59 | | - parsers.add(new DateTimeParser("MM-dd-yy", TimeUnit.DAY)); |
|---|
| 60 | | - parsers.add(new DateTimeParser("dd-MMM-yy", TimeUnit.DAY)); |
|---|
| 61 | | - parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY)); |
|---|
| 62 | | - parsers.add(new DateTimeParser("MM/dd/yy", TimeUnit.DAY)); |
|---|
| 63 | | - parsers.add(new DateTimeParser("MM/dd/yyyy", TimeUnit.DAY)); |
|---|
| 64 | | - parsers.add(new DateTimeParser("dd MMM yyyy", TimeUnit.DAY)); |
|---|
| 65 | | - parsers.add(new DateTimeParser("dd MMM, yyyy", TimeUnit.DAY)); |
|---|
| 47 | +// parsers.add(new DateTimeParser("yyyy-MM-ddzzzzzzzzzz", TimeUnit.DAY)); |
|---|
| 48 | +// parsers.add(new DateTimeParser("MMM dd yyyy HH:mm", TimeUnit.SECOND)); |
|---|
| 49 | +// parsers.add(new DateTimeParser("MMM/dd/yyyy HH:mm", TimeUnit.SECOND)); |
|---|
| 50 | +// parsers.add(new DateTimeParser("MM/dd/yy HH:mm", TimeUnit.SECOND)); |
|---|
| 51 | +// parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss", TimeUnit.SECOND)); |
|---|
| 52 | + parsers.add(new DateTimeParser("HH:mm:ss:SS", TimeUnit.REALTIME)); |
|---|
| 53 | +// parsers.add(new DateTimeParser("MM/dd/yyyy HH:mm:ss", TimeUnit.SECOND)); |
|---|
| 54 | +// parsers.add(new DateTimeParser("MMM dd yyyy HH:mm:ss zzzzzzzz", TimeUnit.SECOND)); |
|---|
| 55 | +// parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND)); |
|---|
| 56 | +// parsers.add(new DateTimeParser("EEE MMM dd HH:mm:ss zzzzzzzz yyyy", TimeUnit.SECOND)); |
|---|
| 57 | +// parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY)); |
|---|
| 58 | +// parsers.add(new DateTimeParser("yyyy-MM-dd", TimeUnit.DAY)); |
|---|
| 59 | +// parsers.add(new DateTimeParser("yyyyMMdd", TimeUnit.DAY)); |
|---|
| 60 | +// parsers.add(new DateTimeParser("MM-dd-yy", TimeUnit.DAY)); |
|---|
| 61 | +// parsers.add(new DateTimeParser("dd-MMM-yy", TimeUnit.DAY)); |
|---|
| 62 | +// parsers.add(new DateTimeParser("MM-dd-yyyy", TimeUnit.DAY)); |
|---|
| 63 | +// parsers.add(new DateTimeParser("MM/dd/yy", TimeUnit.DAY)); |
|---|
| 64 | +// parsers.add(new DateTimeParser("MM/dd/yyyy", TimeUnit.DAY)); |
|---|
| 65 | +// parsers.add(new DateTimeParser("dd MMM yyyy", TimeUnit.DAY)); |
|---|
| 66 | +// parsers.add(new DateTimeParser("dd MMM, yyyy", TimeUnit.DAY)); |
|---|
| 66 | 67 | parsers.add(new DateTimeParser("MMM dd yyyy", TimeUnit.DAY)); |
|---|
| 67 | | - parsers.add(new DateTimeParser("MMM dd, yyyy", TimeUnit.DAY)); |
|---|
| 68 | | - parsers.add(new DateTimeParser("EEE MMM dd zzzzzzzz yyyy", TimeUnit.DAY)); |
|---|
| 69 | | - parsers.add(new DateTimeParser("EEE MMM dd yyyy", TimeUnit.DAY)); |
|---|
| 70 | | - parsers.add(new DateTimeParser("MMM-yy", TimeUnit.MONTH)); |
|---|
| 71 | | - parsers.add(new DateTimeParser("MMM yy", TimeUnit.MONTH)); |
|---|
| 72 | | - parsers.add(new DateTimeParser("MMM/yy", TimeUnit.MONTH)); |
|---|
| 73 | | - parsers.add(new DateTimeParser("yyyy", TimeUnit.YEAR)); |
|---|
| 74 | | - parsers.add(new DateTimeParser("yyyy GG", TimeUnit.YEAR)); |
|---|
| 68 | +// parsers.add(new DateTimeParser("MMM dd, yyyy", TimeUnit.DAY)); |
|---|
| 69 | +// parsers.add(new DateTimeParser("EEE MMM dd zzzzzzzz yyyy", TimeUnit.DAY)); |
|---|
| 70 | +// parsers.add(new DateTimeParser("EEE MMM dd yyyy", TimeUnit.DAY)); |
|---|
| 71 | +// parsers.add(new DateTimeParser("MMM-yy", TimeUnit.MONTH)); |
|---|
| 72 | +// parsers.add(new DateTimeParser("MMM yy", TimeUnit.MONTH)); |
|---|
| 73 | +// parsers.add(new DateTimeParser("MMM/yy", TimeUnit.MONTH)); |
|---|
| 74 | +// parsers.add(new DateTimeParser("yyyy", TimeUnit.YEAR)); |
|---|
| 75 | +// parsers.add(new DateTimeParser("yyyy GG", TimeUnit.YEAR)); |
|---|
| 76 | + parsers.add(new DateTimeParser("S", TimeUnit.REALTIME)); |
|---|
| 75 | 77 | } |
|---|
| 76 | 78 | |
|---|
| 77 | 79 | public DateTimeParser getLastGoodFormat() |
|---|
| .. | .. |
|---|
| 10 | 10 | public List<Long> tics; |
|---|
| 11 | 11 | private static final TimeUnit[] units = |
|---|
| 12 | 12 | { |
|---|
| 13 | | - TimeUnit.YEAR, TimeUnit.MONTH, TimeUnit.DAY, TimeUnit.HOUR, TimeUnit.MINUTE, TimeUnit.SECOND |
|---|
| 13 | + TimeUnit.YEAR, TimeUnit.MONTH, TimeUnit.DAY, TimeUnit.HOUR, TimeUnit.MINUTE, TimeUnit.SECOND, TimeUnit.REALTIME |
|---|
| 14 | 14 | }; |
|---|
| 15 | 15 | private static final TimeUnit[] histUnits = |
|---|
| 16 | 16 | { |
|---|
| .. | .. |
|---|
| 20 | 20 | TimeUnit.WEEK, TimeUnit.DAY.times(2), TimeUnit.DAY, |
|---|
| 21 | 21 | TimeUnit.HOUR, |
|---|
| 22 | 22 | TimeUnit.MINUTE, |
|---|
| 23 | | - TimeUnit.SECOND |
|---|
| 23 | + TimeUnit.SECOND, |
|---|
| 24 | + TimeUnit.REALTIME |
|---|
| 24 | 25 | }; |
|---|
| 25 | 26 | |
|---|
| 26 | 27 | public AxisTicMarks(TimeUnit unit, long start, long end) |
|---|
| .. | .. |
|---|
| 48 | 49 | |
|---|
| 49 | 50 | public static AxisTicMarks histoTics(long start, long end) |
|---|
| 50 | 51 | { |
|---|
| 51 | | - for (int i = histUnits.length - 1; i >= 0; i--) |
|---|
| 52 | + for (int i = histUnits.length; --i >= 0;) |
|---|
| 52 | 53 | { |
|---|
| 53 | 54 | TimeUnit u = histUnits[i]; |
|---|
| 54 | 55 | long estimate = u.approxNumInRange(start, end); |
|---|
| 55 | 56 | if (estimate < 200 || i == 0) |
|---|
| 56 | 57 | { |
|---|
| 58 | + if (i == 17) |
|---|
| 59 | + i = 17; |
|---|
| 60 | + |
|---|
| 57 | 61 | AxisTicMarks t = new AxisTicMarks(u, start, end); |
|---|
| 58 | 62 | return t; |
|---|
| 59 | 63 | } |
|---|
| .. | .. |
|---|
| 15 | 15 | |
|---|
| 16 | 16 | public class TimelineSlider extends ModelPanel |
|---|
| 17 | 17 | { |
|---|
| 18 | | - |
|---|
| 19 | 18 | TimelineVisuals visuals; |
|---|
| 20 | 19 | Interval original; |
|---|
| 21 | 20 | long minRange; |
|---|
| .. | .. |
|---|
| 30 | 29 | |
|---|
| 31 | 30 | START, END, POSITION, NONE |
|---|
| 32 | 31 | }; |
|---|
| 32 | + |
|---|
| 33 | 33 | Modify change = Modify.NONE; |
|---|
| 34 | 34 | Rectangle startRect = new Rectangle(-1, -1, 0, 0); |
|---|
| 35 | 35 | Rectangle endRect = new Rectangle(-1, -1, 0, 0); |
|---|
| .. | .. |
|---|
| 165 | 165 | scale.setDateRange(visuals.getGlobalInterval()); |
|---|
| 166 | 166 | scale.setNumberRange(ew, w - ew); |
|---|
| 167 | 167 | |
|---|
| 168 | | - |
|---|
| 169 | 168 | // draw the area for the central "thumb". |
|---|
| 170 | 169 | int lx = scale.toInt(window().start); |
|---|
| 171 | 170 | int rx = scale.toInt(window().end); |
|---|
| .. | .. |
|---|
| 194 | 193 | mostInSlot = Math.max(mostInSlot, slots[s]); |
|---|
| 195 | 194 | } |
|---|
| 196 | 195 | } |
|---|
| 196 | + |
|---|
| 197 | 197 | if (mostInSlot > 30) |
|---|
| 198 | 198 | { |
|---|
| 199 | 199 | g.setColor(Color.gray); |
|---|