Normand Briere
2018-07-07 e416acb9b012b17d1efe49ad2199ea7132d874d1
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
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;
   }
}