001 /* 002 * $Id: JXSearchPanel.java,v 1.11 2006/05/14 08:12:17 dmouse Exp $ 003 * 004 * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, 005 * Santa Clara, California 95054, U.S.A. All rights reserved. 006 * 007 * This library is free software; you can redistribute it and/or 008 * modify it under the terms of the GNU Lesser General Public 009 * License as published by the Free Software Foundation; either 010 * version 2.1 of the License, or (at your option) any later version. 011 * 012 * This library is distributed in the hope that it will be useful, 013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 015 * Lesser General Public License for more details. 016 * 017 * You should have received a copy of the GNU Lesser General Public 018 * License along with this library; if not, write to the Free Software 019 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 020 */ 021 022 package org.jdesktop.swingx; 023 024 import java.util.ArrayList; 025 import java.util.Iterator; 026 import java.util.List; 027 import java.util.regex.Pattern; 028 029 import javax.swing.ComboBoxModel; 030 import javax.swing.DefaultComboBoxModel; 031 import javax.swing.JComboBox; 032 033 import org.jdesktop.swingx.decorator.PatternFilter; 034 import org.jdesktop.swingx.decorator.PatternHighlighter; 035 import org.jdesktop.swingx.decorator.PatternMatcher; 036 037 /** 038 * Rudimentary search panel. 039 * 040 * Updates PatternMatchers from user input. 041 * 042 * Supports 043 * 044 * <ol> 045 * <li> text input to match 046 * <li> match rules like contains/equals/... 047 * <li> toggle case sensitive match 048 * </ol> 049 * 050 * TODO: allow custom PatternModel and/or access 051 * to configuration of bound PatternModel. 052 * 053 * TODO: fully support control of multiple PatternMatchers. 054 * 055 * @author Ramesh Gupta 056 * @author Jeanette Winzenburg 057 * 058 */ 059 public class JXSearchPanel extends AbstractPatternPanel { 060 061 062 public static final String MATCH_RULE_ACTION_COMMAND = "selectMatchRule"; 063 064 private JComboBox searchCriteria; 065 066 private List<PatternMatcher> patternMatchers; 067 068 069 public JXSearchPanel() { 070 initComponents(); 071 build(); 072 initActions(); 073 bind(); 074 getPatternModel().setIncremental(true); 075 } 076 077 //----------------- accessing public properties 078 079 /** 080 * sets the PatternFilter control. 081 * 082 * PENDING: change to do a addPatternMatcher to enable multiple control. 083 * 084 */ 085 public void setPatternFilter(PatternFilter filter) { 086 getPatternMatchers().add(filter); 087 updateFieldName(filter); 088 } 089 090 /** 091 * sets the PatternHighlighter control. 092 * 093 * PENDING: change to do a addPatternMatcher to enable multiple control. 094 * 095 */ 096 public void setPatternHighlighter(PatternHighlighter highlighter) { 097 getPatternMatchers().add(highlighter); 098 updateFieldName(highlighter); 099 } 100 101 102 103 /** 104 * set the label of the search combo. 105 * 106 * @param name 107 */ 108 public void setFieldName(String name) { 109 searchLabel.setText(name); 110 } 111 112 /** 113 * returns the label of the search combo. 114 * 115 */ 116 public String getFieldName() { 117 return searchLabel.getText(); 118 } 119 120 /** 121 * returns the current compiled Pattern. 122 * 123 * @return the current compiled <code>Pattern</code> 124 */ 125 public Pattern getPattern() { 126 return patternModel.getPattern(); 127 } 128 129 /** 130 * @param matcher 131 */ 132 protected void updateFieldName(PatternMatcher matcher) { 133 134 if (matcher instanceof PatternFilter) { 135 PatternFilter filter = (PatternFilter) matcher; 136 if (filter == null) { 137 searchLabel.setText("Field"); 138 } else { 139 searchLabel.setText(filter.getColumnName()); 140 } 141 } else { 142 if (searchLabel.getText().length() == 0) { // ugly hack 143 searchLabel.setText("Field"); 144 /** TODO: Remove this hack!!! */ 145 } 146 147 } 148 } 149 150 // ---------------- action callbacks 151 152 /** 153 * 154 */ 155 public void match() { 156 for (Iterator<PatternMatcher> iter = getPatternMatchers().iterator(); iter.hasNext();) { 157 iter.next().setPattern(getPattern()); 158 159 } 160 } 161 162 /** 163 * set's the PatternModel's MatchRule to the selected in combo. 164 * 165 * NOTE: this 166 * is public as an implementation side-effect! 167 * No need to ever call directly. 168 */ 169 public void updateMatchRule() { 170 getPatternModel().setMatchRule( 171 (String) searchCriteria.getSelectedItem()); 172 } 173 174 private List<PatternMatcher> getPatternMatchers() { 175 if (patternMatchers == null) { 176 patternMatchers = new ArrayList<PatternMatcher>(); 177 } 178 return patternMatchers; 179 } 180 181 //---------------- init actions and model 182 183 @Override 184 protected void initExecutables() { 185 super.initExecutables(); 186 getActionMap().put(MATCH_RULE_ACTION_COMMAND, 187 createBoundAction(MATCH_RULE_ACTION_COMMAND, "updateMatchRule")); 188 } 189 190 191 //--------------------- binding support 192 193 194 195 /** 196 * bind the components to the patternModel/actions. 197 */ 198 @Override 199 protected void bind() { 200 super.bind(); 201 List matchRules = getPatternModel().getMatchRules(); 202 // PENDING: map rules to localized strings 203 ComboBoxModel model = new DefaultComboBoxModel(matchRules.toArray()); 204 model.setSelectedItem(getPatternModel().getMatchRule()); 205 searchCriteria.setModel(model); 206 searchCriteria.setAction(getAction(MATCH_RULE_ACTION_COMMAND)); 207 208 } 209 210 211 212 //------------------------ init ui 213 214 /** 215 * build container by adding all components. 216 * PRE: all components created. 217 */ 218 private void build() { 219 add(searchLabel); 220 add(searchCriteria); 221 add(searchField); 222 add(matchCheck); 223 } 224 225 /** 226 * create contained components. 227 * 228 * 229 */ 230 @Override 231 protected void initComponents() { 232 super.initComponents(); 233 searchCriteria = new JComboBox(); 234 } 235 236 237 }