Add Configuration to Repositories View
[egit/spearce.git] / org.eclipse.egit.ui / src / org / eclipse / egit / ui / internal / repository / RepositorySearchDialog.java
blobd9a3e47fd2295dd3bef0bb76da3fdab381e6c54f
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.repository;
13 import java.io.File;
14 import java.lang.reflect.InvocationTargetException;
15 import java.util.Collection;
16 import java.util.HashSet;
17 import java.util.Set;
18 import java.util.TreeSet;
20 import org.eclipse.core.runtime.IProgressMonitor;
21 import org.eclipse.egit.ui.UIText;
22 import org.eclipse.jface.dialogs.Dialog;
23 import org.eclipse.jface.dialogs.IDialogConstants;
24 import org.eclipse.jface.dialogs.MessageDialog;
25 import org.eclipse.jface.dialogs.ProgressMonitorDialog;
26 import org.eclipse.jface.layout.GridDataFactory;
27 import org.eclipse.jface.operation.IRunnableWithProgress;
28 import org.eclipse.jface.viewers.BaseLabelProvider;
29 import org.eclipse.jface.viewers.CheckStateChangedEvent;
30 import org.eclipse.jface.viewers.CheckboxTableViewer;
31 import org.eclipse.jface.viewers.ICheckStateListener;
32 import org.eclipse.jface.viewers.IColorProvider;
33 import org.eclipse.jface.viewers.IStructuredContentProvider;
34 import org.eclipse.jface.viewers.ITableLabelProvider;
35 import org.eclipse.jface.viewers.Viewer;
36 import org.eclipse.swt.SWT;
37 import org.eclipse.swt.events.SelectionAdapter;
38 import org.eclipse.swt.events.SelectionEvent;
39 import org.eclipse.swt.graphics.Color;
40 import org.eclipse.swt.graphics.Image;
41 import org.eclipse.swt.layout.GridLayout;
42 import org.eclipse.swt.widgets.Button;
43 import org.eclipse.swt.widgets.Composite;
44 import org.eclipse.swt.widgets.Control;
45 import org.eclipse.swt.widgets.DirectoryDialog;
46 import org.eclipse.swt.widgets.Label;
47 import org.eclipse.swt.widgets.Shell;
48 import org.eclipse.swt.widgets.Table;
49 import org.eclipse.swt.widgets.Text;
51 /**
52 * Searches for Git directories under a path that can be selected by the user
54 public class RepositorySearchDialog extends Dialog {
56 private final Set<String> existingRepositoryDirs = new HashSet<String>();
58 private final String myInitialPath;
60 private Set<String> result;
62 CheckboxTableViewer tv;
64 private final class ContentProvider implements IStructuredContentProvider {
66 @SuppressWarnings("unchecked")
67 public Object[] getElements(Object inputElement) {
68 return ((Set<String>) inputElement).toArray();
71 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
72 // nothing
75 public void dispose() {
76 // nothing
81 private final class LabelProvider extends BaseLabelProvider implements
82 ITableLabelProvider, IColorProvider {
84 public Image getColumnImage(Object element, int columnIndex) {
85 return null;
88 public String getColumnText(Object element, int columnIndex) {
89 return element.toString();
92 public Color getBackground(Object element) {
93 return null;
96 public Color getForeground(Object element) {
97 if (existingRepositoryDirs.contains(element))
98 return getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY);
100 return null;
106 * @param parentShell
107 * @param initialPath
108 * the initial path
109 * @param existingDirs
111 protected RepositorySearchDialog(Shell parentShell, String initialPath,
112 Collection<String> existingDirs) {
113 super(parentShell);
114 this.existingRepositoryDirs.addAll(existingDirs);
115 this.myInitialPath = initialPath;
116 setShellStyle(getShellStyle() | SWT.SHELL_TRIM);
121 * @return the directories
123 public Set<String> getDirectories() {
124 return result;
127 @Override
128 protected void configureShell(Shell newShell) {
129 super.configureShell(newShell);
130 newShell.setText(UIText.RepositorySearchDialog_SearchRepositoriesHeader);
133 @Override
134 protected void okPressed() {
135 result = new HashSet<String>();
136 Object[] checked = tv.getCheckedElements();
137 for (Object o : checked) {
138 result.add((String) o);
140 super.okPressed();
143 @Override
144 protected Control createDialogArea(Composite parent) {
146 Composite main = new Composite(parent, SWT.NONE);
147 main.setLayout(new GridLayout(3, false));
149 GridDataFactory.fillDefaults().grab(true, true).applyTo(main);
151 Label dirLabel = new Label(main, SWT.NONE);
152 dirLabel.setText(UIText.RepositorySearchDialog_DirectoryLabel);
153 final Text dir = new Text(main, SWT.NONE);
154 if (myInitialPath != null)
155 dir.setText(myInitialPath);
157 GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true,
158 false).applyTo(dir);
160 Button browse = new Button(main, SWT.PUSH);
161 browse.setText(UIText.RepositorySearchDialog_BrowseButton);
162 browse.addSelectionListener(new SelectionAdapter() {
164 @Override
165 public void widgetSelected(SelectionEvent e) {
166 DirectoryDialog dd = new DirectoryDialog(getShell());
167 dd.setFilterPath(dir.getText());
168 String directory = dd.open();
169 if (directory != null) {
170 dir.setText(directory);
176 Button search = new Button(main, SWT.PUSH);
177 search.setText(UIText.RepositorySearchDialog_SearchButton);
178 GridDataFactory.fillDefaults().align(SWT.LEAD, SWT.CENTER).span(3, 1)
179 .applyTo(search);
181 tv = CheckboxTableViewer.newCheckList(main, SWT.NONE);
182 Table tab = tv.getTable();
183 GridDataFactory.fillDefaults().grab(true, true).span(3, 1).applyTo(tab);
185 tv.addCheckStateListener(new ICheckStateListener() {
187 public void checkStateChanged(CheckStateChangedEvent event) {
188 if (existingRepositoryDirs.contains(event.getElement()))
189 event.getCheckable().setChecked(event.getElement(), false);
190 getButton(IDialogConstants.OK_ID).setEnabled(
191 tv.getCheckedElements().length > 0);
195 tv.setContentProvider(new ContentProvider());
196 tv.setLabelProvider(new LabelProvider());
198 search.addSelectionListener(new SelectionAdapter() {
200 @Override
201 public void widgetSelected(SelectionEvent e) {
202 final TreeSet<String> directories = new TreeSet<String>();
203 final File file = new File(dir.getText());
204 if (file.exists()) {
205 IRunnableWithProgress action = new IRunnableWithProgress() {
207 public void run(IProgressMonitor monitor)
208 throws InvocationTargetException,
209 InterruptedException {
210 RepositoriesView.recurseDir(file, directories,
211 monitor);
214 try {
215 ProgressMonitorDialog pd = new ProgressMonitorDialog(
216 getShell());
217 pd.run(true, true, action);
219 } catch (InvocationTargetException e1) {
220 MessageDialog.openError(getShell(), UIText.RepositorySearchDialog_ErrorHeader, e1
221 .getCause().getMessage());
222 } catch (InterruptedException e1) {
223 // ignore
226 tv.setInput(directories);
232 return main;
235 @Override
236 protected Control createButtonBar(Composite parent) {
237 // disable the OK button until the user selects something
238 Control bar = super.createButtonBar(parent);
239 getButton(IDialogConstants.OK_ID).setEnabled(false);
240 return bar;