Git Import Wizard
[egit.git] / org.eclipse.egit.ui / src / org / eclipse / egit / ui / internal / clone / GitImportWizard.java
blob11170834b4e7bb6863a77dd68adb994b23321680
1 /*******************************************************************************
2 * Copyright (c) 2010 SAP AG.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
8 * Contributors:
9 * Mathias Kinzler (SAP AG) - initial implementation
10 *******************************************************************************/
11 package org.eclipse.egit.ui.internal.clone;
13 import java.io.File;
14 import java.lang.reflect.InvocationTargetException;
15 import java.util.ArrayList;
16 import java.util.List;
18 import org.eclipse.core.resources.IProject;
19 import org.eclipse.core.resources.IProjectDescription;
20 import org.eclipse.core.resources.IResource;
21 import org.eclipse.core.resources.ResourcesPlugin;
22 import org.eclipse.core.runtime.CoreException;
23 import org.eclipse.core.runtime.IProgressMonitor;
24 import org.eclipse.core.runtime.Path;
25 import org.eclipse.egit.core.op.ConnectProviderOperation;
26 import org.eclipse.egit.ui.Activator;
27 import org.eclipse.egit.ui.UIIcons;
28 import org.eclipse.egit.ui.UIText;
29 import org.eclipse.jface.operation.IRunnableWithProgress;
30 import org.eclipse.jface.viewers.IStructuredSelection;
31 import org.eclipse.jface.wizard.IWizardPage;
32 import org.eclipse.jface.wizard.Wizard;
33 import org.eclipse.swt.widgets.Display;
34 import org.eclipse.ui.IImportWizard;
35 import org.eclipse.ui.IWorkbench;
36 import org.eclipse.ui.PlatformUI;
37 import org.eclipse.ui.actions.NewWizardAction;
38 import org.eclipse.ui.actions.WorkspaceModifyOperation;
40 /**
41 * The import wizard including options to clone/add repositories
43 public class GitImportWizard extends Wizard implements ProjectCreator,
44 IImportWizard {
46 private final IProject[] previousProjects;
48 private GitSelectRepositoryPage selectRepoPage = new GitSelectRepositoryPage();
50 private GitImportWithDirectoriesPage importWithDirectoriesPage = new GitImportWithDirectoriesPage();
52 private GitProjectsImportPage projectsImportPage = new GitProjectsImportPage();
54 private GitCreateGeneralProjectPage createGeneralProjectPage = new GitCreateGeneralProjectPage();
56 private GitShareProjectsPage shareProjectsPage = new GitShareProjectsPage();
58 /**
59 * Default constructor
61 public GitImportWizard() {
62 setWindowTitle(UIText.GitImportWizard_WizardTitle);
63 setDefaultPageImageDescriptor(UIIcons.WIZBAN_IMPORT_REPO);
64 previousProjects = ResourcesPlugin.getWorkspace().getRoot()
65 .getProjects();
68 @Override
69 public void addPages() {
70 addPage(selectRepoPage);
71 addPage(importWithDirectoriesPage);
72 addPage(projectsImportPage);
73 addPage(createGeneralProjectPage);
74 addPage(shareProjectsPage);
77 @Override
78 public boolean performFinish() {
79 try {
80 final int actionSelection = importWithDirectoriesPage
81 .getActionSelection();
83 final IProject[] projectsToShare;
84 if (actionSelection == GitSelectWizardPage.ACTION_DIALOG_SHARE)
85 projectsToShare = shareProjectsPage.getSelectedProjects();
86 else
87 projectsToShare = null;
89 final File repoDir = selectRepoPage.getRepository().getDirectory();
91 getContainer().run(true, true, new IRunnableWithProgress() {
93 public void run(IProgressMonitor monitor)
94 throws InvocationTargetException, InterruptedException {
96 if (actionSelection != GitSelectWizardPage.ACTION_DIALOG_SHARE) {
97 // in case of the share page, the import is done by the
98 // share page itself
99 // TODO this currently must be run in the UI Thread due
100 // to access to
101 // SWT widgets
102 importProjects();
105 if (actionSelection != GitSelectWizardPage.ACTION_NO_SHARE) {
107 // TODO scheduling rule?
108 IProject[] projects;
109 if (projectsToShare == null)
110 projects = getAddedProjects();
111 else
112 projects = projectsToShare;
113 for (IProject prj : projects) {
114 if (monitor.isCanceled())
115 throw new InterruptedException();
117 ConnectProviderOperation connectProviderOperation = new ConnectProviderOperation(
118 prj, repoDir);
119 try {
120 connectProviderOperation.execute(monitor);
121 } catch (CoreException e) {
122 throw new InvocationTargetException(e);
130 } catch (InvocationTargetException e) {
131 Activator
132 .handleError(e.getCause().getMessage(), e.getCause(), true);
133 return false;
134 } catch (InterruptedException e) {
135 Activator.handleError(
136 UIText.GitCreateProjectViaWizardWizard_AbortedMessage, e,
137 true);
138 return false;
140 return true;
143 @Override
144 public IWizardPage getNextPage(IWizardPage page) {
145 if (page == selectRepoPage) {
146 importWithDirectoriesPage.setRepository(selectRepoPage
147 .getRepository());
148 return importWithDirectoriesPage;
149 } else if (page == importWithDirectoriesPage) {
151 switch (importWithDirectoriesPage.getWizardSelection()) {
152 case GitSelectWizardPage.EXISTING_PROJECTS_WIZARD:
153 projectsImportPage.setProjectsList(importWithDirectoriesPage
154 .getPath());
155 return projectsImportPage;
156 case GitSelectWizardPage.NEW_WIZARD:
157 if (importWithDirectoriesPage.getActionSelection() != GitSelectWizardPage.ACTION_DIALOG_SHARE)
158 return null;
159 else
160 return shareProjectsPage;
162 case GitSelectWizardPage.GENERAL_WIZARD:
163 createGeneralProjectPage.setPath(importWithDirectoriesPage
164 .getPath());
165 return createGeneralProjectPage;
169 } else if (page == createGeneralProjectPage
170 || page == projectsImportPage) {
172 if (importWithDirectoriesPage.getActionSelection() != GitSelectWizardPage.ACTION_DIALOG_SHARE)
173 return null;
174 else
175 return shareProjectsPage;
177 return super.getNextPage(page);
180 @Override
181 public boolean canFinish() {
183 boolean showSharePage = importWithDirectoriesPage.getActionSelection() == GitSelectWizardPage.ACTION_DIALOG_SHARE;
184 boolean showShareComplete = !showSharePage
185 || shareProjectsPage.isPageComplete();
187 switch (importWithDirectoriesPage.getWizardSelection()) {
188 case GitSelectWizardPage.EXISTING_PROJECTS_WIZARD:
189 return projectsImportPage.isPageComplete() && showShareComplete;
190 case GitSelectWizardPage.NEW_WIZARD:
191 return showShareComplete;
192 case GitSelectWizardPage.GENERAL_WIZARD:
193 return createGeneralProjectPage.isPageComplete()
194 && showShareComplete;
196 return super.canFinish();
200 public void importProjects() {
201 // TODO progress monitoring and cancellation
202 Display.getDefault().syncExec(new Runnable() {
204 public void run() {
206 switch (importWithDirectoriesPage.getWizardSelection()) {
207 case GitSelectWizardPage.EXISTING_PROJECTS_WIZARD:
208 projectsImportPage.createProjects();
209 break;
210 case GitSelectWizardPage.NEW_WIZARD:
211 new NewWizardAction(PlatformUI.getWorkbench()
212 .getActiveWorkbenchWindow()).run();
213 break;
214 case GitSelectWizardPage.GENERAL_WIZARD:
215 try {
217 final String projectName = createGeneralProjectPage
218 .getProjectName();
219 final String path = importWithDirectoriesPage.getPath();
220 getContainer().run(true, false,
221 new WorkspaceModifyOperation() {
223 @Override
224 protected void execute(
225 IProgressMonitor monitor)
226 throws CoreException,
227 InvocationTargetException,
228 InterruptedException {
230 final IProjectDescription desc = ResourcesPlugin
231 .getWorkspace()
232 .newProjectDescription(
233 projectName);
234 desc.setLocation(new Path(path));
236 IProject prj = ResourcesPlugin
237 .getWorkspace().getRoot()
238 .getProject(desc.getName());
239 prj.create(desc, monitor);
240 prj.open(monitor);
242 ResourcesPlugin.getWorkspace()
243 .getRoot().refreshLocal(
244 IResource.DEPTH_ONE,
245 monitor);
249 } catch (InvocationTargetException e1) {
250 Activator.handleError(e1.getMessage(), e1
251 .getTargetException(), true);
252 } catch (InterruptedException e1) {
253 Activator.handleError(e1.getMessage(), e1, true);
255 break;
263 public IProject[] getAddedProjects() {
265 IProject[] currentProjects = ResourcesPlugin.getWorkspace().getRoot()
266 .getProjects();
268 List<IProject> newProjects = new ArrayList<IProject>();
270 for (IProject current : currentProjects) {
271 boolean found = false;
272 for (IProject previous : previousProjects) {
273 if (previous.equals(current)) {
274 found = true;
275 break;
278 if (!found) {
279 newProjects.add(current);
283 return newProjects.toArray(new IProject[0]);
286 public void init(IWorkbench workbench, IStructuredSelection selection) {
287 // nothing to do