Add dispose method on contexts
[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
20import org.eclipse.core.resources.IMarker;\r
21import org.eclipse.core.resources.IMarkerDelta;\r
22import org.eclipse.core.resources.IResource;\r
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
27import org.eclipse.linuxtools.tmf.event.TmfEvent;\r
28import org.eclipse.linuxtools.tmf.event.TmfTimestamp;\r
29import org.eclipse.linuxtools.tmf.filter.ITmfFilter;\r
30import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler;\r
31import org.eclipse.linuxtools.tmf.signal.TmfTimeSynchSignal;\r
32import org.eclipse.linuxtools.tmf.signal.TmfTraceSelectedSignal;\r
33import org.eclipse.linuxtools.tmf.signal.TmfTraceUpdatedSignal;\r
34import org.eclipse.linuxtools.tmf.trace.ITmfTrace;\r
35import org.eclipse.linuxtools.tmf.trace.TmfContext;\r
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
66 private static final byte 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
FC
71 private final ArrayList<TimeChartAnalysisEntry> fTimeAnalysisEntries = new ArrayList<TimeChartAnalysisEntry>();\r
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
105 ITmfTrace trace = ((ITmfTraceEditor) editor).getTrace();\r
106 if (trace != null) {\r
107 IResource resource = ((ITmfTraceEditor) editor).getResource();\r
108 TimeChartAnalysisEntry timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2);\r
109 fTimeAnalysisEntries.add(timeAnalysisEntry);\r
110 fDecorationProviders.put(trace, new TimeChartDecorationProvider(resource));\r
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
FC
154 private void updateTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry, long stopRank, long startTime, long stopTime) {\r
155 ITmfTrace trace = timeAnalysisEntry.getTrace();\r
156 TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(trace);\r
157 if (decorationProvider == null) {\r
948b0607 158 return; // the trace has been closed\r
ce62370f
FC
159 }\r
160 TmfContext 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
182 TmfEvent event = trace.getNextEvent(context);\r
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
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
ce62370f
FC
342 private TmfContext fContext;\r
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
ce62370f
FC
360 }\r
361\r
362 public void resetTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry) {\r
363 Iterator<ITimeEvent> iterator = timeAnalysisEntry.getTraceEventsIterator();\r
364 TimeChartEvent event = null;\r
365 boolean hasNext = true;\r
366 while (!interrupted && hasNext) {\r
367 synchronized (timeAnalysisEntry) {\r
368 while (hasNext = iterator.hasNext()) {\r
369 event = (TimeChartEvent) iterator.next();\r
370 break;\r
371 }\r
372 }\r
373 if (hasNext) {\r
948b0607
FC
374 // TODO possible concurrency problem here with ItemizeJob\r
375 event.setColorSettingPriority(ColorSettingsManager.PRIORITY_NONE);\r
ce62370f 376 if (event.getItemizedEntry() != null) {\r
948b0607 377 resetTraceEntry(event.getItemizedEntry());\r
ce62370f
FC
378 }\r
379 }\r
380 }\r
381 }\r
948b0607 382\r
ce62370f 383 public void decorateTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry, TimeChartEvent parentEvent) {\r
948b0607
FC
384 // Set max duration high to ensure iterator does not consider\r
385 // itemized events\r
ce62370f
FC
386 Iterator<ITimeEvent> iterator = timeAnalysisEntry.getTraceEventsIterator(0, Long.MAX_VALUE, Long.MAX_VALUE);\r
387 TimeChartEvent event = null;\r
388 int entryPriority = ColorSettingsManager.PRIORITY_NONE;\r
389 boolean entryIsBookmarked = false;\r
390 boolean entryIsVisible = false;\r
391 boolean entryIsSearchMatch = false;\r
392 boolean hasNext = true;\r
393 while (!interrupted && hasNext) {\r
394 synchronized (timeAnalysisEntry) {\r
395 while (hasNext = iterator.hasNext()) {\r
396 event = (TimeChartEvent) iterator.next();\r
397 break;\r
398 }\r
399 }\r
400 if (hasNext) {\r
948b0607 401 // TODO possible concurrency problem here with ItemizeJob\r
ce62370f
FC
402 if (event.getItemizedEntry() == null) {\r
403 decorateEvent(event);\r
404 } else {\r
405 decorateTraceEntry(event.getItemizedEntry(), event);\r
406 }\r
407 entryPriority = Math.min(entryPriority, event.getColorSettingPriority());\r
408 entryIsBookmarked |= event.isBookmarked();\r
409 entryIsVisible |= event.isVisible();\r
410 entryIsSearchMatch |= event.isSearchMatch();\r
411 if (++fCount % timeAnalysisEntry.getTrace().getCacheSize() == 0) {\r
412 refreshViewer(false);\r
413 }\r
414 }\r
415 }\r
416 if (parentEvent != null) {\r
948b0607
FC
417 parentEvent.setColorSettingPriority(entryPriority);\r
418 parentEvent.setIsBookmarked(entryIsBookmarked);\r
419 parentEvent.setIsVisible(entryIsVisible);\r
420 parentEvent.setIsSearchMatch(entryIsSearchMatch);\r
ce62370f
FC
421 }\r
422 }\r
423\r
424 public void decorateEvent(TimeChartEvent timeChartEvent) {\r
948b0607
FC
425 // TODO possible concurrency problem here with ItemizeJob\r
426 TimeChartAnalysisEntry timeAnalysisEntry = (TimeChartAnalysisEntry) timeChartEvent.getEntry();\r
427 ITmfTrace trace = timeAnalysisEntry.getTrace();\r
428 int priority = ColorSettingsManager.PRIORITY_NONE;\r
429 boolean isBookmarked = false;\r
430 boolean isVisible = false;\r
431 boolean isSearchMatch = false;\r
ce62370f 432 synchronized (timeChartEvent.getRankRangeList()) {\r
948b0607
FC
433 for (RankRange range : timeChartEvent.getRankRangeList()) {\r
434 if (interrupted)\r
435 return;\r
436 if (fContext == null || fContext.getRank() != range.getFirstRank()) {\r
437 fContext = trace.seekEvent(range.getFirstRank());\r
438 fContext.setRank(range.getFirstRank());\r
439 }\r
ce62370f 440 while (true) {\r
948b0607
FC
441 if (interrupted)\r
442 return;\r
443 long rank = fContext.getRank();\r
ce62370f
FC
444 TmfEvent event = trace.getNextEvent(fContext);\r
445 if (event == null) {\r
446 break;\r
447 }\r
448 long eventTime = event.getTimestamp().synchronize(0, (byte) -9).getValue();\r
449 if (eventTime >= timeChartEvent.getTime() && eventTime <= timeChartEvent.getTime() + timeChartEvent.getDuration()) {\r
948b0607 450 priority = Math.min(priority, ColorSettingsManager.getColorSettingPriority(event));\r
ce62370f 451 }\r
948b0607
FC
452 isBookmarked |= fDecorationProvider.isBookmark(rank);\r
453 isVisible |= fDecorationProvider.isVisible(event);\r
454 isSearchMatch |= fDecorationProvider.isSearchMatch(event);\r
ce62370f 455 if (fContext.getRank() > range.getLastRank()) {\r
948b0607 456 break;\r
ce62370f
FC
457 }\r
458 }\r
948b0607 459 }\r
ce62370f
FC
460 }\r
461 timeChartEvent.setColorSettingPriority(priority);\r
462 timeChartEvent.setIsBookmarked(isBookmarked);\r
463 timeChartEvent.setIsVisible(isVisible);\r
464 timeChartEvent.setIsSearchMatch(isSearchMatch);\r
465 }\r
948b0607
FC
466\r
467 public void cancel() {\r
468 interrupted = true;\r
469 }\r
ce62370f
FC
470 }\r
471\r
472 // ------------------------------------------------------------------------\r
473 // Listeners\r
474 // ------------------------------------------------------------------------\r
948b0607 475\r
ce62370f
FC
476 @Override\r
477 public void tsfTmProcessTimeScaleEvent(TmfTimeScaleSelectionEvent event) {\r
948b0607
FC
478 fStartTime = event.getTime0();\r
479 fStopTime = event.getTime1();\r
ce62370f
FC
480 itemize(fStartTime, fStopTime);\r
481 }\r
482\r
483 @Override\r
484 public void tsfTmProcessSelEvent(TmfTimeSelectionEvent event) {\r
485 ITmfTimeAnalysisEntry timeAnalysisEntry = null;\r
486 if (event.getSelection() instanceof TimeChartAnalysisEntry) {\r
487 timeAnalysisEntry = (TimeChartAnalysisEntry) event.getSelection();\r
488 } else if (event.getSelection() instanceof TimeChartEvent) {\r
489 timeAnalysisEntry = ((TimeChartEvent) event.getSelection()).getEntry();\r
490 }\r
491 if (timeAnalysisEntry instanceof TimeChartAnalysisEntry) {\r
492 broadcast(new TmfTraceSelectedSignal(this, ((TimeChartAnalysisEntry) timeAnalysisEntry).getTrace()));\r
493 }\r
494 broadcast(new TmfTimeSynchSignal(this, new TmfTimestamp(event.getSelectedTime(), TIMESTAMP_SCALE)));\r
495 }\r
496\r
948b0607 497 @Override\r
ce62370f 498 public void colorSettingsChanged(ColorSetting[] colorSettings) {\r
948b0607 499 redecorate();\r
ce62370f
FC
500 }\r
501\r
502 @Override\r
503 public void resourceChanged(IResourceChangeEvent event) {\r
948b0607
FC
504 for (IMarkerDelta delta : event.findMarkerDeltas(IMarker.BOOKMARK, false)) {\r
505 for (TimeChartDecorationProvider provider : fDecorationProviders.values()) {\r
506 if (delta.getResource().equals(provider.getResource())) {\r
507 if (delta.getKind() == IResourceDelta.CHANGED && delta.getMarker().getAttribute(IMarker.LOCATION, -1) != -1) {\r
508 provider.refreshBookmarks();\r
509 } else if (delta.getKind() == IResourceDelta.REMOVED) {\r
510 provider.refreshBookmarks();\r
511 }\r
512 }\r
513 }\r
514 }\r
515 redecorate();\r
ce62370f 516 }\r
948b0607
FC
517\r
518 @Override\r
ce62370f 519 public void filterApplied(ITmfFilter filter, ITmfTrace trace) {\r
948b0607
FC
520 TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(trace);\r
521 decorationProvider.filterApplied(filter);\r
522 redecorate();\r
ce62370f
FC
523 }\r
524\r
948b0607 525 @Override\r
ce62370f 526 public void searchApplied(ITmfFilter filter, ITmfTrace trace) {\r
948b0607
FC
527 TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(trace);\r
528 decorationProvider.searchApplied(filter);\r
529 redecorate();\r
ce62370f
FC
530 }\r
531\r
532 // ------------------------------------------------------------------------\r
533 // Signal handlers\r
534 // ------------------------------------------------------------------------\r
948b0607
FC
535\r
536 @TmfSignalHandler\r
ce62370f 537 public void traceOpened(TmfTraceOpenedSignal signal) {\r
948b0607
FC
538 if (fTimeAnalysisEntries == null)\r
539 return;\r
ce62370f
FC
540 final ITmfTrace trace = signal.getTrace();\r
541 final IResource resource = signal.getResource();\r
542 final ITmfEventsFilterProvider eventsFilterProvider = signal.getEventsFilterProvider();\r
543 TimeChartAnalysisEntry timeAnalysisEntry = null;\r
544 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {\r
545 if (fTimeAnalysisEntries.get(i).getTrace().equals(trace)) {\r
546 timeAnalysisEntry = fTimeAnalysisEntries.get(i);\r
547 break;\r
548 }\r
549 }\r
550 if (timeAnalysisEntry == null) {\r
948b0607 551 timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2);\r
ce62370f
FC
552 fTimeAnalysisEntries.add(timeAnalysisEntry);\r
553 fDecorationProviders.put(trace, new TimeChartDecorationProvider(resource));\r
554 Thread thread = new ProcessTraceThread(timeAnalysisEntry);\r
555 thread.start();\r
556 }\r
557 refreshViewer(true);\r
558 if (eventsFilterProvider != null) {\r
948b0607 559 eventsFilterProvider.addEventsFilterListener(this);\r
ce62370f
FC
560 }\r
561 }\r
948b0607 562\r
ce62370f
FC
563 @TmfSignalHandler\r
564 public void traceClosed(TmfTraceClosedSignal signal) {\r
948b0607
FC
565 if (fTimeAnalysisEntries == null)\r
566 return;\r
ce62370f
FC
567 final ITmfTrace trace = signal.getTrace();\r
568 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {\r
569 if (fTimeAnalysisEntries.get(i).getTrace().equals(trace)) {\r
570 fTimeAnalysisEntries.remove(i);\r
571 fDecorationProviders.remove(trace);\r
572 refreshViewer(true);\r
573 break;\r
574 }\r
575 }\r
576 }\r
948b0607 577\r
ce62370f
FC
578 @TmfSignalHandler\r
579 public void traceSelected(TmfTraceSelectedSignal signal) {\r
580 if (signal.getSource() != this && fTimeAnalysisEntries != null) {\r
581 ITmfTrace trace = signal.getTrace();\r
582 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {\r
583 if (fTimeAnalysisEntries.get(i).getTrace().equals(trace)) {\r
584 fViewer.setSelectedTrace(fTimeAnalysisEntries.get(i));\r
585 break;\r
586 }\r
587 }\r
588 }\r
589 }\r
590\r
591 @TmfSignalHandler\r
592 public void traceUpdated(TmfTraceUpdatedSignal signal) {\r
948b0607
FC
593 if (fTimeAnalysisEntries == null)\r
594 return;\r
ce62370f
FC
595 final ITmfTrace trace = signal.getTrace();\r
596 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {\r
597 TimeChartAnalysisEntry timeAnalysisEntry = fTimeAnalysisEntries.get(i);\r
598 if (timeAnalysisEntry.getTrace().equals(trace)) {\r
599 updateTraceEntry(timeAnalysisEntry, Long.MAX_VALUE, 0, Long.MAX_VALUE);\r
600 break;\r
601 }\r
602 }\r
603 }\r
604\r
605 @TmfSignalHandler\r
606 public void currentTimeUpdated(TmfTimeSynchSignal signal) {\r
607 long time = signal.getCurrentTime().synchronize(0, TIMESTAMP_SCALE).getValue();\r
608 fViewer.setSelectedTime(time, true, this);\r
609 }\r
610\r
611}\r
This page took 0.052574 seconds and 5 git commands to generate.