blob: 386a707aab2907c243d87ee06ba2310bd8089ae4 [file] [log] [blame]
package autotest.tko;
import autotest.common.Utils;
import autotest.common.ui.ExtendedListBox;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class SeriesSelector extends Composite {
private FlexTable table = new FlexTable();
private ArrayList<Series> series = new ArrayList<Series>();
private Anchor addLink = new Anchor("[Add Series]");
private boolean enabled = true;
private boolean invertible = false;
private final ChangeHandler handler;
public class Series extends Composite {
private FlexTable seriesTable = new FlexTable();
private TextBox name = new TextBox();
private CheckBox invert = new CheckBox("Invert y-axis");
private ExtendedListBox values = new DBColumnSelector(DBColumnSelector.PERF_VIEW);
private ExtendedListBox aggregation = new ExtendedListBox();
private CheckBox errorBars = new CheckBox();
private FilterSelector filter = new FilterSelector(DBColumnSelector.PERF_VIEW);
private Anchor deleteLink = new Anchor("Delete Series");
private int row;
private Series(int aRow) {
this.row = aRow;
deleteLink.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
if (enabled) {
deleteSeries(row);
}
}
});
name.addChangeHandler(handler);
aggregation.addItem("AVG", "AVG(");
aggregation.addItem("COUNT (DISTINCT)", "COUNT(DISTINCT ");
aggregation.addItem("MIN", "MIN(");
aggregation.addItem("MAX", "MAX(");
aggregation.setSelectedIndex(0);
aggregation.addChangeHandler(new ChangeHandler() {
public void onChange(ChangeEvent event) {
if (getAggregation().equals("AVG(")) {
errorBars.setEnabled(true);
} else {
errorBars.setEnabled(false);
errorBars.setValue(false);
}
}
});
errorBars.setText("error bars");
Panel aggregationPanel = new HorizontalPanel();
aggregationPanel.add(aggregation);
aggregationPanel.add(errorBars);
addControl("Name:", name);
addControl("Values:", values);
addControl("Aggregation:", aggregationPanel);
addControl("Filters:", filter);
seriesTable.getFlexCellFormatter().setVerticalAlignment(
seriesTable.getRowCount() - 1, 0, HasVerticalAlignment.ALIGN_TOP);
seriesTable.setWidget(seriesTable.getRowCount() - 1, 2, deleteLink);
seriesTable.getFlexCellFormatter().setHorizontalAlignment(
seriesTable.getRowCount() - 1, 2, HasHorizontalAlignment.ALIGN_RIGHT);
seriesTable.getFlexCellFormatter().setVerticalAlignment(
seriesTable.getRowCount() - 1, 2, HasVerticalAlignment.ALIGN_BOTTOM);
seriesTable.setWidget(0, 2, invert);
seriesTable.getFlexCellFormatter().setHorizontalAlignment(
0, 2, HasHorizontalAlignment.ALIGN_RIGHT);
initWidget(seriesTable);
}
private void addControl(String text, Widget control) {
TkoUtils.addControlRow(seriesTable, text, control);
}
public String getAggregation() {
return aggregation.getSelectedValue();
}
public ExtendedListBox getDBColumnSelector() {
return values;
}
public boolean wantErrorBars() {
return errorBars.getValue();
}
public String getName() {
return name.getText();
}
public String getFilterString() {
return filter.getFilterString();
}
public void setInverted(boolean isInverted) {
invert.setValue(isInverted);
}
public void addToHistory(Map<String, String> args, int index) {
args.put(parameterString("name", index), getName());
args.put(parameterString("values", index), getDBColumnSelector().getSelectedValue());
args.put(parameterString("aggregation", index), aggregation.getSelectedName());
args.put(parameterString("errorBars", index), String.valueOf(wantErrorBars()));
filter.addToHistory(args, parameterString("seriesFilters", index));
}
public void readHistoryArguments(Map<String, String> args, int index) {
name.setText(args.get(parameterString("name", index)));
String valueColumn = args.get(parameterString("values", index));
getDBColumnSelector().selectByValue(valueColumn);
String aggregationString = args.get(parameterString("aggregation", index));
aggregation.selectByName(aggregationString);
boolean errorBarsChecked =
Boolean.parseBoolean(args.get(parameterString("errorBars", index)));
errorBars.setValue(errorBarsChecked);
filter.handleHistoryArguments(args, parameterString("seriesFilters", index));
}
}
public SeriesSelector(ChangeHandler handler) {
this.handler = handler;
addLink.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
if (enabled) {
addSeries();
}
}
});
table.setWidget(0, 0, addLink);
table.setText(0, 1, "");
addSeries();
initWidget(table);
}
public List<Series> getAllSeries() {
return Collections.unmodifiableList(series);
}
public void reset() {
for (int i = 0; i < series.size(); i++) {
table.removeRow(0);
}
series.clear();
addSeries();
}
public List<String> getInverted() {
List<String> inverted = new ArrayList<String>();
for (Series s : series) {
if (s.invert.getValue()) {
inverted.add(s.getName());
}
}
return inverted;
}
public void setInvertible(boolean invertible) {
for (Series s : series) {
s.invert.setEnabled(invertible);
if (!invertible) {
s.invert.setValue(false);
}
}
this.invertible = invertible;
}
private static String parameterString(String parameterName, int index) {
return parameterName + "[" + index + "]";
}
protected void addToHistory(Map<String, String> args) {
for (int index = 0; index < series.size(); index++) {
series.get(index).addToHistory(args, index);
}
List<String> inverted = getInverted();
if (!inverted.isEmpty()) {
args.put("inverted", Utils.joinStrings(",", inverted));
}
}
protected void handleHistoryArguments(Map<String, String> args) {
String invertedString = args.get("inverted");
Set<String> inverted = new HashSet<String>();
if (invertedString != null) {
for (String s : invertedString.split(",")) {
inverted.add(s);
}
}
for (int index = 0; args.get(parameterString("name", index)) != null; index++) {
Series thisSeries;
if (index == 0) {
thisSeries = series.get(0);
} else {
thisSeries = addSeries();
}
thisSeries.readHistoryArguments(args, index);
thisSeries.setInverted(inverted.contains(thisSeries.getName()));
}
}
private Series addSeries() {
int row = table.getRowCount() - 1;
Series nextSeries = new Series(row);
nextSeries.invert.setEnabled(invertible);
series.add(nextSeries);
table.insertRow(row);
table.setWidget(row, 0, nextSeries);
table.getFlexCellFormatter().setColSpan(row, 0, 2);
table.getFlexCellFormatter().setStylePrimaryName(row, 0, "box");
return nextSeries;
}
private void deleteSeries(int row) {
if (series.size() == 1) {
reset();
return;
}
series.remove(row);
table.removeRow(row);
for (int i = row; i < series.size(); i++) {
series.get(i).row--;
}
}
}