/* * $Id: JXFindBar.java 2948 2008-06-16 15:02:14Z kleopatra $ * * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package org.hdesktop.swingx; import java.awt.Color; import java.awt.FlowLayout; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.KeyStroke; import javax.swing.SwingConstants; import org.hdesktop.swingx.search.Searchable; /** * A simple low-intrusion default widget for incremental search. * * Actions registered (in addition to super): * <ul> * <li> {@link JXDialog#CLOSE_ACTION_COMMAND} - an action bound to this * component's cancel method. The method itself is an empty implementation: * Subclassing clients can override the method, all clients can register a * custom action. * </ul> * * Key bindings: * <ul> * <li> ESCAPE - calls action registered for * {@link JXDialog#CLOSE_ACTION_COMMAND} * </ul> * * This implementation uses textfield coloring as not-found visualization. * * <p> * PENDING: the coloring needs to be read from the UIManager instead of * hardcoding. * * <p> * PENDING: the state transition of found/non-found coloring needs clean-up - * there are spurious problems when re-using the same instance (as SearchFactory * does). * * @author Jeanette Winzenburg * */ public class JXFindBar extends JXFindPanel { protected Color previousBackgroundColor; protected Color previousForegroundColor; // PENDING: need to read from UIManager protected Color notFoundBackgroundColor = Color.decode("#FF6666"); protected Color notFoundForegroundColor = Color.white; protected JButton findNext; protected JButton findPrevious; public JXFindBar() { this(null); } public JXFindBar(Searchable searchable) { super(searchable); getPatternModel().setIncremental(true); getPatternModel().setWrapping(true); } @Override public void setSearchable(Searchable searchable) { super.setSearchable(searchable); match(); } /** * here: set textfield colors to not-found colors. */ @Override protected void showNotFoundMessage() { //JW: quick hack around #487-swingx - NPE in setSearchable if (searchField == null) return; searchField.setForeground(notFoundForegroundColor); searchField.setBackground(notFoundBackgroundColor); } /** * here: set textfield colors to normal. */ @Override protected void showFoundMessage() { //JW: quick hack around #487-swingx - NPE in setSearchable if (searchField == null) return; searchField.setBackground(previousBackgroundColor); searchField.setForeground(previousForegroundColor); } @Override public void addNotify() { super.addNotify(); if (previousBackgroundColor == null) { previousBackgroundColor = searchField.getBackground(); previousForegroundColor = searchField.getForeground(); } else { searchField.setBackground(previousBackgroundColor); searchField.setForeground(previousForegroundColor); } } // --------------------------- action call back /** * Action callback method for bound action JXDialog.CLOSE_ACTION_COMMAND. * * Here: does nothing. Subclasses can override to define custom "closing" * behaviour. Alternatively, any client can register a custom action with * the actionMap. * * */ public void cancel() { } // -------------------- init @Override protected void initExecutables() { getActionMap().put(JXDialog.CLOSE_ACTION_COMMAND, createBoundAction(JXDialog.CLOSE_ACTION_COMMAND, "cancel")); super.initExecutables(); } @Override protected void bind() { super.bind(); searchField .addActionListener(getAction(JXDialog.EXECUTE_ACTION_COMMAND)); findNext.setAction(getAction(FIND_NEXT_ACTION_COMMAND)); findPrevious.setAction(getAction(FIND_PREVIOUS_ACTION_COMMAND)); KeyStroke stroke = KeyStroke.getKeyStroke("ESCAPE"); getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(stroke, JXDialog.CLOSE_ACTION_COMMAND); } @Override protected void build() { setLayout(new FlowLayout(SwingConstants.LEADING)); add(searchLabel); add(new JLabel(":")); add(new JLabel(" ")); add(searchField); add(findNext); add(findPrevious); } @Override protected void initComponents() { super.initComponents(); findNext = new JButton(); findPrevious = new JButton(); } }