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