001    /*
002     * Created on Oct 19, 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;
017    
018    import java.awt.Component;
019    
020    import org.fest.swing.annotation.RunsInCurrentThread;
021    
022    /**
023     * Understands a base class for implementations of <code>{@link ResettableComponentMatcher}</code>.
024     *
025     * @author Yvonne Wang
026     * @author Alex Ruiz
027     */
028    public abstract class AbstractComponentMatcher implements ResettableComponentMatcher {
029    
030      private boolean requireShowing;
031    
032      /**
033       * Creates a new </code>{@link AbstractComponentMatcher}</code>.
034       */
035      public AbstractComponentMatcher() {
036        this(false);
037      }
038    
039      /**
040       * Creates a new </code>{@link AbstractComponentMatcher}</code>.
041       * @param requireShowing indicates if the component to match should be showing or not.
042       */
043      public AbstractComponentMatcher(boolean requireShowing) {
044        requireShowing(requireShowing);
045      }
046    
047      /**
048       * Indicates whether the component to match has to be showing.
049       * @return <code>true</code> if the component to find has to be showing, <code>false</code> otherwise.
050       */
051      protected final boolean requireShowing() { return requireShowing; }
052    
053      /**
054       * Updates the value of the flag that indicates if the component to match should be showing or not.
055       * @param shouldBeShowing the new value to set.
056       */
057      protected final void requireShowing(boolean shouldBeShowing) {
058        requireShowing = shouldBeShowing;
059      }
060    
061      /**
062       * Indicates if the value of the "showing" property of the given component matches the value specified in this
063       * matcher.
064       * <p>
065       * <b>Note:</b> This method is <b>not</b> guaranteed to be executed in the event dispatch thread (EDT.) Clients are
066       * responsible for calling this method from the EDT.
067       * </p>
068       * @param c the component to verify.
069       * @return <code>true</code> if the value of the "isShowing" property of the given component matches the value
070       * specified in this matcher, <code>false</code> otherwise.
071       */
072      @RunsInCurrentThread
073      protected final boolean requireShowingMatches(Component c) {
074        return !requireShowing || c.isShowing();
075      }
076    
077      /**
078       * Resets the internal state of this matcher.
079       * @param matchFound indicates whether a match has been found before resetting.
080       * @since 1.2
081       */
082      public void reset(boolean matchFound) {}
083    }