--- a/options.api/src/org/netbeans/modules/options/OptionsPanel.java +++ a/options.api/src/org/netbeans/modules/options/OptionsPanel.java @@ -44,6 +44,7 @@ package org.netbeans.modules.options; +import java.awt.AWTEvent; import java.awt.Color; import java.awt.Component; import java.awt.Cursor; @@ -73,6 +74,7 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.InputMap; @@ -86,10 +88,15 @@ import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; +import javax.swing.text.Position.Bias; +import org.netbeans.api.quicksearch.QuickSearch; +import org.netbeans.api.quicksearch.QuickSearchListener; import org.netbeans.modules.options.ui.VariableBorder; +import org.netbeans.spi.options.OptionsCategory; import org.netbeans.spi.options.OptionsPanelController; import org.openide.awt.Mnemonics; import org.openide.util.HelpCtx; +import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.openide.util.NbPreferences; import org.openide.util.RequestProcessor; @@ -114,6 +121,7 @@ private final Color borderMac = new Color(141, 141, 141); private final Font labelFontMac = new Font("Lucida Grande", 0, 10); + private QuickSearch qs; private static String loc (String key) { return NbBundle.getMessage (OptionsPanel.class, key); @@ -269,6 +277,14 @@ b.setSelected(); } } + GridBagConstraints qsConstraints = new GridBagConstraints(); + qsConstraints.gridx = buttons.size() + 1; + qsConstraints.anchor = GridBagConstraints.NORTHEAST; + qsConstraints.gridy = 0; + qs = QuickSearch.attach(pCategories2, qsConstraints); + qs.addQuickSearchListener(new QSListener()); + qs.setAsynchronous(true); + enableEvents(AWTEvent.KEY_EVENT_MASK); } private void initActions () { @@ -399,7 +415,23 @@ } return retval; } + + private KeyEvent processingEvent = null; + @Override + protected boolean processKeyBinding(KeyStroke ks, KeyEvent e, int condition, boolean pressed) { + if (condition == WHEN_ANCESTOR_OF_FOCUSED_COMPONENT && !e.isConsumed()) { + if (e == processingEvent) return false; + processingEvent = e; + qs.processKeyEvent(e); + processingEvent = null; + if (e.isConsumed()) { + return true; + } + } + return super.processKeyBinding(ks, e, condition, pressed); + } + // innerclasses ............................................................ private class SelectAction extends AbstractAction { @@ -441,6 +473,55 @@ } } + private class QSListener implements QuickSearchListener { + + @Override + public void quickSearchUpdate(String searchText) { + System.out.println("quickSearchUpdate("+searchText+")"); + searchText = searchText.toUpperCase(); + for (Lookup.Item entry : QuickSearchProvider.getODCategories()) { + for (Map.Entry> kw : QuickSearchProvider.getKeywords(entry).entrySet()) { + for (String keyword : kw.getValue()) { + if (keyword.toUpperCase().indexOf(searchText) > -1) { + displayOption(kw.getKey(), keyword); + } + } + } + } + + } + + @Override + public void showNextSelection(Bias bias) { + + } + + @Override + public String findMaxPrefix(String prefix) { + return prefix; + } + + @Override + public void quickSearchConfirmed() { + + } + + @Override + public void quickSearchCanceled() { + + } + + } + + private void displayOption(final String path, final String keyword) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + OptionsDisplayerImpl.selectCategory(path); + } + }); + } + class CategoryButton extends JLabel implements MouseListener { private final CategoryModel.Category category; CategoryButton (final CategoryModel.Category category) { --- a/options.api/src/org/netbeans/modules/options/QuickSearchProvider.java +++ a/options.api/src/org/netbeans/modules/options/QuickSearchProvider.java @@ -77,7 +77,7 @@ } } - private Map> getKeywords(Lookup.Item it) { + static Map> getKeywords(Lookup.Item it) { OptionsCategory category = it.getInstance(); Map> kws = new HashMap>(); @@ -100,7 +100,7 @@ return kws; } - private Iterable> getODCategories() { + static Iterable> getODCategories() { Lookup lookup = Lookups.forPath(CategoryModel.OD_LAYER_FOLDER_NAME); Lookup.Result result = lookup.lookupResult(OptionsCategory.class); return result.allItems();