import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
import org.eclipse.tracecompass.tmf.ui.editors.TmfEventsEditor;
+import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer;
import org.eclipse.tracecompass.tmf.ui.views.timegraph.AbstractTimeGraphView;
import org.eclipse.ui.IEditorReference;
import org.hamcrest.Matcher;
return new TimeGraphIsReadyCondition(view, selectionRange, visibleTime);
}
+ private static class XYViewerIsReadyCondition extends DefaultCondition {
+
+ private TmfXYChartViewer fViewer;
+ private String fFailureMessage;
+
+ private XYViewerIsReadyCondition(TmfXYChartViewer view) {
+ fViewer = view;
+ }
+
+ @Override
+ public boolean test() throws Exception {
+
+ if (fViewer.isDirty()) {
+ fFailureMessage = "Time graph is dirty";
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public String getFailureMessage() {
+ return fFailureMessage;
+ }
+ }
+
+ /**
+ *
+ * Wait until the XY chart viewer is ready. The XY chart viewer is
+ * considered ready when it is not updating.
+ *
+ * @param viewer
+ * the XY chart viewer
+ * @return ICondition for verification
+ */
+ public static ICondition xyViewerIsReadyCondition(TmfXYChartViewer viewer) {
+ return new XYViewerIsReadyCondition(viewer);
+ }
+
private static class NumberOfEventsCondition extends DefaultCondition {
private ITmfTrace fTrace;
import org.eclipse.tracecompass.tmf.core.signal.TmfTimestampFormatUpdateSignal;
import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
+import org.eclipse.tracecompass.tmf.core.trace.TmfTraceContext;
+import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
import org.eclipse.tracecompass.tmf.ui.viewers.TmfTimeViewer;
import org.swtchart.Chart;
import org.swtchart.IAxis;
import org.swtchart.ISeriesSet;
import org.swtchart.Range;
+import com.google.common.annotations.VisibleForTesting;
+
/**
* Base class for a XY-Chart based on SWT chart. It provides a methods to define
* zoom, selection and tool tip providers. It also provides call backs to be
*/
protected abstract void updateContent();
+ /**
+ * Returns whether or not this chart viewer is dirty. The viewer is
+ * considered dirty if it has yet to completely update its model.
+ *
+ * This method is meant to be used by tests in order to know when it is safe
+ * to proceed.
+ *
+ * @return true if the time graph view has yet to completely update its
+ * model, false otherwise
+ * @since 2.2
+ */
+ @VisibleForTesting
+ public boolean isDirty() {
+ if (getTrace() == null) {
+ return false;
+ }
+
+ TmfTraceContext ctx = TmfTraceManager.getInstance().getCurrentTraceContext();
+ long startTime = ctx.getWindowRange().getStartTime().toNanos();
+ long endTime = ctx.getWindowRange().getEndTime().toNanos();
+
+ // If the chart viewer hasn't updated all the way to the end of
+ // the window range then it's dirty. A refresh should happen later.
+ return (getWindowStartTime() != startTime || getWindowEndTime() != endTime);
+ }
+
// ------------------------------------------------------------------------
// Signal Handler
// ------------------------------------------------------------------------
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Logger;
import org.eclipse.core.runtime.IProgressMonitor;
private UpdateThread fUpdateThread;
+ private volatile AtomicInteger fDirty = new AtomicInteger();
+
/**
* Constructor
*
*/
protected void reinitialize() {
fSeriesValues.clear();
+ fDirty.incrementAndGet();
Thread thread = new Thread() {
// Don't use TmfUiRefreshHandler (bug 467751)
@Override
/* Delete the old series */
clearContent();
createSeries();
+ fDirty.decrementAndGet();
}
}
});
public void run() {
LOGGER.info(() -> getLogMessage("UpdateDataStart", "tid=" + getId())); //$NON-NLS-1$ //$NON-NLS-2$
updateData(getWindowStartTime(), getWindowEndTime(), fNumRequests, fMonitor);
+ fDirty.decrementAndGet();
LOGGER.info(() -> getLogMessage("UpdateDataEnd", "tid=" + getId())); //$NON-NLS-1$ //$NON-NLS-2$
}
});
@Override
protected void updateContent() {
+ fDirty.incrementAndGet();
getDisplay().asyncExec(new Runnable() {
@Override
public void run() {
super.clearContent();
}
+ @Override
+ public boolean isDirty() {
+ boolean dirty = super.isDirty();
+
+ if (dirty) {
+ return dirty;
+ }
+
+ // Check the specific dirtiness of this view
+ return fDirty.get() != 0;
+ }
+
}