001: /*
002: * $Id: HighlighterPipeline.java,v 1.14 2006/06/06 15:49:25 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.Component;
025: import java.util.ArrayList;
026: import java.util.Iterator;
027: import java.util.List;
028:
029: import javax.swing.BoundedRangeModel;
030: import javax.swing.event.ChangeEvent;
031: import javax.swing.event.ChangeListener;
032: import javax.swing.event.EventListenerList;
033:
034: import org.jdesktop.swingx.decorator.Highlighter.UIHighlighter;
035:
036: /**
037: * A class which manages the lists of highlighters.
038: *
039: * @see Highlighter
040: *
041: * @author Ramesh Gupta
042: * @author Jeanette Winzenburg
043: *
044: */
045: public class HighlighterPipeline implements UIHighlighter {
046: protected transient ChangeEvent changeEvent = null;
047: protected EventListenerList listenerList = new EventListenerList();
048:
049: protected List<Highlighter> highlighters;
050:
051: private ChangeListener highlighterChangeListener;
052:
053: public HighlighterPipeline() {
054: highlighters = new ArrayList<Highlighter>();
055: }
056:
057: /**
058: *
059: * @param inList the array of highlighters to initially add to this.
060: * @throws NullPointerException if array is null of array contains null values.
061: */
062: public HighlighterPipeline(Highlighter[] inList) {
063: this ();
064: for (int i = 0; i < inList.length; i++) {
065: addHighlighter(inList[i]);
066: }
067: }
068:
069: /**
070: * Appends a highlighter to the pipeline.
071: *
072: * @param hl highlighter to add
073: * @throws NullPointerException if highlighter is null.
074: */
075: public void addHighlighter(Highlighter hl) {
076: addHighlighter(hl, false);
077: }
078:
079: /**
080: * Adds a highlighter to the pipeline.
081: *
082: * PENDING: Duplicate inserts?
083: *
084: * @param hl highlighter to add
085: * @param prepend prepend the highlighter if true; false will append
086: * @throws NullPointerException if highlighter is null.
087: */
088: public void addHighlighter(Highlighter hl, boolean prepend) {
089: if (prepend) {
090: highlighters.add(0, hl);
091: } else {
092: highlighters.add(highlighters.size(), hl);
093: }
094: updateUI(hl);
095: hl.addChangeListener(getHighlighterChangeListener());
096: fireStateChanged();
097: }
098:
099: private ChangeListener getHighlighterChangeListener() {
100: if (highlighterChangeListener == null) {
101: highlighterChangeListener = new ChangeListener() {
102:
103: public void stateChanged(ChangeEvent e) {
104: fireStateChanged();
105:
106: }
107:
108: };
109: }
110: return highlighterChangeListener;
111: }
112:
113: /**
114: * Removes a highlighter from the pipeline.
115: *
116: *
117: * @param hl highlighter to remove
118: */
119: public void removeHighlighter(Highlighter hl) {
120: boolean success = highlighters.remove(hl);
121: if (success) {
122: // PENDING: duplicates?
123: hl.removeChangeListener(getHighlighterChangeListener());
124: fireStateChanged();
125: }
126: // should log if this didn't succeed. Maybe
127: }
128:
129: public Highlighter[] getHighlighters() {
130: return (Highlighter[]) highlighters
131: .toArray(new Highlighter[highlighters.size()]);
132: }
133:
134: /**
135: * Applies all the highlighters to the components.
136: *
137: * @throws NullPointerException if either stamp or adapter is null.
138: */
139: public Component apply(Component stamp, ComponentAdapter adapter) {
140: // stamp = resetDefaultTableCellRendererHighlighter.highlight(stamp, adapter);
141: for (Iterator<Highlighter> iter = highlighters.iterator(); iter
142: .hasNext();) {
143: stamp = iter.next().highlight(stamp, adapter);
144:
145: }
146: return stamp;
147: }
148:
149: public void updateUI() {
150: for (Highlighter highlighter : highlighters) {
151: updateUI(highlighter);
152: }
153: }
154:
155: /**
156: * @param hl
157: */
158: private void updateUI(Highlighter hl) {
159: if (hl instanceof UIHighlighter) {
160: ((UIHighlighter) hl).updateUI();
161: }
162: }
163:
164: /**
165: * Adds a <code>ChangeListener</code>. The change listeners are run each
166: * time any one of the Bounded Range model properties changes.
167: *
168: * @param l the ChangeListener to add
169: * @see #removeChangeListener
170: * @see BoundedRangeModel#addChangeListener
171: */
172: public void addChangeListener(ChangeListener l) {
173: listenerList.add(ChangeListener.class, l);
174: }
175:
176: /**
177: * Removes a <code>ChangeListener</code>.
178: *
179: * @param l the <code>ChangeListener</code> to remove
180: * @see #addChangeListener
181: * @see BoundedRangeModel#removeChangeListener
182: */
183: public void removeChangeListener(ChangeListener l) {
184: listenerList.remove(ChangeListener.class, l);
185: }
186:
187: /**
188: * Returns an array of all the change listeners
189: * registered on this <code>DefaultBoundedRangeModel</code>.
190: *
191: * @return all of this model's <code>ChangeListener</code>s
192: * or an empty
193: * array if no change listeners are currently registered
194: *
195: * @see #addChangeListener
196: * @see #removeChangeListener
197: *
198: * @since 1.4
199: */
200: public ChangeListener[] getChangeListeners() {
201: return (ChangeListener[]) listenerList
202: .getListeners(ChangeListener.class);
203: }
204:
205: /**
206: * Runs each <code>ChangeListener</code>'s <code>stateChanged</code> method.
207: *
208: * @see EventListenerList
209: */
210: protected void fireStateChanged() {
211: Object[] listeners = listenerList.getListenerList();
212: for (int i = listeners.length - 2; i >= 0; i -= 2) {
213: if (listeners[i] == ChangeListener.class) {
214: if (changeEvent == null) {
215: changeEvent = new ChangeEvent(this );
216: }
217: ((ChangeListener) listeners[i + 1])
218: .stateChanged(changeEvent);
219: }
220: }
221: }
222:
223: }
|