| /******************************************************************************* |
| * Copyright (c) 2000, 2008 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * 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.resources.*; |
| import org.eclipse.jface.dialogs.IDialogSettings; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| import org.eclipse.jface.wizard.IWizardPage; |
| import org.eclipse.jface.wizard.Wizard; |
| import org.eclipse.team.internal.ccvs.core.*; |
| import org.eclipse.team.internal.ccvs.ui.*; |
| import org.eclipse.team.internal.ccvs.ui.operations.*; |
| import org.eclipse.team.internal.ccvs.ui.tags.*; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.actions.NewProjectAction; |
| |
| /** |
| * @author Administrator |
| * |
| * To change the template for this generated type comment go to |
| * Window>Preferences>Java>Code Generation>Code and Comments |
| */ |
| public class CheckoutAsWizard extends Wizard { |
| |
| private ICVSRemoteFolder[] remoteFolders; |
| private boolean allowProjectConfiguration; |
| |
| private CheckoutAsMainPage mainPage; |
| private CheckoutAsProjectSelectionPage projectSelectionPage; |
| private CheckoutAsLocationSelectionPage locationSelectionPage; |
| private TagSelectionWizardPage tagSelectionPage; |
| private IWorkbenchPart part; |
| |
| class NewProjectListener implements IResourceChangeListener { |
| private IProject newProject = null; |
| |
| @Override |
| public void resourceChanged(IResourceChangeEvent event) { |
| IResourceDelta root = event.getDelta(); |
| IResourceDelta[] projectDeltas = root.getAffectedChildren(); |
| for (int i = 0; i < projectDeltas.length; i++) { |
| IResourceDelta delta = projectDeltas[i]; |
| IResource resource = delta.getResource(); |
| if (delta.getKind() == IResourceDelta.ADDED) { |
| newProject = (IProject)resource; |
| } |
| } |
| } |
| /** |
| * Gets the newProject. |
| * @return Returns a IProject |
| */ |
| public IProject getNewProject() { |
| return newProject; |
| } |
| } |
| |
| /** |
| * Return the settings used for all CheckoutAsWizard pages |
| */ |
| public static IDialogSettings getCheckoutAsDialogSettings() { |
| IDialogSettings workbenchSettings = CVSUIPlugin.getPlugin().getDialogSettings(); |
| IDialogSettings section = workbenchSettings.getSection("CheckoutAsWizard");//$NON-NLS-1$ |
| if (section == null) { |
| section = workbenchSettings.addNewSection("CheckoutAsWizard");//$NON-NLS-1$ |
| } |
| return section; |
| } |
| |
| public CheckoutAsWizard(IWorkbenchPart part, ICVSRemoteFolder[] remoteFolders, boolean allowProjectConfiguration) { |
| this.part = part; |
| this.remoteFolders = remoteFolders; |
| setDialogSettings(getCheckoutAsDialogSettings()); |
| setWindowTitle(CVSUIMessages.CheckoutAsWizard_title); |
| this.allowProjectConfiguration = allowProjectConfiguration; |
| } |
| |
| @Override |
| public void addPages() { |
| setNeedsProgressMonitor(true); |
| ImageDescriptor substImage = CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_WIZBAN_CHECKOUT); |
| |
| mainPage = new CheckoutAsMainPage(substImage, remoteFolders, allowProjectConfiguration); |
| addPage(mainPage); |
| |
| projectSelectionPage = new CheckoutAsProjectSelectionPage(substImage, remoteFolders); |
| addPage(projectSelectionPage); |
| |
| locationSelectionPage = new CheckoutAsLocationSelectionPage(substImage, remoteFolders); |
| addPage(locationSelectionPage); |
| |
| tagSelectionPage = new TagSelectionWizardPage("tagPage", CVSUIMessages.CheckoutAsWizard_3, substImage, CVSUIMessages.CheckoutAsWizard_4, TagSource.create(remoteFolders), //$NON-NLS-1$ |
| TagSelectionArea.INCLUDE_HEAD_TAG | |
| TagSelectionArea.INCLUDE_BRANCHES | |
| TagSelectionArea.INCLUDE_VERSIONS | |
| TagSelectionArea.INCLUDE_DATES |
| ); |
| if (remoteFolders.length > 0) { |
| try { |
| CVSTag selectedTag = remoteFolders[0].getFolderSyncInfo().getTag(); |
| tagSelectionPage.setSelection(selectedTag); |
| } catch (CVSException e) { |
| CVSUIPlugin.log(e); |
| } |
| } |
| tagSelectionPage.setHelpContxtId(IHelpContextIds.CHECKOUT_TAG_SELETION_PAGE); |
| addPage(tagSelectionPage); |
| } |
| |
| @Override |
| public boolean performFinish() { |
| try { |
| if (mainPage.isPerformConfigure()) { |
| return performConfigureAndCheckout(); |
| } else if (mainPage.isPerformCheckoutAs()) { |
| if (isSingleFolder()) { |
| return performSingleCheckoutAs(); |
| } else { |
| return performMultipleCheckoutAs(); |
| } |
| } else if (mainPage.isPerformCheckoutInto()) { |
| return performCheckoutInto(); |
| } |
| } catch (InvocationTargetException e) { |
| handle(e); |
| // drop through |
| } catch (InterruptedException e) { |
| // drop through |
| } |
| return false; |
| } |
| |
| private boolean isSingleFolder() { |
| return remoteFolders.length == 1; |
| } |
| |
| @Override |
| public boolean canFinish() { |
| return (mainPage.isPageComplete() |
| && (mainPage.isPerformConfigure() |
| || (mainPage.isPerformCheckoutInto() && projectSelectionPage.isPageComplete()) |
| || (mainPage.isPerformCheckoutAs() && locationSelectionPage.isPageComplete()))); |
| } |
| |
| @Override |
| public IWizardPage getNextPage(IWizardPage page) { |
| if (page == mainPage) { |
| if (mainPage.isPerformConfigure()) return tagSelectionPage; |
| if (mainPage.isPerformCheckoutInto()) return projectSelectionPage; |
| if (mainPage.isPerformCheckoutAs()) { |
| if (isSingleFolder()) { |
| locationSelectionPage.setProjectName(mainPage.getProjectName()); |
| } else { |
| locationSelectionPage.setProject(null); |
| } |
| return locationSelectionPage; |
| } |
| } |
| // The tag selection page is always shown as the last page |
| if (page != tagSelectionPage) { |
| return tagSelectionPage; |
| } |
| return null; |
| } |
| |
| private void handle(Throwable e) { |
| CVSUIPlugin.openError(getShell(), CVSUIMessages.CheckoutAsWizard_error, null, e); |
| } |
| |
| /* |
| * Configure a local project and checkout the selected remote folder into the project. |
| * This only occurs for single folders. |
| */ |
| private boolean performConfigureAndCheckout() throws InvocationTargetException, InterruptedException { |
| IProject newProject = getNewProject(); |
| if (newProject == null) return false; |
| // Run the checkout in the background |
| ICVSRemoteFolder folder = getRemoteFolder(); |
| new CheckoutSingleProjectOperation(part, folder, newProject, null, true).run(); |
| return true; |
| } |
| |
| /* |
| * Return the single remote folder to be checked out |
| */ |
| private ICVSRemoteFolder getRemoteFolder() { |
| ICVSRemoteFolder folder = remoteFolders[0]; |
| CVSTag selectedTag = getSelectedTag(); |
| if (selectedTag != null) { |
| folder = (ICVSRemoteFolder)folder.forTag(selectedTag); |
| } |
| return folder; |
| } |
| |
| /* |
| * Return the remote folders to be checked out |
| */ |
| private ICVSRemoteFolder[] getRemoteFolders() { |
| ICVSRemoteFolder[] folders = remoteFolders.clone(); |
| CVSTag selectedTag = getSelectedTag(); |
| // see bug 160851 |
| if(selectedTag != null){ |
| for (int i = 0; i < remoteFolders.length; i++) { |
| folders[i] = (ICVSRemoteFolder)folders[i].forTag(getSelectedTag()); |
| } |
| } |
| return folders; |
| } |
| |
| /* |
| * Return the remote folders to be checked out with |
| * Folder description if available based on preferrences settings |
| */ |
| private ICVSRemoteFolder[] getRemoteFoldersWithProjectDescriptions() throws InvocationTargetException, InterruptedException { |
| ICVSRemoteFolder[] folders = getRemoteFolders(); |
| if (CVSUIPlugin.getPlugin().isUseProjectNameOnCheckout()) { |
| folders = ProjectMetaFileOperation.updateFoldersWithProjectName(part, folders); |
| } |
| return folders; |
| } |
| |
| private CVSTag getSelectedTag() { |
| return tagSelectionPage.getSelectedTag(); |
| } |
| |
| private boolean performSingleCheckoutAs() throws InvocationTargetException, InterruptedException { |
| IProject newProject = ResourcesPlugin.getWorkspace().getRoot().getProject(mainPage.getProjectName()); |
| String targetLocation = locationSelectionPage.getTargetLocation(); |
| // Run the checkout in the background |
| ICVSRemoteFolder folder = getRemoteFolder(); |
| final boolean recurse = mainPage.isRecurse(); |
| new CheckoutSingleProjectOperation(part, folder, newProject, targetLocation, false, mainPage.getWorkingSets()) { |
| @Override |
| protected boolean isRecursive() { |
| return recurse; |
| } |
| }.run(); |
| return true; |
| } |
| |
| /** |
| * Check out multiple folders to the workspace using a custom location if one is |
| * specified. |
| */ |
| private boolean performMultipleCheckoutAs() throws InvocationTargetException, InterruptedException { |
| String targetLocation = locationSelectionPage.getTargetLocation(); |
| // Run the checkout in the background |
| new CheckoutMultipleProjectsOperation(part, getRemoteFoldersWithProjectDescriptions(), targetLocation, mainPage.getWorkingSets()).run(); |
| return true; |
| } |
| |
| private boolean performCheckoutInto() throws InvocationTargetException, InterruptedException { |
| CheckoutIntoOperation operation; |
| boolean recursive = mainPage.isRecurse(); |
| if (isSingleFolder()) { |
| ICVSRemoteFolder folder = getRemoteFolder(); |
| operation = new CheckoutIntoOperation(part, folder, projectSelectionPage.getLocalFolder(), recursive); |
| } else { |
| operation = new CheckoutIntoOperation(part, getRemoteFolders(), projectSelectionPage.getParentFolder(), recursive); |
| } |
| // Run the checkout in the background |
| operation.run(); |
| return true; |
| } |
| |
| /** |
| * Get a new project that is configured by the new project wizard. |
| * This is currently the only way to do this. |
| */ |
| private IProject getNewProject() { |
| NewProjectListener listener = new NewProjectListener(); |
| ResourcesPlugin.getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.POST_CHANGE); |
| (new NewProjectAction(PlatformUI.getWorkbench().getActiveWorkbenchWindow())).run(); |
| ResourcesPlugin.getWorkspace().removeResourceChangeListener(listener); |
| IProject project = listener.getNewProject(); |
| return project; |
| } |
| |
| } |