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
9 * Mathias Kinzler (SAP AG) - initial implementation
10 *******************************************************************************/
11 package org
.eclipse
.egit
.ui
.internal
.clone
;
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
;
41 * The import wizard including options to clone/add repositories
43 public class GitImportWizard
extends Wizard
implements ProjectCreator
,
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();
61 public GitImportWizard() {
62 setWindowTitle(UIText
.GitImportWizard_WizardTitle
);
63 setDefaultPageImageDescriptor(UIIcons
.WIZBAN_IMPORT_REPO
);
64 previousProjects
= ResourcesPlugin
.getWorkspace().getRoot()
69 public void addPages() {
70 addPage(selectRepoPage
);
71 addPage(importWithDirectoriesPage
);
72 addPage(projectsImportPage
);
73 addPage(createGeneralProjectPage
);
74 addPage(shareProjectsPage
);
78 public boolean performFinish() {
80 final int actionSelection
= importWithDirectoriesPage
81 .getActionSelection();
83 final IProject
[] projectsToShare
;
84 if (actionSelection
== GitSelectWizardPage
.ACTION_DIALOG_SHARE
)
85 projectsToShare
= shareProjectsPage
.getSelectedProjects();
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
99 // TODO this currently must be run in the UI Thread due
105 if (actionSelection
!= GitSelectWizardPage
.ACTION_NO_SHARE
) {
107 // TODO scheduling rule?
109 if (projectsToShare
== null)
110 projects
= getAddedProjects();
112 projects
= projectsToShare
;
113 for (IProject prj
: projects
) {
114 if (monitor
.isCanceled())
115 throw new InterruptedException();
117 ConnectProviderOperation connectProviderOperation
= new ConnectProviderOperation(
120 connectProviderOperation
.execute(monitor
);
121 } catch (CoreException e
) {
122 throw new InvocationTargetException(e
);
130 } catch (InvocationTargetException e
) {
132 .handleError(e
.getCause().getMessage(), e
.getCause(), true);
134 } catch (InterruptedException e
) {
135 Activator
.handleError(
136 UIText
.GitCreateProjectViaWizardWizard_AbortedMessage
, e
,
144 public IWizardPage
getNextPage(IWizardPage page
) {
145 if (page
== selectRepoPage
) {
146 importWithDirectoriesPage
.setRepository(selectRepoPage
148 return importWithDirectoriesPage
;
149 } else if (page
== importWithDirectoriesPage
) {
151 switch (importWithDirectoriesPage
.getWizardSelection()) {
152 case GitSelectWizardPage
.EXISTING_PROJECTS_WIZARD
:
153 projectsImportPage
.setProjectsList(importWithDirectoriesPage
155 return projectsImportPage
;
156 case GitSelectWizardPage
.NEW_WIZARD
:
157 if (importWithDirectoriesPage
.getActionSelection() != GitSelectWizardPage
.ACTION_DIALOG_SHARE
)
160 return shareProjectsPage
;
162 case GitSelectWizardPage
.GENERAL_WIZARD
:
163 createGeneralProjectPage
.setPath(importWithDirectoriesPage
165 return createGeneralProjectPage
;
169 } else if (page
== createGeneralProjectPage
170 || page
== projectsImportPage
) {
172 if (importWithDirectoriesPage
.getActionSelection() != GitSelectWizardPage
.ACTION_DIALOG_SHARE
)
175 return shareProjectsPage
;
177 return super.getNextPage(page
);
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() {
206 switch (importWithDirectoriesPage
.getWizardSelection()) {
207 case GitSelectWizardPage
.EXISTING_PROJECTS_WIZARD
:
208 projectsImportPage
.createProjects();
210 case GitSelectWizardPage
.NEW_WIZARD
:
211 new NewWizardAction(PlatformUI
.getWorkbench()
212 .getActiveWorkbenchWindow()).run();
214 case GitSelectWizardPage
.GENERAL_WIZARD
:
217 final String projectName
= createGeneralProjectPage
219 final String path
= importWithDirectoriesPage
.getPath();
220 getContainer().run(true, false,
221 new WorkspaceModifyOperation() {
224 protected void execute(
225 IProgressMonitor monitor
)
226 throws CoreException
,
227 InvocationTargetException
,
228 InterruptedException
{
230 final IProjectDescription desc
= ResourcesPlugin
232 .newProjectDescription(
234 desc
.setLocation(new Path(path
));
236 IProject prj
= ResourcesPlugin
237 .getWorkspace().getRoot()
238 .getProject(desc
.getName());
239 prj
.create(desc
, monitor
);
242 ResourcesPlugin
.getWorkspace()
243 .getRoot().refreshLocal(
249 } catch (InvocationTargetException e1
) {
250 Activator
.handleError(e1
.getMessage(), e1
251 .getTargetException(), true);
252 } catch (InterruptedException e1
) {
253 Activator
.handleError(e1
.getMessage(), e1
, true);
263 public IProject
[] getAddedProjects() {
265 IProject
[] currentProjects
= ResourcesPlugin
.getWorkspace().getRoot()
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
)) {
279 newProjects
.add(current
);
283 return newProjects
.toArray(new IProject
[0]);
286 public void init(IWorkbench workbench
, IStructuredSelection selection
) {