4ddb9a1d04866bd2ba29a894cf3d31bcf39520fb
1 /*******************************************************************************
2 * Copyright (c) 2012, 2016 Ericsson, École Polytechnique de Montréal
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Patrick Tasse - Initial API and implementation
11 * Geneviève Bastien - Move code to provide base classes for time graph view
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.model
;
16 import java
.util
.ArrayList
;
17 import java
.util
.Arrays
;
18 import java
.util
.Comparator
;
19 import java
.util
.Iterator
;
20 import java
.util
.List
;
21 import java
.util
.concurrent
.CopyOnWriteArrayList
;
22 import java
.util
.regex
.Pattern
;
24 import org
.eclipse
.jdt
.annotation
.NonNull
;
25 import org
.eclipse
.swt
.SWT
;
28 * An entry for use in the time graph views
30 public class TimeGraphEntry
implements ITimeGraphEntry
{
33 private TimeGraphEntry fParent
= null;
35 /** List of child entries */
36 private final List
<@NonNull TimeGraphEntry
> fChildren
= new CopyOnWriteArrayList
<>();
38 /** Name of this entry (text to show) */
40 private long fStartTime
= SWT
.DEFAULT
;
41 private long fEndTime
= SWT
.DEFAULT
;
42 private @NonNull List
<ITimeEvent
> fEventList
= new ArrayList
<>();
43 private @NonNull List
<ITimeEvent
> fZoomedEventList
= new ArrayList
<>();
44 private Comparator
<ITimeGraphEntry
> fComparator
;
50 * The name of this entry
52 * The start time of this entry
54 * The end time of this entry
56 public TimeGraphEntry(String name
, long startTime
, long endTime
) {
58 fStartTime
= startTime
;
62 // ---------------------------------------------
63 // Getters and setters
64 // ---------------------------------------------
70 public TimeGraphEntry
getParent() {
75 * Sets the entry's parent
77 * @param entry The new parent entry
80 public void setParent(TimeGraphEntry entry
) {
85 public synchronized boolean hasChildren() {
86 return fChildren
.size() > 0;
90 public synchronized List
<@NonNull TimeGraphEntry
> getChildren() {
95 * Clear the children of the entry
99 public synchronized void clearChildren() {
104 public String
getName() {
109 * Update the entry name
112 * the updated entry name
114 public void setName(String name
) {
119 public long getStartTime() {
124 public long getEndTime() {
129 * Updates the end time
134 public void updateEndTime(long endTime
) {
135 fEndTime
= Math
.max(endTime
, fEndTime
);
139 public boolean hasTimeEvents() {
144 public Iterator
<@NonNull ITimeEvent
> getTimeEventsIterator() {
145 if (hasTimeEvents()) {
146 return new EventIterator(fEventList
, fZoomedEventList
);
152 public Iterator
<@NonNull ITimeEvent
> getTimeEventsIterator(long startTime
, long stopTime
, long visibleDuration
) {
153 if (!hasTimeEvents()) {
156 return new EventIterator(fEventList
, fZoomedEventList
, startTime
, stopTime
);
160 * Add an event to this entry's event list. If necessary, update the start
161 * and end time of the entry. If the event list's last event starts at the
162 * same time as the event to add, it is replaced by the new event.
165 * The time event to add
167 public void addEvent(ITimeEvent event
) {
168 long start
= event
.getTime();
169 long end
= start
+ event
.getDuration();
170 int lastIndex
= fEventList
.size() - 1;
171 if (lastIndex
>= 0 && fEventList
.get(lastIndex
).getTime() == event
.getTime()) {
172 fEventList
.set(lastIndex
, event
);
174 fEventList
.add(event
);
176 if (event
instanceof NullTimeEvent
) {
177 /* A NullTimeEvent should not affect the entry bounds */
180 if (fStartTime
== SWT
.DEFAULT
|| start
< fStartTime
) {
183 if (fEndTime
== SWT
.DEFAULT
|| end
> fEndTime
) {
189 * Set the general event list of this entry. The list should be modifiable
190 * but will only increase in size over time.
193 * The modifiable list of time events, or null to clear the list
195 public void setEventList(List
<ITimeEvent
> eventList
) {
196 if (eventList
!= null) {
197 fEventList
= eventList
;
199 fEventList
= new ArrayList
<>();
204 * Set the zoomed event list of this entry. The list should be modifiable
205 * but will only increase in size over time.
208 * The modifiable list of time events, or null to clear the list
210 public void setZoomedEventList(List
<ITimeEvent
> eventList
) {
211 if (eventList
!= null) {
212 fZoomedEventList
= eventList
;
214 fZoomedEventList
= new ArrayList
<>();
219 * Add an event to this entry's zoomed event list. If necessary, update the
220 * start and end time of the entry. If the zoomed event list's last event
221 * starts at the same time as the event to add, it is replaced by the new
222 * event. If the new event starts before the zoomed event list's last event,
223 * the new event is ignored and is assumed to be already part of the list.
226 * The time event to add
229 public void addZoomedEvent(ITimeEvent event
) {
230 long start
= event
.getTime();
231 long end
= start
+ event
.getDuration();
232 int lastIndex
= fZoomedEventList
.size() - 1;
233 long lastStart
= lastIndex
>= 0 ? fZoomedEventList
.get(lastIndex
).getTime() : Long
.MIN_VALUE
;
234 if (start
> lastStart
) {
235 fZoomedEventList
.add(event
);
236 } else if (start
== lastStart
) {
237 fZoomedEventList
.set(lastIndex
, event
);
239 if (event
instanceof NullTimeEvent
) {
240 /* A NullTimeEvent should not affect the entry bounds */
243 if (fStartTime
== SWT
.DEFAULT
|| start
< fStartTime
) {
246 if (fEndTime
== SWT
.DEFAULT
|| end
> fEndTime
) {
252 * Add a child entry to this one. If a comparator was previously set with
253 * {@link #sortChildren(Comparator)}, the entry will be inserted in its
254 * sort-order position. Otherwise it will be added to the end of the list.
259 public synchronized void addChild(@NonNull TimeGraphEntry child
) {
260 child
.setParent(this);
261 if (fComparator
== null) {
262 fChildren
.add(child
);
265 for (i
= 0; i
< fChildren
.size(); i
++) {
266 ITimeGraphEntry entry
= fChildren
.get(i
);
267 if (fComparator
.compare(child
, entry
) < 0) {
271 fChildren
.add(i
, child
);
276 * Add a child entry to this one at the specified position
279 * Index at which the specified entry is to be inserted
284 public synchronized void addChild(int index
, @NonNull TimeGraphEntry child
) {
285 child
.setParent(this);
286 fChildren
.add(index
, child
);
290 * Remove a child entry from this one.
296 public synchronized void removeChild(@NonNull TimeGraphEntry child
) {
297 child
.setParent(null);
298 fChildren
.remove(child
);
302 * Sort the children of this entry using the provided comparator. Subsequent
303 * calls to {@link #addChild(TimeGraphEntry)} will use this comparator to
304 * maintain the sort order.
307 * The entry comparator
309 public synchronized void sortChildren(Comparator
<ITimeGraphEntry
> comparator
) {
310 fComparator
= comparator
;
311 if (comparator
== null) {
314 @NonNull TimeGraphEntry
[] array
= fChildren
.toArray(new @NonNull TimeGraphEntry
[0]);
315 Arrays
.sort(array
, comparator
);
317 fChildren
.addAll(Arrays
.asList(array
));
321 public String
toString() {
322 return getClass().getSimpleName() + '(' + fName
+ ')';
329 public boolean matches(@NonNull Pattern pattern
) {
330 // Default implementation
331 return pattern
.matcher(fName
).find();
This page took 0.037868 seconds and 4 git commands to generate.