+ private ListenerNotifier fListenerNotifier;
+
+ private Composite fTimeAlignedComposite;
+
+ private class ListenerNotifier extends Thread {
+ private static final long DELAY = 400L;
+ private static final long POLLING_INTERVAL = 10L;
+ private long fLastUpdateTime = Long.MAX_VALUE;
+ private boolean fSelectionChanged = false;
+ private boolean fTimeRangeUpdated = false;
+ private boolean fTimeSelected = false;
+
+ @Override
+ public void run() {
+ while ((System.currentTimeMillis() - fLastUpdateTime) < DELAY) {
+ try {
+ Thread.sleep(POLLING_INTERVAL);
+ } catch (Exception e) {
+ return;
+ }
+ }
+ Display.getDefault().asyncExec(new Runnable() {
+ @Override
+ public void run() {
+ if (fListenerNotifier != ListenerNotifier.this) {
+ return;
+ }
+ fListenerNotifier = null;
+ if (ListenerNotifier.this.isInterrupted() || fDataViewer.isDisposed()) {
+ return;
+ }
+ if (fSelectionChanged) {
+ fireSelectionChanged(fSelectedEntry);
+ }
+ if (fTimeRangeUpdated) {
+ fireTimeRangeUpdated(fTime0, fTime1);
+ }
+ if (fTimeSelected) {
+ fireTimeSelected(fSelectionBegin, fSelectionEnd);
+ }
+ }
+ });
+ }
+
+ public void selectionChanged() {
+ fSelectionChanged = true;
+ fLastUpdateTime = System.currentTimeMillis();
+ }
+
+ public void timeRangeUpdated() {
+ fTimeRangeUpdated = true;
+ fLastUpdateTime = System.currentTimeMillis();
+ }
+
+ public void timeSelected() {
+ fTimeSelected = true;
+ fLastUpdateTime = System.currentTimeMillis();
+ }
+
+ public boolean hasSelectionChanged() {
+ return fSelectionChanged;
+ }
+
+ public boolean hasTimeRangeUpdated() {
+ return fTimeRangeUpdated;
+ }
+
+ public boolean hasTimeSelected() {
+ return fTimeSelected;
+ }
+ }
+