// -*- mode: java; c-basic-offset: 2; -*-
// Copyright 2009-2011 Google, All Rights reserved
// Copyright 2011-2012 MIT, All rights reserved
// Released under the Apache License, Version 2.0
// http://www.apache.org/licenses/LICENSE-2.0
package com.google.appinventor.client.explorer.commands;
import com.google.appinventor.client.Ode;
import com.google.appinventor.client.editor.youngandroid.BlocklyPanel;
import com.google.appinventor.client.output.OdeLog;
import com.google.appinventor.shared.rpc.project.ProjectNode;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import static com.google.appinventor.client.Ode.MESSAGES;
/**
* Command for displaying a barcode for the target of a project.
*
* <p/>This command is often chained with SaveAllEditorsCommand and BuildCommand.
*
* @author markf@google.com (Mark Friedman)
*/
public class ShowBarcodeCommand extends ChainableCommand {
// The build target
private String target;
/**
* Creates a new command for showing a barcode for the target of a project.
*
* @param target the build target
*/
public ShowBarcodeCommand(String target) {
// Since we don't know when the barcode dialog is finished, we can't
// support a command after this one.
super(null); // no next command
this.target = target;
}
@Override
public boolean willCallExecuteNextCommand() {
return false;
}
@Override
public void execute(final ProjectNode node) {
// Display a barcode for an url pointing at our server's download servlet
String barcodeUrl = GWT.getHostPageBaseURL()
+ "b/" + Ode.getInstance().getNonce();
OdeLog.log("Barcode url is: " + barcodeUrl);
new BarcodeDialogBox(node.getName(), barcodeUrl).center();
}
static class BarcodeDialogBox extends DialogBox {
BarcodeDialogBox(String projectName, String appInstallUrl) {
super(false, true);
setStylePrimaryName("ode-DialogBox");
setText(MESSAGES.barcodeTitle(projectName));
ClickHandler buttonHandler = new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
hide();
}
};
Button cancelButton = new Button(MESSAGES.cancelButton());
cancelButton.addClickHandler(buttonHandler);
Button okButton = new Button(MESSAGES.okButton());
okButton.addClickHandler(buttonHandler);
HTML barcodeQrcode = new HTML("<center>" + BlocklyPanel.getQRCode(appInstallUrl) + "</center>");
HorizontalPanel buttonPanel = new HorizontalPanel();
buttonPanel.setHorizontalAlignment(HorizontalPanel.ALIGN_CENTER);
HTML warningLabel = new HTML(MESSAGES.barcodeWarning(
"<a href=\"" + "http://appinventor.mit.edu/explore/ai2/share.html" +
"\" target=\"_blank\">",
"</a>"));
warningLabel.setWordWrap(true);
warningLabel.setWidth("200px"); // set width to get the text to wrap
HorizontalPanel warningPanel = new HorizontalPanel();
warningPanel.setHorizontalAlignment(HorizontalPanel.ALIGN_LEFT);
warningPanel.add(warningLabel);
// The cancel button is removed from the panel since it has no meaning in this
// context. But the logic is still here in case we want to restore it, and as
// an example of how to code this stuff in GWT.
// buttonPanel.add(cancelButton);
buttonPanel.add(okButton);
buttonPanel.setSize("100%", "24px");
VerticalPanel contentPanel = new VerticalPanel();
contentPanel.add(barcodeQrcode);
contentPanel.add(buttonPanel);
contentPanel.add(warningPanel);
// contentPanel.setSize("320px", "100%");
add(contentPanel);
}
}
}