package tern.eclipse.ide.ui.wizards;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.internal.wizards.datatransfer.DataTransferMessages;
import tern.eclipse.ide.core.IIDETernRepository;
import tern.eclipse.ide.internal.ui.TernUIMessages;
import tern.eclipse.ide.internal.ui.Trace;
import tern.eclipse.ide.ui.TernUIPlugin;
import tern.utils.TernModuleHelper;
public class ImportTernRepositoryWizardPage extends WizardPage {
private final IIDETernRepository repository;
private IProjectDescription description;
protected ImportTernRepositoryWizardPage(IIDETernRepository repository) {
super("CreateOrImportProjectWizardPage");
setPageComplete(true);
setTitle(TernUIMessages.ImportTernRepositoryWizardPage_title);
setDescription(TernUIMessages.ImportTernRepositoryWizardPage_description);
this.repository = repository;
this.description = getProjectDescription();
}
private Text nameText;
private Text locationText;
@Override
public void createControl(Composite parent) {
initializeDialogUnits(parent);
Composite workArea = new Composite(parent, SWT.NONE);
setControl(workArea);
workArea.setLayout(new GridLayout());
workArea.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
createProjectInfo(workArea);
restoreWidgetValues();
Dialog.applyDialogFont(workArea);
}
private void createProjectInfo(Composite parent) {
Composite workArea = new Composite(parent, SWT.NONE);
workArea.setLayout(new GridLayout(2, false));
workArea.setLayoutData(new GridData(GridData.FILL_BOTH));
// Project name
Label nameLabel = new Label(workArea, SWT.NONE);
nameLabel.setText(TernUIMessages.ImportTernRepositoryWizardPage_name_label);
nameText = new Text(workArea, SWT.SINGLE | SWT.BORDER);
nameText.setFont(parent.getFont());
nameText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
// File system path
Label locationLabel = new Label(workArea, SWT.NONE);
locationLabel.setText(TernUIMessages.ImportTernRepositoryWizardPage_location_label);
locationText = new Text(workArea, SWT.WRAP | SWT.READ_ONLY);
locationText.setFont(parent.getFont());
locationText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
}
private IProjectDescription getProjectDescription() {
File dotProject = new File(repository.getBaseDir(), IProjectDescription.DESCRIPTION_FILE_NAME);
if (dotProject.exists()) {
IPath path = new Path(TernModuleHelper.getPath(dotProject));
try {
return ResourcesPlugin.getWorkspace().loadProjectDescription(path);
} catch (CoreException e) {
Trace.trace(Trace.SEVERE, "Error while getting .project description", e);
}
}
return null;
}
private void restoreWidgetValues() {
if (description != null) {
nameText.setText(description.getName());
nameText.setEnabled(false);
} else {
nameText.setText(repository.getName());
}
locationText.setText(TernModuleHelper.getPath(repository.getBaseDir()));
}
public boolean importRepository() {
final String projectName = nameText.getText();
final IWorkspace workspace = ResourcesPlugin.getWorkspace();
final IProject project = workspace.getRoot().getProject(projectName);
if (project.exists()) {
return true;
}
WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
@Override
protected void execute(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
try {
monitor.beginTask("", 1); //$NON-NLS-1$
if (monitor.isCanceled()) {
throw new OperationCanceledException();
}
IStatus status = importRepository(monitor);
if (!status.isOK()) {
throw new InvocationTargetException(new CoreException(status));
}
} finally {
monitor.done();
}
}
private IStatus importRepository(final IProgressMonitor monitor) {
if (description == null) {
description = workspace.newProjectDescription(projectName);
IPath locationPath = new Path(repository.getBaseDir().getAbsolutePath());
// If it is under the root use the default location
if (Platform.getLocation().isPrefixOf(locationPath)) {
description.setLocation(null);
} else {
description.setLocation(locationPath);
}
}
try {
monitor.beginTask(TernUIMessages.ImportTernRepositoryWizardPage_CreateProjectTask, 100);
project.create(description, new SubProgressMonitor(monitor, 30));
project.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(monitor, 70));
} catch (CoreException e) {
return e.getStatus();
} finally {
monitor.done();
}
return Status.OK_STATUS;
}
};
// run the new project creation operation
try {
getContainer().run(true, true, op);
} catch (InterruptedException e) {
return false;
} catch (InvocationTargetException e) {
// one of the steps resulted in a core exception
Throwable t = e.getTargetException();
String message = TernUIMessages.ImportTernRepositoryWizardPage_errorMessage;
IStatus status;
if (t instanceof CoreException) {
status = ((CoreException) t).getStatus();
} else {
status = new Status(IStatus.ERROR, TernUIPlugin.PLUGIN_ID, 1, message, t);
}
// Update the visible status on error so the user can see what's
// been imported
// updateProjectsStatus();
ErrorDialog.openError(getShell(), message, null, status);
return false;
} finally {
}
return true;
}
}