blob: 73f57f74c90c485750bccd118b7e3a67e40dd3bb [file] [log] [blame]
/*******************************************************************************
* 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();
}
}