package com.onaro.util.jfc.search; import java.awt.BorderLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.util.Arrays; import javax.swing.AbstractAction; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.UIManager; import com.jidesoft.swing.SearchableBar; /** * Utility class for installing search capabilities in components */ public class SearchUtils { private static final String ACTION_MAP_FIND_KEY = "find"; //$NON-NLS-1$ private static final KeyStroke SHOW_SEARCH_BAR_KEY_STROKE = KeyStroke.getKeyStroke(KeyEvent.VK_F, KeyEvent.CTRL_DOWN_MASK); /** * Install search bar in the panel for searching in the table * To see the search panel use Ctrl+F * @param panel the panel in which the search bar will appear (at the bottom) * @param table table to search */ public static void installSearchBar(final JPanel panel, JTable table, JComponent...components) { //define the search AllColumnsTableSearchable searchable = new AllColumnsTableSearchable(table); //search bar SearchableBar searchableBar = new MySearchableBar(searchable); searchableBar.setInstaller(new SearchBarInstaller(table,panel)); searchableBar.setVisibleButtons(~SearchableBar.SHOW_REPEATS & ~SearchableBar.SHOW_MATCHCASE & ~SearchableBar.SHOW_HIGHLIGHTS); //register the key stroke to show the search bar JComponent[] comps = Arrays.copyOf(components, components.length + 2); comps[comps.length - 1] = panel; comps[comps.length - 2] = table; registerFindKeyStroke(searchableBar, comps); } private static void registerFindKeyStroke(SearchableBar searchableBar, JComponent ... components) { for (JComponent component: components) { ShowSearchBarAction showSearchBarAction = new ShowSearchBarAction(searchableBar); component.getInputMap().put(SHOW_SEARCH_BAR_KEY_STROKE, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); component.getActionMap().put(ACTION_MAP_FIND_KEY, showSearchBarAction); } } private static class ShowSearchBarAction extends AbstractAction{ private static final long serialVersionUID = 1L; private SearchableBar searchableBar; public ShowSearchBarAction(SearchableBar searchableBar) { this.searchableBar = searchableBar; } public void actionPerformed(ActionEvent actionevent) { searchableBar.getInstaller().openSearchBar(searchableBar); searchableBar.focusSearchField(); } } private static class SearchBarInstaller implements SearchableBar.Installer { private JTable table; private final JPanel panel; public SearchBarInstaller(JTable table, JPanel panel) { this.table = table; this.panel = panel; } public void openSearchBar(SearchableBar searchableBar) { panel.add(searchableBar, BorderLayout.NORTH); panel.revalidate(); //reset the searchable to find the next relative to the current selected row and not the last found row searchableBar.getSearchable().setCursor(-1); } public void closeSearchBar(SearchableBar searchableBar) { panel.remove(searchableBar); panel.revalidate(); table.requestFocus(); } } private static class MySearchableBar extends SearchableBar { private static final long serialVersionUID = 1L; public MySearchableBar(AllColumnsTableSearchable searchable) { super(searchable, true); Insets insets = UIManager.getDefaults().getInsets("ToolBar.Button.margin"); //$NON-NLS-1$ _closeButton.setMargin(insets); _findNextButton.setMargin(insets); _findPrevButton.setMargin(insets); _highlightsButton.setMargin(insets); } } }