| 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<String, String> args); |
| public abstract void handleHistoryArguments(Map<String, String> 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("<a href=\"http://"); |
| link.append(Window.Location.getHost()); |
| link.append(Window.Location.getPath()); |
| link.append("#"); |
| link.append(HISTORY_TOKEN); |
| link.append("="); |
| link.append(embeddedGraphId); |
| |
| link.append("\"><img border=\"0\" src=\"http://"); |
| link.append(Window.Location.getHost()); |
| |
| link.append(JsonRpcProxy.TKO_BASE_URL); |
| link.append("plot/?id="); |
| link.append(embeddedGraphId); |
| |
| link.append("&max_age=10"); |
| |
| link.append("\"></a>"); |
| |
| 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<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_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); |
| } |
| }); |
| } |
| } |