001 /*
002 * Created on Jul 17, 2008
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
005 * in compliance with the License. You may obtain a copy of the License at
006 *
007 * http://www.apache.org/licenses/LICENSE-2.0
008 *
009 * Unless required by applicable law or agreed to in writing, software distributed under the License
010 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
011 * or implied. See the License for the specific language governing permissions and limitations under
012 * the License.
013 *
014 * Copyright @2008-2010 the original author or authors.
015 */
016 package org.fest.swing.core.matcher;
017
018 import static java.lang.String.valueOf;
019 import static org.fest.util.Strings.concat;
020
021 import java.util.regex.Pattern;
022
023 import javax.swing.text.JTextComponent;
024
025 import org.fest.swing.annotation.RunsInCurrentThread;
026
027 /**
028 * Understands matching a <code>{@link JTextComponent}</code> by type, name or text.
029 *
030 * @author Alex Ruiz
031 */
032 public final class JTextComponentMatcher extends NamedComponentMatcherTemplate<JTextComponent> {
033
034 private Object text;
035
036 /**
037 * Creates a new <code>{@link JTextComponentMatcher}</code> that matches a <code>{@link JTextComponent}</code> that:
038 * <ol>
039 * <li>has a matching name</li>
040 * <li>(optionally) has matching text</li>
041 * <li>(optionally) is showing on the screen</li>
042 * <p>
043 * The following code listing shows how to match a <code>{@link JTextComponent}</code> by name and text:
044 * <pre>
045 * JTextComponentMatcher m = {@link #withName(String) withName}("lastName").{@link #andText(String) andText}("Wang");
046 * </pre>
047 * </p>
048 * <p>
049 * The following code listing shows how to match a <code>{@link JTextComponent}</code>, that should be showing on the screen,
050 * by name and text:
051 * <pre>
052 * JTextComponentMatcher m = {@link #withName(String) withName}("lastName").{@link #andText(String) andText}("Wang").{@link #andShowing() andShowing}();
053 * </pre>
054 * </p>
055 * @param name the id to match.
056 * @return the created matcher.
057 */
058 public static JTextComponentMatcher withName(String name) {
059 return new JTextComponentMatcher(name, ANY);
060 }
061
062 /**
063 * Creates a new <code>{@link JTextComponentMatcher}</code> that matches a <code>{@link JTextComponent}</code> by its
064 * text.
065 * <p>
066 * The following code listing shows how to match a <code>{@link JTextComponent}</code> by text:
067 * <pre>
068 * JTextComponentMatcher m = {@link #withText(String) withText}("Wang");
069 * </pre>
070 * </p>
071 * <p>
072 * The following code listing shows how to match a <code>{@link JTextComponent}</code>, that should be showing on the
073 * screen, by text:
074 * <pre>
075 * JTextComponentMatcher m = {@link #withText(String) withText}("Wang").{@link #andShowing() andShowing}();
076 * </pre>
077 * </p>
078 * @param text the text to match. It can be a regular expression.
079 * @return the created matcher.
080 */
081 public static JTextComponentMatcher withText(String text) {
082 return new JTextComponentMatcher(ANY, text);
083 }
084
085 /**
086 * Creates a new <code>{@link JTextComponentMatcher}</code> that matches a <code>{@link JTextComponent}</code> by its
087 * text.
088 * <p>
089 * The following code listing shows how to match a <code>{@link JTextComponent}</code> by text, using a regular
090 * expression pattern:
091 * <pre>
092 * JTextComponentMatcher m = {@link #withText(Pattern) withText}(Pattern.compile("W.*"));
093 * </pre>
094 * </p>
095 * <p>
096 * The following code listing shows how to match a <code>{@link JTextComponent}</code>, that should be showing on the
097 * screen, by text, using a regular expression pattern:
098 * <pre>
099 * JTextComponentMatcher m = {@link #withText(Pattern) withText}(Pattern.compile("W.*")).{@link #andShowing() andShowing}();
100 * </pre>
101 * </p>
102 * @param textPattern the text to match. It can be a regular expression.
103 * @return the created matcher.
104 */
105 public static JTextComponentMatcher withText(Pattern textPattern) {
106 return new JTextComponentMatcher(ANY, textPattern);
107 }
108
109 /**
110 * Creates a new <code>{@link JTextComponentMatcher}</code> that matches any <code>{@link JTextComponent}</code>.
111 * @return the created matcher.
112 */
113 public static JTextComponentMatcher any() {
114 return new JTextComponentMatcher(ANY, ANY);
115 }
116
117 private JTextComponentMatcher(Object name, Object text) {
118 super(JTextComponent.class, name);
119 this.text = text;
120 }
121
122 /**
123 * Specifies the text to match. If this matcher was created using <code>{@link #withText(String)}</code> or
124 * <code>{@link #withText(Pattern)}</code>, this method will simply update the text to match.
125 * @param newText the new text to match. It can be a regular expression.
126 * @return this matcher.
127 */
128 public JTextComponentMatcher andText(String newText) {
129 text = newText;
130 return this;
131 }
132
133 /**
134 * Specifies the text to match. If this matcher was created using <code>{@link #withText(String)}</code> or
135 * <code>{@link #withText(Pattern)}</code>, this method will simply update the text to match.
136 * @param textPattern the regular expression pattern to match.
137 * @return this matcher.
138 * @since 1.2
139 */
140 public JTextComponentMatcher andText(Pattern textPattern) {
141 text = textPattern;
142 return this;
143 }
144
145 /**
146 * Indicates that the <code>{@link JTextComponent}</code> to match should be showing on the screen.
147 * @return this matcher.
148 */
149 public JTextComponentMatcher andShowing() {
150 requireShowing(true);
151 return this;
152 }
153
154 /**
155 * Indicates whether the text of the given <code>{@link JTextComponent}</code> is equal to the text in this matcher.
156 * <p>
157 * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are
158 * responsible for calling this method from the EDT.
159 * </p>
160 * @param button the <code>JTextComponent</code> to match.
161 * @return <code>true</code> if the text in the <code>JTextComponent</code> is equal to the text in this matcher,
162 * <code>false</code> otherwise.
163 */
164 @RunsInCurrentThread
165 protected boolean isMatching(JTextComponent button) {
166 if (!isNameMatching(button.getName())) return false;
167 return arePropertyValuesMatching(text, button.getText());
168 }
169
170 @Override public String toString() {
171 return concat(
172 getClass().getName(), "[",
173 "name=", quotedName(), ", ",
174 "text=", quoted(text), ", ",
175 "requireShowing=", valueOf(requireShowing()),
176 "]"
177 );
178 }
179 }