swingx-master/swingx-demos/swingx-demos-content/src/main/java/org/jdesktop/swingx/demos/decorator/HighlighterClient.java
/*
 * Created on 08.12.2008
 *
 */
package org.jdesktop.swingx.demos.decorator;

import java.beans.PropertyChangeListener;

import org.jdesktop.swingx.decorator.Highlighter;
import org.jdesktop.swingx.plaf.UIDependent;

/**
 * This interface defines the common contract of clients which provide
 * support for Highlighters. They must
 * 
 * <ul>
 * <li> have a bound property "highlighters" denoting a collection of
 * Highlighters
 * <li> have methods to modify the collection
 * <li> update the ui of contained Highlighters on LAF changes
 * <li> apply the highlighters as appropriate. This implies that it must
 * listen to highlighter state changes to update itself (or related parties)
 * accordingly.
 * </ul>
 * 
 * The last bullet is a "vague" requirement in that it might vary
 * considerably across client implementations. While JComponents typically
 * will invoke a repaint, a non-component might choose to notify some other
 * listeners. Furthermore, it's not testable, as clients might choose to do
 * the actual update only if really needed, f.i. not if invisible or if
 * there are no external listeners.
 * <p>
 * 
 */
public interface HighlighterClient extends UIDependent {

    /**
     * Sets the <code>Highlighter</code>s to this client, replacing any old settings.
     * No argument or an empty array removes all <code>Highlighter</code>s. <p>
     * 
     * This is a bound property.
     * 
     * @param highlighters zero or more not null highlighters to use for renderer decoration.
     * @throws NullPointerException if array is null or array contains null values.
     * 
     * @see #getHighlighters()
     * @see #addHighlighter(Highlighter)
     * @see #removeHighlighter(Highlighter)
     * 
     */
    void setHighlighters(Highlighter... highlighters);

    /**
     * Returns the <code>Highlighter</code>s used by this client.
     * Maybe empty, but guarantees to be never null.
     * 
     * @return the Highlighters used by this table, guaranteed to never null.
     * 
     * @see #setHighlighters(Highlighter[])
     */
    Highlighter[] getHighlighters();

    /**
     * Appends a <code>Highlighter</code> to the end of the list of used
     * <code>Highlighter</code>s. The argument must not be null. 
     * <p>
     * 
     * @param highlighter the <code>Highlighter</code> to add, must not be null.
     * @throws NullPointerException if <code>Highlighter</code> is null.
     * 
     * @see #removeHighlighter(Highlighter)
     * @see #setHighlighters(Highlighter[])
     */
    void addHighlighter(Highlighter highlighter);

    /**
     * Removes the given <code>Highlighter</code>. Does nothing if the
     * <code>Highlighter</code> is not contained.
     * 
     * @param highlighter the <code>Highlighter</code> to remove.
     * 
     * @see #addHighlighter(Highlighter)
     * @see #setHighlighters(Highlighter...)
     */
    void removeHighlighter(Highlighter highlighter);

    /**
     * Adds a PropertyChangeListener which will be notified on changes of the 
     * "highlighters" property.
     * 
     * @param l the listener to add.
     */
    void addPropertyChangeListener(PropertyChangeListener l);

    /**
     * Removes the <code>PropertyChangeListener</code>. Does nothing if the
     * listener is not contained.
     * 
     * @param l the listener to remove. 
     */
    void removePropertyChangeListener(PropertyChangeListener l);
}
