001 /*
002 * $Id: PatternHighlighter.java,v 1.7 2005/10/26 14:30:00 kleopatra 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.decorator;
023
024 import java.awt.Color;
025 import java.util.regex.Pattern;
026 import java.util.regex.PatternSyntaxException;
027
028 /**
029 * PatternHighlighter
030 *
031 * @author Ramesh Gupta
032 */
033 public class PatternHighlighter extends ConditionalHighlighter implements
034 PatternMatcher {
035
036 protected Pattern pattern = null;
037
038 /**
039 * Constructs a <code>PatternHighlighter</code> instance with no
040 * background or foreground color and no pattern
041 */
042 public PatternHighlighter() {
043 // default constructor
044 this(null, null, null, 0, 0); // match flags = 0; test column = 0
045 }
046
047 /**
048 * <p>
049 * Constructs a <code>PatternHighlighter</code> instance with the
050 * specified background and foreground colors that will be used to decorate
051 * the renderer component for all cell in a row if and only if the specified
052 * regExString defines a valid {@link java.util.regex.Pattern}, and the
053 * value of the cell in the specified testColumn of that row matches that
054 * pattern.
055 * </p>
056 *
057 * @param background
058 * background color for decorated cells, or null, if background
059 * should not be changed
060 * @param foreground
061 * foreground color for decorated cells, or null, if foreground
062 * should not be changed
063 * @param regExString
064 * the regular expression string to compile, or null to leave the
065 * pattern undefined
066 * @param testColumn
067 * column to which the pattern matching test is applied; must be
068 * a valid column index in model coordinates
069 * @throws java.util.regex.PatternSyntaxException
070 * if regExString is not null, but it does not define a valid
071 * {@link java.util.regex.Pattern}
072 * @see java.util.regex.Pattern
073 */
074 public PatternHighlighter(Color background, Color foreground,
075 String regExString, int matchFlags, int testColumn)
076 throws PatternSyntaxException {
077 this(background, foreground, regExString, matchFlags, testColumn, -1);
078 }
079
080 /**
081 * <p>
082 * Constructs a <code>PatternHighlighter</code> instance with the
083 * specified background and foreground colors that will be used to decorate
084 * the renderer component for a cell in the specified decorateColumn of any
085 * row if and only if the specified regExString and matchFlags define a
086 * valid {@link java.util.regex.Pattern}, and the value of the cell in the
087 * specified testColumn of the same row matches that pattern.
088 * </p>
089 *
090 * @param background
091 * background color for decorated cells, or null, if background
092 * should not be changed
093 * @param foreground
094 * foreground color for decorated cells, or null, if foreground
095 * should not be changed
096 * @param regExString
097 * the regular expression string to compile, or null to leave the
098 * pattern undefined
099 * @param matchFlags
100 * a bit mask that may include
101 * {@link java.util.regex.Pattern#CASE_INSENSITIVE},
102 * {@link java.util.regex.Pattern#MULTILINE},
103 * {@link java.util.regex.Pattern#DOTALL},
104 * {@link java.util.regex.Pattern#UNICODE_CASE}, and
105 * {@link java.util.regex.Pattern#CANON_EQ}
106 * @param testColumn
107 * column to which the pattern matching test is applied; must be
108 * a valid column index in model coordinates
109 * @param decorateColumn
110 * column to which decorator attributes will be applied; may be a
111 * valid column index in model coordinates, or -1 to indicate all
112 * columns
113 * @throws java.util.regex.PatternSyntaxException
114 * if regExString is not null, but regExString and matchFlags do
115 * not define a valid {@link java.util.regex.Pattern}
116 * @see java.util.regex.Pattern
117 */
118 public PatternHighlighter(Color background, Color foreground,
119 String regExString, int matchFlags, int testColumn,
120 int decorateColumn) throws PatternSyntaxException {
121 super(background, foreground, testColumn, decorateColumn);
122 setPattern(regExString, matchFlags);
123 }
124
125 /**
126 * Tests whether the string representation of the value of the cell
127 * identified by the specified adapter matches the pattern, if any, that is
128 * set for this <code>PatternHighlighter</code>, and returns true if the
129 * test succeeds; Otherwise, it returns false.
130 *
131 * @param adapter
132 * the current cell rendering adapter
133 * @return true if the test succeeds; false otherwise
134 */
135 protected boolean test(ComponentAdapter adapter) {
136 if (pattern == null) {
137 return false;
138 }
139
140 if (!adapter.isTestable(testColumn))
141 return false;
142 Object value = adapter.getFilteredValueAt(adapter.row, testColumn);
143
144 if (value == null) {
145 return false;
146 } else {
147 boolean matches = pattern.matcher(value.toString()).find();
148 return matches;
149 }
150 }
151
152 /**
153 * Returns the pattern used by this cell decorator for matching against a
154 * cell's value to determine if the conditions for cell decoration are met.
155 *
156 * @return the pattern used by this cell decorator for matching
157 * @see java.util.regex.Pattern
158 */
159 public Pattern getPattern() {
160 return pattern;
161 }
162
163 public void setPattern(String regularExpr, int matchFlags) {
164 if ((regularExpr == null) || (regularExpr.length() == 0)) {
165 regularExpr = ".*";
166 }
167 setPattern(Pattern.compile(regularExpr, matchFlags));
168 }
169
170 /**
171 * Sets the pattern used by this cell decorator to match against a cell's
172 * value to determine if the conditions for cell decoration are met.
173 *
174 * @param pattern
175 * the pattern used by this cell decorator for matching
176 * @see java.util.regex.Pattern
177 */
178 public void setPattern(Pattern pattern) {
179 this.pattern = pattern;
180 fireStateChanged();
181 }
182
183 }