Bug 378401: Implementation of time graph widget.
authorPatrick Tasse <patrick.tasse@gmail.com>
Wed, 6 Jun 2012 20:09:52 +0000 (16:09 -0400)
committerPatrick Tasse <patrick.tasse@gmail.com>
Wed, 6 Jun 2012 20:10:55 +0000 (16:10 -0400)
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/Messages.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/internal/tmf/ui/messages.properties
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/timechart/TimeChartAnalysisProvider.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/views/timechart/TimeChartView.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/timegraph/TimeGraphViewer.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/timegraph/widgets/TimeGraphControl.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/timegraph/widgets/TimeGraphScale.java
org.eclipse.linuxtools.tmf.ui/src/org/eclipse/linuxtools/tmf/ui/widgets/timegraph/widgets/TimeGraphTooltipHandler.java

index e36752842729d6266763dbb96ed5a96da0e45608..e11d5f7ef0e51f2735b91e73914ac4509c621df8 100644 (file)
@@ -81,14 +81,9 @@ public class Messages extends NLS {
     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
index e6287cb1df5e01b026c489639d56e6dc42d20e60..c431b625233bde05190c3fca4bf9674c0033d9bf 100644 (file)
@@ -79,14 +79,9 @@ TmfTimeLegend_WINDOW_TITLE=Trace Visualizer's Legend
 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
index 26186a25a24d5805388041045a46e0f9d361f7ba..2f9932aaf1de1d82f186f495d756c23c233f39ef 100644 (file)
@@ -20,10 +20,8 @@ import org.eclipse.linuxtools.tmf.ui.widgets.timegraph.model.ITimeEvent;
 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
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
index 57ac77ae504d42d235c3e3730228b0faa7ae0b47..45ae21908437e6f6c8b904899777deed544a4d0e 100644 (file)
@@ -190,6 +190,7 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
         _dataViewer = new Composite(parent, style) {\r
             @Override\r
             public void redraw() {\r
+                _timeScaleCtrl.redraw();\r
                 _stateCtrl.redraw();\r
                 super.redraw();\r
             }\r
@@ -473,7 +474,7 @@ public class TimeGraphViewer implements ITimeDataProvider, SelectionListener {
         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
index ec7a8bc3a4a3fcaecb4a1000d0e3599c9f24539a..d6328ac26a86a1af46d7c0975591643975e44f5a 100644 (file)
@@ -723,14 +723,14 @@ public class TimeGraphControl extends TimeGraphBaseControl implements FocusListe
         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
index 06ac48cd4e8922e69effa239ea8c29ffb2a1a6ea..15be711d404df8798ec2bc203659d56cae9d9df6 100644 (file)
@@ -252,7 +252,6 @@ public class TimeGraphScale extends TimeGraphBaseControl implements MouseListene
             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
@@ -261,11 +260,11 @@ public class TimeGraphScale extends TimeGraphBaseControl implements MouseListene
 \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
@@ -273,18 +272,30 @@ public class TimeGraphScale extends TimeGraphBaseControl implements MouseListene
             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
@@ -316,7 +327,10 @@ public class TimeGraphScale extends TimeGraphBaseControl implements MouseListene
             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
@@ -430,8 +444,13 @@ public class TimeGraphScale extends TimeGraphBaseControl implements MouseListene
                 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
index 8b776d64d7f7e54777756f0311c26056c7dcd0af..7e73b43dd0df92805e0a7292a74735233af85eca 100644 (file)
@@ -118,10 +118,7 @@ public class TimeGraphTooltipHandler {
                 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
@@ -217,6 +214,9 @@ public class TimeGraphTooltipHandler {
                 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
This page took 0.032761 seconds and 5 git commands to generate.