Bug 378401: Implementation of time graph widget.
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.ui / src / org / eclipse / linuxtools / tmf / ui / views / timechart / TimeChartView.java
index a65a19e59adb4859f35c8d69dd16aa1ac57760e9..41235a6053dee313e64610fc0bb58166d638637b 100644 (file)
@@ -75,6 +75,8 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
     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
@@ -89,6 +91,7 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
         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
@@ -199,14 +202,14 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
                 // 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
@@ -215,22 +218,54 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
                 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
@@ -304,7 +339,7 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
                 }\r
             }\r
             event.setItemizedEntry(timeAnalysisEntry);\r
-            refreshViewer(false);\r
+            redrawViewer(false);\r
             itemizeTraceEntry(timeAnalysisEntry);\r
             synchronized (event) {\r
                 event.setItemizing(false);\r
@@ -342,9 +377,9 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
         @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
@@ -403,7 +438,7 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
                     entryIsVisible |= event.isVisible();\r
                     entryIsSearchMatch |= event.isSearchMatch();\r
                     if (++fCount % timeAnalysisEntry.getTrace().getCacheSize() == 0) {\r
-                        refreshViewer(false);\r
+                        redrawViewer(false);\r
                     }\r
                 }\r
             }\r
@@ -425,8 +460,9 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
             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
@@ -435,8 +471,9 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
                         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
@@ -481,7 +518,7 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
     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
@@ -539,8 +576,9 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
 \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
@@ -558,7 +596,7 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
             Thread thread = new ProcessTraceThread(timeAnalysisEntry);\r
             thread.start();\r
         }\r
-        refreshViewer(true);\r
+        refreshViewer();\r
         if (eventsFilterProvider != null) {\r
             eventsFilterProvider.addEventsFilterListener(this);\r
         }\r
@@ -566,14 +604,15 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
 \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
@@ -594,8 +633,9 @@ public class TimeChartView extends TmfView implements ITimeGraphRangeListener, I
 \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
This page took 0.027167 seconds and 5 git commands to generate.