private long fStopTime = Long.MAX_VALUE;\r
private boolean fRefreshBusy = false;\r
private boolean fRefreshPending = false;\r
+ private boolean fRedrawBusy = false;\r
+ private boolean fRedrawPending = false;\r
private final Object fSyncObj = new Object();\r
private ITimeGraphPresentationProvider fPresentationProvider;\r
\r
fPresentationProvider = new TimeChartAnalysisProvider();\r
fViewer.setTimeGraphProvider(fPresentationProvider);\r
fViewer.setTimeCalendarFormat(true);\r
+ fViewer.addTimeListener(this);\r
fViewer.addRangeListener(this);\r
fViewer.addSelectionListener(this);\r
fViewer.setMinimumItemWidth(1);\r
// stopRank));\r
timeAnalysisEntry.setLastRank(context.getRank());\r
}\r
- refreshViewer(false);\r
+ redrawViewer(true);\r
}\r
if (context != null) {\r
context.dispose();\r
}\r
}\r
\r
- private void refreshViewer(boolean resetTimeIntervals) {\r
+ private void refreshViewer() {\r
synchronized (fSyncObj) {\r
if (fRefreshBusy) {\r
fRefreshPending = true;\r
fRefreshBusy = true;\r
}\r
}\r
- final boolean reset = resetTimeIntervals;\r
// Perform the refresh on the UI thread\r
Display.getDefault().asyncExec(new Runnable() {\r
@Override\r
public void run() {\r
- if (fViewer.getControl().isDisposed())\r
+ if (fViewer.getControl().isDisposed()) {\r
return;\r
- fViewer.setInput(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));\r
- if (reset) {\r
- fViewer.resetStartFinishTime();\r
}\r
+ fViewer.setInput(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));\r
+ fViewer.resetStartFinishTime();\r
synchronized (fSyncObj) {\r
fRefreshBusy = false;\r
if (fRefreshPending) {\r
fRefreshPending = false;\r
- refreshViewer(reset);\r
+ refreshViewer();\r
+ }\r
+ }\r
+ }\r
+ });\r
+ }\r
+\r
+ private void redrawViewer(boolean resetTimeIntervals) {\r
+ synchronized (fSyncObj) {\r
+ if (fRedrawBusy) {\r
+ fRedrawPending = true;\r
+ return;\r
+ } else {\r
+ fRedrawBusy = true;\r
+ }\r
+ }\r
+ final boolean reset = resetTimeIntervals;\r
+ // Perform the refresh on the UI thread\r
+ Display.getDefault().asyncExec(new Runnable() {\r
+ @Override\r
+ public void run() {\r
+ if (fViewer.getControl().isDisposed()) {\r
+ return;\r
+ }\r
+ if (reset) {\r
+ fViewer.setTimeRange(fTimeAnalysisEntries.toArray(new TimeChartAnalysisEntry[0]));\r
+ fViewer.setTimeBounds();\r
+ }\r
+ fViewer.getControl().redraw();\r
+ fViewer.getControl().update();\r
+ synchronized (fSyncObj) {\r
+ fRedrawBusy = false;\r
+ if (fRedrawPending) {\r
+ fRedrawPending = false;\r
+ redrawViewer(reset);\r
}\r
}\r
}\r
}\r
}\r
event.setItemizedEntry(timeAnalysisEntry);\r
- refreshViewer(false);\r
+ redrawViewer(false);\r
itemizeTraceEntry(timeAnalysisEntry);\r
synchronized (event) {\r
event.setItemizing(false);\r
@Override\r
public void run() {\r
resetTraceEntry(fTimeAnalysisEntry);\r
- refreshViewer(false);\r
+ redrawViewer(false);\r
decorateTraceEntry(fTimeAnalysisEntry, null);\r
- refreshViewer(false);\r
+ redrawViewer(false);\r
synchronized (fDecorateThreads) {\r
fDecorateThreads.remove(this);\r
}\r
entryIsVisible |= event.isVisible();\r
entryIsSearchMatch |= event.isSearchMatch();\r
if (++fCount % timeAnalysisEntry.getTrace().getCacheSize() == 0) {\r
- refreshViewer(false);\r
+ redrawViewer(false);\r
}\r
}\r
}\r
boolean isSearchMatch = false;\r
synchronized (timeChartEvent.getRankRangeList()) {\r
for (RankRange range : timeChartEvent.getRankRangeList()) {\r
- if (interrupted)\r
+ if (interrupted) {\r
return;\r
+ }\r
if (fContext == null || fContext.getRank() != range.getFirstRank()) {\r
if (fContext != null) {\r
fContext.dispose();\r
fContext.setRank(range.getFirstRank());\r
}\r
while (true) {\r
- if (interrupted)\r
+ if (interrupted) {\r
return;\r
+ }\r
long rank = fContext.getRank();\r
ITmfEvent event = trace.getNext(fContext);\r
if (event == null) {\r
public void selectionChanged(TimeGraphSelectionEvent event) {\r
ITimeGraphEntry timeAnalysisEntry = null;\r
if (event.getSelection() instanceof TimeChartAnalysisEntry) {\r
- timeAnalysisEntry = (TimeChartAnalysisEntry) event.getSelection();\r
+ timeAnalysisEntry = event.getSelection();\r
} else if (event.getSelection() instanceof TimeChartEvent) {\r
timeAnalysisEntry = ((TimeChartEvent) event.getSelection()).getEntry();\r
}\r
\r
@TmfSignalHandler\r
public void traceOpened(TmfTraceOpenedSignal signal) {\r
- if (fTimeAnalysisEntries == null)\r
+ if (fTimeAnalysisEntries == null) {\r
return;\r
+ }\r
final ITmfTrace<?> trace = signal.getTrace();\r
final IFile bookmarksFile = signal.getBookmarksFile();\r
final ITmfEventsFilterProvider eventsFilterProvider = signal.getEventsFilterProvider();\r
Thread thread = new ProcessTraceThread(timeAnalysisEntry);\r
thread.start();\r
}\r
- refreshViewer(true);\r
+ refreshViewer();\r
if (eventsFilterProvider != null) {\r
eventsFilterProvider.addEventsFilterListener(this);\r
}\r
\r
@TmfSignalHandler\r
public void traceClosed(TmfTraceClosedSignal signal) {\r
- if (fTimeAnalysisEntries == null)\r
+ if (fTimeAnalysisEntries == null) {\r
return;\r
+ }\r
final ITmfTrace<?> trace = signal.getTrace();\r
for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {\r
if (fTimeAnalysisEntries.get(i).getTrace().equals(trace)) {\r
fTimeAnalysisEntries.remove(i);\r
fDecorationProviders.remove(trace);\r
- refreshViewer(true);\r
+ refreshViewer();\r
break;\r
}\r
}\r
\r
@TmfSignalHandler\r
public void traceUpdated(TmfTraceUpdatedSignal signal) {\r
- if (fTimeAnalysisEntries == null)\r
+ if (fTimeAnalysisEntries == null) {\r
return;\r
+ }\r
final ITmfTrace<?> trace = signal.getTrace();\r
for (int i = 0; i < fTimeAnalysisEntries.size(); i++) {\r
TimeChartAnalysisEntry timeAnalysisEntry = fTimeAnalysisEntries.get(i);\r