blob: a129c83053bd6d5d4fb3a4ac26346f74ec31f9ab [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2006 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
* Philippe Ombredanne - bug 84808
*******************************************************************************/
package org.eclipse.team.internal.ccvs.ui.wizards;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.internal.ccvs.core.*;
import org.eclipse.team.internal.ccvs.core.util.KnownRepositories;
import org.eclipse.team.internal.ccvs.ui.*;
import org.eclipse.team.internal.ccvs.ui.operations.CheckoutMultipleProjectsOperation;
import org.eclipse.team.internal.ccvs.ui.operations.ProjectMetaFileOperation;
import org.eclipse.ui.*;
/**
* Gathers all information necessary for a checkout from a repository.
*/
public class CheckoutWizard extends Wizard implements ICVSWizard, INewWizard {
private RepositorySelectionPage locationPage;
private ConfigurationWizardMainPage createLocationPage;
private ModuleSelectionPage modulePage;
private CheckoutAsWizard wizard;
private ICVSRepositoryLocation location;
private boolean isNewLocation;
private CVSWizardPage dummyPage;
public CheckoutWizard() {
setWindowTitle(CVSUIMessages.CheckoutWizard_0);
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#addPages()
*/
public void addPages() {
setNeedsProgressMonitor(true);
ImageDescriptor substImage = getBannerImageDescriptor();
ICVSRepositoryLocation[] locations = CVSUIPlugin.getPlugin().getRepositoryManager().getKnownRepositoryLocations();
if (locations.length > 0) {
locationPage = new RepositorySelectionPage("locationSelection", CVSUIMessages.CheckoutWizard_7, substImage); //$NON-NLS-1$
locationPage.setDescription(CVSUIMessages.SharingWizard_importTitleDescription);
locationPage.setExtendedDescription(CVSUIMessages.CheckoutWizard_8);
addPage(locationPage);
}
createLocationPage = new ConfigurationWizardMainPage("createLocationPage", CVSUIMessages.SharingWizard_enterInformation, substImage); //$NON-NLS-1$
createLocationPage.setDescription(CVSUIMessages.SharingWizard_enterInformationDescription);
addPage(createLocationPage);
createLocationPage.setDialogSettings(NewLocationWizard.getLocationDialogSettings());
modulePage = new ModuleSelectionPage("moduleSelection", CVSUIMessages.CheckoutWizard_10, substImage); //$NON-NLS-1$
modulePage.setDescription(CVSUIMessages.CheckoutWizard_11);
modulePage.setHelpContxtId(IHelpContextIds.CHECKOUT_MODULE_SELECTION_PAGE);
modulePage.setSupportsMultiSelection(true);
addPage(modulePage);
// Dummy page to allow lazy creation of CheckoutAsWizard
dummyPage = new CVSWizardPage("dummyPage") { //$NON-NLS-1$
public void createControl(Composite parent) {
Composite composite = createComposite(parent, 1, false);
setControl(composite);
}
};
addPage(dummyPage);
}
protected ImageDescriptor getBannerImageDescriptor() {
return CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_WIZBAN_CHECKOUT);
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#canFinish()
*/
public boolean canFinish() {
return (wizard == null && getSelectedModules().length > 0) ||
(wizard != null && wizard.canFinish());
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.IWizard#performFinish()
*/
public boolean performFinish() {
if (wizard != null) {
// The finish of the child wizard will get called directly.
// We only get here if it completed successfully
if (isNewLocation) {
KnownRepositories.getInstance().addRepository(location, true /* broadcast */);
}
return true;
} else {
try {
new CheckoutMultipleProjectsOperation(getPart(), getSelectedModules(), null)
.run();
if (isNewLocation) {
KnownRepositories.getInstance().addRepository(location, true /* broadcast */);
}
return true;
} catch (InvocationTargetException e) {
CVSUIPlugin.openError(getShell(), null, null, e);
} catch (InterruptedException e) {
// Canceled. fall through.
}
return false;
}
}
private IWorkbenchPart getPart() {
// This wizard doesn't have a part
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.Wizard#performCancel()
*/
public boolean performCancel() {
if (location != null && isNewLocation) {
KnownRepositories.getInstance().disposeRepository(location);
location = null;
}
return wizard == null || wizard.performCancel();
}
/* (non-Javadoc)
* @see org.eclipse.jface.wizard.IWizard#getNextPage(org.eclipse.jface.wizard.IWizardPage)
*/
public IWizardPage getNextPage(IWizardPage page) {
// Assume the page is about to be shown when this method is
// invoked
return getNextPage(page, true /* about to show*/);
}
/* (non-Javadoc)
* @see org.eclipse.team.internal.ccvs.ui.wizards.ICVSWizard#getNextPage(org.eclipse.jface.wizard.IWizardPage, boolean)
*/
public IWizardPage getNextPage(IWizardPage page, boolean aboutToShow) {
if (page == locationPage) {
if (locationPage.getLocation() == null) {
return createLocationPage;
} else {
if (aboutToShow) {
try {
modulePage.setLocation(getLocation());
} catch (TeamException e1) {
CVSUIPlugin.log(e1);
}
}
return modulePage;
}
}
if (page == createLocationPage) {
if (aboutToShow) {
try {
ICVSRepositoryLocation l = getLocation();
if (l != null) {
modulePage.setLocation(l);
}
} catch (TeamException e1) {
CVSUIPlugin.log(e1);
}
}
return modulePage;
}
if (page == modulePage) {
ICVSRemoteFolder[] selectedModules = getSelectedModules();
if (selectedModules.length == 0) return null;
for (int i = 0; i < selectedModules.length; i++) {
ICVSRemoteFolder folder = selectedModules[i];
if (folder.isDefinedModule()) {
// No further configuration is possible for defined modules
return null;
}
}
if (aboutToShow) {
try {
boolean hasMetafile = true;
if (selectedModules.length == 1) {
// Only allow configuration if one module is selected
final ICVSRemoteFolder[] folders = new ICVSRemoteFolder[] {selectedModules[0]};
final boolean withName = CVSUIPlugin.getPlugin().isUseProjectNameOnCheckout();
// attempt to retrieve the project description depending on preferences
// this is a bit convoluted to batch the meta-file check and retrieval in one operation
final ICVSRemoteFolder[] folderResult = new ICVSRemoteFolder [1];
final boolean[] booleanResult = new boolean[] { true };
getContainer().run(true, true, new IRunnableWithProgress() {
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
ProjectMetaFileOperation op = new ProjectMetaFileOperation(getPart(), new ICVSRemoteFolder[] {folders[0]}, withName);
op.run(monitor);
folderResult[0] = op.getUpdatedFolders()[0];
booleanResult[0] = op.metaFileExists();
}
});
hasMetafile = booleanResult[0];
if (withName && hasMetafile)
selectedModules[0] = folderResult[0];
}
resetSubwizard();
wizard = new CheckoutAsWizard(getPart(), selectedModules, ! hasMetafile /* allow configuration */);
wizard.addPages();
return wizard.getStartingPage();
} catch (InvocationTargetException e) {
// Show the error and fall through to return null as the next page
CVSUIPlugin.openError(getShell(), null, null, e);
} catch (InterruptedException e) {
// Canceled by user. Fall through and return null
}
return null;
} else {
if (wizard == null) {
return dummyPage;
} else {
return wizard.getStartingPage();
}
}
}
if (wizard != null) {
return wizard.getNextPage(page);
}
return null;
}
private ICVSRemoteFolder[] getSelectedModules() {
if (modulePage == null) return null;
return modulePage.getSelectedModules();
}
/**
* Return an ICVSRepositoryLocation
*/
private ICVSRepositoryLocation getLocation() throws TeamException {
// If the location page has a location, use it.
if (locationPage != null) {
ICVSRepositoryLocation newLocation = locationPage.getLocation();
if (newLocation != null) {
return recordLocation(newLocation);
}
}
// Otherwise, get the location from the create location page
final ICVSRepositoryLocation[] locations = new ICVSRepositoryLocation[] { null };
final CVSException[] exception = new CVSException[] { null };
getShell().getDisplay().syncExec(new Runnable() {
public void run() {
try {
locations[0] = createLocationPage.getLocation();
} catch (CVSException e) {
exception[0] = e;
}
}
});
if (exception[0] != null) {
throw exception[0];
}
return recordLocation(locations[0]);
}
private ICVSRepositoryLocation recordLocation(ICVSRepositoryLocation newLocation) {
if (newLocation == null) return location;
if (location == null || !newLocation.equals(location)) {
if (location != null && isNewLocation) {
// Dispose of the previous location
KnownRepositories.getInstance().disposeRepository(location);
}
location = newLocation;
isNewLocation = !KnownRepositories.getInstance().isKnownRepository(newLocation.getLocation(false));
if (isNewLocation) {
// Add the location silently so we can work with it
location = KnownRepositories.getInstance().addRepository(location, false /* silently */);
}
}
return location;
}
/* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
*/
public void init(IWorkbench workbench, IStructuredSelection selection) {
}
/*
* Reset the sub-wizard
*/
/* package */ void resetSubwizard() {
if (wizard != null) {
wizard.dispose();
wizard = null;
}
}
}