source: tmcsimulator-scriptbuilder/trunk/src/scriptbuilder/structures/ScriptIncident.java @ 58

Revision 58, 8.9 KB checked in by bmcguffin, 9 years ago (diff)

Updated setOffset() method to actually shift timeslices. Changed scope of updateLenth(), both for testing purposes and to ensure length is always accurate.

Line 
1package scriptbuilder.structures;
2
3import java.awt.Color;
4import java.io.BufferedWriter;
5import java.io.File;
6import java.io.FileWriter;
7import java.util.ArrayList;
8import java.util.TreeMap;
9import scriptbuilder.structures.events.I_ScriptEvent;
10
11/**
12 * A script incident. It has an ID number, a name, and a description. It may
13 * contain several script events. It also has a color in the GUI window, and is
14 * collapsible. Incidents may start as soon as the script begins to run, or they
15 * can be offset from the start of the script.
16 *
17 * @author Greg Eddington <geddingt@calpoly.edu>
18 * @author Bryan McGuffin
19 * @version 2017/06/29
20 */
21public class ScriptIncident implements I_XML_Writable
22{
23
24    /**
25     * The moments in time which have associated events.
26     */
27    public TreeMap<Integer, TimeSlice> slices;
28
29    /**
30     * GUI display color of this slice.
31     */
32    public Color color;
33
34    /**
35     * ID number for this incident.
36     */
37    public int number;
38
39    /**
40     * Name of the incident.
41     */
42    public String name;
43
44    /**
45     * Description of the incident.
46     */
47    public String description;
48
49    /**
50     * Length, in seconds, of the incident.
51     */
52    public int length = 0;
53
54    /**
55     * If true, incident appears minimized.
56     */
57    public boolean collapsed = false;
58
59    /**
60     * Number of seconds between start of simulation and start of this incident.
61     */
62    public int offset = 0;
63
64    /**
65     * Start position of the latest timeslice.
66     */
67    private int latestStart = 0;
68
69    /**
70     * Number of events in this incident.
71     */
72    public int eventCount = 0;
73
74    SimulationScript script;
75
76    /**
77     * Basic constructor.
78     *
79     * @param number The incident ID number
80     * @param name The name of the incident
81     * @param description The description of the incident
82     * @param script The script object holding this incident
83     */
84    public ScriptIncident(int number, String name, String description,
85            SimulationScript script)
86    {
87        color = Color.BLACK;
88        this.number = number;
89        this.name = name;
90        this.description = description;
91        this.script = script;
92        slices = new TreeMap<Integer, TimeSlice>();
93    }
94
95    /**
96     * Constructor with color parameter.
97     *
98     * @param color The color to use in the GUI for this event
99     * @param number The incident ID number
100     * @param name The name of the incident
101     * @param description The description of the incident
102     * @param script The script object holding this incident
103     */
104    public ScriptIncident(Color color, int number, String name,
105            String description, SimulationScript script)
106    {
107        this.color = color;
108        this.number = number;
109        this.name = name;
110        this.description = description;
111        this.script = script;
112        slices = new TreeMap<Integer, TimeSlice>();
113    }
114
115    /**
116     * Constructor with color and offset parameters.
117     *
118     * @param color The color to use in the GUI for this event
119     * @param number The incident ID number
120     * @param name The name of the incident
121     * @param description The description of the incident
122     * @param script The script object holding this incident
123     * @param offset Number of seconds after 00:00:00 that this incident begins
124     */
125    public ScriptIncident(Color color, int number, String name,
126            String description, SimulationScript script,
127            int offset)
128    {
129        this.color = color;
130        this.number = number;
131        this.name = name;
132        this.description = description;
133        this.script = script;
134        slices = new TreeMap<Integer, TimeSlice>();
135        this.setOffset(offset);
136    }
137
138    /**
139     * Set whether or not the incident is fully visible or in a compacted state.
140     *
141     * @param collapsed True if the event is compacted
142     */
143    public void setCollapsed(boolean collapsed)
144    {
145        this.collapsed = collapsed;
146        script.update();
147    }
148
149    /**
150     * Set the delay time between the start of the script and the start of this
151     * incident.
152     *
153     * @param offset Number of seconds after 00:00:00 that this incident begins
154     */
155    public void setOffset(int offset)
156    {
157        int old = this.offset;
158        this.offset = offset;
159
160        for (TimeSlice ts : slices.values())
161        {
162            ts.shift(offset - old);
163        }
164
165        script.update();
166    }
167
168    /**
169     * Add a new script event to this incident.
170     *
171     * @param ev The new event
172     * @param start Start time of this event, in seconds, from the beginning of
173     * the simulation
174     */
175    public void addNewEvent(I_ScriptEvent ev, int start)
176    {
177        TimeSlice t = slices.get(start);
178        if (t == null)
179        {
180            //System.out.println("Generating new slice at time " + start);
181            t = new TimeSlice(start, this);
182            t.addEvent(ev);
183            slices.put(start, t);
184        }
185        else
186        {
187            t.addEvent(ev);
188        }
189        eventCount++;
190
191        if (start > latestStart)
192        {
193            latestStart = start;
194            //System.out.println("Latest Start: " + latestStart);
195        }
196        if (start < offset)
197        {
198            offset = start;
199            //System.out.println("Offset: " + offset);
200        }
201        updateLength();
202    }
203
204    /**
205     * Get an array of all valid timeSlices.
206     *
207     * @return List of timeSlices which are not null
208     */
209    public ArrayList<TimeSlice> getSlices()
210    {
211        ArrayList<TimeSlice> arr = new ArrayList<TimeSlice>();
212        for (int i = 0; i <= latestStart; i++)
213        {
214            TimeSlice ts = slices.get(i);
215            if (ts != null)
216            {
217                arr.add(ts);
218            }
219        }
220        return arr;
221    }
222
223    public void saveIncidentToFile(File f)
224    {
225        try
226        {
227            f.createNewFile();
228
229            BufferedWriter bw = new BufferedWriter(new FileWriter(f));
230            bw.write(this.toXML());
231            bw.flush();
232            bw.close();
233
234        }
235        catch (Exception ex)
236        {
237            System.out.println("ERROR SAVING SCRIPT");
238            ex.printStackTrace();
239        }
240    }
241
242    @Override
243    public String toXML()
244    {
245        String output = "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n";
246        output += "<!DOCTYPE TMC_SCRIPT SYSTEM \"script.dtd\">\n";
247        output += XMLWriter.openTag(ELEMENT.TMC_SCRIPT.tag + " title=\"" + this.script.title + "\"");
248
249        for (TimeSlice slice : slices.values())
250        {
251            output += slice.toXML();
252        }
253        output += XMLWriter.closeTag(ELEMENT.TMC_SCRIPT.tag);
254        return output;
255    }
256
257    void insertCadData(long currentEventTime, CadData cad)
258    {
259        int time = (int) currentEventTime;
260
261        TimeSlice slice;
262
263        if (slices.get(time) == null)
264        {
265            slices.put(time, new TimeSlice(time, this));
266        }
267        slice = slices.get(time);
268        slice.cadData = cad;
269    }
270
271    /**
272     * Update the offset and apparent length of this incident. The offset is the
273     * start time of the earliest event in the incident. The length is the time
274     * that the latest, longest-lasting event ends, minus the offset.
275     */
276    public void updateLength()
277    {
278        int lengthSoFar = 0;
279        for (int i = 0; i <= latestStart; i++)
280        {
281            TimeSlice ts = slices.get(i);
282            if (ts != null)
283            {
284                int reach = ts.getTime() + ts.getEffectiveDuration() - offset;
285                if (reach > lengthSoFar)
286                {
287                    lengthSoFar = reach;
288                }
289            }
290        }
291        length = lengthSoFar;
292    }
293
294    /**
295     * An event which is fired if the focused slice changes.
296     */
297    public static class SliceChangedEvent
298    {
299
300        public TimeSlice slice;
301
302        SliceChangedEvent(TimeSlice slice)
303        {
304            this.slice = slice;
305        }
306    }
307
308    /**
309     * Update and cause the system to focus on the given timeslice.
310     *
311     * @param i Index of the slice to focus on
312     */
313    public void setSliceActive(int i)
314    {
315        if (this.slices.get(i) != null)
316        {
317            script.broadcastEvent(new SliceChangedEvent(this.slices.get(i)));
318        }
319    }
320
321    /**
322     * An event which is fired if the focused incident changes.
323     */
324    public static class IncidentFocusedEvent
325    {
326
327        public ScriptIncident incident;
328
329        IncidentFocusedEvent(ScriptIncident i)
330        {
331            incident = i;
332        }
333    }
334
335    /**
336     * Update and cause the system to focus on this incident.
337     */
338    public void setIncidentActive()
339    {
340        script.broadcastEvent(new IncidentFocusedEvent(this));
341    }
342
343    /**
344     * String representation of this incident.
345     *
346     * @return String of the form "[Incident number] - [Incident name]"
347     */
348    @Override
349    public String toString()
350    {
351        return this.number + " - " + this.name;
352    }
353}
Note: See TracBrowser for help on using the repository browser.