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 );