Package org.jdesktop.swingx

Source Code of org.jdesktop.swingx.JXSearchPanel

/*
* $Id: JXSearchPanel.java 3674 2010-04-26 10:15:12Z 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.jdesktop.swingx;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Pattern;

import javax.swing.ComboBoxModel;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;

import org.jdesktop.swingx.decorator.Highlighter;
import org.jdesktop.swingx.search.PatternMatcher;

/**
* <p>
* {@code JXSearchPanel} provides complex searching features. Users are able to
* specify searching rules, enter searching text (including regular
* expressions), and toggle case-sensitivity.
* </p>
* <p>
* One of the main features that {@code JXSearchPanel} provides is the ability
* to update {@link PatternMatcher}s. To highlight text with a
* {@link Highlighter}, you need to update the highlighter via a pattern
* matcher.
* </p>
* <pre>
* public class PatternHandler implements PatternMatcher {
*
*     private Highlighter highlighter;
*
*     private Pattern pattern;
*
*     public void setPattern(Pattern pattern) {
*         this.pattern = pattern;
*         highlighter.setHighlightPredicate(new PatternPredicate(pattern));
*     }
*
* }
* </pre>
* <p>
* TODO: allow custom PatternModel and/or access to configuration of bound
* PatternModel.
* </p>
* <p>
* TODO: fully support control of multiple PatternMatchers.
* </p>
*
* @author Ramesh Gupta
* @author Jeanette Winzenburg
*/
public class JXSearchPanel extends AbstractPatternPanel {
    /**
     * The action command key.
     */
    public static final String MATCH_RULE_ACTION_COMMAND = "selectMatchRule";

    private JComboBox searchCriteria;

    private List<PatternMatcher> patternMatchers;
   

    /**
     * Creates a search panel.
     */
    public JXSearchPanel() {
        initComponents();
        build();
        initActions();
        bind();
        getPatternModel().setIncremental(true);
    }

//----------------- accessing public properties

    /**
     * Adds a pattern matcher.
     *
     * @param matcher
     *            the matcher to add.
     */
    public void addPatternMatcher(PatternMatcher matcher) {
        getPatternMatchers().add(matcher);
        updateFieldName(matcher);
    }
   
    /**
     * sets the PatternFilter control.
     *
     * PENDING: change to do a addPatternMatcher to enable multiple control.
     *
     */
//    public void setPatternFilter(PatternFilter filter) {
//        getPatternMatchers().add(filter);
//        updateFieldName(filter);
//    }

    /**
     * set the label of the search combo.
     *
     * @param name
     *            the label
     */
    public void setFieldName(String name) {
        String old = searchLabel.getText();
        searchLabel.setText(name);
        firePropertyChange("fieldName", old, searchLabel.getText());
    }

    /**
     * returns the label of the search combo.
     *
     */
    public String getFieldName() {
        return searchLabel.getText();
    }

    /**
     * returns the current compiled Pattern.
     *
     * @return the current compiled <code>Pattern</code>
     */
    public Pattern getPattern() {
        return patternModel.getPattern();
    }

    /**
     * @param matcher
     */
    protected void updateFieldName(PatternMatcher matcher) {
       
//        if (matcher instanceof PatternFilter) {
//            PatternFilter filter = (PatternFilter) matcher;
//            searchLabel.setText(filter.getColumnName());
//        } else {
            if (searchLabel.getText().length() == 0) { // ugly hack
                searchLabel.setText("Field");
                /** TODO: Remove this hack!!! */
//            }
        }
    }

    // ---------------- action callbacks

    /**
     * Updates the pattern matchers.
     */
    @Override
    public void match() {
        for (Iterator<PatternMatcher> iter = getPatternMatchers().iterator(); iter.hasNext();) {
            iter.next().setPattern(getPattern());
           
        }
    }

    /**
     * set's the PatternModel's MatchRule to the selected in combo.
     *
     * NOTE: this
     * is public as an implementation side-effect!
     * No need to ever call directly.
     */
    public void updateMatchRule() {
        getPatternModel().setMatchRule(
                (String) searchCriteria.getSelectedItem());
    }

    private List<PatternMatcher> getPatternMatchers() {
        if (patternMatchers == null) {
            patternMatchers = new ArrayList<PatternMatcher>();
        }
        return patternMatchers;
    }

    //---------------- init actions and model
   
    @Override
    protected void initExecutables() {
        super.initExecutables();
        getActionMap().put(MATCH_RULE_ACTION_COMMAND,
                createBoundAction(MATCH_RULE_ACTION_COMMAND, "updateMatchRule"));
    }


    //--------------------- binding support
   


    /**
     * bind the components to the patternModel/actions.
     */
    @Override
    protected void bind() {
        super.bind();
        List<?> matchRules = getPatternModel().getMatchRules();
        // PENDING: map rules to localized strings
        ComboBoxModel model = new DefaultComboBoxModel(matchRules.toArray());
        model.setSelectedItem(getPatternModel().getMatchRule());
        searchCriteria.setModel(model);
        searchCriteria.setAction(getAction(MATCH_RULE_ACTION_COMMAND));
       
    }
   


    //------------------------ init ui
   
    /**
     * build container by adding all components.
     * PRE: all components created.
     */
    private void build() {
        add(searchLabel);
        add(searchCriteria);
        add(searchField);
        add(matchCheck);
    }

    /**
     * create contained components.
     *
     *
     */
    @Override
    protected void initComponents() {
        super.initComponents();
        searchCriteria = new JComboBox();
    }


}
TOP

Related Classes of org.jdesktop.swingx.JXSearchPanel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.