tmf: Rename the UI TmfStatistics class to TmfStatisticsValues
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / views / timechart / TimeChartView.java
CommitLineData
ce62370f
FC
1/*******************************************************************************\r
2 * Copyright (c) 2010 Ericsson\r
013a5f1c 3 *\r
ce62370f
FC
4 * All rights reserved. This program and the accompanying materials are\r
5 * made available under the terms of the Eclipse Public License v1.0 which\r
6 * accompanies this distribution, and is available at\r
7 * http://www.eclipse.org/legal/epl-v10.html\r
013a5f1c 8 *\r
ce62370f
FC
9 * Contributors:\r
10 * Patrick Tasse - Initial API and implementation\r
11 *******************************************************************************/\r
12\r
13package org.eclipse.linuxtools.tmf.ui.views.timechart;\r
14\r
15import java.util.ArrayList;\r
16import java.util.HashMap;\r
17import java.util.Iterator;\r
18import java.util.Map;\r
19\r
a1091415 20import org.eclipse.core.resources.IFile;\r
ce62370f
FC
21import org.eclipse.core.resources.IMarker;\r
22import org.eclipse.core.resources.IMarkerDelta;\r
ce62370f
FC
23import org.eclipse.core.resources.IResourceChangeEvent;\r
24import org.eclipse.core.resources.IResourceChangeListener;\r
25import org.eclipse.core.resources.IResourceDelta;\r
26import org.eclipse.core.resources.ResourcesPlugin;\r
72f1e62a 27import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;\r
6c13869b
FC
28import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;\r
29import org.eclipse.linuxtools.tmf.core.filter.ITmfFilter;\r
30import org.eclipse.linuxtools.tmf.core.signal.TmfSignalHandler;\r
31import org.eclipse.linuxtools.tmf.core.signal.TmfTimeSynchSignal;\r
32import org.eclipse.linuxtools.tmf.core.signal.TmfTraceSelectedSignal;\r
33import org.eclipse.linuxtools.tmf.core.signal.TmfTraceUpdatedSignal;\r
34ccf9a9 34import org.eclipse.linuxtools.tmf.core.trace.ITmfContext;\r
6c13869b 35import org.eclipse.linuxtools.tmf.core.trace.ITmfTrace;\r
ce62370f
FC
36import org.eclipse.linuxtools.tmf.ui.editors.ITmfTraceEditor;\r
37import org.eclipse.linuxtools.tmf.ui.signal.TmfTraceClosedSignal;\r
38import org.eclipse.linuxtools.tmf.ui.signal.TmfTraceOpenedSignal;\r
ce62370f
FC
39import org.eclipse.linuxtools.tmf.ui.viewers.events.ITmfEventsFilterListener;\r
40import org.eclipse.linuxtools.tmf.ui.viewers.events.ITmfEventsFilterProvider;\r
ce62370f
FC
41import org.eclipse.linuxtools.tmf.ui.views.TmfView;\r
42import org.eclipse.linuxtools.tmf.ui.views.colors.ColorSetting;\r
43import org.eclipse.linuxtools.tmf.ui.views.colors.ColorSettingsManager;\r
44import org.eclipse.linuxtools.tmf.ui.views.colors.IColorSettingsListener;\r
45import org.eclipse.linuxtools.tmf.ui.views.timechart.TimeChartEvent.RankRange;\r
0edc9535 46import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider;\r
fb5cad3d
PT
47import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphRangeListener;\r
48import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphSelectionListener;\r
49import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.ITimeGraphTimeListener;\r
50import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphRangeUpdateEvent;\r
51import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphSelectionEvent;\r
52import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphTimeEvent;\r
53import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.TimeGraphViewer;\r
2fa130b8 54import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;\r
fb5cad3d 55import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;\r
ce62370f 56import org.eclipse.swt.SWT;\r
ce62370f
FC
57import org.eclipse.swt.widgets.Composite;\r
58import org.eclipse.swt.widgets.Display;\r
59import org.eclipse.ui.IEditorPart;\r
60import org.eclipse.ui.IEditorReference;\r
61\r
013a5f1c
AM
62/**\r
63 * Generic Time Chart view, which is similar to a Gantt chart for trace analysis\r
64 *\r
65 * @version 1.0\r
66 * @author Patrick Tasse\r
67 */\r
a55887ca
AM
68public class TimeChartView extends TmfView implements ITimeGraphRangeListener,\r
69 ITimeGraphSelectionListener, ITimeGraphTimeListener,\r
70 IColorSettingsListener, IResourceChangeListener,\r
71 ITmfEventsFilterListener {\r
ce62370f 72\r
a55887ca 73 /** TimeChartView's ID */\r
ce62370f
FC
74 public static final String ID = "org.eclipse.linuxtools.tmf.ui.views.timechart"; //$NON-NLS-1$\r
75\r
5179fc01 76 private static final int TIMESTAMP_SCALE = -9;\r
948b0607
FC
77\r
78 private final int fDisplayWidth;\r
fb5cad3d 79 private TimeGraphViewer fViewer;\r
948b0607 80 private final ArrayList<TimeChartAnalysisEntry> fTimeAnalysisEntries = new ArrayList<TimeChartAnalysisEntry>();\r
6256d8ad 81 private final Map<ITmfTrace, TimeChartDecorationProvider> fDecorationProviders = new HashMap<ITmfTrace, TimeChartDecorationProvider>();\r
ce62370f
FC
82 private ArrayList<DecorateThread> fDecorateThreads;\r
83 private long fStartTime = 0;\r
84 private long fStopTime = Long.MAX_VALUE;\r
2d55fd20
FC
85 private boolean fRefreshBusy = false;\r
86 private boolean fRefreshPending = false;\r
1571f4e4
PT
87 private boolean fRedrawBusy = false;\r
88 private boolean fRedrawPending = false;\r
948b0607 89 private final Object fSyncObj = new Object();\r
0edc9535 90 private ITimeGraphPresentationProvider fPresentationProvider;\r
ce62370f 91\r
a55887ca
AM
92 /**\r
93 * Default constructor\r
94 */\r
ce62370f
FC
95 public TimeChartView() {\r
96 super("Time Chart"); //$NON-NLS-1$\r
97 fDisplayWidth = Display.getDefault().getBounds().width;\r
98 }\r
99\r
100 @Override\r
101 public void createPartControl(Composite parent) {\r
fb5cad3d 102 fViewer = new TimeGraphViewer(parent, SWT.NONE);\r
0edc9535
BH
103 fPresentationProvider = new TimeChartAnalysisProvider();\r
104 fViewer.setTimeGraphProvider(fPresentationProvider);\r
ce62370f 105 fViewer.setTimeCalendarFormat(true);\r
1571f4e4 106 fViewer.addTimeListener(this);\r
fb5cad3d
PT
107 fViewer.addRangeListener(this);\r
108 fViewer.addSelectionListener(this);\r
ce62370f 109 fViewer.setMinimumItemWidth(1);\r
948b0607 110\r
ce62370f
FC
111 IEditorReference[] editorReferences = getSite().getPage().getEditorReferences();\r
112 for (IEditorReference editorReference : editorReferences) {\r
113 IEditorPart editor = editorReference.getEditor(false);\r
114 if (editor instanceof ITmfTraceEditor) {\r
6256d8ad 115 ITmfTrace trace = ((ITmfTraceEditor) editor).getTrace();\r
ce62370f 116 if (trace != null) {\r
a1091415 117 IFile bookmarksFile = ((ITmfTraceEditor) editor).getBookmarksFile();\r
ce62370f
FC
118 TimeChartAnalysisEntry timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2);\r
119 fTimeAnalysisEntries.add(timeAnalysisEntry);\r
a1091415 120 fDecorationProviders.put(trace, new TimeChartDecorationProvider(bookmarksFile));\r
ce62370f
FC
121 Thread thread = new ProcessTraceThread(timeAnalysisEntry);\r
122 thread.start();\r
123 }\r
124 }\r
125 }\r
fb5cad3d 126 fViewer.setInput(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));\r
948b0607 127\r
ce62370f
FC
128 fDecorateThreads = new ArrayList<DecorateThread>();\r
129 ColorSettingsManager.addColorSettingsListener(this);\r
130 ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);\r
131 }\r
132\r
133 @Override\r
134 public void dispose() {\r
948b0607
FC
135 ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);\r
136 for (DecorateThread thread : fDecorateThreads) {\r
137 thread.cancel();\r
138 }\r
ce62370f 139 ColorSettingsManager.removeColorSettingsListener(this);\r
948b0607 140 super.dispose();\r
ce62370f
FC
141 }\r
142\r
948b0607 143 @Override\r
ce62370f 144 public void setFocus() {\r
ce62370f
FC
145 fViewer.setFocus();\r
146 }\r
948b0607 147\r
ce62370f
FC
148 private class ProcessTraceThread extends Thread {\r
149\r
948b0607 150 private final TimeChartAnalysisEntry fTimeAnalysisEntry;\r
ce62370f
FC
151\r
152 public ProcessTraceThread(TimeChartAnalysisEntry timeAnalysisEntry) {\r
948b0607 153 super("ProcessTraceJob:" + timeAnalysisEntry.getName()); //$NON-NLS-1$\r
ce62370f
FC
154 fTimeAnalysisEntry = timeAnalysisEntry;\r
155 }\r
156\r
157 @Override\r
158 public void run() {\r
159 updateTraceEntry(fTimeAnalysisEntry, Long.MAX_VALUE, 0, Long.MAX_VALUE);\r
160 }\r
161 }\r
948b0607 162\r
ce62370f 163 private void updateTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry, long stopRank, long startTime, long stopTime) {\r
6256d8ad 164 ITmfTrace trace = timeAnalysisEntry.getTrace();\r
ce62370f
FC
165 TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(trace);\r
166 if (decorationProvider == null) {\r
948b0607 167 return; // the trace has been closed\r
ce62370f 168 }\r
34ccf9a9 169 ITmfContext context = null;\r
948b0607 170 // TmfTimestamp lastTimestamp = null;\r
ce62370f
FC
171 boolean done = false;\r
172 while (!done) {\r
173 synchronized (timeAnalysisEntry) {\r
174 if (timeAnalysisEntry.getLastRank() >= trace.getNbEvents()) {\r
175 done = true;\r
176 break;\r
177 }\r
178 if (context == null || context.getRank() != timeAnalysisEntry.getLastRank()) {\r
948b0607
FC
179 if (context != null) {\r
180 context.dispose();\r
181 }\r
ce62370f
FC
182 if (timeAnalysisEntry.getLastRank() != -1) {\r
183 context = trace.seekEvent(timeAnalysisEntry.getLastRank());\r
184 } else {\r
948b0607 185 // context = trace.seekLocation(null);\r
ce62370f
FC
186 context = trace.seekEvent(0);\r
187 }\r
188 }\r
189 while (true) {\r
190 long rank = context.getRank();\r
c32744d6 191 ITmfEvent event = trace.getNext(context);\r
ce62370f
FC
192 if (event == null) {\r
193 done = true;\r
194 break;\r
195 }\r
948b0607 196 // if (!event.getTimestamp().equals(lastTimestamp)) {\r
ce62370f
FC
197 TimeChartEvent timeEvent = new TimeChartEvent(timeAnalysisEntry, event, rank, decorationProvider);\r
198 if (timeEvent.getTime() >= startTime && timeEvent.getTime() <= stopTime) {\r
199 timeAnalysisEntry.addTraceEvent(timeEvent);\r
200 }\r
948b0607
FC
201 // lastTimestamp = event.getTimestamp();\r
202 // } *** commented out so that color setting priority gets\r
203 // set even if the event has same time\r
ce62370f
FC
204 if (context.getRank() == trace.getNbEvents() || context.getRank() == stopRank) {\r
205 done = true;\r
206 break;\r
207 }\r
20658947 208 if (context.getRank() % trace.getCacheSize() == 1) {\r
948b0607 209 // break for UI refresh\r
ce62370f
FC
210 break;\r
211 }\r
212 }\r
948b0607
FC
213 // timeAnalysisEntry.setLastRank(Math.min(trace.getNbEvents(),\r
214 // stopRank));\r
ce62370f
FC
215 timeAnalysisEntry.setLastRank(context.getRank());\r
216 }\r
1571f4e4 217 redrawViewer(true);\r
ce62370f 218 }\r
948b0607
FC
219 if (context != null) {\r
220 context.dispose();\r
221 }\r
ce62370f
FC
222 }\r
223\r
1571f4e4 224 private void refreshViewer() {\r
2d55fd20 225 synchronized (fSyncObj) {\r
948b0607
FC
226 if (fRefreshBusy) {\r
227 fRefreshPending = true;\r
228 return;\r
948b0607 229 }\r
abbdd66a 230 fRefreshBusy = true;\r
2d55fd20 231 }\r
ce62370f
FC
232 // Perform the refresh on the UI thread\r
233 Display.getDefault().asyncExec(new Runnable() {\r
234 @Override\r
235 public void run() {\r
1571f4e4 236 if (fViewer.getControl().isDisposed()) {\r
948b0607 237 return;\r
2d55fd20 238 }\r
1571f4e4
PT
239 fViewer.setInput(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));\r
240 fViewer.resetStartFinishTime();\r
2d55fd20 241 synchronized (fSyncObj) {\r
948b0607
FC
242 fRefreshBusy = false;\r
243 if (fRefreshPending) {\r
244 fRefreshPending = false;\r
1571f4e4
PT
245 refreshViewer();\r
246 }\r
247 }\r
248 }\r
249 });\r
250 }\r
251\r
252 private void redrawViewer(boolean resetTimeIntervals) {\r
253 synchronized (fSyncObj) {\r
254 if (fRedrawBusy) {\r
255 fRedrawPending = true;\r
256 return;\r
1571f4e4 257 }\r
abbdd66a 258 fRedrawBusy = true;\r
1571f4e4
PT
259 }\r
260 final boolean reset = resetTimeIntervals;\r
261 // Perform the refresh on the UI thread\r
262 Display.getDefault().asyncExec(new Runnable() {\r
263 @Override\r
264 public void run() {\r
265 if (fViewer.getControl().isDisposed()) {\r
266 return;\r
267 }\r
268 if (reset) {\r
269 fViewer.setTimeRange(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));\r
270 fViewer.setTimeBounds();\r
271 }\r
272 fViewer.getControl().redraw();\r
273 fViewer.getControl().update();\r
274 synchronized (fSyncObj) {\r
275 fRedrawBusy = false;\r
276 if (fRedrawPending) {\r
277 fRedrawPending = false;\r
278 redrawViewer(reset);\r
948b0607 279 }\r
ce62370f
FC
280 }\r
281 }\r
282 });\r
283 }\r
948b0607 284\r
ce62370f
FC
285 private void itemize(long startTime, long stopTime) {\r
286 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {\r
287 Thread thread = new ItemizeThread(fTimeAnalysisEntries.get(i), startTime, stopTime);\r
288 thread.start();\r
289 }\r
290 }\r
948b0607 291\r
ce62370f
FC
292 private class ItemizeThread extends Thread {\r
293\r
948b0607
FC
294 private final TimeChartAnalysisEntry fTimeAnalysisEntry;\r
295 private final long fStartTime;\r
296 private final long fStopTime;\r
297 private final long fMaxDuration;\r
298\r
ce62370f 299 private ItemizeThread(TimeChartAnalysisEntry timeAnalysisEntry, long startTime, long stopTime) {\r
948b0607 300 super("Itemize Thread:" + timeAnalysisEntry.getName()); //$NON-NLS-1$\r
ce62370f
FC
301 fTimeAnalysisEntry = timeAnalysisEntry;\r
302 fStartTime = startTime;\r
303 fStopTime = stopTime;\r
948b0607 304 fMaxDuration = 3 * (fStopTime - fStartTime) / fDisplayWidth;\r
ce62370f 305 }\r
948b0607 306\r
ce62370f
FC
307 @Override\r
308 public void run() {\r
309 itemizeTraceEntry(fTimeAnalysisEntry);\r
310 }\r
311\r
312 public void itemizeTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry) {\r
fb5cad3d 313 Iterator<ITimeEvent> iterator = timeAnalysisEntry.getTimeEventsIterator();\r
ce62370f
FC
314 TimeChartEvent event = null;\r
315 boolean hasNext = true;\r
316 while (hasNext) {\r
317 synchronized (timeAnalysisEntry) {\r
318 while (hasNext = iterator.hasNext()) {\r
319 event = (TimeChartEvent) iterator.next();\r
948b0607
FC
320 if (event.getTime() + event.getDuration() > fStartTime && event.getTime() < fStopTime && event.getDuration() > fMaxDuration\r
321 && event.getNbEvents() > 1) {\r
ce62370f
FC
322 break;\r
323 }\r
324 }\r
325 }\r
326 if (hasNext) {\r
327 if (event.getItemizedEntry() == null) {\r
328 itemizeEvent(event);\r
329 } else {\r
330 itemizeTraceEntry(event.getItemizedEntry());\r
331 }\r
332 }\r
333 }\r
334 }\r
335\r
336 public void itemizeEvent(TimeChartEvent event) {\r
337 synchronized (event) {\r
338 if (event.isItemizing()) {\r
339 return;\r
340 }\r
341 event.setItemizing(true);\r
342 }\r
948b0607
FC
343 TimeChartAnalysisEntry timeAnalysisEntry = new TimeChartAnalysisEntry(fTimeAnalysisEntry.getTrace(), (int) Math.min(\r
344 event.getNbEvents() + 1, fDisplayWidth * 2));\r
ce62370f 345 synchronized (event.getRankRangeList()) {\r
948b0607
FC
346 for (RankRange range : event.getRankRangeList()) {\r
347 timeAnalysisEntry.setLastRank(range.getFirstRank());\r
348 updateTraceEntry(timeAnalysisEntry, range.getLastRank() + 1, event.getTime(), event.getTime() + event.getDuration());\r
349 }\r
ce62370f
FC
350 }\r
351 event.setItemizedEntry(timeAnalysisEntry);\r
1571f4e4 352 redrawViewer(false);\r
ce62370f
FC
353 itemizeTraceEntry(timeAnalysisEntry);\r
354 synchronized (event) {\r
355 event.setItemizing(false);\r
356 }\r
357 }\r
358 }\r
359\r
360 private void redecorate() {\r
948b0607
FC
361 synchronized (fDecorateThreads) {\r
362 for (DecorateThread thread : fDecorateThreads) {\r
363 thread.cancel();\r
364 }\r
365 fDecorateThreads.clear();\r
366 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {\r
367 DecorateThread thread = new DecorateThread(fTimeAnalysisEntries.get(i));\r
368 thread.start();\r
369 fDecorateThreads.add(thread);\r
370 }\r
ce62370f
FC
371 }\r
372 }\r
948b0607 373\r
ce62370f 374 private class DecorateThread extends Thread {\r
948b0607
FC
375 private volatile boolean interrupted = false;\r
376 private final TimeChartAnalysisEntry fTimeAnalysisEntry;\r
377 private final TimeChartDecorationProvider fDecorationProvider;\r
34ccf9a9 378 private ITmfContext fContext;\r
ce62370f 379 private int fCount = 0;\r
948b0607 380\r
ce62370f 381 private DecorateThread(TimeChartAnalysisEntry timeAnalysisEntry) {\r
948b0607 382 super("Decorate Thread:" + timeAnalysisEntry.getName()); //$NON-NLS-1$\r
ce62370f
FC
383 fTimeAnalysisEntry = timeAnalysisEntry;\r
384 fDecorationProvider = fDecorationProviders.get(timeAnalysisEntry.getTrace());\r
385 }\r
948b0607 386\r
ce62370f
FC
387 @Override\r
388 public void run() {\r
948b0607 389 resetTraceEntry(fTimeAnalysisEntry);\r
1571f4e4 390 redrawViewer(false);\r
ce62370f 391 decorateTraceEntry(fTimeAnalysisEntry, null);\r
1571f4e4 392 redrawViewer(false);\r
948b0607
FC
393 synchronized (fDecorateThreads) {\r
394 fDecorateThreads.remove(this);\r
395 }\r
88a66159
PT
396 if (fContext != null) {\r
397 fContext.dispose();\r
398 }\r
ce62370f
FC
399 }\r
400\r
401 public void resetTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry) {\r
fb5cad3d 402 Iterator<ITimeEvent> iterator = timeAnalysisEntry.getTimeEventsIterator();\r
ce62370f
FC
403 TimeChartEvent event = null;\r
404 boolean hasNext = true;\r
405 while (!interrupted && hasNext) {\r
406 synchronized (timeAnalysisEntry) {\r
407 while (hasNext = iterator.hasNext()) {\r
408 event = (TimeChartEvent) iterator.next();\r
409 break;\r
410 }\r
411 }\r
412 if (hasNext) {\r
948b0607
FC
413 // TODO possible concurrency problem here with ItemizeJob\r
414 event.setColorSettingPriority(ColorSettingsManager.PRIORITY_NONE);\r
ce62370f 415 if (event.getItemizedEntry() != null) {\r
948b0607 416 resetTraceEntry(event.getItemizedEntry());\r
ce62370f
FC
417 }\r
418 }\r
419 }\r
420 }\r
948b0607 421\r
ce62370f 422 public void decorateTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry, TimeChartEvent parentEvent) {\r
948b0607
FC
423 // Set max duration high to ensure iterator does not consider\r
424 // itemized events\r
fb5cad3d 425 Iterator<ITimeEvent> iterator = timeAnalysisEntry.getTimeEventsIterator(0, Long.MAX_VALUE, Long.MAX_VALUE);\r
ce62370f
FC
426 TimeChartEvent event = null;\r
427 int entryPriority = ColorSettingsManager.PRIORITY_NONE;\r
428 boolean entryIsBookmarked = false;\r
429 boolean entryIsVisible = false;\r
430 boolean entryIsSearchMatch = false;\r
431 boolean hasNext = true;\r
432 while (!interrupted && hasNext) {\r
433 synchronized (timeAnalysisEntry) {\r
434 while (hasNext = iterator.hasNext()) {\r
435 event = (TimeChartEvent) iterator.next();\r
436 break;\r
437 }\r
438 }\r
439 if (hasNext) {\r
948b0607 440 // TODO possible concurrency problem here with ItemizeJob\r
ce62370f
FC
441 if (event.getItemizedEntry() == null) {\r
442 decorateEvent(event);\r
443 } else {\r
444 decorateTraceEntry(event.getItemizedEntry(), event);\r
445 }\r
446 entryPriority = Math.min(entryPriority, event.getColorSettingPriority());\r
447 entryIsBookmarked |= event.isBookmarked();\r
448 entryIsVisible |= event.isVisible();\r
449 entryIsSearchMatch |= event.isSearchMatch();\r
20658947 450 if (++fCount % timeAnalysisEntry.getTrace().getCacheSize() == 0) {\r
1571f4e4 451 redrawViewer(false);\r
ce62370f
FC
452 }\r
453 }\r
454 }\r
455 if (parentEvent != null) {\r
948b0607
FC
456 parentEvent.setColorSettingPriority(entryPriority);\r
457 parentEvent.setIsBookmarked(entryIsBookmarked);\r
458 parentEvent.setIsVisible(entryIsVisible);\r
459 parentEvent.setIsSearchMatch(entryIsSearchMatch);\r
ce62370f
FC
460 }\r
461 }\r
462\r
463 public void decorateEvent(TimeChartEvent timeChartEvent) {\r
948b0607
FC
464 // TODO possible concurrency problem here with ItemizeJob\r
465 TimeChartAnalysisEntry timeAnalysisEntry = (TimeChartAnalysisEntry) timeChartEvent.getEntry();\r
6256d8ad 466 ITmfTrace trace = timeAnalysisEntry.getTrace();\r
948b0607
FC
467 int priority = ColorSettingsManager.PRIORITY_NONE;\r
468 boolean isBookmarked = false;\r
469 boolean isVisible = false;\r
470 boolean isSearchMatch = false;\r
ce62370f 471 synchronized (timeChartEvent.getRankRangeList()) {\r
948b0607 472 for (RankRange range : timeChartEvent.getRankRangeList()) {\r
1571f4e4 473 if (interrupted) {\r
948b0607 474 return;\r
1571f4e4 475 }\r
948b0607 476 if (fContext == null || fContext.getRank() != range.getFirstRank()) {\r
88a66159
PT
477 if (fContext != null) {\r
478 fContext.dispose();\r
479 }\r
948b0607
FC
480 fContext = trace.seekEvent(range.getFirstRank());\r
481 fContext.setRank(range.getFirstRank());\r
482 }\r
ce62370f 483 while (true) {\r
1571f4e4 484 if (interrupted) {\r
948b0607 485 return;\r
1571f4e4 486 }\r
948b0607 487 long rank = fContext.getRank();\r
c32744d6 488 ITmfEvent event = trace.getNext(fContext);\r
ce62370f
FC
489 if (event == null) {\r
490 break;\r
491 }\r
5179fc01 492 long eventTime = event.getTimestamp().normalize(0, -9).getValue();\r
ce62370f 493 if (eventTime >= timeChartEvent.getTime() && eventTime <= timeChartEvent.getTime() + timeChartEvent.getDuration()) {\r
948b0607 494 priority = Math.min(priority, ColorSettingsManager.getColorSettingPriority(event));\r
ce62370f 495 }\r
948b0607
FC
496 isBookmarked |= fDecorationProvider.isBookmark(rank);\r
497 isVisible |= fDecorationProvider.isVisible(event);\r
498 isSearchMatch |= fDecorationProvider.isSearchMatch(event);\r
ce62370f 499 if (fContext.getRank() > range.getLastRank()) {\r
948b0607 500 break;\r
ce62370f
FC
501 }\r
502 }\r
948b0607 503 }\r
ce62370f
FC
504 }\r
505 timeChartEvent.setColorSettingPriority(priority);\r
506 timeChartEvent.setIsBookmarked(isBookmarked);\r
507 timeChartEvent.setIsVisible(isVisible);\r
508 timeChartEvent.setIsSearchMatch(isSearchMatch);\r
509 }\r
948b0607
FC
510\r
511 public void cancel() {\r
512 interrupted = true;\r
513 }\r
ce62370f
FC
514 }\r
515\r
516 // ------------------------------------------------------------------------\r
517 // Listeners\r
518 // ------------------------------------------------------------------------\r
948b0607 519\r
ce62370f 520 @Override\r
fb5cad3d
PT
521 public void timeRangeUpdated(TimeGraphRangeUpdateEvent event) {\r
522 fStartTime = event.getStartTime();\r
523 fStopTime = event.getEndTime();\r
ce62370f
FC
524 itemize(fStartTime, fStopTime);\r
525 }\r
526\r
527 @Override\r
fb5cad3d
PT
528 public void selectionChanged(TimeGraphSelectionEvent event) {\r
529 ITimeGraphEntry timeAnalysisEntry = null;\r
ce62370f 530 if (event.getSelection() instanceof TimeChartAnalysisEntry) {\r
1571f4e4 531 timeAnalysisEntry = event.getSelection();\r
ce62370f
FC
532 } else if (event.getSelection() instanceof TimeChartEvent) {\r
533 timeAnalysisEntry = ((TimeChartEvent) event.getSelection()).getEntry();\r
534 }\r
535 if (timeAnalysisEntry instanceof TimeChartAnalysisEntry) {\r
536 broadcast(new TmfTraceSelectedSignal(this, ((TimeChartAnalysisEntry) timeAnalysisEntry).getTrace()));\r
537 }\r
fb5cad3d
PT
538 }\r
539\r
540 @Override\r
541 public void timeSelected(TimeGraphTimeEvent event) {\r
542 broadcast(new TmfTimeSynchSignal(this, new TmfTimestamp(event.getTime(), TIMESTAMP_SCALE)));\r
ce62370f
FC
543 }\r
544\r
948b0607 545 @Override\r
ce62370f 546 public void colorSettingsChanged(ColorSetting[] colorSettings) {\r
0edc9535
BH
547 // Set presentation provider again to trigger re-creation of new color settings which are stored\r
548 // in the TimeGraphControl class\r
549 fViewer.setTimeGraphProvider(fPresentationProvider);\r
948b0607 550 redecorate();\r
ce62370f
FC
551 }\r
552\r
553 @Override\r
554 public void resourceChanged(IResourceChangeEvent event) {\r
948b0607
FC
555 for (IMarkerDelta delta : event.findMarkerDeltas(IMarker.BOOKMARK, false)) {\r
556 for (TimeChartDecorationProvider provider : fDecorationProviders.values()) {\r
a1091415 557 if (delta.getResource().equals(provider.getBookmarksFile())) {\r
948b0607
FC
558 if (delta.getKind() == IResourceDelta.CHANGED && delta.getMarker().getAttribute(IMarker.LOCATION, -1) != -1) {\r
559 provider.refreshBookmarks();\r
560 } else if (delta.getKind() == IResourceDelta.REMOVED) {\r
561 provider.refreshBookmarks();\r
562 }\r
563 }\r
564 }\r
565 }\r
566 redecorate();\r
ce62370f 567 }\r
948b0607
FC
568\r
569 @Override\r
6256d8ad 570 public void filterApplied(ITmfFilter filter, ITmfTrace trace) {\r
948b0607
FC
571 TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(trace);\r
572 decorationProvider.filterApplied(filter);\r
573 redecorate();\r
ce62370f
FC
574 }\r
575\r
948b0607 576 @Override\r
6256d8ad 577 public void searchApplied(ITmfFilter filter, ITmfTrace trace) {\r
948b0607
FC
578 TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(trace);\r
579 decorationProvider.searchApplied(filter);\r
580 redecorate();\r
ce62370f
FC
581 }\r
582\r
583 // ------------------------------------------------------------------------\r
584 // Signal handlers\r
585 // ------------------------------------------------------------------------\r
948b0607 586\r
a55887ca
AM
587 /**\r
588 * Handler for the Trace Opened signal\r
589 *\r
590 * @param signal\r
591 * The incoming signal\r
592 */\r
948b0607 593 @TmfSignalHandler\r
ce62370f 594 public void traceOpened(TmfTraceOpenedSignal signal) {\r
1571f4e4 595 if (fTimeAnalysisEntries == null) {\r
948b0607 596 return;\r
1571f4e4 597 }\r
6256d8ad 598 final ITmfTrace trace = signal.getTrace();\r
a1091415 599 final IFile bookmarksFile = signal.getBookmarksFile();\r
ce62370f
FC
600 final ITmfEventsFilterProvider eventsFilterProvider = signal.getEventsFilterProvider();\r
601 TimeChartAnalysisEntry timeAnalysisEntry = null;\r
602 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {\r
603 if (fTimeAnalysisEntries.get(i).getTrace().equals(trace)) {\r
604 timeAnalysisEntry = fTimeAnalysisEntries.get(i);\r
605 break;\r
606 }\r
607 }\r
608 if (timeAnalysisEntry == null) {\r
948b0607 609 timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2);\r
ce62370f 610 fTimeAnalysisEntries.add(timeAnalysisEntry);\r
a1091415 611 fDecorationProviders.put(trace, new TimeChartDecorationProvider(bookmarksFile));\r
ce62370f
FC
612 Thread thread = new ProcessTraceThread(timeAnalysisEntry);\r
613 thread.start();\r
614 }\r
1571f4e4 615 refreshViewer();\r
ce62370f 616 if (eventsFilterProvider != null) {\r
948b0607 617 eventsFilterProvider.addEventsFilterListener(this);\r
ce62370f
FC
618 }\r
619 }\r
948b0607 620\r
a55887ca
AM
621 /**\r
622 * Handler for the Trace Closed signal\r
623 *\r
624 * @param signal\r
625 * The incoming signal\r
626 */\r
ce62370f
FC
627 @TmfSignalHandler\r
628 public void traceClosed(TmfTraceClosedSignal signal) {\r
1571f4e4 629 if (fTimeAnalysisEntries == null) {\r
948b0607 630 return;\r
1571f4e4 631 }\r
6256d8ad 632 final ITmfTrace trace = signal.getTrace();\r
ce62370f
FC
633 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {\r
634 if (fTimeAnalysisEntries.get(i).getTrace().equals(trace)) {\r
635 fTimeAnalysisEntries.remove(i);\r
636 fDecorationProviders.remove(trace);\r
1571f4e4 637 refreshViewer();\r
ce62370f
FC
638 break;\r
639 }\r
640 }\r
641 }\r
948b0607 642\r
a55887ca
AM
643 /**\r
644 * Handler for the Trace Selected signal\r
645 *\r
646 * @param signal\r
647 * The incoming signal\r
648 */\r
ce62370f
FC
649 @TmfSignalHandler\r
650 public void traceSelected(TmfTraceSelectedSignal signal) {\r
651 if (signal.getSource() != this && fTimeAnalysisEntries != null) {\r
6256d8ad 652 ITmfTrace trace = signal.getTrace();\r
ce62370f
FC
653 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {\r
654 if (fTimeAnalysisEntries.get(i).getTrace().equals(trace)) {\r
fb5cad3d 655 fViewer.setSelection(fTimeAnalysisEntries.get(i));\r
ce62370f
FC
656 break;\r
657 }\r
658 }\r
659 }\r
660 }\r
661\r
a55887ca
AM
662 /**\r
663 * Handler for the Trace Updated signal\r
664 *\r
665 * @param signal\r
666 * The incoming signal\r
667 */\r
ce62370f
FC
668 @TmfSignalHandler\r
669 public void traceUpdated(TmfTraceUpdatedSignal signal) {\r
1571f4e4 670 if (fTimeAnalysisEntries == null) {\r
948b0607 671 return;\r
1571f4e4 672 }\r
6256d8ad 673 final ITmfTrace trace = signal.getTrace();\r
ce62370f
FC
674 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {\r
675 TimeChartAnalysisEntry timeAnalysisEntry = fTimeAnalysisEntries.get(i);\r
676 if (timeAnalysisEntry.getTrace().equals(trace)) {\r
677 updateTraceEntry(timeAnalysisEntry, Long.MAX_VALUE, 0, Long.MAX_VALUE);\r
678 break;\r
679 }\r
680 }\r
681 }\r
682\r
a55887ca
AM
683 /**\r
684 * Handler for the Time Synch signal\r
685 *\r
686 * @param signal\r
687 * The incoming signal\r
688 */\r
ce62370f
FC
689 @TmfSignalHandler\r
690 public void currentTimeUpdated(TmfTimeSynchSignal signal) {\r
9116598a
PT
691 final long time = signal.getCurrentTime().normalize(0, TIMESTAMP_SCALE).getValue();\r
692 Display.getDefault().asyncExec(new Runnable() {\r
693 @Override\r
694 public void run() {\r
1e66758c 695 fViewer.setSelectedTime(time, true);\r
9116598a
PT
696 }\r
697 });\r
ce62370f
FC
698 }\r
699\r
700}\r
This page took 0.074664 seconds and 5 git commands to generate.