// -*- 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.wizards.youngandroid; import java.util.regex.Pattern; import com.google.appinventor.client.Ode; import static com.google.appinventor.client.Ode.MESSAGES; import com.google.appinventor.client.explorer.project.Project; import com.google.appinventor.client.explorer.youngandroid.ProjectToolbar; import com.google.appinventor.client.tracking.Tracking; import com.google.appinventor.client.widgets.LabeledTextBox; import com.google.appinventor.client.widgets.Validator; import com.google.appinventor.client.wizards.NewProjectWizard; import com.google.appinventor.client.youngandroid.TextValidators; import com.google.appinventor.common.utils.StringUtils; import com.google.appinventor.shared.rpc.project.youngandroid.NewYoungAndroidProjectParameters; import com.google.appinventor.shared.rpc.project.youngandroid.YoungAndroidProjectNode; import com.google.appinventor.client.youngandroid.TextValidators; import com.google.gwt.core.client.Scheduler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.DeferredCommand; import com.google.gwt.user.client.ui.VerticalPanel; /** * Wizard for creating new Young Android projects. * * @author markf@google.com (Mark Friedman) */ public final class NewYoungAndroidProjectWizard extends NewProjectWizard { // UI element for project name private LabeledTextBox projectNameTextBox; /** * Creates a new YoungAndroid project wizard. */ public NewYoungAndroidProjectWizard(final ProjectToolbar toolbar) { super(MESSAGES.newYoungAndroidProjectWizardCaption()); // Initialize the UI setStylePrimaryName("ode-DialogBox"); projectNameTextBox = new LabeledTextBox(MESSAGES.projectNameLabel(), new Validator() { @Override public boolean validate(String value) { errorMessage = TextValidators.getErrorMessage(value); if (errorMessage.length()>0){ disableOkButton(); return false; } enableOkButton(); return true; } @Override public String getErrorMessage() { return errorMessage; } }); projectNameTextBox.getTextBox().addKeyDownHandler(new KeyDownHandler() { @Override public void onKeyDown(KeyDownEvent event) { int keyCode = event.getNativeKeyCode(); if (keyCode == KeyCodes.KEY_ENTER) { handleOkClick(); } else if (keyCode == KeyCodes.KEY_ESCAPE) { handleCancelClick(); } } }); projectNameTextBox.getTextBox().addKeyUpHandler(new KeyUpHandler() { @Override public void onKeyUp(KeyUpEvent event) { //Validate the text each time a key is lifted projectNameTextBox.validate(); } }); VerticalPanel page = new VerticalPanel(); page.add(projectNameTextBox); addPage(page); // Create cancel command handler. This handler // arranges to re-enable the project start button // Note that toolbar will be null if we are called // from the Project menu instead of the Start button // on the project toolbar if (toolbar != null) { initCancelCommand(new Command() { @Override public void execute() { toolbar.enableStartButton(); } }); } // Create finish command (create a new Young Android project) initFinishCommand(new Command() { @Override public void execute() { String projectName = projectNameTextBox.getText(); if (TextValidators.checkNewProjectName(projectName)) { String packageName = StringUtils.getProjectPackage( Ode.getInstance().getUser().getUserEmail(), projectName); NewYoungAndroidProjectParameters parameters = new NewYoungAndroidProjectParameters( packageName); NewProjectCommand callbackCommand = new NewProjectCommand() { @Override public void execute(final Project project) { Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { if (Ode.getInstance().screensLocked()) { // Wait until I/O finished Scheduler.get().scheduleDeferred(this); // on other project } else { Ode.getInstance().openYoungAndroidProjectInDesigner(project); } } }); } }; createNewProject(YoungAndroidProjectNode.YOUNG_ANDROID_PROJECT_TYPE, projectName, parameters, callbackCommand); Tracking.trackEvent(Tracking.PROJECT_EVENT, Tracking.PROJECT_ACTION_NEW_YA, projectName); } else { show(); center(); return; } } }); } @Override public void show() { super.show(); // Wizard size (having it resize between page changes is quite annoying) int width = 340; int height = 40; this.center(); setPixelSize(width, height); super.setPagePanelHeight(85); DeferredCommand.addCommand(new Command() { public void execute() { projectNameTextBox.setFocus(true); projectNameTextBox.selectAll(); } }); } }