Normand Briere
2018-10-27 d34fd9341c61d13677e029cb187d4dacff5e44ea
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package timeflow.vis.timeline;
 
import java.util.*;
 
import timeflow.data.time.*;
 
public class AxisTicMarks
{
        public TimeUnit unit;
        public List<Long> tics;
        private static final TimeUnit[] units =
        {
                TimeUnit.YEAR, TimeUnit.MONTH, TimeUnit.DAY, TimeUnit.HOUR, TimeUnit.MINUTE, TimeUnit.SECOND
        };
        private static final TimeUnit[] histUnits =
        {
                TimeUnit.YEAR.times(100), TimeUnit.YEAR.times(50), TimeUnit.YEAR.times(25),
                TimeUnit.YEAR.times(10), TimeUnit.YEAR.times(5), TimeUnit.YEAR.times(2), TimeUnit.YEAR,
                TimeUnit.MONTH.times(6), TimeUnit.MONTH.times(3), TimeUnit.MONTH.times(2), TimeUnit.MONTH,
                TimeUnit.WEEK, TimeUnit.DAY.times(2), TimeUnit.DAY,
                TimeUnit.HOUR,
                TimeUnit.MINUTE,
                TimeUnit.SECOND
        };
 
        public AxisTicMarks(TimeUnit unit, long start, long end)
        {
                this.unit = unit;
                tics = new ArrayList<Long>();
                RoughTime r = unit.roundDown(start);
                tics.add(r.getTime());
                do
                {
                        unit.addTo(r);
                        tics.add(r.getTime());
                } while (r.getTime() < end);
        }
 
        public static List<AxisTicMarks> allRelevant(Interval interval)
        {
                return allRelevant(interval.start, interval.end);
        }
 
        public static List<AxisTicMarks> allRelevant(long start, long end)
        {
                return allRelevant(start, end, 40);
        }
 
        public static AxisTicMarks histoTics(long start, long end)
        {
                for (int i = histUnits.length - 1; i >= 0; i--)
                {
                        TimeUnit u = histUnits[i];
                        long estimate = u.approxNumInRange(start, end);
                        if (estimate < 200 || i == 0)
                        {
                                AxisTicMarks t = new AxisTicMarks(u, start, end);
                                return t;
                        }
                }
                return null;
        }
 
        public static List<AxisTicMarks> allRelevant(long start, long end, long maxTics)
        {
                List<AxisTicMarks> list = new ArrayList<AxisTicMarks>();
 
 
                for (int i = 0; i < units.length; i++)
                {
                        TimeUnit u = units[i];
                        long estimate = u.approxNumInRange(start, end);
 
                        if (estimate < maxTics)
                        {
                                AxisTicMarks t = new AxisTicMarks(u, start, end);
                                if (list.size() > 0)
                                {
                                        AxisTicMarks last = list.get(0);
                                        if (last.tics.size() == t.tics.size())
                                        {
                                                list.remove(0);
                                        }
                                }
                                list.add(t);
 
                        }
                }
                while (list.size() > 2)
                {
                        list.remove(0);
                }
 
                if (list.size() == 0) // uh oh! must be many years. we will add in bigger increments.
                {
                        long length = end - start;
                        long size = 365 * 24 * 60 * 60 * 1000L;
                        int m = 1;
                        maxTics = 15;
                        while (m < 2000000000 && length / (m * size) > maxTics)
                        {
                                if (length / (2 * m * size) <= maxTics)
                                {
                                        m *= 2;
                                        break;
                                }
                                if (length / (5 * m * size) <= maxTics)
                                {
                                        m *= 5;
                                        break;
                                }
                                m *= 10;
                        }
                        AxisTicMarks t = new AxisTicMarks(TimeUnit.multipleYears(m), start, end);
                        list.add(t);
                }
                return list;
        }
}