From 2beb17486fdb4874a3bb6b033512ecf37180e351 Mon Sep 17 00:00:00 2001 From: Mathias Kinzler Date: Fri, 11 Jun 2010 12:07:27 +0200 Subject: [PATCH] The "Add Repositories" dialog should not scan automatically The "Search" button was added back since automatically scanning the "last used" directory was considered harmful. In order to better guide the user, suitable message texts are now used in the title area of the dialog. Bug: 315285 Change-Id: I16bfa8190acecebc192df9be92d8268f44a005fc Signed-off-by: Mathias Kinzler Signed-off-by: Matthias Sohn --- .../src/org/eclipse/egit/ui/UIText.java | 35 +++- .../repository/RepositorySearchDialog.java | 194 ++++++++++++--------- .../src/org/eclipse/egit/ui/uitext.properties | 21 ++- 3 files changed, 162 insertions(+), 88 deletions(-) diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java index 6cb32614..46f8da4a 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/UIText.java @@ -301,6 +301,9 @@ public class UIText extends NLS { public static String RepositoryRemotePropertySource_RemotePushUrl_label; /** */ + public static String RepositorySearchDialog_AddGitRepositories; + + /** */ public static String RepositorySearchDialog_DeepSearch_button; /** */ @@ -310,10 +313,25 @@ public class UIText extends NLS { public static String RepositorySearchDialog_ScanningForRepositories_message; /** */ - public static String RepositorySearchDialog_DeselectAll_button; + public static String RepositorySearchDialog_DirectoryNotFoundMessage; + + /** */ + public static String RepositorySearchDialog_Search; + + /** */ + public static String RepositorySearchDialog_SearchCriteriaGroup; + + /** */ + public static String RepositorySearchDialog_SearchRecursiveToolTip; + + /** */ + public static String RepositorySearchDialog_SearchResultGroup; /** */ - public static String RepositorySearchDialog_SelectAll_button; + public static String RepositorySearchDialog_SearchTitle; + + /** */ + public static String RepositorySearchDialog_SearchTooltip; /** */ public static String RepositorySearchDialog_SomeDirectoriesHiddenMessage; @@ -340,18 +358,27 @@ public class UIText extends NLS { public static String RepositorySearchDialog_directory; /** */ + public static String RepositorySearchDialog_EnterDirectoryToolTip; + + /** */ public static String RepositorySearchDialog_errorOccurred; /** */ - public static String RepositorySearchDialog_search; + public static String RepositorySearchDialog_NoSearchAvailableMessage; /** */ - public static String RepositorySearchDialog_searchRepositories; + public static String RepositorySearchDialog_NothingFoundMessage; + + /** */ + public static String RepositorySearchDialog_search; /** */ public static String RepositorySearchDialog_searchRepositoriesMessage; /** */ + public static String RepositorySearchDialog_ToggleSelectionButton; + + /** */ public static String RepositorySelectionPage_BrowseLocalFile; /** */ diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositorySearchDialog.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositorySearchDialog.java index 2d1e2630..685fff49 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositorySearchDialog.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositorySearchDialog.java @@ -18,7 +18,6 @@ import java.util.HashSet; import java.util.Set; import java.util.TreeSet; -import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; @@ -58,7 +57,7 @@ import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.DirectoryDialog; -import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; @@ -88,9 +87,9 @@ public class RepositorySearchDialog extends TitleAreaDialog { private Button lookForNestedButton; - private Button fSelectAllButton; + private Button searchButton; - private Button fDeselectAllButton; + private Button toggleSelectionButton; private final ResourceManager fImageCache = new LocalResourceManager( JFaceResources.getResources()); @@ -172,18 +171,6 @@ public class RepositorySearchDialog extends TitleAreaDialog { setHelpAvailable(false); } - @Override - public int open() { - // we start the search asynchronously so that the dialog is already open - // when the progress dialog is showing - Display.getDefault().asyncExec(new Runnable() { - public void run() { - doSearch(); - } - }); - return super.open(); - } - /** * * @return the directories @@ -195,7 +182,7 @@ public class RepositorySearchDialog extends TitleAreaDialog { @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); - newShell.setText(UIText.RepositorySearchDialog_searchRepositories); + newShell.setText(UIText.RepositorySearchDialog_AddGitRepositories); setTitleImage(fImageCache.createImage(UIIcons.WIZBAN_IMPORT_REPO)); } @@ -208,26 +195,34 @@ public class RepositorySearchDialog extends TitleAreaDialog { @Override protected Control createDialogArea(Composite parent) { - super.createDialogArea(parent); - setTitle(UIText.RepositorySearchDialog_searchRepositories); + + Composite titleParent = (Composite) super.createDialogArea(parent); + + setTitle(UIText.RepositorySearchDialog_SearchTitle); setMessage(UIText.RepositorySearchDialog_searchRepositoriesMessage); - Composite main = new Composite(parent, SWT.NONE); - main.setLayout(new GridLayout(4, false)); + Composite main = new Composite(titleParent, SWT.NONE); + main.setLayout(new GridLayout(1, false)); main.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - Label dirLabel = new Label(main, SWT.NONE); + Group searchGroup = new Group(main, SWT.SHADOW_ETCHED_IN); + searchGroup.setText(UIText.RepositorySearchDialog_SearchCriteriaGroup); + searchGroup.setLayout(new GridLayout(3, false)); + GridDataFactory.fillDefaults().grab(true, false).applyTo(searchGroup); + + Label dirLabel = new Label(searchGroup, SWT.NONE); dirLabel.setText(UIText.RepositorySearchDialog_directory); - dir = new Text(main, SWT.BORDER); + dir = new Text(searchGroup, SWT.BORDER); GridDataFactory.fillDefaults().align(SWT.FILL, SWT.CENTER).grab(true, - false).span(2, 1).hint(300, SWT.DEFAULT).applyTo(dir); + false).hint(300, SWT.DEFAULT).applyTo(dir); + dir.setToolTipText(UIText.RepositorySearchDialog_EnterDirectoryToolTip); - String initialPath = prefs.get(PREF_PATH, ResourcesPlugin - .getWorkspace().getRoot().getLocation().toOSString()); + String initialPath = prefs.get(PREF_PATH, FS.DETECTED.userHome() + .toString()); dir.setText(initialPath); - Button browse = new Button(main, SWT.PUSH); + Button browse = new Button(searchGroup, SWT.PUSH); browse.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); browse.setText(UIText.RepositorySearchDialog_browse); @@ -239,6 +234,7 @@ public class RepositorySearchDialog extends TitleAreaDialog { dd.setFilterPath(dir.getText()); String directory = dd.open(); if (directory != null) { + setNeedsSearch(); dir.setText(directory); prefs.put(PREF_PATH, directory); try { @@ -251,32 +247,15 @@ public class RepositorySearchDialog extends TitleAreaDialog { }); - // TODO for 3.4 compatibility, we must use this constructor - fTree = new FilteredTree(main, SWT.CHECK | SWT.BORDER, - new PatternFilter()); - fTreeViewer = fTree.getViewer(); - fTreeViewer - .addSelectionChangedListener(new ISelectionChangedListener() { - - public void selectionChanged(SelectionChangedEvent event) { - // this is used to update the OK button when the - // keyboard - // is used to toggle the check boxes - getButton(OK).setEnabled(hasCheckedItems()); - } - }); - - GridDataFactory.fillDefaults().grab(true, true).span(4, 1).minSize(0, - 300).applyTo(fTree); - fTree.setEnabled(false); - - lookForNestedButton = new Button(main, SWT.CHECK); + lookForNestedButton = new Button(searchGroup, SWT.CHECK); lookForNestedButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, - false, false, 2, 1)); + false, false, 3, 1)); lookForNestedButton.setSelection(prefs.getBoolean(PREF_DEEP_SEARCH, false)); lookForNestedButton .setText(UIText.RepositorySearchDialog_DeepSearch_button); + lookForNestedButton + .setToolTipText(UIText.RepositorySearchDialog_SearchRecursiveToolTip); lookForNestedButton.addSelectionListener(new SelectionAdapter() { @@ -289,36 +268,66 @@ public class RepositorySearchDialog extends TitleAreaDialog { } catch (BackingStoreException e1) { // ignore } - doSearch(); + setNeedsSearch(); } }); - fSelectAllButton = new Button(main, SWT.NONE); - fSelectAllButton.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, false, - false, 1, 1)); - fSelectAllButton - .setText(UIText.RepositorySearchDialog_SelectAll_button); - fSelectAllButton.setEnabled(false); - fSelectAllButton.addSelectionListener(new SelectionAdapter() { + Group searchResultGroup = new Group(main, SWT.SHADOW_ETCHED_IN); + searchResultGroup + .setText(UIText.RepositorySearchDialog_SearchResultGroup); + searchResultGroup.setLayout(new GridLayout(2, false)); + GridDataFactory.fillDefaults().applyTo(searchResultGroup); + + // TODO for 3.4 compatibility, we must use this constructor + fTree = new FilteredTree(searchResultGroup, SWT.CHECK | SWT.BORDER, + new PatternFilter()); + fTreeViewer = fTree.getViewer(); + fTreeViewer + .addSelectionChangedListener(new ISelectionChangedListener() { + + public void selectionChanged(SelectionChangedEvent event) { + // this is used to update the OK button when the + // keyboard + // is used to toggle the check boxes + enableOk(); + } + }); + + GridDataFactory.fillDefaults().grab(true, true).minSize(0, 300) + .applyTo(fTree); + + Composite buttonColumn = new Composite(searchResultGroup, SWT.NONE); + buttonColumn.setLayout(new GridLayout(1, false)); + GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).applyTo( + buttonColumn); + + searchButton = new Button(buttonColumn, SWT.PUSH); + GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).applyTo( + searchButton); + searchButton.setText(UIText.RepositorySearchDialog_Search); + searchButton + .setToolTipText(UIText.RepositorySearchDialog_SearchTooltip); + searchButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - setAllSelected(true); + doSearch(); } + }); - fDeselectAllButton = new Button(main, SWT.NONE); - fDeselectAllButton.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, - false, false, 1, 1)); - fDeselectAllButton - .setText(UIText.RepositorySearchDialog_DeselectAll_button); - fDeselectAllButton.setEnabled(false); - fDeselectAllButton.addSelectionListener(new SelectionAdapter() { + toggleSelectionButton = new Button(buttonColumn, SWT.NONE); + GridDataFactory.fillDefaults().align(SWT.FILL, SWT.FILL).applyTo( + toggleSelectionButton); + toggleSelectionButton + .setText(UIText.RepositorySearchDialog_ToggleSelectionButton); + toggleSelectionButton.setEnabled(false); + toggleSelectionButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - setAllSelected(false); + toggleSelection(); } }); @@ -329,7 +338,7 @@ public class RepositorySearchDialog extends TitleAreaDialog { dir.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { - doSearch(); + setNeedsSearch(); } }); @@ -337,13 +346,15 @@ public class RepositorySearchDialog extends TitleAreaDialog { fTreeViewer.setContentProvider(new ContentProvider()); fTreeViewer.setLabelProvider(new RepositoryLabelProvider()); + applyDialogFont(main); + return main; } @Override protected void createButtonsForButtonBar(Composite parent) { super.createButtonsForButtonBar(parent); - getButton(OK).setEnabled(false); + enableOk(); } private void findGitDirsRecursive(File root, Set strings, @@ -363,7 +374,8 @@ public class RepositorySearchDialog extends TitleAreaDialog { } if (child.isDirectory() - && RepositoryCache.FileKey.isGitRepository(child, FS.DETECTED)) { + && RepositoryCache.FileKey.isGitRepository(child, + FS.DETECTED)) { try { strings.add(child.getCanonicalPath()); } catch (IOException e) { @@ -402,14 +414,16 @@ public class RepositorySearchDialog extends TitleAreaDialog { return false; } - private void setAllSelected(boolean selectionState) { + private void toggleSelection() { for (TreeItem item : fTreeViewer.getTree().getItems()) - item.setChecked(selectionState); - getButton(OK).setEnabled(hasCheckedItems()); + item.setChecked(!item.getChecked()); + enableOk(); } private void doSearch() { + setMessage(null); + setErrorMessage(null); // perform the search... final Set directories = new HashSet(); final File file = new File(dir.getText()); @@ -439,6 +453,9 @@ public class RepositorySearchDialog extends TitleAreaDialog { new Status(IStatus.ERROR, Activator .getPluginId(), ex.getMessage(), ex)); } + if (monitor.isCanceled()) { + throw new InterruptedException(); + } } }; try { @@ -456,7 +473,6 @@ public class RepositorySearchDialog extends TitleAreaDialog { // ignore } - boolean foundNew = false; int foundOld = 0; TreeSet validDirs = new TreeSet(); @@ -464,7 +480,6 @@ public class RepositorySearchDialog extends TitleAreaDialog { for (String foundDir : directories) { if (!fExistingDirectories.contains(foundDir)) { validDirs.add(foundDir); - foundNew = true; } else { foundOld++; } @@ -476,13 +491,36 @@ public class RepositorySearchDialog extends TitleAreaDialog { UIText.RepositorySearchDialog_SomeDirectoriesHiddenMessage, Integer.valueOf(foundOld)); setMessage(message, IMessageProvider.INFORMATION); - } else - setMessage(null); - fSelectAllButton.setEnabled(foundNew); - fDeselectAllButton.setEnabled(foundNew); - fTree.setEnabled(validDirs.size() > 0); + } else if (directories.isEmpty()) + setMessage(UIText.RepositorySearchDialog_NothingFoundMessage, + IMessageProvider.INFORMATION); + toggleSelectionButton.setEnabled(!validDirs.isEmpty()); fTreeViewer.setInput(validDirs); + // this sets all to selected + toggleSelection(); } } + + private void setNeedsSearch() { + fTreeViewer.setInput(null); + final File file = new File(dir.getText()); + if (!file.exists()) { + setErrorMessage(NLS.bind( + UIText.RepositorySearchDialog_DirectoryNotFoundMessage, dir + .getText())); + } else { + setErrorMessage(null); + setMessage(UIText.RepositorySearchDialog_NoSearchAvailableMessage, + IMessageProvider.INFORMATION); + } + enableOk(); + } + + private void enableOk() { + boolean enable = hasCheckedItems(); + getButton(OK).setEnabled(enable); + if (enable) + getButton(OK).setFocus(); + } } diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties index 2780ec81..9269fee2 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/uitext.properties @@ -115,18 +115,27 @@ RepositoryRemotePropertySource_PushLabel=Remote Push Specification RepositoryRemotePropertySource_RemoteFetchURL_label=Remote Fetch URL RepositoryRemotePropertySource_RemotePushUrl_label=Remote Push URL -RepositorySearchDialog_DeepSearch_button=Look for nested repositories +RepositorySearchDialog_AddGitRepositories=Add Git Repositories +RepositorySearchDialog_DeepSearch_button=&Look for nested repositories RepositorySearchDialog_RepositoriesFound_message={0} Git repositories found... RepositorySearchDialog_ScanningForRepositories_message=Scanning for GIT repositories... -RepositorySearchDialog_SelectAll_button=Select All +RepositorySearchDialog_Search=&Search +RepositorySearchDialog_SearchCriteriaGroup=Search criteria +RepositorySearchDialog_SearchRecursiveToolTip=If this is checked, subdirectories of already found Repositories will be searched recursively +RepositorySearchDialog_SearchResultGroup=Search result +RepositorySearchDialog_SearchTitle=Search and select Git Repositories on your local file system +RepositorySearchDialog_SearchTooltip=Performs a search with the current search criteria and updates the search result RepositorySearchDialog_SomeDirectoriesHiddenMessage={0} directories are hidden as they have alredy been added -RepositorySearchDialog_DeselectAll_button=Deselect All -RepositorySearchDialog_browse=Browse... -RepositorySearchDialog_directory=Directory: +RepositorySearchDialog_DirectoryNotFoundMessage=Directory {0} does not exist +RepositorySearchDialog_browse=&Browse... +RepositorySearchDialog_directory=&Directory: +RepositorySearchDialog_EnterDirectoryToolTip=Enter a local file system directory from which to start the search RepositorySearchDialog_errorOccurred=Error occurred +RepositorySearchDialog_NoSearchAvailableMessage=No search results available for current search criteria, click Search button to update the list +RepositorySearchDialog_NothingFoundMessage=No Git Repositories found RepositorySearchDialog_search=Search -RepositorySearchDialog_searchRepositories=Search Git Repositories RepositorySearchDialog_searchRepositoriesMessage=Search for local Git repositories on the file system +RepositorySearchDialog_ToggleSelectionButton=&Toggle Selection RepositorySelectionPage_BrowseLocalFile=Local file... RepositorySelectionPage_sourceSelectionTitle=Source Git Repository RepositorySelectionPage_sourceSelectionDescription=Enter the location of the source repository. -- 2.11.4.GIT