diff --git a/apisupport.project/src/org/netbeans/modules/apisupport/project/ui/branding/ResourceBundleBrandingPanel.form b/apisupport.project/src/org/netbeans/modules/apisupport/project/ui/branding/ResourceBundleBrandingPanel.form
--- a/apisupport.project/src/org/netbeans/modules/apisupport/project/ui/branding/ResourceBundleBrandingPanel.form
+++ b/apisupport.project/src/org/netbeans/modules/apisupport/project/ui/branding/ResourceBundleBrandingPanel.form
@@ -52,7 +52,6 @@
-
diff --git a/apisupport.project/src/org/netbeans/modules/apisupport/project/ui/branding/ResourceBundleBrandingPanel.java b/apisupport.project/src/org/netbeans/modules/apisupport/project/ui/branding/ResourceBundleBrandingPanel.java
--- a/apisupport.project/src/org/netbeans/modules/apisupport/project/ui/branding/ResourceBundleBrandingPanel.java
+++ b/apisupport.project/src/org/netbeans/modules/apisupport/project/ui/branding/ResourceBundleBrandingPanel.java
@@ -164,8 +164,6 @@
}
});
- view.setUseSubstringInQuickSearch(true);
-
searchLabel.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
searchLabel.setLabelFor(searchField);
org.openide.awt.Mnemonics.setLocalizedText(searchLabel, org.openide.util.NbBundle.getMessage(ResourceBundleBrandingPanel.class, "ResourceBundleBrandingPanel.searchLabel.text")); // NOI18N
diff --git a/cnd.qnavigator/src/org/netbeans/modules/cnd/qnavigator/navigator/NavigatorPanelUI.java b/cnd.qnavigator/src/org/netbeans/modules/cnd/qnavigator/navigator/NavigatorPanelUI.java
--- a/cnd.qnavigator/src/org/netbeans/modules/cnd/qnavigator/navigator/NavigatorPanelUI.java
+++ b/cnd.qnavigator/src/org/netbeans/modules/cnd/qnavigator/navigator/NavigatorPanelUI.java
@@ -78,7 +78,6 @@
navigatorPane.setRootVisible(false);
navigatorPane.setDropTarget(false);
navigatorPane.setDragSource(false);
- navigatorPane.setUseSubstringInQuickSearch(true);
add(navigatorPane, java.awt.BorderLayout.CENTER);
explorerManager.setRootContext(content.getRoot());
expandAll();
diff --git a/cnd.refactoring/src/org/netbeans/modules/cnd/refactoring/codegen/ui/ElementSelectorPanel.java b/cnd.refactoring/src/org/netbeans/modules/cnd/refactoring/codegen/ui/ElementSelectorPanel.java
--- a/cnd.refactoring/src/org/netbeans/modules/cnd/refactoring/codegen/ui/ElementSelectorPanel.java
+++ b/cnd.refactoring/src/org/netbeans/modules/cnd/refactoring/codegen/ui/ElementSelectorPanel.java
@@ -76,7 +76,6 @@
setLayout(new BorderLayout());
elementView = new CheckTreeView();
elementView.setRootVisible(false);
- elementView.setUseSubstringInQuickSearch(true);
add(elementView, BorderLayout.CENTER);
if (supportInline) {
Mnemonics.setLocalizedText(inline, NbBundle.getMessage(ElementSelectorPanel.class, "LBL_inline_implementation")); // NOI18N
diff --git a/cnd.simpleunit/src/org/netbeans/modules/cnd/simpleunit/wizard/FunctionSelectorPanel.java b/cnd.simpleunit/src/org/netbeans/modules/cnd/simpleunit/wizard/FunctionSelectorPanel.java
--- a/cnd.simpleunit/src/org/netbeans/modules/cnd/simpleunit/wizard/FunctionSelectorPanel.java
+++ b/cnd.simpleunit/src/org/netbeans/modules/cnd/simpleunit/wizard/FunctionSelectorPanel.java
@@ -69,7 +69,6 @@
public FunctionSelectorPanel(boolean singleSelection) {
setLayout(new BorderLayout());
elementView = new CheckTreeView();
- elementView.setUseSubstringInQuickSearch(true);
add(elementView, BorderLayout.CENTER);
}
diff --git a/favorites/src/org/netbeans/modules/favorites/Tab.java b/favorites/src/org/netbeans/modules/favorites/Tab.java
--- a/favorites/src/org/netbeans/modules/favorites/Tab.java
+++ b/favorites/src/org/netbeans/modules/favorites/Tab.java
@@ -169,7 +169,6 @@
TreeView tView = new MyBeanTreeView();
tView.setRootVisible(false);
tView.setDragSource (true);
- tView.setUseSubstringInQuickSearch(true);
setLayout(new BorderLayout());
add (tView);
return tView;
diff --git a/java.debug/src/org/netbeans/modules/java/debug/ElementNavigatorProviderImpl.java b/java.debug/src/org/netbeans/modules/java/debug/ElementNavigatorProviderImpl.java
--- a/java.debug/src/org/netbeans/modules/java/debug/ElementNavigatorProviderImpl.java
+++ b/java.debug/src/org/netbeans/modules/java/debug/ElementNavigatorProviderImpl.java
@@ -94,7 +94,6 @@
if (panel == null) {
final BeanTreeView view = new BeanTreeView();
view.setRootVisible(true);
- view.setUseSubstringInQuickSearch(true);
view.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
class Panel extends JPanel implements ExplorerManager.Provider, Lookup.Provider {
// Make sure action context works correctly:
diff --git a/java.debug/src/org/netbeans/modules/java/debug/ErrorNavigatorProviderImpl.java b/java.debug/src/org/netbeans/modules/java/debug/ErrorNavigatorProviderImpl.java
--- a/java.debug/src/org/netbeans/modules/java/debug/ErrorNavigatorProviderImpl.java
+++ b/java.debug/src/org/netbeans/modules/java/debug/ErrorNavigatorProviderImpl.java
@@ -80,7 +80,6 @@
if (panel == null) {
final BeanTreeView view = new BeanTreeView();
view.setRootVisible(false);
- view.setUseSubstringInQuickSearch(true);
view.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
class Panel extends JPanel implements ExplorerManager.Provider, Lookup.Provider {
// Make sure action context works correctly:
diff --git a/java.debug/src/org/netbeans/modules/java/debug/TreeNavigatorProviderImpl.java b/java.debug/src/org/netbeans/modules/java/debug/TreeNavigatorProviderImpl.java
--- a/java.debug/src/org/netbeans/modules/java/debug/TreeNavigatorProviderImpl.java
+++ b/java.debug/src/org/netbeans/modules/java/debug/TreeNavigatorProviderImpl.java
@@ -115,7 +115,6 @@
if (panel == null) {
final BeanTreeView view = new BeanTreeView();
view.setRootVisible(true);
- view.setUseSubstringInQuickSearch(true);
view.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
class Panel extends JPanel implements ExplorerManager.Provider, Lookup.Provider {
// Make sure action context works correctly:
diff --git a/java.editor/src/org/netbeans/modules/java/editor/codegen/ui/ElementSelectorPanel.java b/java.editor/src/org/netbeans/modules/java/editor/codegen/ui/ElementSelectorPanel.java
--- a/java.editor/src/org/netbeans/modules/java/editor/codegen/ui/ElementSelectorPanel.java
+++ b/java.editor/src/org/netbeans/modules/java/editor/codegen/ui/ElementSelectorPanel.java
@@ -68,7 +68,6 @@
setLayout(new BorderLayout());
elementView = new CheckTreeView();
elementView.setRootVisible(false);
- elementView.setUseSubstringInQuickSearch(true);
add(elementView, BorderLayout.CENTER);
setRootElement(elementDescription, singleSelection);
//make sure that the first element is pre-selected
diff --git a/java.navigation/src/org/netbeans/modules/java/navigation/ClassMemberPanelUI.java b/java.navigation/src/org/netbeans/modules/java/navigation/ClassMemberPanelUI.java
--- a/java.navigation/src/org/netbeans/modules/java/navigation/ClassMemberPanelUI.java
+++ b/java.navigation/src/org/netbeans/modules/java/navigation/ClassMemberPanelUI.java
@@ -347,7 +347,6 @@
public MyBeanTreeView() {
toolTipManager = new ToolTipManagerEx( this );
- setUseSubstringInQuickSearch(true);
}
public boolean getScrollOnExpand() {
diff --git a/maven.grammar/src/org/netbeans/modules/maven/codegen/NewPluginPanel.java b/maven.grammar/src/org/netbeans/modules/maven/codegen/NewPluginPanel.java
--- a/maven.grammar/src/org/netbeans/modules/maven/codegen/NewPluginPanel.java
+++ b/maven.grammar/src/org/netbeans/modules/maven/codegen/NewPluginPanel.java
@@ -422,7 +422,6 @@
btv = new BeanTreeView();
btv.setRootVisible(false);
btv.setDefaultActionAllowed(false);
- btv.setUseSubstringInQuickSearch(true);
manager = new ExplorerManager();
manager.setRootContext(getNoResultsRoot());
setLayout(new BorderLayout());
diff --git a/maven.hints/src/org/netbeans/modules/maven/hints/ui/SearchDependencyUI.java b/maven.hints/src/org/netbeans/modules/maven/hints/ui/SearchDependencyUI.java
--- a/maven.hints/src/org/netbeans/modules/maven/hints/ui/SearchDependencyUI.java
+++ b/maven.hints/src/org/netbeans/modules/maven/hints/ui/SearchDependencyUI.java
@@ -107,7 +107,6 @@
beanTreeView.setPopupAllowed(false);
beanTreeView.setRootVisible(false);
beanTreeView.setDefaultActionAllowed(true);
- beanTreeView.setUseSubstringInQuickSearch(true);
addButton.setEnabled(false);
txtClassName.setText(clazz);
diff --git a/maven/src/org/netbeans/modules/maven/newproject/ChooseArchetypePanel.java b/maven/src/org/netbeans/modules/maven/newproject/ChooseArchetypePanel.java
--- a/maven/src/org/netbeans/modules/maven/newproject/ChooseArchetypePanel.java
+++ b/maven/src/org/netbeans/modules/maven/newproject/ChooseArchetypePanel.java
@@ -151,7 +151,6 @@
tv.setPopupAllowed(false);
tv.setRootVisible(false);
tv.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
- tv.setUseSubstringInQuickSearch(true);
Childs childs = new Childs();
childs.addArchetype(LOADING_ARCHETYPE);
AbstractNode root = new AbstractNode(childs);
diff --git a/maven/src/org/netbeans/modules/maven/nodes/AddDependencyPanel.java b/maven/src/org/netbeans/modules/maven/nodes/AddDependencyPanel.java
--- a/maven/src/org/netbeans/modules/maven/nodes/AddDependencyPanel.java
+++ b/maven/src/org/netbeans/modules/maven/nodes/AddDependencyPanel.java
@@ -976,7 +976,6 @@
btv = new BeanTreeView();
btv.setRootVisible(false);
btv.setDefaultActionAllowed(true);
- btv.setUseSubstringInQuickSearch(true);
manager = new ExplorerManager();
setLayout(new BorderLayout());
add(btv, BorderLayout.CENTER);
@@ -1271,7 +1270,6 @@
btv = new BeanTreeView();
btv.setRootVisible(false);
btv.setDefaultActionAllowed(true);
- btv.setUseSubstringInQuickSearch(true);
//lv.setDefaultProcessor(this);
manager = new ExplorerManager();
manager.addPropertyChangeListener(this);
@@ -1376,7 +1374,6 @@
btv = new BeanTreeView();
btv.setRootVisible(false);
btv.setDefaultActionAllowed(true);
- btv.setUseSubstringInQuickSearch(true);
manager = new ExplorerManager();
manager.addPropertyChangeListener(this);
setLayout(new BorderLayout());
diff --git a/openide.explorer/src/org/openide/explorer/view/TreeView.java b/openide.explorer/src/org/openide/explorer/view/TreeView.java
--- a/openide.explorer/src/org/openide/explorer/view/TreeView.java
+++ b/openide.explorer/src/org/openide/explorer/view/TreeView.java
@@ -488,7 +488,11 @@
* matching for the typed characters. Defaults to prefix (false).
* @since 6.11
* @param useSubstring true
if substring search is used in quick search
+ * @deprecated Deprecated as the quick search feature uses both substring and prefix
+ * matching. All prefix matches for the typed characters will appear before substring
+ * matches.
*/
+ @Deprecated
public void setUseSubstringInQuickSearch(boolean useSubstring) {
quickSearchUsingSubstring = useSubstring;
}
@@ -2079,6 +2083,9 @@
private List doSearch(String prefix) {
List results = new ArrayList();
Set resSet = new HashSet();
+
+ // starting index of substring matches within the results
+ int startOfSubstringMatches = 0;
int startIndex = origSelectionPaths != null ? Math.max(0, getRowForPath(origSelectionPaths[0])) : 0;
int size = getRowCount();
@@ -2091,19 +2098,24 @@
while (true) {
startIndex = startIndex % size;
- TreePath path = null;
- if (quickSearchUsingSubstring) {
- path = getNextSubstringMatch(prefix, startIndex, Position.Bias.Forward);
- } else {
- path = getNextMatch(prefix, startIndex, Position.Bias.Forward);
- }
+ SubstringSearchResult substringSearchResult = getNextSubstringMatch(prefix, startIndex, Position.Bias.Forward);
+ TreePath path = substringSearchResult != null? substringSearchResult.treePath: null;
if ((path != null) && !resSet.contains(path)) {
startIndex = tree.getRowForPath(path);
- results.add(path);
+ boolean isPrefixMatch = true;
+ // put all prefix matches to the top of the list while
+ // substring matches remains in the end of the list
+ if (substringSearchResult.index == 0) {
+ results.add(startOfSubstringMatches++, path);
+ } else {
+ isPrefixMatch = false;
+ results.add(path);
+ }
resSet.add(path);
- if (!quickSearchUsingSubstring) {
+ // calculate max prefix only with prefix matches
+ if (isPrefixMatch) {
String elementName = ((VisualizerNode) path.getLastPathComponent()).getDisplayName();
// initialize prefix
@@ -2135,8 +2147,11 @@
/**
* Copied and adapted from JTree.getNextMatch(...).
+ *
+ * @return An instance of SubstringSearchResult containing the matching TreePath
+ * and the index of the first occurrence of the substring in TreePath.
*/
- private TreePath getNextSubstringMatch(
+ private SubstringSearchResult getNextSubstringMatch(
String substring, int startingRow, Position.Bias bias) {
int max = getRowCount();
@@ -2157,9 +2172,10 @@
String text = convertValueToText(
path.getLastPathComponent(), isRowSelected(row),
isExpanded(row), true, row, false);
-
- if (text.toUpperCase().indexOf(substring) >= 0) {
- return path;
+
+ int index = text.toUpperCase().indexOf(substring);
+ if (index >= 0) {
+ return new SubstringSearchResult(path, index);
}
row = (row + increment + max) % max;
} while (row != startingRow);
@@ -2456,6 +2472,18 @@
}
}
}
+
+ private class SubstringSearchResult {
+
+ TreePath treePath; // holds the matching TreePath
+ int index; // holds the index of the first occurrence of the substring in TreePath
+
+ public SubstringSearchResult(TreePath treePath, int index) {
+ this.treePath = treePath;
+ this.index = index;
+ }
+
+ }
}
private static class DummyTransferHandler extends TransferHandler /*implements UIResource*/ {
diff --git a/openide.explorer/test/unit/src/org/openide/explorer/view/TreeViewQuickSearchTest.java b/openide.explorer/test/unit/src/org/openide/explorer/view/TreeViewQuickSearchTest.java
--- a/openide.explorer/test/unit/src/org/openide/explorer/view/TreeViewQuickSearchTest.java
+++ b/openide.explorer/test/unit/src/org/openide/explorer/view/TreeViewQuickSearchTest.java
@@ -81,14 +81,11 @@
}
}
- public void testSubstringQuickSearch() throws Throwable {
- doQuickSearchTest(true);
- }
- public void testPrefixQuickSearch() throws Throwable {
- doQuickSearchTest(false);
+ public void testQuickSearch() throws Throwable {
+ doQuickSearchTest();
}
- private void doQuickSearchTest(final boolean substringSearch) throws Throwable {
+ private void doQuickSearchTest() throws Throwable {
final AbstractNode root = new AbstractNode(new Children.Array());
root.setName("test root");
@@ -107,7 +104,6 @@
final BeanTreeView btv = new BeanTreeView();
p.add(BorderLayout.CENTER, btv);
- btv.setUseSubstringInQuickSearch(substringSearch);
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
@@ -135,9 +131,8 @@
KeyEvent ke = new KeyEvent(btv.tree, KeyEvent.KEY_TYPED, 0, 0, KeyEvent.VK_UNDEFINED, 'A');
btv.tree.dispatchEvent(ke);
}
-
if (phase[0] == 2) {
- Node operateOn = substringSearch ? children[2] : children[4];
+ Node operateOn = children[4];
TreePath[] paths = tree.getSelectionPaths();
assertNotNull("One node should be selected, but there are none.", paths);
assertEquals("One node should be selected, but there are none.", 1, paths.length);
diff --git a/options.api/src/org/netbeans/modules/options/classic/NbMainExplorer.java b/options.api/src/org/netbeans/modules/options/classic/NbMainExplorer.java
--- a/options.api/src/org/netbeans/modules/options/classic/NbMainExplorer.java
+++ b/options.api/src/org/netbeans/modules/options/classic/NbMainExplorer.java
@@ -174,7 +174,6 @@
*/
protected TreeView initGui () {
TreeView v = new BeanTreeView();
- v.setUseSubstringInQuickSearch(true);
v.setDragSource (true);
setLayout(new BorderLayout());
add (v);
diff --git a/projectui/src/org/netbeans/modules/project/ui/ProjectTab.java b/projectui/src/org/netbeans/modules/project/ui/ProjectTab.java
--- a/projectui/src/org/netbeans/modules/project/ui/ProjectTab.java
+++ b/projectui/src/org/netbeans/modules/project/ui/ProjectTab.java
@@ -178,7 +178,6 @@
btv = new ProjectTreeView(); // Add the BeanTreeView
btv.setDragSource (true);
- btv.setUseSubstringInQuickSearch(true);
btv.setRootVisible(false);
add( btv, BorderLayout.CENTER );