Scripting: support histogram chart

Change-Id: I3abe736fd48fbfa2ee159e2c059c3c95bce37b11
Signed-off-by: Qing Chi <chiqing2010@163.com>
Reviewed-on: https://git.eclipse.org/r/160134
Tested-by: Trace Compass Bot <tracecompass-bot@eclipse.org>
Reviewed-by: Genevieve Bastien <gbastien+lttng@versatic.net>
Tested-by: Genevieve Bastien <gbastien+lttng@versatic.net>
Reviewed-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Tested-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
diff --git a/scripting/org.eclipse.tracecompass.incubator.scripting.ui/META-INF/MANIFEST.MF b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/META-INF/MANIFEST.MF
index 9d058bf..875b0da 100644
--- a/scripting/org.eclipse.tracecompass.incubator.scripting.ui/META-INF/MANIFEST.MF
+++ b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/META-INF/MANIFEST.MF
@@ -29,6 +29,7 @@
  org.eclipse.tracecompass.incubator.callstack.ui;resolution:=optional
 Export-Package: org.eclipse.tracecompass.incubator.internal.scripting.ui;x-friends:="org.eclipse.tracecompass.incubator.scripting.ui.tests",
  org.eclipse.tracecompass.incubator.internal.scripting.ui.project.handlers;x-internal:=true,
+ org.eclipse.tracecompass.incubator.internal.scripting.ui.views.histogram;x-internal:=true,
  org.eclipse.tracecompass.incubator.internal.scripting.ui.views.timegraph;x-internal:=true,
  org.eclipse.tracecompass.incubator.internal.scripting.ui.views.xychart;x-internal:=true,
  org.eclipse.tracecompass.incubator.scripting.ui.callstack,
diff --git a/scripting/org.eclipse.tracecompass.incubator.scripting.ui/plugin.properties b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/plugin.properties
index c9702df..41ff170 100644
--- a/scripting/org.eclipse.tracecompass.incubator.scripting.ui/plugin.properties
+++ b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/plugin.properties
@@ -12,6 +12,7 @@
 Bundle-Vendor = Eclipse Trace Compass Incubator
 Bundle-Name = Trace Compass Scripting UI Plug-in (Incubator)
 
+view.scriptedHistogramChart = Scripted Histogram Chart
 view.scriptedTimeGraph = Scripted Time Graph
 view.scriptedXYChart = Scripted XY Chart
 
diff --git a/scripting/org.eclipse.tracecompass.incubator.scripting.ui/plugin.xml b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/plugin.xml
index 419d1a7..358d8ea 100644
--- a/scripting/org.eclipse.tracecompass.incubator.scripting.ui/plugin.xml
+++ b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/plugin.xml
@@ -30,6 +30,17 @@
       <view
             allowMultiple="true"
             category="org.eclipse.linuxtools.lttng2.ui.views.category"
+            class="org.eclipse.tracecompass.incubator.internal.scripting.ui.views.histogram.ScriptedHistogramView"
+            id="org.eclipse.tracecompass.incubator.internal.scripting.ui.views.histogram"
+            name="%view.scriptedHistogramChart"
+            restorable="true">
+      </view>
+   </extension>
+   <extension
+            point="org.eclipse.ui.views">
+      <view
+            allowMultiple="true"
+            category="org.eclipse.linuxtools.lttng2.ui.views.category"
             class="org.eclipse.tracecompass.incubator.internal.scripting.ui.views.timegraph.ScriptedTimeGraphView"
             id="org.eclipse.tracecompass.incubator.scripting.ui.view.timegraph"
             name="%view.scriptedTimeGraph"
diff --git a/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/internal/scripting/ui/views/histogram/Messages.java b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/internal/scripting/ui/views/histogram/Messages.java
new file mode 100644
index 0000000..e090783
--- /dev/null
+++ b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/internal/scripting/ui/views/histogram/Messages.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2020 VMware
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.incubator.internal.scripting.ui.views.histogram;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Messages related to the {@link ScriptedHistogramView}
+ *
+ * @author Qing Chi
+ */
+public class Messages extends NLS {
+
+    private static final String BUNDLE_NAME = "org.eclipse.tracecompass.incubator.internal.scripting.ui.views.histogram.messages"; //$NON-NLS-1$
+
+    /** Default Viewer title */
+    public static String ScriptedHistogramTreeViewer_DefaultViewerTitle;
+    /** default x axis title */
+    public static String ScriptedHistogramTreeViewer_DefaultXAxis;
+    /** default y axis title */
+    public static String ScriptedHistogramTreeViewer_DefaultYAxis;
+
+    static {
+        // initialize resource bundle
+        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+    }
+
+    private Messages() {
+    }
+}
diff --git a/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/internal/scripting/ui/views/histogram/ScriptedHistogramView.java b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/internal/scripting/ui/views/histogram/ScriptedHistogramView.java
new file mode 100644
index 0000000..2a95b5d
--- /dev/null
+++ b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/internal/scripting/ui/views/histogram/ScriptedHistogramView.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2020 VMware
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.incubator.internal.scripting.ui.views.histogram;
+
+import java.util.Objects;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
+import org.eclipse.swt.widgets.Composite;
+
+import org.eclipse.tracecompass.incubator.internal.scripting.ui.views.xychart.ScriptedXYTreeViewer;
+import org.eclipse.tracecompass.tmf.ui.viewers.TmfViewer;
+import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.TmfXYChartViewer;
+import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfXYChartSettings;
+import org.eclipse.tracecompass.tmf.ui.views.TmfChartView;
+
+/**
+ * A data provider view to display the results of a scripted analysis. It uses
+ * the secondary ID as the data provider ID to display
+ *
+ * @author Qing Chi
+ */
+public class ScriptedHistogramView extends TmfChartView {
+
+    /**
+     * Because colons are not allowed in secondary IDs, but can be present in
+     * data provider IDs, they can be replaced upstream by this string and it
+     * will be replaced again when getting the data provider ID.
+     */
+    public static final String COLON = "[COLON]"; //$NON-NLS-1$
+
+    /** The view ID. */
+    public static final String ID = "org.eclipse.tracecompass.incubator.internal.scripting.ui.views.histogram"; //$NON-NLS-1$
+
+    /**
+     * Default Constructor
+     */
+    public ScriptedHistogramView() {
+        super(ID);
+    }
+
+    @Override
+    protected TmfXYChartViewer createChartViewer(Composite parent) {
+        TmfXYChartSettings settings = new TmfXYChartSettings(Messages.ScriptedHistogramTreeViewer_DefaultViewerTitle, Messages.ScriptedHistogramTreeViewer_DefaultXAxis, Messages.ScriptedHistogramTreeViewer_DefaultYAxis, 1);
+        return new ScriptedHistogramViewer(parent, settings, getSecondaryIdName());
+    }
+
+    @Override
+    protected @NonNull TmfViewer createLeftChildViewer(@Nullable Composite parent) {
+        return new ScriptedXYTreeViewer(Objects.requireNonNull(parent), getSecondaryIdName());
+    }
+
+    private String getSecondaryIdName() {
+        return getViewSite().getSecondaryId().replace(ScriptedHistogramView.COLON, ":"); //$NON-NLS-1$
+    }
+}
diff --git a/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/internal/scripting/ui/views/histogram/ScriptedHistogramViewer.java b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/internal/scripting/ui/views/histogram/ScriptedHistogramViewer.java
new file mode 100644
index 0000000..31134f9
--- /dev/null
+++ b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/internal/scripting/ui/views/histogram/ScriptedHistogramViewer.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2020 VMware
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License 2.0 which
+ * accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.incubator.internal.scripting.ui.views.histogram;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.tracecompass.tmf.core.presentation.IYAppearance;
+import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfFilteredXYChartViewer;
+import org.eclipse.tracecompass.tmf.ui.viewers.xycharts.linecharts.TmfXYChartSettings;
+
+/**
+ * Viewer for the {@link ScriptedHistogramView}
+ *
+ * @author Qing Chi
+ */
+public class ScriptedHistogramViewer extends TmfFilteredXYChartViewer {
+
+    private static final int DEFAULT_SERIES_WIDTH = 1;
+
+    public ScriptedHistogramViewer(Composite parent, TmfXYChartSettings settings, String providerId) {
+        super(parent, settings, providerId);
+    }
+
+    @Override
+    public IYAppearance getSeriesAppearance(@NonNull String seriesName) {
+        return getPresentationProvider().getAppearance(seriesName, IYAppearance.Type.BAR, DEFAULT_SERIES_WIDTH);
+    }
+
+}
diff --git a/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/internal/scripting/ui/views/histogram/messages.properties b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/internal/scripting/ui/views/histogram/messages.properties
new file mode 100644
index 0000000..301453b
--- /dev/null
+++ b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/internal/scripting/ui/views/histogram/messages.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2020 VMware
+#
+# All rights reserved. This program and the accompanying materials are
+# made available under the terms of the Eclipse Public License 2.0 which
+# accompanies this distribution, and is available at
+# https://www.eclipse.org/legal/epl-2.0
+#
+# SPDX-License-Identifier: EPL-2.0
+###############################################################################
+
+ScriptedHistogramTreeViewer_DefaultViewerTitle=Scripted Histogram Viewer
+ScriptedHistogramTreeViewer_DefaultXAxis=Time
+ScriptedHistogramTreeViewer_DefaultYAxis=Unit
diff --git a/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/scripting/ui/views/ViewModule.java b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/scripting/ui/views/ViewModule.java
index efda9f2..c507c21 100644
--- a/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/scripting/ui/views/ViewModule.java
+++ b/scripting/org.eclipse.tracecompass.incubator.scripting.ui/src/org/eclipse/tracecompass/incubator/scripting/ui/views/ViewModule.java
@@ -15,6 +15,7 @@
 import org.eclipse.ease.modules.WrapToScript;
 import org.eclipse.jdt.annotation.Nullable;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.tracecompass.incubator.internal.scripting.ui.views.histogram.ScriptedHistogramView;
 import org.eclipse.tracecompass.incubator.internal.scripting.ui.views.timegraph.ScriptedTimeGraphView;
 import org.eclipse.tracecompass.incubator.internal.scripting.ui.views.xychart.ScriptedXYView;
 import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphDataProvider;
@@ -149,4 +150,34 @@
 
         return activePage.showView(ScriptedXYView.ID, name.replace(":", ScriptedXYView.COLON), IWorkbenchPage.VIEW_ACTIVATE); //$NON-NLS-1$
     }
+
+    /**
+     * Open a histogram chart for a scripted XY data provider
+     *
+     * @param dataProvider
+     *            The data provider used to populate the view
+     */
+    @WrapToScript
+    public void openHistogramChartView(ITmfTreeXYDataProvider<ITmfTreeDataModel> dataProvider) {
+        Display.getDefault().asyncExec(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    IViewPart view = openHistogramView(dataProvider.getId());
+                    if (view == null) {
+                        return;
+                    }
+                } catch (final PartInitException e) {
+                    // Do nothing
+                }
+            }
+        });
+    }
+
+    private static @Nullable IViewPart openHistogramView(String name) throws PartInitException {
+        final IWorkbench wb = PlatformUI.getWorkbench();
+        final IWorkbenchPage activePage = wb.getActiveWorkbenchWindow().getActivePage();
+
+        return activePage.showView(ScriptedHistogramView.ID, name.replace(":", ScriptedHistogramView.COLON), IWorkbenchPage.VIEW_ACTIVATE); //$NON-NLS-1$
+    }
 }