Honor workbench setting for Dialog font
[egit.git] / org.eclipse.egit.ui / src / org / eclipse / egit / ui / internal / clone / GitShareProjectsPage.java
blob2e1abb5dbb55673725a49d5955b28fd133275cbc
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.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;
43 /**
44 * Displays a list of projects with their containing Git repository and check
45 * box for sharing these projects with the Git Team Provider
46 * <p>
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);
60 /**
61 * Default constructor
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);
77 name.setWidth(200);
78 name.setText(UIText.GitShareProjectsPage_ProjectNameLabel);
80 TableColumn repo = new TableColumn(tv.getTable(), SWT.NONE);
81 repo.setWidth(400);
82 repo.setText(UIText.GitShareProjectsPage_RepositoryLabel);
84 tv.getTable().setHeaderVisible(true);
86 tv.setContentProvider(new IStructuredContentProvider() {
88 public void inputChanged(Viewer viewer, Object oldInput,
89 Object newInput) {
90 // nothing
93 public void dispose() {
94 // nothing
97 public Object[] getElements(Object inputElement) {
98 return (Object[]) inputElement;
102 tv.setLabelProvider(new ITableLabelProvider() {
104 public void removeListener(ILabelProviderListener listener) {
105 // ignore
108 public boolean isLabelProperty(Object element, String property) {
109 return false;
112 public void dispose() {
113 // nothing
116 public void addListener(ILabelProviderListener listener) {
117 // ignore
120 public String getColumnText(Object element, int columnIndex) {
121 switch (columnIndex) {
122 case 0:
123 return ((IProject) element).getName();
124 case 1:
125 String actRepo = getRepository((IProject) element);
126 if (actRepo == null)
127 return UIText.GitShareProjectsPage_NoRepoFoundMessage;
128 return actRepo;
129 default:
130 return null;
134 public Image getColumnImage(Object element, int columnIndex) {
135 return null;
139 tv.addCheckStateListener(new ICheckStateListener() {
141 public void checkStateChanged(CheckStateChangedEvent event) {
142 checkPage();
146 Dialog.applyDialogFont(main);
147 setControl(main);
150 @Override
151 public void setVisible(boolean visible) {
152 if (visible) {
153 // when this becomes visible, we have to ask the wizard to import
154 // the projects
155 final ProjectCreator wiz = (ProjectCreator) getWizard();
156 // TODO scheduling rule
157 try {
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(),
170 true);
171 } catch (InterruptedException e) {
172 Activator.handleError(
173 UIText.GitShareProjectsPage_AbortedMessage, e, true);
176 setProjects(wiz.getAddedProjects());
179 super.setVisible(visible);
183 * @param projects
185 public void setProjects(IProject[] projects) {
186 tv.setInput(projects);
187 tv.setAllChecked(true);
188 checkPage();
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)
210 return null;
211 if (locationFile.list(myFilenameFilter).length > 0)
212 return locationFile.getPath();
213 return checkFileRecursive(locationFile.getParentFile());
216 private void checkPage() {
217 setErrorMessage(null);
218 try {
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);
223 return;
226 Object[] selected = tv.getCheckedElements();
227 if (selected.length == 0) {
228 setErrorMessage(UIText.GitShareProjectsPage_NothingSelectedMessage);
229 return;
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) {
235 setErrorMessage(NLS
236 .bind(
237 UIText.GitShareProjectsPage_NoRepoForProjectMessage,
238 prj.getName()));
239 return;
241 if (RepositoryProvider.getProvider(prj) != null)
242 setErrorMessage(NLS
243 .bind(
244 UIText.GitShareProjectsPage_ProjectAlreadySharedMessage,
245 prj.getName()));
248 } finally {
249 setPageComplete(getErrorMessage() == null);