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
.dialogs
.Dialog
;
24 import org
.eclipse
.jface
.layout
.GridDataFactory
;
25 import org
.eclipse
.jface
.operation
.IRunnableWithProgress
;
26 import org
.eclipse
.jface
.viewers
.CheckStateChangedEvent
;
27 import org
.eclipse
.jface
.viewers
.CheckboxTableViewer
;
28 import org
.eclipse
.jface
.viewers
.ICheckStateListener
;
29 import org
.eclipse
.jface
.viewers
.ILabelProviderListener
;
30 import org
.eclipse
.jface
.viewers
.IStructuredContentProvider
;
31 import org
.eclipse
.jface
.viewers
.ITableLabelProvider
;
32 import org
.eclipse
.jface
.viewers
.Viewer
;
33 import org
.eclipse
.jface
.wizard
.WizardPage
;
34 import org
.eclipse
.jgit
.lib
.Constants
;
35 import org
.eclipse
.osgi
.util
.NLS
;
36 import org
.eclipse
.swt
.SWT
;
37 import org
.eclipse
.swt
.graphics
.Image
;
38 import org
.eclipse
.swt
.layout
.GridLayout
;
39 import org
.eclipse
.swt
.widgets
.Composite
;
40 import org
.eclipse
.swt
.widgets
.TableColumn
;
41 import org
.eclipse
.team
.core
.RepositoryProvider
;
44 * Displays a list of projects with their containing Git repository and check
45 * box for sharing these projects with the Git Team Provider
47 * TODO add selectAll/unselectAll/toggleSelection?
49 public class GitShareProjectsPage
extends WizardPage
{
51 CheckboxTableViewer tv
;
53 private final FilenameFilter myFilenameFilter
= new FilenameFilter() {
55 public boolean accept(File dir
, String name
) {
56 return name
.equals(Constants
.DOT_GIT
);
63 public GitShareProjectsPage() {
64 super(GitShareProjectsPage
.class.getName());
65 setTitle(UIText
.GitShareProjectsPage_PageTitle
);
66 setPageComplete(false);
69 public void createControl(Composite parent
) {
71 Composite main
= new Composite(parent
, SWT
.NONE
);
72 main
.setLayout(new GridLayout(1, false));
73 tv
= CheckboxTableViewer
.newCheckList(main
, SWT
.NONE
);
74 GridDataFactory
.fillDefaults().grab(true, true).applyTo(tv
.getTable());
76 TableColumn name
= new TableColumn(tv
.getTable(), SWT
.NONE
);
78 name
.setText(UIText
.GitShareProjectsPage_ProjectNameLabel
);
80 TableColumn repo
= new TableColumn(tv
.getTable(), SWT
.NONE
);
82 repo
.setText(UIText
.GitShareProjectsPage_RepositoryLabel
);
84 tv
.getTable().setHeaderVisible(true);
86 tv
.setContentProvider(new IStructuredContentProvider() {
88 public void inputChanged(Viewer viewer
, Object oldInput
,
93 public void dispose() {
97 public Object
[] getElements(Object inputElement
) {
98 return (Object
[]) inputElement
;
102 tv
.setLabelProvider(new ITableLabelProvider() {
104 public void removeListener(ILabelProviderListener listener
) {
108 public boolean isLabelProperty(Object element
, String property
) {
112 public void dispose() {
116 public void addListener(ILabelProviderListener listener
) {
120 public String
getColumnText(Object element
, int columnIndex
) {
121 switch (columnIndex
) {
123 return ((IProject
) element
).getName();
125 String actRepo
= getRepository((IProject
) element
);
127 return UIText
.GitShareProjectsPage_NoRepoFoundMessage
;
134 public Image
getColumnImage(Object element
, int columnIndex
) {
139 tv
.addCheckStateListener(new ICheckStateListener() {
141 public void checkStateChanged(CheckStateChangedEvent event
) {
146 Dialog
.applyDialogFont(main
);
151 public void setVisible(boolean visible
) {
153 // when this becomes visible, we have to ask the wizard to import
155 final ProjectCreator wiz
= (ProjectCreator
) getWizard();
156 // TODO scheduling rule
158 getContainer().run(false, true, new IRunnableWithProgress() {
160 public void run(IProgressMonitor monitor
)
161 throws InvocationTargetException
,
162 InterruptedException
{
163 wiz
.importProjects();
168 } catch (InvocationTargetException e
) {
169 Activator
.handleError(e
.getCause().getMessage(), e
.getCause(),
171 } catch (InterruptedException e
) {
172 Activator
.handleError(
173 UIText
.GitShareProjectsPage_AbortedMessage
, e
, true);
176 setProjects(wiz
.getAddedProjects());
179 super.setVisible(visible
);
185 public void setProjects(IProject
[] projects
) {
186 tv
.setInput(projects
);
187 tv
.setAllChecked(true);
192 * @return the selected projects
194 public IProject
[] getSelectedProjects() {
195 List
<IProject
> prj
= new ArrayList
<IProject
>();
196 for (Object o
: tv
.getCheckedElements()) {
197 prj
.add((IProject
) o
);
199 return prj
.toArray(new IProject
[0]);
203 private String
getRepository(IProject element
) {
204 File locationFile
= new File(element
.getLocationURI());
205 return checkFileRecursive(locationFile
);
208 private String
checkFileRecursive(File locationFile
) {
209 if (locationFile
== null)
211 if (locationFile
.list(myFilenameFilter
).length
> 0)
212 return locationFile
.getPath();
213 return checkFileRecursive(locationFile
.getParentFile());
216 private void checkPage() {
217 setErrorMessage(null);
219 // of course we need at least one project
220 IProject
[] projects
= (IProject
[]) tv
.getInput();
221 if (projects
== null || projects
.length
== 0) {
222 setErrorMessage(UIText
.GitShareProjectsPage_NoNewProjectMessage
);
226 Object
[] selected
= tv
.getCheckedElements();
227 if (selected
.length
== 0) {
228 setErrorMessage(UIText
.GitShareProjectsPage_NothingSelectedMessage
);
231 // not all selected projects may be share-able here
232 for (Object obj
: selected
) {
233 IProject prj
= (IProject
) obj
;
234 if (getRepository(prj
) == null) {
237 UIText
.GitShareProjectsPage_NoRepoForProjectMessage
,
241 if (RepositoryProvider
.getProvider(prj
) != null)
244 UIText
.GitShareProjectsPage_ProjectAlreadySharedMessage
,
249 setPageComplete(getErrorMessage() == null);