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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package timeflow.vis;
 
import timeflow.data.db.*;
import timeflow.model.*;
 
import java.awt.Color;
import java.util.*;
 
public class VisualEncoder
{
 
        private TFModel model;
        private java.util.List<VisualAct> visualActs = new ArrayList<VisualAct>();
        private double maxSize = 0;
 
        public VisualEncoder(TFModel model)
        {
                this.model = model;
        }
 
        public java.util.List<VisualAct> getVisualActs()
        {
                return visualActs;
        }
 
        public void createVisualActs()
        {
                Field colorField = model.getDB().getField(VirtualField.COLOR);
                Field trackField = model.getDB().getField(VirtualField.TRACK);
                boolean multipleColors = colorField != null && colorField.getType() == String[].class && colorField != trackField;
                visualActs = VisualActFactory.create(model.getDB().all(), trackField, multipleColors);
                Collections.sort(visualActs);
        }
 
        public List<VisualAct> apply()
        {
 
                ActList visibleActs = model.getActs();
                Field start = model.getDB().getField(VirtualField.START);
                Field end = model.getDB().getField(VirtualField.END);
                Field size = model.getDB().getField(VirtualField.SIZE);
                if (size != null)
                {
                        double[] minmax = DBUtils.minmax(model.getActs(), size);
                        maxSize = Math.max(Math.abs(minmax[0]), Math.abs(minmax[1]));
                }
 
                // apply color, label, visibility, etc.
                for (VisualAct v : visualActs)
                {
                        Act a = v.getAct();
                        v.setStart(start == null ? null : a.getTime(start));
                        v.setEnd(end == null ? null : a.getTime(end));
                        v.setVisible(visibleActs.contains(a) && v.getStart() != null && v.getStart().isDefined());
                        apply(v);
                }
 
                return visualActs;
        }
 
        public void apply(VisualAct v)
        {
                Display display = model.getDisplay();
                ActDB db = model.getDB();
                Act a = v.getAct();
                Field label = db.getField(VirtualField.LABEL);
                Field track = db.getField(VirtualField.TRACK);
                Field color = db.getField(VirtualField.COLOR);
                Field size = db.getField(VirtualField.SIZE);
 
                if (label == null)
                {
                        v.setLabel("");
                } else
                {
                        v.setLabel(a.getString(label));
                }
 
                double s = Display.MAX_DOT_SIZE;
                if (size == null || maxSize == 0)
                {
                        v.setSize(s / 3);
                } else
                {
                        double z = s * Math.sqrt(Math.abs(a.getValue(size)) / maxSize);
                        if (a.getValue(size) < 0)
                        {
                                z = -z;
                        }
                        v.setSize(z);
                }
 
                // For setting the track:
                // This is a little complicated, but if the track is set to
                // tags (that is, track.getType()==String[].class) then
                // the track string was set earlier so it doesn't need to be set now.
                if (track == null)
                {
                        v.setTrackString("");
                } else if (track.getType() == String.class)
                {
                        v.setTrackString(a.getString(track));
                }
 
                if (color == null || color == track)
                {
                        if (track == null)
                        {
                                v.setColor(display.getColor("timeline.unspecified.color"));
                        } else
                        {
                                v.setColor(display.makeColor(v.getTrackString()));
                        }
                } else
                {
                        if (color.getType() == String[].class)
                        {
                                String[] tags = a.getTextList(color);
                                if (tags == null || tags.length == 0)
                                {
                                        ((TagVisualAct) v).setColors(new Color[0]);
                                } else
                                {
                                        int n = tags.length;
                                        Color[] c = new Color[n];
                                        for (int i = 0; i < n; i++)
                                        {
                                                c[i] = display.makeColor(tags[i]);
                                        }
                                        ((TagVisualAct) v).setColors(c);
                                }
                        } else
                        {
                                v.setColor(display.makeColor(a.getString(color)));
                        }
                }
        }
}