Home | History | Annotate | Download | only in tko
      1 package autotest.tko;
      2 
      3 import autotest.common.Utils;
      4 import autotest.common.ui.ExtendedListBox;
      5 
      6 import com.google.gwt.event.dom.client.ChangeEvent;
      7 import com.google.gwt.event.dom.client.ChangeHandler;
      8 import com.google.gwt.event.dom.client.ClickEvent;
      9 import com.google.gwt.event.dom.client.ClickHandler;
     10 import com.google.gwt.user.client.ui.Anchor;
     11 import com.google.gwt.user.client.ui.CheckBox;
     12 import com.google.gwt.user.client.ui.Composite;
     13 import com.google.gwt.user.client.ui.FlexTable;
     14 import com.google.gwt.user.client.ui.HasHorizontalAlignment;
     15 import com.google.gwt.user.client.ui.HasVerticalAlignment;
     16 import com.google.gwt.user.client.ui.HorizontalPanel;
     17 import com.google.gwt.user.client.ui.Panel;
     18 import com.google.gwt.user.client.ui.TextBox;
     19 import com.google.gwt.user.client.ui.Widget;
     20 
     21 import java.util.ArrayList;
     22 import java.util.Collections;
     23 import java.util.HashSet;
     24 import java.util.List;
     25 import java.util.Map;
     26 import java.util.Set;
     27 
     28 public class SeriesSelector extends Composite {
     29 
     30     private FlexTable table = new FlexTable();
     31     private ArrayList<Series> series = new ArrayList<Series>();
     32     private Anchor addLink = new Anchor("[Add Series]");
     33     private boolean enabled = true;
     34     private boolean invertible = false;
     35     private final ChangeHandler handler;
     36 
     37     public class Series extends Composite {
     38 
     39         private FlexTable seriesTable = new FlexTable();
     40         private TextBox name = new TextBox();
     41         private CheckBox invert = new CheckBox("Invert y-axis");
     42         private ExtendedListBox values = new DBColumnSelector(DBColumnSelector.PERF_VIEW);
     43         private ExtendedListBox aggregation = new ExtendedListBox();
     44         private CheckBox errorBars = new CheckBox();
     45         private FilterSelector filter = new FilterSelector(DBColumnSelector.PERF_VIEW);
     46         private Anchor deleteLink = new Anchor("Delete Series");
     47         private int row;
     48 
     49         private Series(int aRow) {
     50             this.row = aRow;
     51             deleteLink.addClickHandler(new ClickHandler() {
     52                 public void onClick(ClickEvent event) {
     53                     if (enabled) {
     54                         deleteSeries(row);
     55                     }
     56                 }
     57             });
     58 
     59             name.addChangeHandler(handler);
     60 
     61             aggregation.addItem("AVG", "AVG(");
     62             aggregation.addItem("COUNT (DISTINCT)", "COUNT(DISTINCT ");
     63             aggregation.addItem("MIN", "MIN(");
     64             aggregation.addItem("MAX", "MAX(");
     65             aggregation.setSelectedIndex(0);
     66             aggregation.addChangeHandler(new ChangeHandler() {
     67                 public void onChange(ChangeEvent event) {
     68                     if (getAggregation().equals("AVG(")) {
     69                         errorBars.setEnabled(true);
     70                     } else {
     71                         errorBars.setEnabled(false);
     72                         errorBars.setValue(false);
     73                     }
     74                 }
     75             });
     76 
     77             errorBars.setText("error bars");
     78 
     79             Panel aggregationPanel = new HorizontalPanel();
     80             aggregationPanel.add(aggregation);
     81             aggregationPanel.add(errorBars);
     82 
     83             addControl("Name:", name);
     84             addControl("Values:", values);
     85             addControl("Aggregation:", aggregationPanel);
     86             addControl("Filters:", filter);
     87             seriesTable.getFlexCellFormatter().setVerticalAlignment(
     88                     seriesTable.getRowCount() - 1, 0, HasVerticalAlignment.ALIGN_TOP);
     89 
     90             seriesTable.setWidget(seriesTable.getRowCount() - 1, 2, deleteLink);
     91             seriesTable.getFlexCellFormatter().setHorizontalAlignment(
     92                     seriesTable.getRowCount() - 1, 2, HasHorizontalAlignment.ALIGN_RIGHT);
     93             seriesTable.getFlexCellFormatter().setVerticalAlignment(
     94                     seriesTable.getRowCount() - 1, 2, HasVerticalAlignment.ALIGN_BOTTOM);
     95 
     96             seriesTable.setWidget(0, 2, invert);
     97             seriesTable.getFlexCellFormatter().setHorizontalAlignment(
     98                     0, 2, HasHorizontalAlignment.ALIGN_RIGHT);
     99 
    100             initWidget(seriesTable);
    101         }
    102 
    103         private void addControl(String text, Widget control) {
    104             TkoUtils.addControlRow(seriesTable, text, control);
    105         }
    106 
    107         public String getAggregation() {
    108             return aggregation.getSelectedValue();
    109         }
    110 
    111         public ExtendedListBox getDBColumnSelector() {
    112             return values;
    113         }
    114 
    115         public boolean wantErrorBars() {
    116             return errorBars.getValue();
    117         }
    118 
    119         public String getName() {
    120             return name.getText();
    121         }
    122 
    123         public String getFilterString() {
    124             return filter.getFilterString();
    125         }
    126 
    127         public void setInverted(boolean isInverted) {
    128             invert.setValue(isInverted);
    129         }
    130 
    131         public void addToHistory(Map<String, String> args, int index) {
    132             args.put(parameterString("name", index), getName());
    133             args.put(parameterString("values", index), getDBColumnSelector().getSelectedValue());
    134             args.put(parameterString("aggregation", index), aggregation.getSelectedName());
    135             args.put(parameterString("errorBars", index), String.valueOf(wantErrorBars()));
    136             filter.addToHistory(args, parameterString("seriesFilters", index));
    137         }
    138 
    139         public void readHistoryArguments(Map<String, String> args, int index) {
    140             name.setText(args.get(parameterString("name", index)));
    141 
    142             String valueColumn = args.get(parameterString("values", index));
    143             getDBColumnSelector().selectByValue(valueColumn);
    144 
    145             String aggregationString = args.get(parameterString("aggregation", index));
    146             aggregation.selectByName(aggregationString);
    147 
    148             boolean errorBarsChecked =
    149                 Boolean.parseBoolean(args.get(parameterString("errorBars", index)));
    150             errorBars.setValue(errorBarsChecked);
    151 
    152             filter.handleHistoryArguments(args, parameterString("seriesFilters", index));
    153         }
    154     }
    155 
    156     public SeriesSelector(ChangeHandler handler) {
    157         this.handler = handler;
    158 
    159         addLink.addClickHandler(new ClickHandler() {
    160             public void onClick(ClickEvent event) {
    161                 if (enabled) {
    162                     addSeries();
    163                 }
    164             }
    165         });
    166         table.setWidget(0, 0, addLink);
    167         table.setText(0, 1, "");
    168 
    169         addSeries();
    170 
    171         initWidget(table);
    172     }
    173 
    174     public List<Series> getAllSeries() {
    175         return Collections.unmodifiableList(series);
    176     }
    177 
    178     public void reset() {
    179         for (int i = 0; i < series.size(); i++) {
    180             table.removeRow(0);
    181         }
    182         series.clear();
    183         addSeries();
    184     }
    185 
    186     public List<String> getInverted() {
    187         List<String> inverted = new ArrayList<String>();
    188         for (Series s : series) {
    189             if (s.invert.getValue()) {
    190                 inverted.add(s.getName());
    191             }
    192         }
    193         return inverted;
    194     }
    195 
    196     public void setInvertible(boolean invertible) {
    197         for (Series s : series) {
    198             s.invert.setEnabled(invertible);
    199             if (!invertible) {
    200                 s.invert.setValue(false);
    201             }
    202         }
    203         this.invertible = invertible;
    204     }
    205 
    206     private static String parameterString(String parameterName, int index) {
    207         return parameterName + "[" + index + "]";
    208     }
    209 
    210     protected void addToHistory(Map<String, String> args) {
    211         for (int index = 0; index < series.size(); index++) {
    212             series.get(index).addToHistory(args, index);
    213         }
    214         List<String> inverted = getInverted();
    215         if (!inverted.isEmpty()) {
    216             args.put("inverted", Utils.joinStrings(",", inverted));
    217         }
    218     }
    219 
    220     protected void handleHistoryArguments(Map<String, String> args) {
    221         String invertedString = args.get("inverted");
    222         Set<String> inverted = new HashSet<String>();
    223         if (invertedString != null) {
    224             for (String s : invertedString.split(",")) {
    225                 inverted.add(s);
    226             }
    227         }
    228 
    229         for (int index = 0; args.get(parameterString("name", index)) != null; index++) {
    230             Series thisSeries;
    231             if (index == 0) {
    232                 thisSeries = series.get(0);
    233             } else {
    234                 thisSeries = addSeries();
    235             }
    236 
    237             thisSeries.readHistoryArguments(args, index);
    238             thisSeries.setInverted(inverted.contains(thisSeries.getName()));
    239         }
    240     }
    241 
    242     private Series addSeries() {
    243         int row = table.getRowCount() - 1;
    244         Series nextSeries = new Series(row);
    245         nextSeries.invert.setEnabled(invertible);
    246         series.add(nextSeries);
    247         table.insertRow(row);
    248         table.setWidget(row, 0, nextSeries);
    249         table.getFlexCellFormatter().setColSpan(row, 0, 2);
    250         table.getFlexCellFormatter().setStylePrimaryName(row, 0, "box");
    251         return nextSeries;
    252     }
    253 
    254     private void deleteSeries(int row) {
    255         if (series.size() == 1) {
    256             reset();
    257             return;
    258         }
    259 
    260         series.remove(row);
    261         table.removeRow(row);
    262         for (int i = row; i < series.size(); i++) {
    263             series.get(i).row--;
    264         }
    265     }
    266 }
    267