Git Import Wizard
[egit.git] / org.eclipse.egit.ui / src / org / eclipse / egit / ui / internal / clone / GitShareProjectsPage.java
blob6debfadde69cd4d2d8768f925dd15e4e95da6930
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.io.FilenameFilter;
15 import java.lang.reflect.InvocationTargetException;
16 import java.util.ArrayList;
17 import java.util.List;
19 import org.eclipse.core.resources.IProject;
20 import org.eclipse.core.runtime.IProgressMonitor;
21 import org.eclipse.egit.ui.Activator;
22 import org.eclipse.egit.ui.UIText;
23 import org.eclipse.jface.layout.GridDataFactory;
24 import org.eclipse.jface.operation.IRunnableWithProgress;
25 import org.eclipse.jface.viewers.CheckStateChangedEvent;
26 import org.eclipse.jface.viewers.CheckboxTableViewer;
27 import org.eclipse.jface.viewers.ICheckStateListener;
28 import org.eclipse.jface.viewers.ILabelProviderListener;
29 import org.eclipse.jface.viewers.IStructuredContentProvider;
30 import org.eclipse.jface.viewers.ITableLabelProvider;
31 import org.eclipse.jface.viewers.Viewer;
32 import org.eclipse.jface.wizard.WizardPage;
33 import org.eclipse.jgit.lib.Constants;
34 import org.eclipse.osgi.util.NLS;
35 import org.eclipse.swt.SWT;
36 import org.eclipse.swt.graphics.Image;
37 import org.eclipse.swt.layout.GridLayout;
38 import org.eclipse.swt.widgets.Composite;
39 import org.eclipse.swt.widgets.TableColumn;
40 import org.eclipse.team.core.RepositoryProvider;
42 /**
43 * Displays a list of projects with their containing Git repository and check
44 * box for sharing these projects with the Git Team Provider
45 * <p>
46 * TODO add selectAll/unselectAll/toggleSelection?
48 public class GitShareProjectsPage extends WizardPage {
50 CheckboxTableViewer tv;
52 private final FilenameFilter myFilenameFilter = new FilenameFilter() {
54 public boolean accept(File dir, String name) {
55 return name.equals(Constants.DOT_GIT);
59 /**
60 * Default constructor
62 public GitShareProjectsPage() {
63 super(GitShareProjectsPage.class.getName());
64 setTitle(UIText.GitShareProjectsPage_PageTitle);
65 setPageComplete(false);
68 public void createControl(Composite parent) {
70 Composite main = new Composite(parent, SWT.NONE);
71 main.setLayout(new GridLayout(1, false));
72 tv = CheckboxTableViewer.newCheckList(main, SWT.NONE);
73 GridDataFactory.fillDefaults().grab(true, true).applyTo(tv.getTable());
75 TableColumn name = new TableColumn(tv.getTable(), SWT.NONE);
76 name.setWidth(200);
77 name.setText(UIText.GitShareProjectsPage_ProjectNameLabel);
79 TableColumn repo = new TableColumn(tv.getTable(), SWT.NONE);
80 repo.setWidth(400);
81 repo.setText(UIText.GitShareProjectsPage_RepositoryLabel);
83 tv.getTable().setHeaderVisible(true);
85 tv.setContentProvider(new IStructuredContentProvider() {
87 public void inputChanged(Viewer viewer, Object oldInput,
88 Object newInput) {
89 // nothing
92 public void dispose() {
93 // nothing
96 public Object[] getElements(Object inputElement) {
97 return (Object[]) inputElement;
99 });
101 tv.setLabelProvider(new ITableLabelProvider() {
103 public void removeListener(ILabelProviderListener listener) {
104 // ignore
107 public boolean isLabelProperty(Object element, String property) {
108 return false;
111 public void dispose() {
112 // nothing
115 public void addListener(ILabelProviderListener listener) {
116 // ignore
119 public String getColumnText(Object element, int columnIndex) {
120 switch (columnIndex) {
121 case 0:
122 return ((IProject) element).getName();
123 case 1:
124 String actRepo = getRepository((IProject) element);
125 if (actRepo == null)
126 return UIText.GitShareProjectsPage_NoRepoFoundMessage;
127 return actRepo;
128 default:
129 return null;
133 public Image getColumnImage(Object element, int columnIndex) {
134 return null;
138 tv.addCheckStateListener(new ICheckStateListener() {
140 public void checkStateChanged(CheckStateChangedEvent event) {
141 checkPage();
145 setControl(main);
148 @Override
149 public void setVisible(boolean visible) {
150 if (visible) {
151 // when this becomes visible, we have to ask the wizard to import
152 // the projects
153 final ProjectCreator wiz = (ProjectCreator) getWizard();
154 // TODO scheduling rule
155 try {
156 getContainer().run(false, true, new IRunnableWithProgress() {
158 public void run(IProgressMonitor monitor)
159 throws InvocationTargetException,
160 InterruptedException {
161 wiz.importProjects();
166 } catch (InvocationTargetException e) {
167 Activator.handleError(e.getCause().getMessage(), e.getCause(),
168 true);
169 } catch (InterruptedException e) {
170 Activator.handleError(
171 UIText.GitShareProjectsPage_AbortedMessage, e, true);
174 setProjects(wiz.getAddedProjects());
177 super.setVisible(visible);
181 * @param projects
183 public void setProjects(IProject[] projects) {
184 tv.setInput(projects);
185 tv.setAllChecked(true);
186 checkPage();
190 * @return the selected projects
192 public IProject[] getSelectedProjects() {
193 List<IProject> prj = new ArrayList<IProject>();
194 for (Object o : tv.getCheckedElements()) {
195 prj.add((IProject) o);
197 return prj.toArray(new IProject[0]);
201 private String getRepository(IProject element) {
202 File locationFile = new File(element.getLocationURI());
203 return checkFileRecursive(locationFile);
206 private String checkFileRecursive(File locationFile) {
207 if (locationFile == null)
208 return null;
209 if (locationFile.list(myFilenameFilter).length > 0)
210 return locationFile.getPath();
211 return checkFileRecursive(locationFile.getParentFile());
214 private void checkPage() {
215 setErrorMessage(null);
216 try {
217 // of course we need at least one project
218 IProject[] projects = (IProject[]) tv.getInput();
219 if (projects == null || projects.length == 0) {
220 setErrorMessage(UIText.GitShareProjectsPage_NoNewProjectMessage);
221 return;
224 Object[] selected = tv.getCheckedElements();
225 if (selected.length == 0) {
226 setErrorMessage(UIText.GitShareProjectsPage_NothingSelectedMessage);
227 return;
229 // not all selected projects may be share-able here
230 for (Object obj : selected) {
231 IProject prj = (IProject) obj;
232 if (getRepository(prj) == null) {
233 setErrorMessage(NLS
234 .bind(
235 UIText.GitShareProjectsPage_NoRepoForProjectMessage,
236 prj.getName()));
237 return;
239 if (RepositoryProvider.getProvider(prj) != null)
240 setErrorMessage(NLS
241 .bind(
242 UIText.GitShareProjectsPage_ProjectAlreadySharedMessage,
243 prj.getName()));
246 } finally {
247 setPageComplete(getErrorMessage() == null);