package autotest.tko; import autotest.common.CustomHistory; import autotest.common.JsonRpcCallback; import autotest.common.JsonRpcProxy; import autotest.common.Utils; import autotest.common.CustomHistory.CustomHistoryListener; import autotest.common.CustomHistory.HistoryToken; import autotest.common.ui.NotifyManager; import autotest.common.ui.SimpleDialog; import autotest.tko.TableView.TableSwitchListener; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; 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.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.Widget; import java.util.Map; public abstract class GraphingFrontend extends Composite implements CustomHistoryListener, ClickHandler { public static final String HISTORY_TOKEN = "embedded_query"; protected FlexTable table = new FlexTable(); protected JsonRpcProxy rpcProxy = JsonRpcProxy.getProxy(); protected Anchor embeddingLink = new Anchor("[Link to this graph]"); protected TableSwitchListener listener; public abstract void refresh(); public abstract void addToHistory(Map args); public abstract void handleHistoryArguments(Map args); /** * This function allows subclasses to add parameters to the call to get_embedding_id() RPC, * called when a user requests an embeddable link to a graph. */ protected abstract void addAdditionalEmbeddingParams(JSONObject params); /** * @return a short text ID for the frontend */ public abstract String getFrontendId(); protected GraphingFrontend() { CustomHistory.addHistoryListener(this); embeddingLink.addClickHandler(this); } public void onClick(ClickEvent event) { assert event.getSource() == embeddingLink; JSONObject params = new JSONObject(); params.put("url_token", new JSONString(CustomHistory.getLastHistoryToken().toString())); addAdditionalEmbeddingParams(params); rpcProxy.rpcCall("get_embedding_id", params, new JsonRpcCallback() { @Override public void onSuccess(JSONValue result) { String id = Utils.jsonToString(result); showEmbeddedGraphHtml(id); } }); } private void showEmbeddedGraphHtml(String embeddedGraphId) { StringBuilder link = new StringBuilder(); link.append(""); TextBox linkBox = new TextBox(); linkBox.setText(link.toString()); linkBox.setWidth("100%"); linkBox.setSelectionRange(0, link.length()); new SimpleDialog("Paste HTML to embed in website:", linkBox).center(); } protected void setListener(TableSwitchListener listener) { this.listener = listener; } protected void addControl(String text, Widget control) { int row = TkoUtils.addControlRow(table, text, control); table.getFlexCellFormatter().setColSpan(row, 1, 2); table.getFlexCellFormatter().setWidth(row, 1, "100%"); table.getFlexCellFormatter().setVerticalAlignment(row, 0, HasVerticalAlignment.ALIGN_TOP); } // TODO(showard): merge this with the code from SavedQueriesControl public void onHistoryChanged(Map 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_embedded_query_url_token", args, new JsonRpcCallback() { @Override public void onSuccess(JSONValue result) { String tokenString = Utils.jsonToString(result); HistoryToken token; try { token = HistoryToken.fromString(tokenString); } catch (IllegalArgumentException exc) { NotifyManager.getInstance().showError("Invalid embedded 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, idString); CustomHistory.newItem(shortToken); CustomHistory.simulateHistoryToken(token); } }); } }