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 = new ArrayList(); 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 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 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 getAllSeries() { return Collections.unmodifiableList(series); } public void reset() { for (int i = 0; i < series.size(); i++) { table.removeRow(0); } series.clear(); addSeries(); } public List getInverted() { List inverted = new ArrayList(); 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 args) { for (int index = 0; index < series.size(); index++) { series.get(index).addToHistory(args, index); } List inverted = getInverted(); if (!inverted.isEmpty()) { args.put("inverted", Utils.joinStrings(",", inverted)); } } protected void handleHistoryArguments(Map args) { String invertedString = args.get("inverted"); Set inverted = new HashSet(); 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--; } } }