tmf.all: use ITmfTimestamp#toNanos when possible
[deliverable/tracecompass.git] / tmf / org.eclipse.tracecompass.tmf.ui / src / org / eclipse / tracecompass / tmf / ui / views / timechart / TimeChartView.java
CommitLineData
6151d86c 1/*******************************************************************************
84c8aef7 2 * Copyright (c) 2010, 2015 Ericsson
6151d86c
PT
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
2bdf0193 13package org.eclipse.tracecompass.tmf.ui.views.timechart;
6151d86c
PT
14
15import java.util.ArrayList;
16import java.util.HashMap;
17import java.util.Iterator;
1337fefc 18import java.util.List;
6151d86c
PT
19import java.util.Map;
20
21import org.eclipse.core.resources.IFile;
22import org.eclipse.core.resources.IMarker;
23import org.eclipse.core.resources.IMarkerDelta;
24import org.eclipse.core.resources.IResourceChangeEvent;
25import org.eclipse.core.resources.IResourceChangeListener;
26import org.eclipse.core.resources.IResourceDelta;
27import org.eclipse.core.resources.ResourcesPlugin;
0fcf3b09 28import org.eclipse.jface.action.IStatusLineManager;
6151d86c
PT
29import org.eclipse.swt.SWT;
30import org.eclipse.swt.widgets.Composite;
31import org.eclipse.swt.widgets.Display;
2bdf0193
AM
32import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
33import org.eclipse.tracecompass.tmf.core.signal.TmfEventFilterAppliedSignal;
34import org.eclipse.tracecompass.tmf.core.signal.TmfEventSearchAppliedSignal;
97c71024 35import org.eclipse.tracecompass.tmf.core.signal.TmfSelectionRangeUpdatedSignal;
d2e4afa7 36import org.eclipse.tracecompass.tmf.core.signal.TmfSignalHandler;
2bdf0193
AM
37import org.eclipse.tracecompass.tmf.core.signal.TmfTraceClosedSignal;
38import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
39import org.eclipse.tracecompass.tmf.core.signal.TmfTraceSelectedSignal;
40import org.eclipse.tracecompass.tmf.core.signal.TmfTraceUpdatedSignal;
d2e4afa7 41import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
2bdf0193
AM
42import org.eclipse.tracecompass.tmf.core.timestamp.ITmfTimestamp;
43import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
44import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
45import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
46import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
21852dfa 47import org.eclipse.tracecompass.tmf.core.trace.TmfTraceContext;
2bdf0193 48import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
d2e4afa7
MAL
49import org.eclipse.tracecompass.tmf.ui.signal.TmfTimeViewAlignmentInfo;
50import org.eclipse.tracecompass.tmf.ui.views.ITmfTimeAligned;
2bdf0193
AM
51import org.eclipse.tracecompass.tmf.ui.views.TmfView;
52import org.eclipse.tracecompass.tmf.ui.views.colors.ColorSetting;
53import org.eclipse.tracecompass.tmf.ui.views.colors.ColorSettingsManager;
54import org.eclipse.tracecompass.tmf.ui.views.colors.IColorSettingsListener;
55import org.eclipse.tracecompass.tmf.ui.views.timechart.TimeChartEvent.RankRange;
56import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphPresentationProvider;
57import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphRangeListener;
58import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphSelectionListener;
59import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.ITimeGraphTimeListener;
60import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphRangeUpdateEvent;
61import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphSelectionEvent;
62import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphTimeEvent;
63import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.TimeGraphViewer;
64import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeEvent;
65import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
66import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.widgets.Utils.TimeFormat;
6151d86c
PT
67
68/**
69 * Generic Time Chart view, which is similar to a Gantt chart for trace analysis
70 *
71 * @version 1.0
72 * @author Patrick Tasse
73 */
d2e4afa7 74public class TimeChartView extends TmfView implements ITimeGraphRangeListener, ITimeGraphSelectionListener, ITimeGraphTimeListener, IColorSettingsListener, IResourceChangeListener, ITmfTimeAligned {
6151d86c
PT
75
76 /** TimeChartView's ID */
77 public static final String ID = "org.eclipse.linuxtools.tmf.ui.views.timechart"; //$NON-NLS-1$
78
79 private static final int TIMESTAMP_SCALE = -9;
80
81 private final int fDisplayWidth;
82 private TimeGraphViewer fViewer;
1337fefc 83 private final List<TimeChartAnalysisEntry> fTimeAnalysisEntries = new ArrayList<>();
507b1336 84 private final Map<ITmfTrace, TimeChartDecorationProvider> fDecorationProviders = new HashMap<>();
1337fefc 85 private final List<DecorateThread> fDecorateThreads = new ArrayList<>();
6151d86c
PT
86 private long fStartTime = 0;
87 private long fStopTime = Long.MAX_VALUE;
88 private boolean fRefreshBusy = false;
89 private boolean fRefreshPending = false;
90 private boolean fRedrawBusy = false;
91 private boolean fRedrawPending = false;
92 private final Object fSyncObj = new Object();
93 private ITimeGraphPresentationProvider fPresentationProvider;
94
95 /**
96 * Default constructor
97 */
98 public TimeChartView() {
99 super("Time Chart"); //$NON-NLS-1$
100 fDisplayWidth = Display.getDefault().getBounds().width;
101 }
102
103 @Override
104 public void createPartControl(Composite parent) {
d2e4afa7 105 super.createPartControl(parent);
ad128fd8 106 fViewer = new TimeGraphViewer(parent, SWT.NONE);
6151d86c
PT
107 fPresentationProvider = new TimeChartAnalysisProvider();
108 fViewer.setTimeGraphProvider(fPresentationProvider);
026664b7 109 fViewer.setTimeFormat(TimeFormat.CALENDAR);
6151d86c
PT
110 fViewer.addTimeListener(this);
111 fViewer.addRangeListener(this);
112 fViewer.addSelectionListener(this);
113 fViewer.setMinimumItemWidth(1);
b052914f 114 fViewer.getTimeGraphControl().setBlendSubPixelEvents(true);
6151d86c 115
0fcf3b09
PT
116 IStatusLineManager statusLineManager = getViewSite().getActionBars().getStatusLineManager();
117 fViewer.getTimeGraphControl().setStatusLineManager(statusLineManager);
118
deaae6e1
PT
119 for (ITmfTrace trace : TmfTraceManager.getInstance().getOpenedTraces()) {
120 IFile bookmarksFile = TmfTraceManager.getInstance().getTraceEditorFile(trace);
121 TimeChartAnalysisEntry timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2);
122 fTimeAnalysisEntries.add(timeAnalysisEntry);
123 fDecorationProviders.put(trace, new TimeChartDecorationProvider(bookmarksFile));
124 Thread thread = new ProcessTraceThread(timeAnalysisEntry);
125 thread.start();
6151d86c
PT
126 }
127 fViewer.setInput(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));
128
6151d86c
PT
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() {
a049a5e7
MK
159 TmfTimeRange range = TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange();
160
161 updateTraceEntry(fTimeAnalysisEntry, Long.MAX_VALUE,
16801c72
MK
162 range.getStartTime().toNanos(),
163 range.getEndTime().toNanos());
6151d86c
PT
164 }
165 }
166
167 private void updateTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry, long stopRank, long startTime, long stopTime) {
168 ITmfTrace trace = timeAnalysisEntry.getTrace();
169 TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(trace);
170 if (decorationProvider == null) {
171 return; // the trace has been closed
172 }
173 ITmfContext context = null;
174 // TmfTimestamp lastTimestamp = null;
175 boolean done = false;
176 while (!done) {
177 synchronized (timeAnalysisEntry) {
178 if (timeAnalysisEntry.getLastRank() >= trace.getNbEvents()) {
179 done = true;
180 break;
181 }
182 if (context == null || context.getRank() != timeAnalysisEntry.getLastRank()) {
183 if (context != null) {
184 context.dispose();
185 }
186 if (timeAnalysisEntry.getLastRank() != -1) {
187 context = trace.seekEvent(timeAnalysisEntry.getLastRank());
188 } else {
189 // context = trace.seekLocation(null);
190 context = trace.seekEvent(0);
191 }
192 }
193 while (true) {
194 long rank = context.getRank();
195 ITmfEvent event = trace.getNext(context);
196 if (event == null) {
197 done = true;
198 break;
199 }
200 // if (!event.getTimestamp().equals(lastTimestamp)) {
201 TimeChartEvent timeEvent = new TimeChartEvent(timeAnalysisEntry, event, rank, decorationProvider);
202 if (timeEvent.getTime() >= startTime && timeEvent.getTime() <= stopTime) {
203 timeAnalysisEntry.addTraceEvent(timeEvent);
204 }
205 // lastTimestamp = event.getTimestamp();
206 // } *** commented out so that color setting priority gets
207 // set even if the event has same time
208 if (context.getRank() == trace.getNbEvents() || context.getRank() == stopRank) {
209 done = true;
210 break;
211 }
212 if (context.getRank() % trace.getCacheSize() == 1) {
213 // break for UI refresh
214 break;
215 }
216 }
217 // timeAnalysisEntry.setLastRank(Math.min(trace.getNbEvents(),
218 // stopRank));
219 timeAnalysisEntry.setLastRank(context.getRank());
220 }
221 redrawViewer(true);
222 }
223 if (context != null) {
224 context.dispose();
225 }
226 }
227
228 private void refreshViewer() {
229 synchronized (fSyncObj) {
230 if (fRefreshBusy) {
231 fRefreshPending = true;
232 return;
233 }
234 fRefreshBusy = true;
235 }
236 // Perform the refresh on the UI thread
237 Display.getDefault().asyncExec(new Runnable() {
238 @Override
239 public void run() {
240 if (fViewer.getControl().isDisposed()) {
241 return;
242 }
243 fViewer.setInput(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));
244 fViewer.resetStartFinishTime();
245 synchronized (fSyncObj) {
246 fRefreshBusy = false;
247 if (fRefreshPending) {
248 fRefreshPending = false;
249 refreshViewer();
250 }
251 }
252 }
253 });
254 }
255
256 private void redrawViewer(boolean resetTimeIntervals) {
257 synchronized (fSyncObj) {
258 if (fRedrawBusy) {
259 fRedrawPending = true;
260 return;
261 }
262 fRedrawBusy = true;
263 }
264 final boolean reset = resetTimeIntervals;
265 // Perform the refresh on the UI thread
266 Display.getDefault().asyncExec(new Runnable() {
267 @Override
268 public void run() {
269 if (fViewer.getControl().isDisposed()) {
270 return;
271 }
272 if (reset) {
273 fViewer.setTimeRange(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));
274 fViewer.setTimeBounds();
275 }
276 fViewer.getControl().redraw();
277 fViewer.getControl().update();
278 synchronized (fSyncObj) {
279 fRedrawBusy = false;
280 if (fRedrawPending) {
281 fRedrawPending = false;
282 redrawViewer(reset);
283 }
284 }
285 }
286 });
287 }
288
289 private void itemize(long startTime, long stopTime) {
290 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {
291 Thread thread = new ItemizeThread(fTimeAnalysisEntries.get(i), startTime, stopTime);
292 thread.start();
293 }
294 }
295
296 private class ItemizeThread extends Thread {
297
298 private final TimeChartAnalysisEntry fTimeAnalysisEntry;
3dca7aa5
AM
299 private final long startTime;
300 private final long stopTime;
6151d86c
PT
301 private final long fMaxDuration;
302
303 private ItemizeThread(TimeChartAnalysisEntry timeAnalysisEntry, long startTime, long stopTime) {
304 super("Itemize Thread:" + timeAnalysisEntry.getName()); //$NON-NLS-1$
305 fTimeAnalysisEntry = timeAnalysisEntry;
3dca7aa5
AM
306 this.startTime = startTime;
307 this.stopTime = stopTime;
308 fMaxDuration = 3 * (stopTime - startTime) / fDisplayWidth;
6151d86c
PT
309 }
310
311 @Override
312 public void run() {
313 itemizeTraceEntry(fTimeAnalysisEntry);
314 }
315
316 public void itemizeTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry) {
317 Iterator<ITimeEvent> iterator = timeAnalysisEntry.getTimeEventsIterator();
318 TimeChartEvent event = null;
319 boolean hasNext = true;
320 while (hasNext) {
321 synchronized (timeAnalysisEntry) {
3dca7aa5 322 while ((hasNext = iterator.hasNext()) == true) {
6151d86c 323 event = (TimeChartEvent) iterator.next();
3dca7aa5 324 if (event.getTime() + event.getDuration() > startTime && event.getTime() < stopTime && event.getDuration() > fMaxDuration
6151d86c
PT
325 && event.getNbEvents() > 1) {
326 break;
327 }
328 }
329 }
3dca7aa5 330 if (hasNext && event != null) {
6151d86c
PT
331 if (event.getItemizedEntry() == null) {
332 itemizeEvent(event);
333 } else {
334 itemizeTraceEntry(event.getItemizedEntry());
335 }
336 }
337 }
338 }
339
340 public void itemizeEvent(TimeChartEvent event) {
341 synchronized (event) {
342 if (event.isItemizing()) {
343 return;
344 }
345 event.setItemizing(true);
346 }
347 TimeChartAnalysisEntry timeAnalysisEntry = new TimeChartAnalysisEntry(fTimeAnalysisEntry.getTrace(), (int) Math.min(
348 event.getNbEvents() + 1, fDisplayWidth * 2));
349 synchronized (event.getRankRangeList()) {
350 for (RankRange range : event.getRankRangeList()) {
351 timeAnalysisEntry.setLastRank(range.getFirstRank());
352 updateTraceEntry(timeAnalysisEntry, range.getLastRank() + 1, event.getTime(), event.getTime() + event.getDuration());
353 }
354 }
355 event.setItemizedEntry(timeAnalysisEntry);
356 redrawViewer(false);
357 itemizeTraceEntry(timeAnalysisEntry);
358 synchronized (event) {
359 event.setItemizing(false);
360 }
361 }
362 }
363
364 private void redecorate() {
365 synchronized (fDecorateThreads) {
366 for (DecorateThread thread : fDecorateThreads) {
367 thread.cancel();
368 }
369 fDecorateThreads.clear();
370 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {
371 DecorateThread thread = new DecorateThread(fTimeAnalysisEntries.get(i));
372 thread.start();
373 fDecorateThreads.add(thread);
374 }
375 }
376 }
377
378 private class DecorateThread extends Thread {
379 private volatile boolean interrupted = false;
380 private final TimeChartAnalysisEntry fTimeAnalysisEntry;
381 private final TimeChartDecorationProvider fDecorationProvider;
382 private ITmfContext fContext;
383 private int fCount = 0;
384
385 private DecorateThread(TimeChartAnalysisEntry timeAnalysisEntry) {
386 super("Decorate Thread:" + timeAnalysisEntry.getName()); //$NON-NLS-1$
387 fTimeAnalysisEntry = timeAnalysisEntry;
388 fDecorationProvider = fDecorationProviders.get(timeAnalysisEntry.getTrace());
389 }
390
391 @Override
392 public void run() {
393 resetTraceEntry(fTimeAnalysisEntry);
394 redrawViewer(false);
395 decorateTraceEntry(fTimeAnalysisEntry, null);
396 redrawViewer(false);
397 synchronized (fDecorateThreads) {
398 fDecorateThreads.remove(this);
399 }
400 if (fContext != null) {
faa38350 401 fContext.dispose();
6151d86c
PT
402 }
403 }
404
405 public void resetTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry) {
406 Iterator<ITimeEvent> iterator = timeAnalysisEntry.getTimeEventsIterator();
407 TimeChartEvent event = null;
408 boolean hasNext = true;
409 while (!interrupted && hasNext) {
410 synchronized (timeAnalysisEntry) {
3dca7aa5 411 while ((hasNext = iterator.hasNext()) == true) {
6151d86c
PT
412 event = (TimeChartEvent) iterator.next();
413 break;
414 }
415 }
3dca7aa5 416 if (hasNext && event != null) {
6151d86c
PT
417 // TODO possible concurrency problem here with ItemizeJob
418 event.setColorSettingPriority(ColorSettingsManager.PRIORITY_NONE);
419 if (event.getItemizedEntry() != null) {
420 resetTraceEntry(event.getItemizedEntry());
421 }
422 }
423 }
424 }
425
426 public void decorateTraceEntry(TimeChartAnalysisEntry timeAnalysisEntry, TimeChartEvent parentEvent) {
427 // Set max duration high to ensure iterator does not consider
428 // itemized events
429 Iterator<ITimeEvent> iterator = timeAnalysisEntry.getTimeEventsIterator(0, Long.MAX_VALUE, Long.MAX_VALUE);
430 TimeChartEvent event = null;
431 int entryPriority = ColorSettingsManager.PRIORITY_NONE;
432 boolean entryIsBookmarked = false;
433 boolean entryIsVisible = false;
434 boolean entryIsSearchMatch = false;
435 boolean hasNext = true;
436 while (!interrupted && hasNext) {
437 synchronized (timeAnalysisEntry) {
3dca7aa5 438 while ((hasNext = iterator.hasNext()) == true) {
6151d86c
PT
439 event = (TimeChartEvent) iterator.next();
440 break;
441 }
442 }
3dca7aa5 443 if (hasNext && event != null) {
6151d86c
PT
444 // TODO possible concurrency problem here with ItemizeJob
445 if (event.getItemizedEntry() == null) {
446 decorateEvent(event);
447 } else {
448 decorateTraceEntry(event.getItemizedEntry(), event);
449 }
450 entryPriority = Math.min(entryPriority, event.getColorSettingPriority());
451 entryIsBookmarked |= event.isBookmarked();
452 entryIsVisible |= event.isVisible();
453 entryIsSearchMatch |= event.isSearchMatch();
454 if (++fCount % timeAnalysisEntry.getTrace().getCacheSize() == 0) {
455 redrawViewer(false);
456 }
457 }
458 }
459 if (parentEvent != null) {
460 parentEvent.setColorSettingPriority(entryPriority);
461 parentEvent.setIsBookmarked(entryIsBookmarked);
462 parentEvent.setIsVisible(entryIsVisible);
463 parentEvent.setIsSearchMatch(entryIsSearchMatch);
464 }
465 }
466
467 public void decorateEvent(TimeChartEvent timeChartEvent) {
468 // TODO possible concurrency problem here with ItemizeJob
469 TimeChartAnalysisEntry timeAnalysisEntry = (TimeChartAnalysisEntry) timeChartEvent.getEntry();
470 ITmfTrace trace = timeAnalysisEntry.getTrace();
471 int priority = ColorSettingsManager.PRIORITY_NONE;
472 boolean isBookmarked = false;
473 boolean isVisible = false;
474 boolean isSearchMatch = false;
475 synchronized (timeChartEvent.getRankRangeList()) {
476 for (RankRange range : timeChartEvent.getRankRangeList()) {
477 if (interrupted) {
478 return;
479 }
480 if (fContext == null || fContext.getRank() != range.getFirstRank()) {
481 if (fContext != null) {
faa38350 482 fContext.dispose();
6151d86c
PT
483 }
484 fContext = trace.seekEvent(range.getFirstRank());
485 fContext.setRank(range.getFirstRank());
486 }
487 while (true) {
488 if (interrupted) {
489 return;
490 }
491 long rank = fContext.getRank();
492 ITmfEvent event = trace.getNext(fContext);
493 if (event == null) {
494 break;
495 }
16801c72 496 long eventTime = event.getTimestamp().toNanos();
6151d86c
PT
497 if (eventTime >= timeChartEvent.getTime() && eventTime <= timeChartEvent.getTime() + timeChartEvent.getDuration()) {
498 priority = Math.min(priority, ColorSettingsManager.getColorSettingPriority(event));
499 }
500 isBookmarked |= fDecorationProvider.isBookmark(rank);
501 isVisible |= fDecorationProvider.isVisible(event);
502 isSearchMatch |= fDecorationProvider.isSearchMatch(event);
503 if (fContext.getRank() > range.getLastRank()) {
504 break;
505 }
506 }
507 }
508 }
509 timeChartEvent.setColorSettingPriority(priority);
510 timeChartEvent.setIsBookmarked(isBookmarked);
511 timeChartEvent.setIsVisible(isVisible);
512 timeChartEvent.setIsSearchMatch(isSearchMatch);
513 }
514
515 public void cancel() {
516 interrupted = true;
517 }
518 }
519
520 // ------------------------------------------------------------------------
521 // Listeners
522 // ------------------------------------------------------------------------
523
524 @Override
525 public void timeRangeUpdated(TimeGraphRangeUpdateEvent event) {
526 fStartTime = event.getStartTime();
527 fStopTime = event.getEndTime();
528 itemize(fStartTime, fStopTime);
faa38350
PT
529 final ITmfTimestamp startTimestamp = new TmfTimestamp(event.getStartTime(), ITmfTimestamp.NANOSECOND_SCALE);
530 final ITmfTimestamp endTimestamp = new TmfTimestamp(event.getEndTime(), ITmfTimestamp.NANOSECOND_SCALE);
531 TmfTimeRange range = new TmfTimeRange(startTimestamp, endTimestamp);
97c71024 532 broadcast(new TmfWindowRangeUpdatedSignal(this, range));
6151d86c
PT
533 }
534
535 @Override
536 public void selectionChanged(TimeGraphSelectionEvent event) {
537 ITimeGraphEntry timeAnalysisEntry = null;
538 if (event.getSelection() instanceof TimeChartAnalysisEntry) {
539 timeAnalysisEntry = event.getSelection();
540 } else if (event.getSelection() instanceof TimeChartEvent) {
541 timeAnalysisEntry = ((TimeChartEvent) event.getSelection()).getEntry();
542 }
543 if (timeAnalysisEntry instanceof TimeChartAnalysisEntry) {
544 broadcast(new TmfTraceSelectedSignal(this, ((TimeChartAnalysisEntry) timeAnalysisEntry).getTrace()));
545 }
546 }
547
548 @Override
549 public void timeSelected(TimeGraphTimeEvent event) {
97c71024 550 broadcast(new TmfSelectionRangeUpdatedSignal(this, new TmfTimestamp(event.getBeginTime(), TIMESTAMP_SCALE), new TmfTimestamp(event.getEndTime(), TIMESTAMP_SCALE)));
6151d86c
PT
551 }
552
553 @Override
554 public void colorSettingsChanged(ColorSetting[] colorSettings) {
a049a5e7
MK
555 // Set presentation provider again to trigger re-creation of new color
556 // settings which are stored in the TimeGraphControl class
6151d86c
PT
557 fViewer.setTimeGraphProvider(fPresentationProvider);
558 redecorate();
559 }
560
561 @Override
562 public void resourceChanged(IResourceChangeEvent event) {
563 for (IMarkerDelta delta : event.findMarkerDeltas(IMarker.BOOKMARK, false)) {
564 for (TimeChartDecorationProvider provider : fDecorationProviders.values()) {
565 if (delta.getResource().equals(provider.getBookmarksFile())) {
566 if (delta.getKind() == IResourceDelta.CHANGED && delta.getMarker().getAttribute(IMarker.LOCATION, -1) != -1) {
567 provider.refreshBookmarks();
568 } else if (delta.getKind() == IResourceDelta.REMOVED) {
569 provider.refreshBookmarks();
570 }
571 }
572 }
573 }
574 redecorate();
575 }
576
6151d86c
PT
577 // ------------------------------------------------------------------------
578 // Signal handlers
579 // ------------------------------------------------------------------------
580
581 /**
582 * Handler for the Trace Opened signal
583 *
584 * @param signal
585 * The incoming signal
586 */
587 @TmfSignalHandler
588 public void traceOpened(TmfTraceOpenedSignal signal) {
6151d86c 589 final ITmfTrace trace = signal.getTrace();
deaae6e1 590 final IFile bookmarksFile = signal.getEditorFile();
6151d86c
PT
591 TimeChartAnalysisEntry timeAnalysisEntry = null;
592 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {
593 if (fTimeAnalysisEntries.get(i).getTrace().equals(trace)) {
594 timeAnalysisEntry = fTimeAnalysisEntries.get(i);
595 break;
596 }
597 }
598 if (timeAnalysisEntry == null) {
599 timeAnalysisEntry = new TimeChartAnalysisEntry(trace, fDisplayWidth * 2);
600 fTimeAnalysisEntries.add(timeAnalysisEntry);
601 fDecorationProviders.put(trace, new TimeChartDecorationProvider(bookmarksFile));
602 Thread thread = new ProcessTraceThread(timeAnalysisEntry);
603 thread.start();
604 }
605 refreshViewer();
6151d86c
PT
606 }
607
608 /**
609 * Handler for the Trace Closed signal
610 *
611 * @param signal
612 * The incoming signal
613 */
614 @TmfSignalHandler
615 public void traceClosed(TmfTraceClosedSignal signal) {
6151d86c
PT
616 final ITmfTrace trace = signal.getTrace();
617 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {
618 if (fTimeAnalysisEntries.get(i).getTrace().equals(trace)) {
619 fTimeAnalysisEntries.remove(i);
620 fDecorationProviders.remove(trace);
faa38350
PT
621 synchronized (fDecorateThreads) {
622 for (DecorateThread thread : fDecorateThreads) {
623 if (thread.fTimeAnalysisEntry.getTrace() == trace) {
624 thread.cancel();
625 fDecorateThreads.remove(thread);
626 break;
627 }
628 }
629 }
6151d86c
PT
630 refreshViewer();
631 break;
632 }
633 }
634 }
635
636 /**
637 * Handler for the Trace Selected signal
638 *
639 * @param signal
640 * The incoming signal
641 */
642 @TmfSignalHandler
643 public void traceSelected(TmfTraceSelectedSignal signal) {
77fdc5df 644 if (signal.getSource() != this) {
6151d86c
PT
645 ITmfTrace trace = signal.getTrace();
646 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {
647 if (fTimeAnalysisEntries.get(i).getTrace().equals(trace)) {
648 fViewer.setSelection(fTimeAnalysisEntries.get(i));
649 break;
650 }
651 }
21852dfa 652 TmfTraceContext ctx = TmfTraceManager.getInstance().getCurrentTraceContext();
16801c72
MK
653 long beginTime = ctx.getSelectionRange().getStartTime().toNanos();
654 long endTime = ctx.getSelectionRange().getEndTime().toNanos();
84c8aef7 655 fViewer.setSelectionRange(beginTime, endTime, false);
6151d86c
PT
656 }
657 }
658
659 /**
660 * Handler for the Trace Updated signal
661 *
662 * @param signal
663 * The incoming signal
664 */
665 @TmfSignalHandler
666 public void traceUpdated(TmfTraceUpdatedSignal signal) {
6151d86c
PT
667 final ITmfTrace trace = signal.getTrace();
668 for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {
669 TimeChartAnalysisEntry timeAnalysisEntry = fTimeAnalysisEntries.get(i);
670 if (timeAnalysisEntry.getTrace().equals(trace)) {
671 updateTraceEntry(timeAnalysisEntry, Long.MAX_VALUE, 0, Long.MAX_VALUE);
672 break;
673 }
674 }
675 }
676
677 /**
97c71024 678 * Handler for the selection range updated signal.
6151d86c
PT
679 *
680 * @param signal
681 * The incoming signal
97c71024 682 * @since 1.0
6151d86c
PT
683 */
684 @TmfSignalHandler
97c71024 685 public void selectionRangeUpdated(TmfSelectionRangeUpdatedSignal signal) {
16801c72
MK
686 final long beginTime = signal.getBeginTime().toNanos();
687 final long endTime = signal.getEndTime().toNanos();
688
689
6151d86c
PT
690 Display.getDefault().asyncExec(new Runnable() {
691 @Override
692 public void run() {
0fcf3b09
PT
693 if (beginTime == endTime) {
694 fViewer.setSelectedTime(beginTime, true);
695 if (fStartTime != fViewer.getTime0() || fStopTime != fViewer.getTime1()) {
696 fStartTime = fViewer.getTime0();
697 fStopTime = fViewer.getTime1();
698 itemize(fStartTime, fStopTime);
699 }
700 } else {
84c8aef7 701 fViewer.setSelectionRange(beginTime, endTime, true);
0fcf3b09 702 }
6151d86c
PT
703 }
704 });
705 }
706
faa38350 707 /**
97c71024 708 * Handler for the window range updated signal.
faa38350
PT
709 *
710 * @param signal
711 * The incoming signal
97c71024 712 * @since 1.0
faa38350
PT
713 */
714 @TmfSignalHandler
97c71024 715 public void windowRangeUpdated(final TmfWindowRangeUpdatedSignal signal) {
faa38350
PT
716 if (signal.getSource() == this) {
717 return;
718 }
16801c72
MK
719 final long startTime = signal.getCurrentRange().getStartTime().toNanos();
720 final long endTime = signal.getCurrentRange().getEndTime().toNanos();
faa38350
PT
721 Display.getDefault().asyncExec(new Runnable() {
722 @Override
723 public void run() {
724 fStartTime = startTime;
725 fStopTime = endTime;
726 itemize(fStartTime, fStopTime);
727 fViewer.setStartFinishTime(startTime, endTime);
faa38350
PT
728 }
729 });
730 }
731
732 /**
733 * Handler for the Event Filter Applied signal
734 *
735 * @param signal
736 * The incoming signal
faa38350
PT
737 */
738 @TmfSignalHandler
739 public void filterApplied(TmfEventFilterAppliedSignal signal) {
740 TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(signal.getTrace());
741 if (decorationProvider == null) {
742 return;
743 }
744 decorationProvider.filterApplied(signal.getEventFilter());
745 redecorate();
746 }
747
748 /**
749 * Handler for the Event Search Applied signal
750 *
751 * @param signal
752 * The incoming signal
faa38350
PT
753 */
754 @TmfSignalHandler
755 public void searchApplied(TmfEventSearchAppliedSignal signal) {
756 TimeChartDecorationProvider decorationProvider = fDecorationProviders.get(signal.getTrace());
757 if (decorationProvider == null) {
758 return;
759 }
760 decorationProvider.searchApplied(signal.getSearchFilter());
761 redecorate();
762 }
763
d2e4afa7
MAL
764 /**
765 * @since 1.0
766 */
767 @Override
768 public TmfTimeViewAlignmentInfo getTimeViewAlignmentInfo() {
769 if (fViewer == null) {
770 return null;
771 }
772 return fViewer.getTimeViewAlignmentInfo();
773 }
774
775 /**
776 * @since 1.0
777 */
778 @Override
779 public int getAvailableWidth(int requestedOffset) {
780 return fViewer.getAvailableWidth(requestedOffset);
781 }
782
783 /**
784 * @since 1.0
785 */
786 @Override
787 public void performAlign(int offset, int width) {
788 fViewer.performAlign(offset, width);
789 }
6151d86c 790}
This page took 0.144818 seconds and 5 git commands to generate.