| /******************************************************************************* |
| * Copyright (C) 2015 Red Hat Inc. |
| * |
| * 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: |
| * - Mickael Istria (Red Hat Inc.) : initial implementation |
| *******************************************************************************/ |
| package org.eclipse.egit.ui.internal.clone; |
| |
| import java.io.File; |
| import java.net.URISyntaxException; |
| import java.util.List; |
| |
| import org.eclipse.egit.ui.internal.UIIcons; |
| import org.eclipse.egit.ui.internal.UIText; |
| import org.eclipse.egit.ui.internal.clone.GitCloneSourceProviderExtension.CloneSourceProvider; |
| import org.eclipse.egit.ui.internal.provisional.wizards.GitRepositoryInfo; |
| import org.eclipse.egit.ui.internal.provisional.wizards.NoRepositoryInfoException; |
| import org.eclipse.jface.dialogs.IDialogSettings; |
| import org.eclipse.jface.dialogs.IPageChangeProvider; |
| import org.eclipse.jface.dialogs.IPageChangedListener; |
| import org.eclipse.jface.dialogs.PageChangedEvent; |
| import org.eclipse.jface.viewers.IStructuredSelection; |
| import org.eclipse.jface.wizard.IWizardContainer; |
| import org.eclipse.jface.wizard.IWizardPage; |
| import org.eclipse.jgit.lib.Repository; |
| import org.eclipse.ui.IImportWizard; |
| import org.eclipse.ui.IWorkbench; |
| import org.eclipse.ui.internal.wizards.datatransfer.SmartImportRootWizardPage; |
| import org.eclipse.ui.internal.wizards.datatransfer.SmartImportWizard; |
| |
| /** |
| * Alternative Git clone wizard using auto import framework incubating in e4 |
| */ |
| public class SmartImportGitWizard extends AbstractGitCloneWizard |
| implements IImportWizard, IPageChangedListener { |
| |
| private SmartImportWizard easymportWizard; |
| private GitSelectRepositoryPage selectRepoPage = new GitSelectRepositoryPage(); |
| |
| /** |
| * Constructor |
| */ |
| public SmartImportGitWizard() { |
| super(); |
| IDialogSettings dialogSettings = super.getDialogSettings(); |
| if (dialogSettings == null) { |
| dialogSettings = org.eclipse.egit.ui.Activator.getDefault() |
| .getDialogSettings(); |
| setDialogSettings(dialogSettings); |
| } |
| setDefaultPageImageDescriptor(UIIcons.WIZBAN_IMPORT_REPO); |
| this.easymportWizard = new SmartImportWizard(); |
| } |
| |
| @Override |
| protected void addPreClonePages() { |
| if (!hasSearchResult()) { |
| addPage(selectRepoPage); |
| } |
| } |
| |
| @Override |
| protected void addPostClonePages() { |
| this.easymportWizard.addPages(); |
| } |
| |
| @Override |
| public boolean performFinish() { |
| return true; // delegated to EasymportWizard |
| } |
| |
| @Override |
| public boolean canFinish() { |
| return getContainer().getCurrentPage() |
| .getWizard() == this.easymportWizard |
| && this.easymportWizard.canFinish(); |
| } |
| |
| @Override |
| public void init(IWorkbench workbench, IStructuredSelection selection) { |
| // nothing to do |
| } |
| |
| @Override |
| protected List<CloneSourceProvider> getCloneSourceProviders() { |
| List<CloneSourceProvider> cloneSourceProvider = super.getCloneSourceProviders(); |
| cloneSourceProvider.add(0, CloneSourceProvider.LOCAL); |
| return cloneSourceProvider; |
| } |
| |
| /** |
| * @return the clone destination page |
| */ |
| public CloneDestinationPage getCloneDestinationPage() { |
| return this.cloneDestination; |
| } |
| |
| @Override |
| public IWizardPage getNextPage(IWizardPage page) { |
| if (page == selectRepoPage || page == this.cloneDestination) { |
| return this.easymportWizard.getPages()[0]; |
| } |
| return super.getNextPage(page); |
| } |
| |
| /** |
| * @return whether according to current config, the selected repo needs to |
| * be cloned |
| */ |
| public boolean needsClone() { |
| return this.cloneDestination.cloneSettingsChanged(); |
| } |
| |
| private boolean needToCloneRepository() { |
| return SmartImportGitWizard.this.cloneDestination.cloneSettingsChanged(); |
| } |
| |
| private File doClone(final SmartImportRootWizardPage importRootPage) { |
| setCallerRunsCloneOperation(true); |
| try { |
| final GitRepositoryInfo repositoryInfo = currentSearchResult.getGitRepositoryInfo(); |
| performClone(repositoryInfo); |
| getContainer().getShell().getDisplay().asyncExec(new Runnable() { |
| @Override |
| public void run() { |
| runCloneOperation(getContainer(), repositoryInfo); |
| cloneDestination.saveSettingsForClonedRepo(); |
| importRootPage.setInitialImportRoot( |
| getCloneDestinationPage().getDestinationFile()); |
| } |
| }); |
| } catch (URISyntaxException e) { |
| org.eclipse.egit.ui.Activator.error(UIText.GitImportWizard_errorParsingURI, e); |
| } catch (NoRepositoryInfoException e) { |
| org.eclipse.egit.ui.Activator.error(UIText.GitImportWizard_noRepositoryInfo, e); |
| } catch (Exception e) { |
| org.eclipse.egit.ui.Activator.error(e.getMessage(), e); |
| } |
| return getCloneDestinationPage().getDestinationFile(); |
| } |
| |
| @Override |
| public void pageChanged(PageChangedEvent event) { |
| SmartImportRootWizardPage selectRootPage = (SmartImportRootWizardPage) this.easymportWizard |
| .getPages()[0]; |
| if (event.getSelectedPage() == selectRootPage) { |
| Repository existingRepo = selectRepoPage.getRepository(); |
| if (existingRepo != null) { |
| selectRootPage.setInitialImportRoot(existingRepo.getWorkTree()); |
| } else if (needToCloneRepository()) { |
| // asynchronous clone, set root later. |
| doClone(selectRootPage); |
| } |
| } |
| } |
| |
| @Override |
| public void setContainer(IWizardContainer container) { |
| if (container instanceof IPageChangeProvider) { |
| ((IPageChangeProvider) container).addPageChangedListener(this); |
| } |
| super.setContainer(container); |
| } |
| |
| @Override |
| public void dispose() { |
| if (getContainer() instanceof IPageChangeProvider) { |
| ((IPageChangeProvider) getContainer()) |
| .removePageChangedListener(this); |
| } |
| super.dispose(); |
| } |
| } |