Class TextComponentSearchable

  • All Implemented Interfaces:
    java.beans.PropertyChangeListener, java.util.EventListener, javax.swing.event.DocumentListener

    public class TextComponentSearchable
    extends Searchable
    implements javax.swing.event.DocumentListener, java.beans.PropertyChangeListener
    TextComponentSearchable is an concrete implementation of Searchable that enables the search function in JTextComponent.

    It's very simple to use it. Assuming you have a JTextComponent, all you need to do is to call

     JTextComponent textComponent = ....;
     TextComponentSearchable searchable = new TextComponentSearchable(textComponent);
     
    Now the JTextComponent will have the search function.

    There is very little customization you need to do to ListSearchable. The only thing you might need is when the element in the JTextComponent needs a special conversion to convert to string. If so, you can override convertElementToString() to provide you own algorithm to do the conversion.

     JTextComponent textComponent = ....;
     TextComponentSearchable searchable = new ListSearchable(textComponent) {
          protected String convertElementToString(Object object) {
              ...
          }
     

    protected boolean isActivateKey(KeyEvent e) { // change to a different activation key return (e.getID() == KeyEvent.KEY_PRESSED && e.getKeyCode() == KeyEvent.VK_F && (KeyEvent.CTRL_MASK & e.getModifiers()) != 0); } };

    Additional customization can be done on the base Searchable class such as background and foreground color, keystrokes, case sensitivity. TextComponentSearchable also has a special attribute called highlightColor. You can change it using setHighlightColor(java.awt.Color).

    Due to the special case of JTextComponent, the searching doesn't support wild card '*' or '?' as in other Searchables. The other difference is JTextComponent will keep the highlights after search popup hides. If you want to hide the highlights, just press ESC again (the first ESC will hide popup; the second ESC will hide all highlights if any).

    • Constructor Detail

      • TextComponentSearchable

        public TextComponentSearchable​(javax.swing.text.JTextComponent textComponent)
    • Method Detail

      • uninstallHighlightsRemover

        public void uninstallHighlightsRemover()
        Uninstalls the handler for ESC key to remove all highlights
      • installHighlightsRemover

        public void installHighlightsRemover()
        Installs the handler for ESC key to remove all highlights
      • installListeners

        public void installListeners()
        Description copied from class: Searchable
        Installs necessary listeners to the component. This method will be called automatically when Searchable is created.
        Overrides:
        installListeners in class Searchable
      • uninstallListeners

        public void uninstallListeners()
        Description copied from class: Searchable
        Uninstall the listeners that installed before. This method is never called because we don't have the control of the life cycle of the component. However you can call this method if you don't want the component to be searchable any more.
        Overrides:
        uninstallListeners in class Searchable
      • setSelectedIndex

        protected void setSelectedIndex​(int index,
                                        boolean incremental)
        Description copied from class: Searchable
        Sets the selected index. The concrete implementation should call methods on the component to select the element at the specified index. The incremental flag is used to do multiple select. If the flag is true, the element at the index should be added to current selection. If false, you should clear previous selection and then select the element.
        Specified by:
        setSelectedIndex in class Searchable
        Parameters:
        index - the index to be selected
        incremental - a flag to enable multiple selection. If the flag is true, the element at the index should be added to current selection. If false, you should clear previous selection and then select the element.
      • addHighlight

        protected void addHighlight​(int index,
                                    java.lang.String text,
                                    boolean incremental)
                             throws javax.swing.text.BadLocationException
        Adds highlight to text component at specified index and text.
        Parameters:
        index - the index of the text to be highlighted
        text - the text to be highlighted
        incremental - if this is an incremental adding highlight
        Throws:
        javax.swing.text.BadLocationException
      • removeAllHighlights

        protected void removeAllHighlights()
        Removes all highlights from the text component.
      • getSelectedIndex

        protected int getSelectedIndex()
        Description copied from class: Searchable
        Gets the selected index in the component. The concrete implementation should call methods on the component to retrieve the current selected index. If the component supports multiple selection, it's OK just return the index of the first selection.

        Here are some examples. In the case of JList, the index is the row index. In the case of JTree, the index is the row index too. In the case of JTable, depending on the selection mode, the index could be row index (in row selection mode), could be column index (in column selection mode) or could the cell index (in cell selection mode).

        Specified by:
        getSelectedIndex in class Searchable
        Returns:
        the selected index.
      • getElementAt

        protected java.lang.Object getElementAt​(int index)
        Description copied from class: Searchable
        Gets the element at the specified index. The element could be any data structure that internally used in the component. The convertElementToString method will give you a chance to convert the element to string which is used to compare with the string that user types in.
        Specified by:
        getElementAt in class Searchable
        Parameters:
        index - the index
        Returns:
        the element at the specified index.
      • getElementCount

        protected int getElementCount()
        Description copied from class: Searchable
        Gets the total element count in the component. Different concrete implementation could have different interpretation of the count. This is totally OK as long as it's consistent in all the methods. For example, the index parameter in other methods should be always a valid value within the total count.
        Specified by:
        getElementCount in class Searchable
        Returns:
        the total element count.
      • convertElementToString

        protected java.lang.String convertElementToString​(java.lang.Object object)
        Converts the element in JTextComponent to string. The returned value will be the toString() of whatever element that returned from list.getModel().getElementAt(i).
        Specified by:
        convertElementToString in class Searchable
        Parameters:
        object -
        Returns:
        the string representing the element in the JTextComponent.
      • propertyChange

        public void propertyChange​(java.beans.PropertyChangeEvent evt)
        Specified by:
        propertyChange in interface java.beans.PropertyChangeListener
      • insertUpdate

        public void insertUpdate​(javax.swing.event.DocumentEvent e)
        Specified by:
        insertUpdate in interface javax.swing.event.DocumentListener
      • removeUpdate

        public void removeUpdate​(javax.swing.event.DocumentEvent e)
        Specified by:
        removeUpdate in interface javax.swing.event.DocumentListener
      • changedUpdate

        public void changedUpdate​(javax.swing.event.DocumentEvent e)
        Specified by:
        changedUpdate in interface javax.swing.event.DocumentListener
      • isActivateKey

        protected boolean isActivateKey​(java.awt.event.KeyEvent e)
        Description copied from class: Searchable
        Checks if the key in KeyEvent should activate the search popup.
        Overrides:
        isActivateKey in class Searchable
        Parameters:
        e - the key event
        Returns:
        true if the keyChar is visible except space and tab.
      • getHighlightColor

        public java.awt.Color getHighlightColor()
        Gets the highlight color.
        Returns:
        the highlight color.
      • setHighlightColor

        public void setHighlightColor​(java.awt.Color highlightColor)
        Changes the highlight color.
        Parameters:
        highlightColor -
      • findLast

        public int findLast​(java.lang.String s)
        Description copied from class: Searchable
        Finds the last element that matches the searching text.
        Overrides:
        findLast in class Searchable
        Parameters:
        s - the searching text
        Returns:
        the last element that matches the searching text.
      • findFirst

        public int findFirst​(java.lang.String s)
        Description copied from class: Searchable
        Finds the first element that matches the searching text.
        Overrides:
        findFirst in class Searchable
        Parameters:
        s - the searching text
        Returns:
        the first element that matches with the searching text.
      • findFromCursor

        public int findFromCursor​(java.lang.String s)
        Description copied from class: Searchable
        Finds the next matching index from the cursor. If it reaches the end, it will restart from the beginning. However is the reverseOrder flag is true, it will finds the previous matching index from the cursor. If it reaches the beginning, it will restart from the end.
        Overrides:
        findFromCursor in class Searchable
        Parameters:
        s - the searching text
        Returns:
        the next index that the element matches the searching text.
      • reverseFindFromCursor

        public int reverseFindFromCursor​(java.lang.String s)
        Description copied from class: Searchable
        Finds the previous matching index from the cursor. If it reaches the beginning, it will restart from the end.
        Overrides:
        reverseFindFromCursor in class Searchable
        Parameters:
        s - the searching text
        Returns:
        the next index that the element matches the searching text.
      • findNext

        public int findNext​(java.lang.String s)
        Description copied from class: Searchable
        Finds the next matching index from the cursor.
        Overrides:
        findNext in class Searchable
        Parameters:
        s - the searching text
        Returns:
        the next index that the element matches the searching text.
      • findPrevious

        public int findPrevious​(java.lang.String s)
        Description copied from class: Searchable
        Finds the previous matching index from the cursor.
        Overrides:
        findPrevious in class Searchable
        Parameters:
        s - the searching text
        Returns:
        the previous index that the element matches the searching text.
      • searchingTextEmpty

        protected void searchingTextEmpty()
        Description copied from class: Searchable
        Actions to take on searching text empty scenario
        Overrides:
        searchingTextEmpty in class Searchable