public static String TmfTimeLegend_WINDOW_TITLE;\r
public static String TmfTimeLegend_StateTypeName;\r
\r
- public static String TmfTimeStatesCtrl_TRACE_GROUP_LABEL;\r
- public static String TmfTimeStatesCtrl_UNDEFINED_GROUP;\r
public static String TmfTimeTipHandler_DURATION;\r
- public static String TmfTimeTipHandler_NUMBER_OF_TRACES;\r
public static String TmfTimeTipHandler_TRACE_DATE;\r
public static String TmfTimeTipHandler_TRACE_EVENT_TIME;\r
- public static String TmfTimeTipHandler_TRACE_GROUP_NAME;\r
- public static String TmfTimeTipHandler_TRACE_NAME;\r
public static String TmfTimeTipHandler_TRACE_START_TIME;\r
public static String TmfTimeTipHandler_TRACE_STATE;\r
public static String TmfTimeTipHandler_TRACE_STOP_TIME;\r
TmfTimeLegend_StateTypeName=States\r
\r
# org.eclipse.linuxtools.tmf.ui.viewers.timegraph.widgets\r
-TmfTimeStatesCtrl_TRACE_GROUP_LABEL=Trace Group [{0}]\r
-TmfTimeStatesCtrl_UNDEFINED_GROUP=<undefined>\r
TmfTimeTipHandler_DURATION=Duration\r
-TmfTimeTipHandler_NUMBER_OF_TRACES=Number of traces\r
TmfTimeTipHandler_TRACE_DATE=Date\r
TmfTimeTipHandler_TRACE_EVENT_TIME=Event Time\r
-TmfTimeTipHandler_TRACE_GROUP_NAME=Group Name\r
-TmfTimeTipHandler_TRACE_NAME=Trace Name\r
TmfTimeTipHandler_TRACE_START_TIME=Start Time\r
TmfTimeTipHandler_TRACE_STATE=State\r
TmfTimeTipHandler_TRACE_STOP_TIME=Stop Time\r
import org.eclipse.swt.SWT;\r
import org.eclipse.swt.graphics.Color;\r
import org.eclipse.swt.graphics.GC;\r
-import org.eclipse.swt.graphics.RGB;\r
import org.eclipse.swt.graphics.Rectangle;\r
import org.eclipse.swt.widgets.Display;\r
-import org.eclipse.ui.themes.ColorUtil;\r
\r
public class TimeChartAnalysisProvider extends TimeGraphPresentationProvider {\r
\r
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
_dataViewer = new Composite(parent, style) {\r
@Override\r
public void redraw() {\r
+ _timeScaleCtrl.redraw();\r
_stateCtrl.redraw();\r
super.redraw();\r
}\r
if (_time1 > _time1_)\r
_time1 = _time1_;\r
if (_time1 - _time0 < _minTimeInterval)\r
- _time1 = _time0 + _minTimeInterval;\r
+ _time1 = Math.min(_time1_, _time0 + _minTimeInterval);\r
_timeRangeFixed = true;\r
_stateCtrl.adjustScrolls();\r
_stateCtrl.redraw();\r
long time1 = _timeProvider.getTime1();\r
int nameWidth = _timeProvider.getNameSpace();\r
x -= nameWidth;\r
+ int timeWidth = size.x - nameWidth - RIGHT_MARGIN;\r
if (x >= 0 && size.x >= nameWidth) {\r
- if (time1 - time0 > size.x - nameWidth - RIGHT_MARGIN) {\r
+ if (time1 - time0 > timeWidth) {\r
// get the last possible time represented by the pixel position\r
- // by taking the time of the next pixel position minus 1\r
- // nanosecond\r
- hitTime = time0 + (long) ((time1 - time0) * ((double) (x + 1) / (size.x - nameWidth - RIGHT_MARGIN))) - 1;\r
+ // by taking the time of the next pixel position minus 1 nanosecond\r
+ hitTime = time0 + (long) ((time1 - time0) * ((double) (x + 1) / timeWidth)) - 1;\r
} else {\r
- hitTime = time0 + (long) ((time1 - time0) * ((double) (x) / (size.x - nameWidth - RIGHT_MARGIN)));\r
+ hitTime = time0 + Math.round((time1 - time0) * ((double) x / timeWidth));\r
}\r
}\r
return hitTime;\r
time = (long) (Math.ceil((double) time0 / _timeDelta) * _timeDelta);\r
}\r
\r
- // long t = (long) (time * 1000000000);\r
int y = _rect0.y + _rect0.height;\r
\r
if (_timeProvider != null && _timeProvider.isCalendarFormat()) {\r
\r
while (true) {\r
x = rect.x + leftSpace + (int) (Math.floor((time - time0) * pixelsPerNanoSec));\r
- gc.drawLine(x, y, x, y + 4);\r
if (x >= rect.x + leftSpace + rect.width - _rect0.width) {\r
break;\r
}\r
if (x >= rect.x + leftSpace) {\r
+ gc.drawLine(x, y, x, y + 4);\r
_rect0.x = x;\r
if (x + _rect0.width <= rect.x + rect.width)\r
timeDraw.draw(gc, time, _rect0);\r
if (pixelsPerNanoSec == 0 || time > Long.MAX_VALUE - _timeDelta || _timeDelta == 0) {\r
break;\r
}\r
- time += _timeDelta;\r
if (_timeProvider != null && _timeProvider.isCalendarFormat()) {\r
if (_timeDelta >= YEAR_IN_NS) {\r
- GREGORIAN_CALENDAR.setTime(new Date(time / 1000000));\r
- GREGORIAN_CALENDAR.set(Calendar.MONTH, 0); // January 1st of year\r
- GREGORIAN_CALENDAR.set(Calendar.DAY_OF_MONTH, 1);\r
- time = GREGORIAN_CALENDAR.getTimeInMillis() * 1000000;\r
+ long millis = time / 1000000L;\r
+ GREGORIAN_CALENDAR.setTime(new Date(millis));\r
+ GREGORIAN_CALENDAR.add(Calendar.YEAR, (int) (_timeDelta / YEAR_IN_NS));\r
+ millis = GREGORIAN_CALENDAR.getTimeInMillis();\r
+ time = millis * 1000000L;\r
} else if (_timeDelta >= MONTH_IN_NS) {\r
- GREGORIAN_CALENDAR.setTime(new Date(time / 1000000));\r
- GREGORIAN_CALENDAR.set(Calendar.DAY_OF_MONTH, 1); // 1st of month\r
- time = GREGORIAN_CALENDAR.getTimeInMillis() * 1000000;\r
+ long millis = time / 1000000L;\r
+ GREGORIAN_CALENDAR.setTime(new Date(millis));\r
+ GREGORIAN_CALENDAR.add(Calendar.MONTH, (int) (_timeDelta / MONTH_IN_NS));\r
+ millis = GREGORIAN_CALENDAR.getTimeInMillis();\r
+ time = millis * 1000000L;\r
+ } else if (_timeDelta >= DAY_IN_NS) {\r
+ long millis = time / 1000000L;\r
+ GREGORIAN_CALENDAR.setTime(new Date(millis));\r
+ GREGORIAN_CALENDAR.add(Calendar.DAY_OF_MONTH, (int) (_timeDelta / DAY_IN_NS));\r
+ millis = GREGORIAN_CALENDAR.getTimeInMillis();\r
+ time = millis * 1000000L;\r
+ } else {\r
+ time += _timeDelta;\r
}\r
+ } else {\r
+ time += _timeDelta;\r
}\r
}\r
}\r
GREGORIAN_CALENDAR.set(Calendar.MILLISECOND, 0);\r
time = GREGORIAN_CALENDAR.getTimeInMillis() * 1000000;\r
} else {\r
+ long offset = GREGORIAN_CALENDAR.getTimeZone().getOffset(time / 1000000L) * 1000000L;\r
+ time += offset;\r
time = (time / timeDelta) * timeDelta;\r
+ time -= offset;\r
}\r
return time;\r
}\r
if (_timeProvider.getTime0() == _timeProvider.getTime1()) {\r
return;\r
}\r
- long time1 = _time0bak + (long) ((_time1bak - _time0bak) * ((double) _dragX0 / _dragX));\r
- _timeProvider.setStartFinishTime(_time0bak, time1);\r
+ long interval = (long) ((_time1bak - _time0bak) * ((double) _dragX0 / _dragX));\r
+ if (interval == Long.MAX_VALUE) {\r
+ _timeProvider.setStartFinishTime(_time0bak, Long.MAX_VALUE);\r
+ } else {\r
+ long time1 = _time0bak + (long) ((_time1bak - _time0bak) * ((double) _dragX0 / _dragX));\r
+ _timeProvider.setStartFinishTime(_time0bak, time1);\r
+ }\r
}\r
} else if (3 == _dragState) {\r
if (x < 0) {\r
if (item == null) {\r
return;\r
}\r
- if (! item._trace.hasTimeEvents()) {\r
- addItem(Messages.TmfTimeTipHandler_TRACE_GROUP_NAME, item.toString());\r
- addItem(Messages.TmfTimeTipHandler_NUMBER_OF_TRACES, "" + item.children.size()); //$NON-NLS-1$\r
- } else {\r
+ if (item._trace.hasTimeEvents()) {\r
ITimeGraphEntry thrd = item._trace;\r
ITimeEvent threadEvent = Utils.findEvent(thrd, threadStates.getTimeAtX(pt.x), 2);\r
ITimeEvent nextEvent = Utils.findEvent(thrd, threadStates.getTimeAtX(pt.x), 1);\r
TimeGraphItem item = threadStates.getItem(pt);\r
_tipTable.remove(0, _tipTable.getItemCount() - 1);\r
fillValues(pt, threadStates, item);\r
+ if (_tipTable.getItemCount() == 0) {\r
+ return;\r
+ }\r
_tipTable.getColumn(0).pack();\r
_tipTable.getColumn(1).pack();\r
_tipShell.pack();\r