blob: 2a1a31a2f9d3229c103cf9c1d8f36fc06e1aa362 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2018 IBM Corporation.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - Jeff Briggs, Henry Hughes, Ryan Morse
* Red Hat - Ongoing maintenance
*******************************************************************************/
package org.eclipse.linuxtools.systemtap.graphing.ui.widgets;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.linuxtools.systemtap.graphing.core.datasets.IDataSet;
import org.eclipse.linuxtools.systemtap.graphing.core.structures.GraphData;
import org.eclipse.linuxtools.systemtap.graphing.ui.charts.AbstractChartBuilder;
import org.eclipse.linuxtools.systemtap.graphing.ui.wizards.graph.GraphFactory;
import org.eclipse.linuxtools.systemtap.structures.listeners.IUpdateListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
/**
* A Composite type to contain a Graph object.
*/
public class GraphComposite extends Composite {
private final Composite xControl;
private final Composite yControl;
private boolean sidebarVisible = false;
private AbstractChartBuilder builder;
private List<Button> checkOptions;
private Composite checkOptionComp;
/**
* The default constructor: creates an internal composite for the Graph to render on, asks GraphFactory
* to create the graph from the given GraphData and DataSet, then initializes all buttons and listeners.
* @param parent Parent composite.
* @param style Style of the widget to create
* @param gd Graph information.
* @param ds Data set for the graph.
*/
public GraphComposite(Composite parent, int style, GraphData gd, IDataSet ds) {
super(parent, style);
FormLayout layout = new FormLayout();
layout.marginWidth = 5;
layout.marginHeight = 5;
this.setLayout(layout);
checkOptions = new ArrayList<>();
checkOptionComp = new Composite(this, style);
checkOptionComp.setLayout(new RowLayout(SWT.VERTICAL));
FormData data = new FormData();
data.bottom = new FormAttachment(100, 0);
data.right = new FormAttachment(100, 0);
checkOptionComp.setLayoutData(data);
builder = GraphFactory.createGraph(this, style, gd, ds);
xControl = GraphFactory.createGraphXControl(this, style);
yControl = GraphFactory.createGraphYControl(this, style);
if (xControl instanceof IUpdateListener) {
builder.addUpdateListener((IUpdateListener) xControl);
}
if (yControl instanceof IUpdateListener) {
builder.addUpdateListener((IUpdateListener) yControl);
}
configure(true);
builder.build();
}
/**
* Toggles sidebar visible or not visible.
* @param withSidebar Enables or disables the sidebar.
*/
private void configure(boolean withSidebar) {
sidebarVisible = withSidebar;
for (Button b : checkOptions) {
b.setVisible(withSidebar);
}
if (xControl != null) {
xControl.setVisible(withSidebar);
}
if (yControl != null) {
yControl.setVisible(withSidebar);
}
FormData data = new FormData();
data.top = new FormAttachment(0,0);
data.right = withSidebar ? new FormAttachment(checkOptionComp, 0) : new FormAttachment(100, 0);
data.bottom = withSidebar && xControl != null ? new FormAttachment(xControl, 0) : new FormAttachment(100, 0);
data.left = withSidebar && yControl != null ? new FormAttachment(yControl, 0) : new FormAttachment(0, 0);
builder.setLayoutData(data);
layout(true, true);
}
public void addCheckOption(final String title, final SelectionListener listener) {
Display.getDefault().syncExec(() -> {
Button b = new Button(checkOptionComp, SWT.CHECK);
b.setText(title);
b.addSelectionListener(listener);
checkOptions.add(b);
b.setSelection(true);
if (sidebarVisible) {
configure(true);
}
});
}
/**
* Returns the graph that is rendering to this composite.
* @return The AbstractChartBuilder to put data into.
*/
public AbstractChartBuilder getCanvas() {
return builder;
}
/**
* Set the visibility of the graph's legend.
* @param visible Set this to <code>true</code> to show the legend,
* or <code>false</code> to hide it.
* @since 3.0
*/
public void setLegendVisible(boolean visible) {
builder.getChart().getLegend().setVisible(visible);
builder.handleUpdateEvent();
}
/**
* Set the visibility of the graph's title.
* @param visible Set this to <code>true</code> to show the title,
* or <code>false</code> to hide it.
* @since 3.1
*/
public void setTitleVisible(boolean visible) {
builder.getChart().getTitle().setVisible(visible);
builder.handleUpdateEvent();
}
}