Home | History | Annotate | Download | only in tko
      1 package autotest.tko;
      2 
      3 import autotest.common.CustomHistory;
      4 import autotest.common.JSONArrayList;
      5 import autotest.common.JsonRpcCallback;
      6 import autotest.common.JsonRpcProxy;
      7 import autotest.common.StaticDataRepository;
      8 import autotest.common.CustomHistory.CustomHistoryListener;
      9 import autotest.common.CustomHistory.HistoryToken;
     10 import autotest.common.ui.NotifyManager;
     11 
     12 import com.google.gwt.event.dom.client.ChangeEvent;
     13 import com.google.gwt.event.dom.client.ChangeHandler;
     14 import com.google.gwt.event.dom.client.ClickEvent;
     15 import com.google.gwt.event.dom.client.ClickHandler;
     16 import com.google.gwt.json.client.JSONArray;
     17 import com.google.gwt.json.client.JSONNumber;
     18 import com.google.gwt.json.client.JSONObject;
     19 import com.google.gwt.json.client.JSONString;
     20 import com.google.gwt.json.client.JSONValue;
     21 import com.google.gwt.user.client.History;
     22 import com.google.gwt.user.client.ui.Button;
     23 import com.google.gwt.user.client.ui.Composite;
     24 import com.google.gwt.user.client.ui.DialogBox;
     25 import com.google.gwt.user.client.ui.HorizontalPanel;
     26 import com.google.gwt.user.client.ui.Label;
     27 import com.google.gwt.user.client.ui.ListBox;
     28 import com.google.gwt.user.client.ui.Panel;
     29 import com.google.gwt.user.client.ui.TextBox;
     30 import com.google.gwt.user.client.ui.VerticalPanel;
     31 import com.google.gwt.user.client.ui.Widget;
     32 
     33 import java.util.Map;
     34 
     35 class SavedQueriesControl extends Composite
     36                           implements ChangeHandler, ClickHandler, CustomHistoryListener {
     37     public static final String HISTORY_TOKEN = "saved_query";
     38 
     39     private static final String ADD_QUERY = "Save current...";
     40     private static final String DELETE_QUERY = "Delete query...";
     41     private static final String DEFAULT_ITEM = "Saved queries...";
     42 
     43     private static JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
     44     private static NotifyManager notifyManager = NotifyManager.getInstance();
     45 
     46     private ListBox queryList = new ListBox();
     47     private QueryActionDialog<TextBox> addQueryDialog;
     48     private QueryActionDialog<ListBox> deleteQueryDialog;
     49 
     50     private static class QueryActionDialog<T extends Widget> extends DialogBox {
     51         public T widget;
     52         public Button actionButton, cancelButton;
     53 
     54         public QueryActionDialog(T widget, String widgetString, String actionString) {
     55             super(false, true);
     56             this.widget = widget;
     57             Panel dialogPanel = new VerticalPanel();
     58             Panel widgetPanel = new HorizontalPanel();
     59             widgetPanel.add(new Label(widgetString));
     60             widgetPanel.add(widget);
     61             dialogPanel.add(widgetPanel);
     62 
     63             Panel buttonPanel = new HorizontalPanel();
     64             actionButton = new Button(actionString);
     65             cancelButton = new Button("Cancel");
     66             buttonPanel.add(actionButton);
     67             buttonPanel.add(cancelButton);
     68             dialogPanel.add(buttonPanel);
     69             add(dialogPanel);
     70 
     71             cancelButton.addClickHandler(new ClickHandler() {
     72                 public void onClick(ClickEvent event) {
     73                     hide();
     74                 }
     75             });
     76         }
     77     }
     78 
     79     public SavedQueriesControl() {
     80         queryList.addChangeHandler(this);
     81         populateMainList();
     82         initWidget(queryList);
     83 
     84         addQueryDialog = new QueryActionDialog<TextBox>(new TextBox(),
     85                                                         "Enter query name:", "Save query");
     86         addQueryDialog.actionButton.addClickHandler(this);
     87         deleteQueryDialog = new QueryActionDialog<ListBox>(new ListBox(),
     88                                                            "Select query:", "Delete query");
     89         deleteQueryDialog.actionButton.addClickHandler(this);
     90 
     91         CustomHistory.addHistoryListener(this);
     92     }
     93 
     94     private void populateMainList() {
     95         queryList.clear();
     96         queryList.addItem(DEFAULT_ITEM);
     97         queryList.addItem(ADD_QUERY);
     98         queryList.addItem(DELETE_QUERY);
     99         fillQueryList(queryList);
    100     }
    101 
    102     private void fillQueryList(final ListBox list) {
    103         StaticDataRepository staticData = StaticDataRepository.getRepository();
    104         JSONObject args = new JSONObject();
    105         args.put("owner", new JSONString(staticData.getCurrentUserLogin()));
    106         rpcProxy.rpcCall("get_saved_queries", args, new JsonRpcCallback() {
    107             @Override
    108             public void onSuccess(JSONValue result) {
    109                 for (JSONObject query : new JSONArrayList<JSONObject>(result.isArray())) {
    110                     int id = (int) query.get("id").isNumber().doubleValue();
    111                     list.addItem(query.get("name").isString().stringValue(),
    112                                  Integer.toString(id));
    113                 }
    114             }
    115         });
    116     }
    117 
    118     @Override
    119     public void onChange(ChangeEvent event) {
    120         int selected = queryList.getSelectedIndex();
    121         queryList.setSelectedIndex(0); // set it back to the default
    122 
    123         String queryName = queryList.getItemText(selected);
    124         if (queryName.equals(DEFAULT_ITEM)) {
    125             return;
    126         }
    127         if (queryName.equals(ADD_QUERY)) {
    128             addQueryDialog.widget.setText("");
    129             addQueryDialog.center();
    130             addQueryDialog.widget.setFocus(true);
    131             return;
    132         }
    133         if (queryName.equals(DELETE_QUERY)) {
    134             deleteQueryDialog.widget.clear();
    135             fillQueryList(deleteQueryDialog.widget);
    136             deleteQueryDialog.center();
    137             return;
    138         }
    139 
    140         String idString = queryList.getValue(selected);
    141         // don't use CustomHistory, since we want the token to be processed
    142         History.newItem(HISTORY_TOKEN + "=" + idString);
    143     }
    144 
    145     public void onClick(ClickEvent event) {
    146         if (event.getSource() == addQueryDialog.actionButton) {
    147             addQueryDialog.hide();
    148             JSONObject args = new JSONObject();
    149             args.put("name", new JSONString(addQueryDialog.widget.getText()));
    150             args.put("url_token", new JSONString(CustomHistory.getLastHistoryToken().toString()));
    151             rpcProxy.rpcCall("add_saved_query", args, new JsonRpcCallback() {
    152                 @Override
    153                 public void onSuccess(JSONValue result) {
    154                     notifyManager.showMessage("Query saved");
    155                     populateMainList();
    156                 }
    157             });
    158         } else {
    159             assert event.getSource() == deleteQueryDialog.actionButton;
    160             deleteQueryDialog.hide();
    161             String idString =
    162                 deleteQueryDialog.widget.getValue(deleteQueryDialog.widget.getSelectedIndex());
    163             JSONObject args = new JSONObject();
    164             JSONArray ids = new JSONArray();
    165             ids.set(0, new JSONNumber(Integer.parseInt(idString)));
    166             args.put("id_list", ids);
    167             rpcProxy.rpcCall("delete_saved_queries", args, new JsonRpcCallback() {
    168                 @Override
    169                 public void onSuccess(JSONValue result) {
    170                     notifyManager.showMessage("Query deleted");
    171                     populateMainList();
    172                 }
    173             });
    174         }
    175     }
    176 
    177     public void onHistoryChanged(Map<String, String> arguments) {
    178         final String idString = arguments.get(HISTORY_TOKEN);
    179         if (idString == null) {
    180             return;
    181         }
    182 
    183         JSONObject args = new JSONObject();
    184         args.put("id", new JSONNumber(Integer.parseInt(idString)));
    185         rpcProxy.rpcCall("get_saved_queries", args, new JsonRpcCallback() {
    186             @Override
    187             public void onSuccess(JSONValue result) {
    188                 JSONArray queries = result.isArray();
    189                 if (queries.size() == 0) {
    190                     notifyManager.showError("No saved query with ID " + idString);
    191                     return;
    192                 }
    193 
    194                 assert queries.size() == 1;
    195                 JSONObject query = queries.get(0).isObject();
    196                 int queryId = (int) query.get("id").isNumber().doubleValue();
    197                 String tokenString = query.get("url_token").isString().stringValue();
    198                 HistoryToken token;
    199                 try {
    200                     token = HistoryToken.fromString(tokenString);
    201                 } catch (IllegalArgumentException exc) {
    202                     NotifyManager.getInstance().showError("Invalid saved query token " +
    203                                                           tokenString);
    204                     return;
    205                 }
    206 
    207                 // since this is happening asynchronously, the history may have changed, so ensure
    208                 // it's set back to what it should be.
    209                 HistoryToken shortToken = new HistoryToken();
    210                 shortToken.put(HISTORY_TOKEN, Integer.toString(queryId));
    211                 CustomHistory.newItem(shortToken);
    212 
    213                 CustomHistory.simulateHistoryToken(token);
    214             }
    215         });
    216     }
    217 }
    218