tmf.ui: Show "No Data" when an XY plot is empty

The timegraph chart has a concept of swimlanes, so no data is obvious.
With an XY Chart, it is less so as the data can be 0.

This gives a visusal feedback that there is no data available in the chart.

[Changed] Add indication that there is no data available to the xy chart

Change-Id: I9d15387bb463e389de4e567e39cc175c217d4881
Signed-off-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/c/tracecompass/org.eclipse.tracecompass/+/182633
Tested-by: Trace Compass Bot <tracecompass-bot@eclipse.org>
Tested-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
Reviewed-by: Bernd Hufmann <bernd.hufmann@ericsson.com>
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/Messages.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/Messages.java
index 12d8654..cd70758 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/Messages.java
+++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/Messages.java
@@ -45,6 +45,7 @@
     public static String MarkerEvent_Bookmarks;
 
     public static String TmfChartView_LockYAxis;
+    public static String TmfChartViewer_NoData;
     public static String TmfCommonXLineChartTooltipProvider_time;
 
     public static String TmfEventsTable_AddAsFilterText;
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/messages.properties b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/messages.properties
index 4d0fdd2..e690d29 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/messages.properties
+++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/messages.properties
@@ -36,6 +36,7 @@
 
 # org.eclipse.tracecompass.tmf.ui.viewers.events
 TmfChartView_LockYAxis=Lock Y Axis...
+TmfChartViewer_NoData=No Data
 TmfCommonXLineChartTooltipProvider_time=Time
 TmfEventsTable_AddAsFilterText=Add as Filter (Ctrl+Enter)
 TmfEventsTable_AddBookmarkActionText=Add Bookmark...
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/piecharts/Messages.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/piecharts/Messages.java
index c34acaa..b3c5c1d 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/piecharts/Messages.java
+++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/piecharts/Messages.java
@@ -26,12 +26,6 @@
 
     private static final String BUNDLE_NAME = "org.eclipse.tracecompass.internal.tmf.ui.viewers.piecharts.messages"; //$NON-NLS-1$
 
-
-    /**
-     * Show no data in pie chart
-     */
-    public static String TmfPieChart_noData;
-
     /**
      * String shown on top of the time-range selection piechart
      */
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/piecharts/messages.properties b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/piecharts/messages.properties
index 3978868..d1b73fc 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/piecharts/messages.properties
+++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/viewers/piecharts/messages.properties
@@ -12,7 +12,6 @@
 #     Ericsson - Initial API and implementation
 ###############################################################################
 
-TmfPieChart_noData=No data
 TmfStatisticsView_GlobalSelectionPieChartName=Global
 TmfStatisticsView_TimeRangeSelectionPieChartName=Events in selection
 TmfStatisticsView_PieChartOthersSliceName=Others
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/widgets/piechart/TmfPieChart.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/widgets/piechart/TmfPieChart.java
index 0da3a61..b820e8e 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/widgets/piechart/TmfPieChart.java
+++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/internal/tmf/ui/widgets/piechart/TmfPieChart.java
@@ -162,7 +162,7 @@
                 Font font = new Font(Display.getDefault(), FONT, 15, SWT.BOLD);
                 gc.setForeground(BLACK);
                 gc.setFont(font);
-                String text = Messages.TmfPieChart_noData;
+                String text = org.eclipse.tracecompass.internal.tmf.ui.Messages.TmfChartViewer_NoData;
                 Point textSize = e.gc.textExtent(text);
                 gc.drawText(text, (bounds.width - textSize.x) / 2, (bounds.height - textSize.y) / 2);
                 gc.setFont(oldFont);
diff --git a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xychart/linechart/TmfCommonXAxisChartViewer.java b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xychart/linechart/TmfCommonXAxisChartViewer.java
index 0ce7562..dcfe15a 100644
--- a/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xychart/linechart/TmfCommonXAxisChartViewer.java
+++ b/tmf/org.eclipse.tracecompass.tmf.ui/src/org/eclipse/tracecompass/tmf/ui/viewers/xychart/linechart/TmfCommonXAxisChartViewer.java
@@ -28,14 +28,19 @@
 import org.eclipse.jface.resource.ColorRegistry;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.RGBA;
+import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swtchart.IAxisSet;
 import org.eclipse.swtchart.IAxisTick;
 import org.eclipse.swtchart.IBarSeries;
+import org.eclipse.swtchart.ICustomPaintListener;
 import org.eclipse.swtchart.ILineSeries;
+import org.eclipse.swtchart.IPlotArea;
 import org.eclipse.swtchart.ISeries;
 import org.eclipse.swtchart.ISeries.SeriesType;
 import org.eclipse.swtchart.ISeriesSet;
@@ -52,6 +57,7 @@
 import org.eclipse.tracecompass.internal.provisional.tmf.ui.viewers.xychart.BaseXYPresentationProvider;
 import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
 import org.eclipse.tracecompass.internal.tmf.ui.Activator;
+import org.eclipse.tracecompass.internal.tmf.ui.Messages;
 import org.eclipse.tracecompass.tmf.core.dataprovider.DataProviderParameterUtils;
 import org.eclipse.tracecompass.tmf.core.dataprovider.DataTypeUtils;
 import org.eclipse.tracecompass.tmf.core.model.OutputElementStyle;
@@ -122,6 +128,26 @@
     private static final @NonNull Logger LOGGER = TraceCompassLog.getLogger(TmfCommonXAxisChartViewer.class);
     private static final int DEFAULT_SERIES_WIDTH = 1;
     private static final String DIMMED_SERIES_SUFFIX = ".dimmed"; //$NON-NLS-1$
+    private static final ICustomPaintListener NO_DATA = e -> {
+        GC gc = e.gc;
+        Rectangle bounds = gc.getClipping();
+        Font oldFont = gc.getFont();
+        int height = 28;
+        Font font = new Font(Display.getDefault(), "Arial", height, SWT.BOLD); //$NON-NLS-1$
+        IPlotArea chart = (IPlotArea) e.widget;
+        Color oldFg = gc.getForeground();
+        gc.setForeground(chart.getChart().getForeground());
+        gc.setFont(font);
+        String text = Messages.TmfChartViewer_NoData;
+        Point textSize = e.gc.textExtent(text);
+        Color bg = gc.getBackground();
+        gc.setBackground(chart.getBackground());
+        gc.drawText(text, (bounds.width - textSize.x) / 2, (bounds.height - textSize.y) / 2);
+        gc.setBackground(bg);
+        gc.setForeground(oldFg);
+        gc.setFont(oldFont);
+        font.dispose();
+    };
 
     private final double fResolution;
     private final AtomicInteger fDirty = new AtomicInteger();
@@ -389,6 +415,7 @@
             } while (!isComplete);
         }
 
+
         /**
          * Update the chart's values before refreshing the viewer
          */
@@ -500,7 +527,10 @@
                             clearContent();
                             delta = 1;
                         }
-
+                        getSwtChart().getPlotArea().removeCustomPaintListener(NO_DATA);
+                        if(seriesValues.getSeriesData().isEmpty()) {
+                            getSwtChart().getPlotArea().addCustomPaintListener(NO_DATA);
+                        }
                         // Set the formatters for the axis
                         IAxisSet axisSet = getSwtChart().getAxisSet();
                         IAxisTick xTick = axisSet.getXAxis(0).getTick();
@@ -529,7 +559,6 @@
                                     new Range(fixedYRange.getLower(), fixedYRange.getUpper()));
                         }
                         getSwtChart().redraw();
-
                         if (isSendTimeAlignSignals()) {
                             /*
                              * The width of the chart might have changed and its time axis might be