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
.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
;
43 * Displays a list of projects with their containing Git repository and check
44 * box for sharing these projects with the Git Team Provider
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
);
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
);
77 name
.setText(UIText
.GitShareProjectsPage_ProjectNameLabel
);
79 TableColumn repo
= new TableColumn(tv
.getTable(), SWT
.NONE
);
81 repo
.setText(UIText
.GitShareProjectsPage_RepositoryLabel
);
83 tv
.getTable().setHeaderVisible(true);
85 tv
.setContentProvider(new IStructuredContentProvider() {
87 public void inputChanged(Viewer viewer
, Object oldInput
,
92 public void dispose() {
96 public Object
[] getElements(Object inputElement
) {
97 return (Object
[]) inputElement
;
101 tv
.setLabelProvider(new ITableLabelProvider() {
103 public void removeListener(ILabelProviderListener listener
) {
107 public boolean isLabelProperty(Object element
, String property
) {
111 public void dispose() {
115 public void addListener(ILabelProviderListener listener
) {
119 public String
getColumnText(Object element
, int columnIndex
) {
120 switch (columnIndex
) {
122 return ((IProject
) element
).getName();
124 String actRepo
= getRepository((IProject
) element
);
126 return UIText
.GitShareProjectsPage_NoRepoFoundMessage
;
133 public Image
getColumnImage(Object element
, int columnIndex
) {
138 tv
.addCheckStateListener(new ICheckStateListener() {
140 public void checkStateChanged(CheckStateChangedEvent event
) {
149 public void setVisible(boolean visible
) {
151 // when this becomes visible, we have to ask the wizard to import
153 final ProjectCreator wiz
= (ProjectCreator
) getWizard();
154 // TODO scheduling rule
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(),
169 } catch (InterruptedException e
) {
170 Activator
.handleError(
171 UIText
.GitShareProjectsPage_AbortedMessage
, e
, true);
174 setProjects(wiz
.getAddedProjects());
177 super.setVisible(visible
);
183 public void setProjects(IProject
[] projects
) {
184 tv
.setInput(projects
);
185 tv
.setAllChecked(true);
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)
209 if (locationFile
.list(myFilenameFilter
).length
> 0)
210 return locationFile
.getPath();
211 return checkFileRecursive(locationFile
.getParentFile());
214 private void checkPage() {
215 setErrorMessage(null);
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
);
224 Object
[] selected
= tv
.getCheckedElements();
225 if (selected
.length
== 0) {
226 setErrorMessage(UIText
.GitShareProjectsPage_NothingSelectedMessage
);
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) {
235 UIText
.GitShareProjectsPage_NoRepoForProjectMessage
,
239 if (RepositoryProvider
.getProvider(prj
) != null)
242 UIText
.GitShareProjectsPage_ProjectAlreadySharedMessage
,
247 setPageComplete(getErrorMessage() == null);