/*******************************************************************************
* Copyright (c) 2013 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package mmrnmhrm.ui.wizards;
import static melnorme.utilbox.misc.MiscUtil.getClassResource;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.wizard.WizardPage;
import melnorme.lang.ide.core.LangCore;
import melnorme.lang.ide.core.utils.ResourceUtils;
import melnorme.lang.ide.ui.dialogs.LangNewProjectWizard;
import melnorme.lang.ide.ui.dialogs.LangProjectWizardFirstPage;
import melnorme.lang.ide.ui.dialogs.WizardMessages;
import melnorme.lang.tooling.BundlePath;
import melnorme.utilbox.core.CommonException;
/**
* D New Project Wizard.
*/
public class DeeProjectWizard extends LangNewProjectWizard {
protected static final String HelloWorld_DubJsonTemplate = getClassResource(
DeeProjectWizard.class, "hello_world.dub.json");
protected static final String HelloWorld_ModuleContents = getClassResource(
DeeProjectWizard.class, "hello_world.d");
protected final DeeProjectWizardFirstPage firstPage = new DeeProjectWizardFirstPage();
// protected final DeeProjectWizardBuildSettingsPage buildSettingsPage = new DeeProjectWizardBuildSettingsPage(this);
public DeeProjectWizard() {
}
@Override
public LangProjectWizardFirstPage getFirstPage() {
return firstPage;
}
@Override
public WizardPage getSecondPage() {
return null;
// return buildSettingsPage;
}
@Override
public void addPages() {
addPage(firstPage);
// addPage(buildSettingsPage);
}
@Override
protected ProjectCreator_ForWizard createProjectCreator() {
return new DeeProjectCreator();
}
public class DeeProjectCreator extends ProjectCreator_ForWizard {
@Override
public boolean revertProjectCreation() {
syncPendingModelUpdates();
return super.revertProjectCreation();
}
// Wait for pending operations, has they be locking the workspace, even if externally.
// TODO: a cleaner way to solve this? Perhaps have the project locked by ModelManager?
protected void syncPendingModelUpdates() {
IRunnableWithProgress op = new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
LangCore.deeBundleModelManager().syncPendingUpdates();
}
};
try {
getContainer().run(true, true, op);
} catch (InvocationTargetException e) {
LangCore.logError("Error synching with ModelManager", e);
} catch (InterruptedException e) {
}
}
}
@Override
protected void configureCreatedProject(ProjectCreator_ForWizard projectCreator, IProgressMonitor pm)
throws CoreException, CommonException {
String bundleName = getProject().getName().toLowerCase();
String dubManifestContents = HelloWorld_DubJsonTemplate.replace("%BUNDLE_NAME%", bundleName);
BundlePath bundlePath = new BundlePath(ResourceUtils.getProjectLocation2(getProject()));
if(!bundlePath.hasBundleManifest()) {
projectCreator.createFile(getProject().getFile(BundlePath.DUB_MANIFEST_NAME_JSON),
dubManifestContents, false, pm);
IFile mainModule = getProject().getFolder("src").getFile("app.d");
projectCreator.createFile(mainModule, HelloWorld_ModuleContents, true, pm);
}
}
@Override
public boolean performFinish() {
boolean res = super.performFinish();
// if(res) {
// buildSettingsPage.performOk();
// return true;
// }
return res;
}
}
class DeeProjectWizardFirstPage extends LangProjectWizardFirstPage {
public DeeProjectWizardFirstPage() {
setTitle(WizardMessages.LangNewProject_Page1_pageTitle);
setDescription(WizardMessages.LangNewProject_Page1_pageDescription);
}
}