Warning: Can't use blame annotator:
svn blame failed on trunk/src/scriptbuilder/structures/TimeSlice.java: ("Can't find a temporary directory: Internal error", 20014)

source: tmcsimulator-scriptbuilder/trunk/src/scriptbuilder/structures/TimeSlice.java @ 76

Revision 76, 8.4 KB checked in by bmcguffin, 9 years ago (diff)

Added javadoc for several files.

RevLine 
1package scriptbuilder.structures;
2
3import java.text.SimpleDateFormat;
4import java.util.ArrayList;
5import java.util.Collections;
6import java.util.Date;
7import java.util.List;
8import java.util.TimeZone;
9import scriptbuilder.gui.ScriptBuilderGuiConstants;
10import scriptbuilder.structures.events.*;
11import scriptbuilder.structures.events.I_ScriptEvent;
12
13/**
14 * An instance in time in the simulation. Each timeslice has a start time, an X
15 * position on the GUI timeline, and a list of ScriptEvents which occur at that
16 * time.
17 *
18 * @author Greg Eddington <geddingt@calpoly.edu>
19 * @author Bryan McGuffin
20 * @version 2017/06/30
21 */
22public class TimeSlice implements Comparable, I_XML_Writable
23{
24
25    CadData cadData = null;
26
27    /**
28     * Reference to the incident which contains this timeslice.
29     */
30    private ScriptIncident thisIncident;
31
32    /**
33     * List of Script Events which begin at this instance.
34     */
35    public List<I_ScriptEvent> events;
36    //Absolute start time of this time slice
37    private int seconds;
38
39    /**
40     * Constructor.
41     *
42     * @param seconds Number of seconds from the beginning of the simulation
43     * that this timeslice occurs
44     * @param inc the incident to which this timeslice belongs.
45     */
46    public TimeSlice(int seconds, ScriptIncident inc)
47    {
48        this.seconds = seconds;
49        events = new ArrayList<I_ScriptEvent>();
50        thisIncident = inc;
51    }
52
53    /**
54     * Add a new script event to this time slice. Sort events by event type.
55     *
56     * @param event the ScriptEvent to be added
57     */
58    public void addEvent(I_ScriptEvent event)
59    {
60        events.add(event);
61        Collections.sort(events);
62    }
63
64    /**
65     * Get the X position of this timeslice on the GUI timeline. Affected by
66     * zoom level.
67     *
68     * @return Screen distance from the start of the timeline that this
69     * timeslice occurs
70     */
71    public int getX()
72    {
73        return seconds / ScriptBuilderGuiConstants.HORIZONTAL_TICK_RESOLUTION
74                * ScriptBuilderGuiConstants.PIXEL_WIDTH_PER_HORIZONTAL_TICK;
75    }
76
77    /**
78     * Get the start time of this timeSlice.
79     *
80     * @return the start time of the timeslice in seconds, from the beginning of
81     * the simulation
82     */
83    public int getTime()
84    {
85        return seconds;
86    }
87
88    /**
89     * Shift the start position of this timeslice to the right by some amount.
90     *
91     * @param amnt the number of seconds forward in time to push this slice
92     */
93    public void shift(int amnt)
94    {
95        seconds += amnt;
96    }
97
98    /**
99     * Get the number of seconds that events which start in this timeslice are
100     * active.
101     *
102     * @return The duration of the longest-lasting event in this slice.
103     */
104    public int getEffectiveDuration()
105    {
106        int dur = 0;
107        for (I_ScriptEvent evt : events)
108        {
109            // save the largest of current dur or this evt length
110            dur = Math.max(dur, evt.getLength());
111        }
112        return dur;
113    }
114
115    /**
116     * Get the text to be displayed when hovering over this timeSlice.
117     *
118     * @param y the y-position of the cursor on the GUI
119     * @return The text to be displayed: all events are listed if we're on the
120     * main incident line, but only one event is listed if we're hovering over
121     * that particular event
122     */
123    public String getToolTipText(int y)
124    {
125        int i = (y - ScriptBuilderGuiConstants.SCRIPT_EVENT_ICON_TOP_MARGIN);
126        if (i < 0)
127        {
128            if (i > (-1 * ScriptBuilderGuiConstants.SCRIPT_EVENT_ICON_STEP))
129            {
130                String s = toString();
131                if (s.equals(""))
132                {
133                    return null;
134                }
135
136                return "<html>" + s.replace("\n", "<br/>") + "</html>";
137            }
138            else
139            {
140                return null;
141            }
142        }
143
144        i /= ScriptBuilderGuiConstants.SCRIPT_EVENT_ICON_STEP;
145        if (i < events.size())
146        {
147            return events.get(i).toString();
148        }
149        return null;
150    }
151
152    /**
153     * List all the events attached to this timeslice, with line breaks between.
154     *
155     * @return A list of the form: event1_type - event1_description event2_type
156     * - event2_description ...
157     */
158    @Override
159    public String toString()
160    {
161        StringBuilder sb = new StringBuilder();
162
163        for (I_ScriptEvent event : events)
164        {
165            sb.append(event.toString());
166            sb.append('\n');
167        }
168
169        return sb.toString();
170    }
171
172    /**
173     * Order the timeslices by start time. Earlier start times come first.
174     *
175     * @param o the other timeSlice to be compared
176     * @return -1, 0 , or 1 depending on if this timeSlice comes before,
177     * simultaneously, or after the other
178     */
179    @Override
180    public int compareTo(Object o)
181    {
182        if (o instanceof TimeSlice)
183        {
184            TimeSlice other = (TimeSlice) o;
185            if (this.getTime() < other.getTime())
186            {
187                return -1;
188            }
189            else if (this.getTime() > other.getTime())
190            {
191                return 1;
192            }
193        }
194        return 0;
195    }
196
197    /**
198     * Converts the contents of this timeslice to a correctly formatted
199     * <ScriptEvent> XML element.
200     *
201     * @return XML conversion of this timeslice.
202     */
203    @Override
204    public String toXML()
205    {
206        ArrayList<I_ScriptEvent> eventsCopy = new ArrayList<I_ScriptEvent>();
207        ArrayList<I_ScriptEvent> eventsCopy2 = new ArrayList<I_ScriptEvent>();
208
209        for (I_ScriptEvent e : events)
210        {
211            eventsCopy.add(e);
212        }
213
214        System.out.println("Seconds:: " + seconds);
215        String output = XMLWriter.openTag(ELEMENT.SCRIPT_EVENT.tag);
216        SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");
217        df.setTimeZone(TimeZone.getTimeZone("GMT"));
218        output += XMLWriter.openTag(ELEMENT.TIME_INDEX.tag) + df.format(new Date(seconds * 1000))
219                + XMLWriter.closeTag(ELEMENT.TIME_INDEX.tag);
220
221        output += XMLWriter.openTag(ELEMENT.INCIDENT.tag + " LogNum=\"" + thisIncident.number + "\"");
222        output += thisIncident.name + XMLWriter.closeTag(ELEMENT.INCIDENT.tag);
223
224        if ((cadData != null && cadData.hasCadData()) || containsCADIncidentEvent())
225        {
226            output += XMLWriter.openTag(ELEMENT.CAD_DATA.tag);
227            if (cadData != null)
228            {
229                output += cadData.toXML();
230            }
231
232            if (containsCADIncidentEvent())
233            {
234                output += XMLWriter.openTag(ELEMENT.CAD_INCIDENT_EVENT.tag);
235                for (I_ScriptEvent ev : eventsCopy)
236                {
237                    if (ev instanceof I_XML_Writable && isCADIncidentEvent(ev))
238                    {
239                        I_XML_Writable ex = (I_XML_Writable) ev;
240                        output += ex.toXML();
241                    }
242                    else
243                    {
244                        eventsCopy2.add(ev);
245                    }
246                }
247
248                eventsCopy = eventsCopy2;
249                output += XMLWriter.closeTag(ELEMENT.CAD_INCIDENT_EVENT.tag);
250            }
251
252            output += XMLWriter.closeTag(ELEMENT.CAD_DATA.tag);
253        }
254
255        if (cadData != null && cadData.hasGeneralInfo())
256        {
257            output += XMLWriter.openTag(ELEMENT.GENERAL_INFO.tag);
258
259            output += XMLWriter.simpleTag(cadData.General_Title, ELEMENT.TITLE);
260
261            output += XMLWriter.simpleTag(cadData.General_Text, ELEMENT.TEXT);
262
263            output += XMLWriter.closeTag(ELEMENT.GENERAL_INFO.tag);
264
265        }
266
267        for (I_ScriptEvent ev : eventsCopy)
268        {
269            if (ev instanceof I_XML_Writable)
270            {
271                I_XML_Writable ex = (I_XML_Writable) ev;
272                output += ex.toXML();
273            }
274        }
275        output += XMLWriter.closeTag(ELEMENT.SCRIPT_EVENT.tag);
276        System.out.println(output);
277        return output;
278    }
279
280    private boolean containsCADIncidentEvent()
281    {
282        for (I_ScriptEvent ev : events)
283        {
284            if (isCADIncidentEvent(ev))
285            {
286                return true;
287            }
288        }
289        return false;
290    }
291
292    private boolean isCADIncidentEvent(I_ScriptEvent ev)
293    {
294        return ev instanceof AudioEvent || ev instanceof UnitEvent
295                || ev instanceof ParamicsEvent || ev instanceof TowEvent
296                || ev instanceof WitnessEvent || ev instanceof CADEvent;
297    }
298}
Note: See TracBrowser for help on using the repository browser.