package autotest.tko;
import autotest.common.CustomHistory;
import autotest.common.JSONArrayList;
import autotest.common.JsonRpcCallback;
import autotest.common.JsonRpcProxy;
import autotest.common.StaticDataRepository;
import autotest.common.CustomHistory.CustomHistoryListener;
import autotest.common.CustomHistory.HistoryToken;
import autotest.common.ui.NotifyManager;
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.json.client.JSONArray;
import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import java.util.Map;
class SavedQueriesControl extends Composite
implements ChangeHandler, ClickHandler, CustomHistoryListener {
public static final String HISTORY_TOKEN = "saved_query";
private static final String ADD_QUERY = "Save current...";
private static final String DELETE_QUERY = "Delete query...";
private static final String DEFAULT_ITEM = "Saved queries...";
private static JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy();
private static NotifyManager notifyManager = NotifyManager.getInstance();
private ListBox queryList = new ListBox();
private QueryActionDialog<TextBox> addQueryDialog;
private QueryActionDialog<ListBox> deleteQueryDialog;
private static class QueryActionDialog<T extends Widget> extends DialogBox {
public T widget;
public Button actionButton, cancelButton;
public QueryActionDialog(T widget, String widgetString, String actionString) {
super(false, true);
this.widget = widget;
Panel dialogPanel = new VerticalPanel();
Panel widgetPanel = new HorizontalPanel();
widgetPanel.add(new Label(widgetString));
widgetPanel.add(widget);
dialogPanel.add(widgetPanel);
Panel buttonPanel = new HorizontalPanel();
actionButton = new Button(actionString);
cancelButton = new Button("Cancel");
buttonPanel.add(actionButton);
buttonPanel.add(cancelButton);
dialogPanel.add(buttonPanel);
add(dialogPanel);
cancelButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
hide();
}
});
}
}
public SavedQueriesControl() {
queryList.addChangeHandler(this);
populateMainList();
initWidget(queryList);
addQueryDialog = new QueryActionDialog<TextBox>(new TextBox(),
"Enter query name:", "Save query");
addQueryDialog.actionButton.addClickHandler(this);
deleteQueryDialog = new QueryActionDialog<ListBox>(new ListBox(),
"Select query:", "Delete query");
deleteQueryDialog.actionButton.addClickHandler(this);
CustomHistory.addHistoryListener(this);
}
private void populateMainList() {
queryList.clear();
queryList.addItem(DEFAULT_ITEM);
queryList.addItem(ADD_QUERY);
queryList.addItem(DELETE_QUERY);
fillQueryList(queryList);
}
private void fillQueryList(final ListBox list) {
StaticDataRepository staticData = StaticDataRepository.getRepository();
JSONObject args = new JSONObject();
args.put("owner", new JSONString(staticData.getCurrentUserLogin()));
rpcProxy.rpcCall("get_saved_queries", args, new JsonRpcCallback() {
@Override
public void onSuccess(JSONValue result) {
for (JSONObject query : new JSONArrayList<JSONObject>(result.isArray())) {
int id = (int) query.get("id").isNumber().doubleValue();
list.addItem(query.get("name").isString().stringValue(),
Integer.toString(id));
}
}
});
}
@Override
public void onChange(ChangeEvent event) {
int selected = queryList.getSelectedIndex();
queryList.setSelectedIndex(0); // set it back to the default
String queryName = queryList.getItemText(selected);
if (queryName.equals(DEFAULT_ITEM)) {
return;
}
if (queryName.equals(ADD_QUERY)) {
addQueryDialog.widget.setText("");
addQueryDialog.center();
addQueryDialog.widget.setFocus(true);
return;
}
if (queryName.equals(DELETE_QUERY)) {
deleteQueryDialog.widget.clear();
fillQueryList(deleteQueryDialog.widget);
deleteQueryDialog.center();
return;
}
String idString = queryList.getValue(selected);
// don't use CustomHistory, since we want the token to be processed
History.newItem(HISTORY_TOKEN + "=" + idString);
}
public void onClick(ClickEvent event) {
if (event.getSource() == addQueryDialog.actionButton) {
addQueryDialog.hide();
JSONObject args = new JSONObject();
args.put("name", new JSONString(addQueryDialog.widget.getText()));
args.put("url_token", new JSONString(CustomHistory.getLastHistoryToken().toString()));
rpcProxy.rpcCall("add_saved_query", args, new JsonRpcCallback() {
@Override
public void onSuccess(JSONValue result) {
notifyManager.showMessage("Query saved");
populateMainList();
}
});
} else {
assert event.getSource() == deleteQueryDialog.actionButton;
deleteQueryDialog.hide();
String idString =
deleteQueryDialog.widget.getValue(deleteQueryDialog.widget.getSelectedIndex());
JSONObject args = new JSONObject();
JSONArray ids = new JSONArray();
ids.set(0, new JSONNumber(Integer.parseInt(idString)));
args.put("id_list", ids);
rpcProxy.rpcCall("delete_saved_queries", args, new JsonRpcCallback() {
@Override
public void onSuccess(JSONValue result) {
notifyManager.showMessage("Query deleted");
populateMainList();
}
});
}
}
public void onHistoryChanged(Map<String, String> arguments) {
final String idString = arguments.get(HISTORY_TOKEN);
if (idString == null) {
return;
}
JSONObject args = new JSONObject();
args.put("id", new JSONNumber(Integer.parseInt(idString)));
rpcProxy.rpcCall("get_saved_queries", args, new JsonRpcCallback() {
@Override
public void onSuccess(JSONValue result) {
JSONArray queries = result.isArray();
if (queries.size() == 0) {
notifyManager.showError("No saved query with ID " + idString);
return;
}
assert queries.size() == 1;
JSONObject query = queries.get(0).isObject();
int queryId = (int) query.get("id").isNumber().doubleValue();
String tokenString = query.get("url_token").isString().stringValue();
HistoryToken token;
try {
token = HistoryToken.fromString(tokenString);
} catch (IllegalArgumentException exc) {
NotifyManager.getInstance().showError("Invalid saved query token " +
tokenString);
return;
}
// since this is happening asynchronously, the history may have changed, so ensure
// it's set back to what it should be.
HistoryToken shortToken = new HistoryToken();
shortToken.put(HISTORY_TOKEN, Integer.toString(queryId));
CustomHistory.newItem(shortToken);
CustomHistory.simulateHistoryToken(token);
}
});
}
}