final ProgressIndicator indicator = globalDisplay_.getProgressIndicator(
"Error Creating Project");
// Here's the command queue that will hold the various operations.
final SerializedCommandQueue createProjectCmds =
new SerializedCommandQueue();
// WARNING: When calling addCommand, BE SURE TO PASS FALSE as the second
// argument, to delay running of the commands until they are all
// scheduled.
// First, attempt to update the default project location pref
createProjectCmds.addCommand(new SerializedCommand()
{
@Override
public void onExecute(final Command continuation)
{
UIPrefs uiPrefs = pUIPrefs_.get();
// update default project location pref if necessary
if ((newProject.getNewDefaultProjectLocation() != null) ||
(newProject.getCreateGitRepo() !=
uiPrefs.newProjGitInit().getValue()))
{
indicator.onProgress("Saving defaults...");
if (newProject.getNewDefaultProjectLocation() != null)
{
uiPrefs.defaultProjectLocation().setGlobalValue(
newProject.getNewDefaultProjectLocation());
}
if (newProject.getCreateGitRepo() !=
uiPrefs.newProjGitInit().getValue())
{
uiPrefs.newProjGitInit().setGlobalValue(
newProject.getCreateGitRepo());
}
if (newProject.getUsePackrat() !=
uiPrefs.newProjUsePackrat().getValue())
{
uiPrefs.newProjUsePackrat().setGlobalValue(
newProject.getUsePackrat());
}
// call the server -- in all cases continue on with
// creating the project (swallow errors updating the pref)
projServer_.setUiPrefs(
session_.getSessionInfo().getUiPrefs(),
new VoidServerRequestCallback(indicator) {
@Override
public void onResponseReceived(Void response)
{
continuation.execute();
}
@Override
public void onError(ServerError error)
{
super.onError(error);
continuation.execute();
}
});
}
else
{
continuation.execute();
}
}
}, false);
// Next, if necessary, clone a repo
if (newProject.getVcsCloneOptions() != null)
{
createProjectCmds.addCommand(new SerializedCommand()
{
@Override
public void onExecute(final Command continuation)
{
VcsCloneOptions cloneOptions = newProject.getVcsCloneOptions();
if (cloneOptions.getVcsName().equals((VCSConstants.GIT_ID)))
indicator.onProgress("Cloning Git repoistory...");
else
indicator.onProgress("Checking out SVN repository...");
gitServer_.vcsClone(
cloneOptions,
new ServerRequestCallback<ConsoleProcess>() {
@Override
public void onResponseReceived(ConsoleProcess proc)
{
final ConsoleProgressDialog consoleProgressDialog =
new ConsoleProgressDialog(proc, gitServer_);
consoleProgressDialog.showModal();
proc.addProcessExitHandler(new ProcessExitEvent.Handler()
{
@Override
public void onProcessExit(ProcessExitEvent event)
{
if (event.getExitCode() == 0)
{
consoleProgressDialog.hide();
continuation.execute();
}
else
{
indicator.onCompleted();
}
}
});
}
@Override
public void onError(ServerError error)
{
Debug.logError(error);
indicator.onError(error.getUserMessage());
}
});
}
}, false);
}
// Next, create the project file
createProjectCmds.addCommand(new SerializedCommand()
{
@Override
public void onExecute(final Command continuation)
{
indicator.onProgress("Creating project...");
projServer_.createProject(
newProject.getProjectFile(),
newProject.getNewPackageOptions(),
newProject.getNewShinyAppOptions(),
new VoidServerRequestCallback(indicator)
{
@Override
public void onSuccess()
{
continuation.execute();
}
});
}
}, false);
// Next, initialize a git repo if requested
if (newProject.getCreateGitRepo())
{
createProjectCmds.addCommand(new SerializedCommand()
{
@Override
public void onExecute(final Command continuation)
{
indicator.onProgress("Initializing git repository...");
String projDir = FileSystemItem.createFile(
newProject.getProjectFile()).getParentPathString();
gitServer_.gitInitRepo(
projDir,
new VoidServerRequestCallback(indicator)
{
@Override
public void onSuccess()
{
continuation.execute();
}
@Override
public void onFailure()
{
continuation.execute();
}
});
}
}, false);
}
// Generate a new packrat project
if (newProject.getUsePackrat()) {
createProjectCmds.addCommand(new SerializedCommand()
{
@Override
public void onExecute(final Command continuation) {
indicator.onProgress("Initializing packrat project...");
String projDir = FileSystemItem.createFile(
newProject.getProjectFile()
).getParentPathString();
packratServer_.packratBootstrap(
projDir,
false,
new VoidServerRequestCallback(indicator) {
@Override
public void onSuccess()
{
continuation.execute();
}
});
}
}, false);
}
if (newProject.getOpenInNewWindow())
{
createProjectCmds.addCommand(new SerializedCommand() {
@Override
public void onExecute(Command continuation)
{
Desktop.getFrame().openProjectInNewWindow(
newProject.getProjectFile());
continuation.execute();
}
}, false);
}
// If we get here, dismiss the progress indicator
createProjectCmds.addCommand(new SerializedCommand()
{
@Override
public void onExecute(Command continuation)
{
indicator.onCompleted();
if (!newProject.getOpenInNewWindow())
{
applicationQuit_.performQuit(
saveChanges,
newProject.getProjectFile());
}
continuation.execute();
}
}, false);
// Now set it all in motion!
createProjectCmds.run();
}