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
.repository
;
14 import java
.lang
.reflect
.InvocationTargetException
;
15 import java
.util
.Collection
;
16 import java
.util
.HashSet
;
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
;
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
) {
75 public void dispose() {
81 private final class LabelProvider
extends BaseLabelProvider
implements
82 ITableLabelProvider
, IColorProvider
{
84 public Image
getColumnImage(Object element
, int columnIndex
) {
88 public String
getColumnText(Object element
, int columnIndex
) {
89 return element
.toString();
92 public Color
getBackground(Object element
) {
96 public Color
getForeground(Object element
) {
97 if (existingRepositoryDirs
.contains(element
))
98 return getShell().getDisplay().getSystemColor(SWT
.COLOR_GRAY
);
109 * @param existingDirs
111 protected RepositorySearchDialog(Shell parentShell
, String initialPath
,
112 Collection
<String
> existingDirs
) {
114 this.existingRepositoryDirs
.addAll(existingDirs
);
115 this.myInitialPath
= initialPath
;
116 setShellStyle(getShellStyle() | SWT
.SHELL_TRIM
);
121 * @return the directories
123 public Set
<String
> getDirectories() {
128 protected void configureShell(Shell newShell
) {
129 super.configureShell(newShell
);
130 newShell
.setText(UIText
.RepositorySearchDialog_SearchRepositoriesHeader
);
134 protected void okPressed() {
135 result
= new HashSet
<String
>();
136 Object
[] checked
= tv
.getCheckedElements();
137 for (Object o
: checked
) {
138 result
.add((String
) o
);
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,
160 Button browse
= new Button(main
, SWT
.PUSH
);
161 browse
.setText(UIText
.RepositorySearchDialog_BrowseButton
);
162 browse
.addSelectionListener(new SelectionAdapter() {
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)
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() {
201 public void widgetSelected(SelectionEvent e
) {
202 final TreeSet
<String
> directories
= new TreeSet
<String
>();
203 final File file
= new File(dir
.getText());
205 IRunnableWithProgress action
= new IRunnableWithProgress() {
207 public void run(IProgressMonitor monitor
)
208 throws InvocationTargetException
,
209 InterruptedException
{
210 RepositoriesView
.recurseDir(file
, directories
,
215 ProgressMonitorDialog pd
= new ProgressMonitorDialog(
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
) {
226 tv
.setInput(directories
);
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);