Example usage for com.google.gwt.user.client Window confirm

List of usage examples for com.google.gwt.user.client Window confirm

Introduction

In this page you can find the example usage for com.google.gwt.user.client Window confirm.

Prototype

public static boolean confirm(String msg) 

Source Link

Usage

From source file:com.example.jumpnote.web.client.controls.NoteItem.java

License:Apache License

@UiHandler("deleteButton")
void onDeleteClick(ClickEvent e) {
    e.stopPropagation();//from w  ww . ja va  2 s .  c  o m
    if (Window.confirm("Are you sure you want to delete '" + mNote.getTitle() + "'?")) {
        mActionCallback.onDelete(mNote.getId());
    }
}

From source file:com.fullmetalgalaxy.client.game.context.WgtContextAction.java

License:Open Source License

@Override
public void onClick(ClickEvent p_event) {
    Object sender = p_event.getSource();
    try {//from www . ja  va2s  . com
        EventsPlayBuilder actionBuilder = GameEngine.model().getActionBuilder();
        if (sender == m_btnOk) {
            actionBuilder.userOk();
            GameEngine.model().runCurrentAction();
        } else if (sender == m_btnCancel) {
            actionBuilder.userCancel();
            AppRoot.getEventBus().fireEvent(new ModelUpdateEvent(GameEngine.model()));
        } else if (sender == m_btnRepairTurret) {
            EventBuilderMsg eventBuilderMsg = actionBuilder.userAction(GameLogType.EvtRepair);
            if (eventBuilderMsg == EventBuilderMsg.MustRun) {
                GameEngine.model().runSingleAction(actionBuilder.getSelectedAction());
            }
        } else if (sender == m_btnFire) {
            actionBuilder.userAction(GameLogType.EvtFire);
            if (((EbEvtFire) actionBuilder.getSelectedAction())
                    .getTokenTarget(GameEngine.model().getGame()) == null) {
                MAppMessagesStack.s_instance.showMessage(MAppBoard.s_messages.selectDestroyerTarget());
            } else {
                MAppMessagesStack.s_instance.showMessage(MAppBoard.s_messages.selectTwoDestroyers());
            }
        } else if (sender == m_btnControl) {
            actionBuilder.userAction(GameLogType.EvtControl);
            if (((EbEvtFire) actionBuilder.getSelectedAction())
                    .getTokenTarget(GameEngine.model().getGame()) == null) {
                MAppMessagesStack.s_instance.showMessage(MAppBoard.s_messages.selectDestroyerTarget());
            } else {
                MAppMessagesStack.s_instance.showMessage(MAppBoard.s_messages.selectTwoDestroyers());
            }
        } else if (sender == m_btnFireCoverOn) {
            GameEngine.model().setFireCoverDisplayed(true);
        } else if (sender == m_btnFireCoverOff) {
            GameEngine.model().setFireCoverDisplayed(false);
        } else if (sender == m_btnGridOn) {
            GameEngine.model().setGridDisplayed(true);
        } else if (sender == m_btnGridOff) {
            GameEngine.model().setGridDisplayed(false);
        } else if (sender == m_btnZoomIn) {
            GameEngine.model().setZoomDisplayed(EnuZoom.Medium);
        } else if (sender == m_btnZoomOut) {
            GameEngine.model().setZoomDisplayed(EnuZoom.Small);
        } else if (sender == m_btnRegister || sender == m_pnlRegister) {
            DlgJoinGame.instance().show();
            DlgJoinGame.instance().center();
        } else if (sender == m_btnPractice || sender == m_btnPracticeCancel) {
            if (GameEngine.model().getGame().getGameType() == GameType.MultiPlayer
                    || GameEngine.model().getGame().getGameType() == GameType.Initiation) {
                Window.alert(MAppBoard.s_messages.activateTrainningMode());
                m_actionIndexBeforePracticeMode = GameEngine.model().getGame().getLogs().size();
                GameEngine.model().getGame().setGameType(GameType.Practice);
                AppRoot.getEventBus().fireEvent(new ModelUpdateEvent(GameEngine.model()));
            } else {
                // Window.alert( MAppBoard.s_messages.deactivateTrainningMode() );
                // ClientUtil.reload();
                // cancel locally
                EbEvtCancel evtCancel = new EbEvtCancel();
                evtCancel.setGame(GameEngine.model().getGame());
                evtCancel.setFromActionIndex(GameEngine.model().getGame().getLogs().size()
                        + GameEngine.model().getGame().getAdditionalEventCount() + GameEngine.model()
                                .getMyRegistration().getTeam(GameEngine.model().getGame()).getMyEvents().size()
                        - 1);
                evtCancel.setToActionIndex(GameEngine.model().getGame().getAdditionalEventCount()
                        + m_actionIndexBeforePracticeMode);
                evtCancel.setAccountId(AppMain.instance().getMyAccount().getId());
                GameEngine.model().runSingleAction(evtCancel);
                GameEngine.model().getGame().setGameType(GameType.MultiPlayer);
                MAppMessagesStack.s_instance.removeMessage(m_pnlPractice);
                AppRoot.getEventBus().fireEvent(new ModelUpdateEvent(GameEngine.model()));
            }
        } else if (sender == m_btnPracticeOk) {
            // after playing offline, user want to commit his turn to server
            // put all actions to event builder
            GameEngine.model().getActionBuilder().clear();
            int iAction = m_actionIndexBeforePracticeMode;
            ArrayList<AnEventPlay> eventsBackup = new ArrayList<AnEventPlay>();
            while (GameEngine.model().getGame().getLogs().size() > iAction) {
                AnEvent event = GameEngine.model().getGame().getLogs().get(iAction);
                if (event instanceof AnEventPlay) {
                    eventsBackup.add((AnEventPlay) event);
                }
                iAction++;
            }
            // cancel locally
            EbEvtCancel evtCancel = new EbEvtCancel();
            evtCancel.setGame(GameEngine.model().getGame());
            evtCancel.setFromActionIndex(GameEngine.model().getGame().getLogs().size()
                    + GameEngine.model().getGame().getAdditionalEventCount() + GameEngine.model()
                            .getMyRegistration().getTeam(GameEngine.model().getGame()).getMyEvents().size()
                    - 1);
            evtCancel.setToActionIndex(m_actionIndexBeforePracticeMode);
            evtCancel.setAccountId(AppMain.instance().getMyAccount().getId());
            GameEngine.model().runSingleAction(evtCancel);
            // finally send actions to server
            GameEngine.model().getGame().setGameType(GameType.MultiPlayer);
            GameEngine.model().getActionBuilder().getActionList().addAll(eventsBackup);
            GameEngine.model().runCurrentAction();
            MAppMessagesStack.s_instance.removeMessage(m_pnlPractice);
        } else if (sender == m_btnEndTurn || sender == m_pnlEndTurn) {
            String msg = null;
            int oldPt = GameEngine.model().getMyRegistration().getPtAction();
            int newPt = GameEngine.model().getMyRegistration().getRoundedActionPt(GameEngine.model().getGame());
            if (oldPt == newPt) {
                msg = MAppBoard.s_messages.confirmEndTurn(oldPt);
            } else {
                msg = MAppBoard.s_messages.confirmEndTurnRoundedPA(oldPt, newPt);
            }
            if (Window.confirm(msg)) {
                EbEvtPlayerTurn action = new EbEvtPlayerTurn();
                action.setGame(GameEngine.model().getGame());
                action.setAccountId(AppMain.instance().getMyAccount().getId());
                GameEngine.model().runSingleAction(action);
            }
        } else if (sender == m_btnTakeOff) {
            if (Window.confirm(MAppBoard.s_messages
                    .confirmTakeOff(Messages.getTokenString(0, actionBuilder.getSelectedToken())))) {
                EbEvtTakeOff action = new EbEvtTakeOff();
                action.setGame(GameEngine.model().getGame());
                action.setRegistration(GameEngine.model().getMyRegistration());
                action.setToken(actionBuilder.getSelectedToken());
                GameEngine.model().runSingleAction(action);
            }
        } else if (sender == m_pnlLand) {
            // search for my freighter to land
            GameEngine.model().getActionBuilder().userTokenClick(
                    GameEngine.model().getGame().getFreighter(GameEngine.model().getMyRegistration()));
            AppRoot.getEventBus().fireEvent(new ModelUpdateEvent(GameEngine.model()));
        } else if (sender == m_pnlDeploy) {
            // search for any unit to deploy
            EbToken myFreighter = GameEngine.model().getGame()
                    .getFreighter(GameEngine.model().getMyRegistration());
            if (myFreighter.containToken()) {
                EbToken firstToken = myFreighter.getContains().iterator().next();
                GameEngine.model().getActionBuilder().userTokenClick(firstToken);
                AppRoot.getEventBus().fireEvent(new ModelUpdateEvent(GameEngine.model()));
            }
        } else if (sender == m_pnlTakeOff) {
            GameEngine.model().getActionBuilder().clear();
            // search for my freighter to take off
            for (EbToken token : GameEngine.model().getGame()
                    .getAllFreighter(GameEngine.model().getMyRegistration().getColor())) {
                if (token.getLocation() == Location.Board) {
                    GameEngine.model().getActionBuilder().userTokenClick(token);
                    break;
                }
            }
            AppRoot.getEventBus().fireEvent(new ModelUpdateEvent(GameEngine.model()));
        }
    } catch (RpcFmpException e) {
        MAppMessagesStack.s_instance.showWarning(e.getLocalizedMessage());
    }
}

From source file:com.fullmetalgalaxy.client.game.tabmenu.WgtGameInfo.java

License:Open Source License

@Override
public void onClick(ClickEvent p_event) {
    if (p_event.getSource() == m_btnGrid) {
        GameEngine.model().setGridDisplayed(m_btnGrid.isDown());
    } else if (p_event.getSource() == m_btnAtmosphere) {
        GameEngine.model().setAtmosphereDisplayed(m_btnAtmosphere.isDown());
    } else if (p_event.getSource() == m_btnCustomMap) {
        GameEngine.model().setCustomMapDisplayed(m_btnCustomMap.isDown());
    } else if (p_event.getSource() == m_btnPause) {
        AnEvent gameLog = GameLogFactory.newAdminTimePause(AppMain.instance().getMyAccount().getId());
        gameLog.setGame(GameEngine.model().getGame());
        GameEngine.model().runSingleAction(gameLog);
    } else if (p_event.getSource() == m_btnPlay) {
        AnEvent gameLog = GameLogFactory.newAdminTimePlay(AppMain.instance().getMyAccount().getId());
        gameLog.setGame(GameEngine.model().getGame());
        GameEngine.model().runSingleAction(gameLog);
    } else if (p_event.getSource() == m_btnEdit) {
        ClientUtil.gotoUrl("/editgame.jsp?id=" + GameEngine.model().getGame().getId());
    } else if (p_event.getSource() == m_btnAbort) {
        if (Window.confirm(MAppBoard.s_messages.confirmCancelGame())) {
            AnEvent gameLog = GameLogFactory.newAdminAbort(AppMain.instance().getMyAccount().getId());
            gameLog.setGame(GameEngine.model().getGame());
            GameEngine.model().runSingleAction(gameLog);
        }/* w w w. j  a  v a  2  s .c  om*/
    } else if (p_event.getSource() == m_btnRecordEvent) {
        if (m_btnRecordEvent.isDown()) {
            GameEngine.model().getGame().setMessage(EventsPlayBuilder.GAME_MESSAGE_RECORDING_TAG + "\n");
        }
        GameEngine.model().getActionBuilder().setRecordMode(m_btnRecordEvent.isDown());
    }
}

From source file:com.fullmetalgalaxy.client.game.tabmenu.WgtGameTimeMode.java

License:Open Source License

@Override
public void onClick(ClickEvent p_event) {
    Object sender = p_event.getSource();
    if (sender == m_btnOk) {
        if (GameEngine.model().getCurrentAction() == null) {
            // user click ok to cancel action
            // but action selected was then last one: no cancel
            GameEngine.model().setTimeLineMode(false);
            return;
        }/*  w  w w.ja va 2  s.c om*/

        if (GameEngine.model().getLastTurnPlayed() != GameEngine.model().getGame().getCurrentTimeStep()
                || (GameEngine.model().getMyRegistration() != null && !GameEngine.model().getGame()
                        .getCurrentPlayerIds().contains(GameEngine.model().getMyRegistration().getId()))) {
            if (!AppMain.instance().iAmAdmin()) {
                // no i18n: this dialog shouldn't appear
                Window.alert("Only admin can cancel such action");
                return;
            }
            // admin is going to perform admin action, show confirm dialog
            // it may also a training game
            // TODO i18n
            if (!Window.confirm("Perform admin cancel ?")) {
                return;
            }
        }

        // just in case another action was in preparation
        EventsPlayBuilder actionBuilder = GameEngine.model().getActionBuilder();
        actionBuilder.clear();
        EbEvtCancel evtCancel = new EbEvtCancel();
        evtCancel.setGame(GameEngine.model().getGame());
        int fromIndex = GameEngine.model().getGame().getLogs().size() - 1;
        fromIndex += GameEngine.model().getGame().getAdditionalEventCount();
        if (GameEngine.model().getMyRegistration() != null) {
            fromIndex += GameEngine.model().getMyRegistration().getTeam(GameEngine.model().getGame())
                    .getMyEvents().size();
        }
        evtCancel.setFromActionIndex(fromIndex);
        evtCancel.setToActionIndex(GameEngine.model().getGame().getAdditionalEventCount()
                + GameEngine.model().getCurrentActionIndex());
        evtCancel.setAccountId(AppMain.instance().getMyAccount().getId());
        // this action is required to send the last game version to server
        GameEngine.model().setTimeLineMode(false);
        GameEngine.model().runSingleAction(evtCancel);
    } else if (sender == m_btnForward) {
        GameEngine.model().timePlay(1);
    } else if (sender == m_btnFastPlay) {
        GameEngine.model().timePlay(10);
    } else if (sender == m_btnBack) {
        GameEngine.model().timeBack(1);
    } else if (sender == m_btnFastBack) {
        GameEngine.model().timeBack(10);
    } else if (sender == m_btnPlay) {
        GameEngine.model().startPlayAnimation();
    } else if (sender == m_btnPause) {
        GameEngine.model().stopPlayAnimation();
    }
}

From source file:com.fullmetalgalaxy.client.game.tabmenu.WgtPlayers.java

License:Open Source License

@Override
public void onClick(ClickEvent p_event) {
    if (p_event.getSource() == m_btnChat) {
        DlgChatInput.showDialog();/*from ww  w . java2  s .c  o m*/
    } else if (m_skipTurnButtons.get(p_event.getSource()) != null) {
        EbRegistration registration = m_skipTurnButtons.get(p_event.getSource());
        String playerName = Messages.getColorString(0,
                registration.getTeam(GameEngine.model().getGame()).getFireColor());
        if (registration.getAccount() != null) {
            playerName = registration.getAccount().getPseudo();
        }
        if (Window.confirm("Voulez-vous rellement sauter le tour de " + playerName + ", il lui reste "
                + registration.getPtAction() + " points d'action.")) {
            EbEvtPlayerTurn action = new EbEvtPlayerTurn();
            action.setGame(GameEngine.model().getGame());
            if (registration.getAccount() != null) {
                action.setAccountId(registration.getAccount().getId());
            }
            action.setOldPlayerId(registration.getId());
            // ok itsn't an automatic action, but with this trick I can track of the guy which
            // end this turn and pass through action checking
            action.setAuto(true);
            GameEngine.model().runSingleAction(action);
        }
    } else if (m_banButtons.get(p_event.getSource()) != null) {
        // want to ban player
        EbRegistration registration = m_banButtons.get(p_event.getSource());
        if (Window.confirm("Voulez-vous rellement banir " + registration.getAccount().getPseudo()
                + " de la partie " + GameEngine.model().getGame().getName())) {
            EbAdminBan gameLog = new EbAdminBan();
            gameLog.setAccountId(AppMain.instance().getMyAccount().getId());
            gameLog.setRegistrationId(registration.getId());
            gameLog.setGame(GameEngine.model().getGame());
            GameEngine.model().runSingleAction(gameLog);
        }
    }
}

From source file:com.google.appinventor.client.editor.simple.components.MockComponent.java

License:Open Source License

/**
 * Creates a new instance of the component.
 *
 * @param editor  editor of source file the component belongs to
 *///ww  w.  ja  v  a  2 s.  co  m
MockComponent(SimpleEditor editor, String type, Image iconImage) {
    this.editor = editor;
    this.type = type;
    this.iconImage = iconImage;

    sourceStructureExplorerItem = new SourceStructureExplorerItem() {
        @Override
        public void onSelected() {
            // are we showing the blocks editor? if so, toggle the component drawer
            if (Ode.getInstance().getCurrentFileEditor() instanceof YaBlocksEditor) {
                YaBlocksEditor blocksEditor = (YaBlocksEditor) Ode.getInstance().getCurrentFileEditor();
                OdeLog.log("Showing item " + getName());
                blocksEditor.showComponentBlocks(getName());
            } else {
                select();
            }
        }

        @Override
        public void onStateChange(boolean open) {
            // The user has expanded or collapsed the branch in the components tree corresponding to
            // this component. Remember that by setting the expanded field so that when we re-build
            // the tree, we will keep the branch in the same state.
            expanded = open;
        }

        @Override
        public boolean canRename() {
            return !isForm();
        }

        @Override
        public void rename() {
            if (!isForm()) {
                new RenameDialog(getName()).center();
            }
        }

        @Override
        public boolean canDelete() {
            return !isForm();
        }

        @Override
        public void delete() {
            if (!isForm()) {
                if (Window.confirm(MESSAGES.reallyDeleteComponent())) {
                    MockComponent.this.delete();
                }
            }
        }
    };
    expanded = true;

    // Create a default property set for the component
    properties = new EditableProperties(true);

    // Add the mock component itself as a property change listener so that it can update its
    // visual aspects according to changes of its properties
    properties.addPropertyChangeListener(this);

    // Allow dragging this component in a drag-and-drop action if this is not the root form
    if (!isForm()) {
        dragSourceSupport = new DragSourceSupport(this);
        addMouseListener(dragSourceSupport);
    }
}

From source file:com.google.appinventor.client.editor.simple.palette.ComponentRemoveWidget.java

License:Open Source License

public ComponentRemoveWidget(SimpleComponentDescriptor simpleComponentDescriptor) {
    if (imageResource == null) {
        Images images = Ode.getImageBundle();
        imageResource = images.deleteComponent();
    }/*from   w  ww .  ja  v  a2 s  .c  o m*/
    this.scd = simpleComponentDescriptor;
    AbstractImagePrototype.create(imageResource).applyTo(this);
    addClickListener(new ClickListener() {

        @Override
        public void onClick(Widget widget) {
            if (Window.confirm(MESSAGES.reallyRemoveComponent())) {
                long projectId = ode.getCurrentYoungAndroidProjectId();
                YaProjectEditor projectEditor = (YaProjectEditor) ode.getEditorManager()
                        .getOpenProjectEditor(projectId);
                SimpleComponentDatabase componentDatabase = SimpleComponentDatabase.getInstance();
                componentDatabase.addComponentDatabaseListener(projectEditor);
                componentDatabase.removeComponent(scd.getName());
            }
        }
    });
}

From source file:com.google.appinventor.client.explorer.commands.DeleteFileCommand.java

License:Open Source License

/**
 * Shows a confirmation dialog./*ww  w  .  j  ava2  s . co  m*/
 *
 * @return {@code true} if the delete file command should be executed or
 *         {@code false} if it should be canceled
 */
protected boolean deleteConfirmation() {
    return Window.confirm(MESSAGES.reallyDeleteFile());
}

From source file:com.google.appinventor.client.explorer.youngandroid.GalleryPage.java

License:Open Source License

/**
 * Helper method called by constructor to initialize the remove button
 *//*w w w .jav  a  2  s . com*/
private void initRemoveButton() {
    removeButton = new Button(MESSAGES.galleryRemoveText());
    removeButton.addClickHandler(new ClickHandler() {
        public void onClick(ClickEvent event) {
            //popup confrim dialog
            if (!Window.confirm(MESSAGES.galleryRemoveConfirmText())) {
                return;
            }
            removeButton.setEnabled(false);
            removeButton.setText(MESSAGES.galleryAppRemoving());
            ;
            final OdeAsyncCallback<Void> callback = new OdeAsyncCallback<Void>(MESSAGES.galleryDeleteError()) {
                @Override
                public void onSuccess(Void result) {
                    // once we have deleted, set the project id back to not published
                    final OdeAsyncCallback<Void> projectCallback = new OdeAsyncCallback<Void>(
                            MESSAGES.gallerySetProjectIdError()) {
                        @Override
                        public void onSuccess(Void result) {
                            // this is called after deleted and after we've set the galleryid
                            Ode.getInstance().getProjectManager().UnpublishProject(app.getProjectId());
                            Ode.getInstance().switchToProjectsView();
                        }

                        @Override
                        public void onFailure(Throwable caught) {
                            super.onFailure(caught);
                            removeButton.setEnabled(true);
                            removeButton.setText(MESSAGES.galleryRemoveText());
                        }
                    };
                    GalleryClient client = GalleryClient.getInstance();
                    client.appWasChanged(); // tell views to update
                    Ode.getInstance().getProjectService().setGalleryId(app.getProjectId(),
                            UserProject.NOTPUBLISHED, projectCallback);
                }

                @Override
                public void onFailure(Throwable caught) {
                    super.onFailure(caught);
                    removeButton.setEnabled(true);
                    removeButton.setText(MESSAGES.galleryRemoveText());
                }
            };
            Ode.getInstance().getGalleryService().deleteApp(app.getGalleryAppId(), callback);
        }
    });
    removeButton.addStyleName("app-action-button");
    appAction.add(removeButton);
}

From source file:com.google.appinventor.client.Ode.java

License:Open Source License

/**
 * Main entry point for Ode. Setting up the UI and the web service
 * connections.//  w  ww .  j  ava2s .  c o m
 */
@Override
public void onModuleLoad() {
    Tracking.trackPageview();

    // Handler for any otherwise unhandled exceptions
    GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
        @Override
        public void onUncaughtException(Throwable e) {
            OdeLog.xlog(e);

            if (AppInventorFeatures.sendBugReports()) {
                if (Window.confirm(MESSAGES.internalErrorReportBug())) {
                    Window.open(BugReport.getBugReportLink(e), "_blank", "");
                }
            } else {
                // Display a confirm dialog with error msg and if 'ok' open the debugging view
                if (Window.confirm(MESSAGES.internalErrorClickOkDebuggingView())) {
                    Ode.getInstance().switchToDebuggingView();
                }
            }
        }
    });

    // Define bridge methods to Javascript
    JsonpConnection.defineBridgeMethod();

    // Initialize global Ode instance
    instance = this;

    // Let's see if we were started with a repo= parameter which points to a template
    templatePath = Window.Location.getParameter("repo");
    if (templatePath != null) {
        OdeLog.wlog("Got a template path of " + templatePath);
        templateLoadingFlag = true;
    }

    // Let's see if we were started with a galleryId= parameter which points to a template
    galleryId = Window.Location.getParameter("galleryId");
    if (galleryId != null) {
        OdeLog.wlog("Got a galleryId of " + galleryId);
        galleryIdLoadingFlag = true;
    }

    // Get user information.
    OdeAsyncCallback<Config> callback = new OdeAsyncCallback<Config>(
            // failure message
            MESSAGES.serverUnavailable()) {

        @Override
        public void onSuccess(Config result) {
            config = result;
            user = result.getUser();
            isReadOnly = user.isReadOnly();

            // If user hasn't accepted terms of service, ask them to.
            if (!user.getUserTosAccepted() && !isReadOnly) {
                // We expect that the redirect to the TOS page should be handled
                // by the onFailure method below. The server should return a
                // "forbidden" error if the TOS wasn't accepted.
                ErrorReporter.reportError(MESSAGES.serverUnavailable());
                return;
            }

            splashConfig = result.getSplashConfig();

            if (result.getRendezvousServer() != null) {
                setRendezvousServer(result.getRendezvousServer());
            } else {
                setRendezvousServer(YaVersion.RENDEZVOUS_SERVER);
            }

            userSettings = new UserSettings(user);

            // Gallery settings
            gallerySettings = new GallerySettings();
            //gallerySettings.loadGallerySettings();
            loadGallerySettings();

            // Initialize project and editor managers
            // The project manager loads the user's projects asynchronously
            projectManager = new ProjectManager();
            projectManager.addProjectManagerEventListener(new ProjectManagerEventAdapter() {
                @Override
                public void onProjectsLoaded() {
                    projectManager.removeProjectManagerEventListener(this);

                    // This handles any built-in templates stored in /war
                    // Retrieve template data stored in war/templates folder and
                    // and save it for later use in TemplateUploadWizard
                    OdeAsyncCallback<String> templateCallback = new OdeAsyncCallback<String>(
                            // failure message
                            MESSAGES.createProjectError()) {
                        @Override
                        public void onSuccess(String json) {
                            // Save the templateData
                            TemplateUploadWizard.initializeBuiltInTemplates(json);
                            // Here we call userSettings.loadSettings, but the settings are actually loaded
                            // asynchronously, so this loadSettings call will return before they are loaded.
                            // After the user settings have been loaded, openPreviousProject will be called.
                            // We have to call this after the builtin templates have been loaded otherwise
                            // we will get a NPF.
                            userSettings.loadSettings();
                        }
                    };
                    Ode.getInstance().getProjectService().retrieveTemplateData(
                            TemplateUploadWizard.TEMPLATES_ROOT_DIRECTORY, templateCallback);
                }
            });
            editorManager = new EditorManager();

            // Initialize UI
            initializeUi();

            topPanel.showUserEmail(user.getUserEmail());
        }

        @Override
        public void onFailure(Throwable caught) {
            if (caught instanceof StatusCodeException) {
                StatusCodeException e = (StatusCodeException) caught;
                int statusCode = e.getStatusCode();
                switch (statusCode) {
                case Response.SC_UNAUTHORIZED:
                    // unauthorized => not on whitelist
                    // getEncodedResponse() gives us the message that we wrote in
                    // OdeAuthFilter.writeWhitelistErrorMessage().
                    Window.alert(e.getEncodedResponse());
                    return;
                case Response.SC_FORBIDDEN:
                    // forbidden => need tos accept
                    Window.open("/" + ServerLayout.YA_TOS_FORM, "_self", null);
                    return;
                case Response.SC_PRECONDITION_FAILED:
                    String locale = Window.Location.getParameter("locale");
                    if (locale == null || locale.equals("")) {
                        Window.Location.replace("/login/");
                    } else {
                        Window.Location.replace("/login/?locale=" + locale);
                    }
                    return; // likely not reached
                }
            }
            super.onFailure(caught);
        }
    };

    // The call below begins an asynchronous read of the user's settings
    // When the settings are finished reading, various settings parsers
    // will be called on the returned JSON object. They will call various
    // other functions in this module, including openPreviousProject (the
    // previous project ID is stored in the settings) as well as the splash
    // screen displaying functions below.
    //
    // TODO(user): ODE makes too many RPC requests at startup time. Currently
    // we do 3 RPCs + 1 per project + 1 per open file. We should bundle some of
    // those with each other or with the initial HTML transfer.
    //
    // This call also stores our sessionId in the backend. This will be checked
    // when we go to save a file and if different file saving will be disabled
    // Newer sessions invalidate older sessions.

    userInfoService.getSystemConfig(sessionId, callback);

    History.addValueChangeHandler(new ValueChangeHandler<String>() {
        @Override
        public void onValueChange(ValueChangeEvent<String> event) {
            openProject(event.getValue());
        }
    });

    // load project based on current url
    // TODO(sharon): Seems like a possible race condition here if the onValueChange
    // handler defined above gets called before the getSystemConfig call sets
    // userSettings.
    // The following line causes problems with GWT debugging, and commenting
    // it out doesn't seem to break things.
    //History.fireCurrentHistoryState();
}