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