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