001: /*
002: * Copyright (c) 2003-2007 JGoodies Karsten Lentzsch. All Rights Reserved.
003: *
004: * Redistribution and use in source and binary forms, with or without
005: * modification, are permitted provided that the following conditions are met:
006: *
007: * o Redistributions of source code must retain the above copyright notice,
008: * this list of conditions and the following disclaimer.
009: *
010: * o Redistributions in binary form must reproduce the above copyright notice,
011: * this list of conditions and the following disclaimer in the documentation
012: * and/or other materials provided with the distribution.
013: *
014: * o Neither the name of JGoodies Karsten Lentzsch nor the names of
015: * its contributors may be used to endorse or promote products derived
016: * from this software without specific prior written permission.
017: *
018: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020: * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024: * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025: * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026: * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027: * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028: * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029: */
030:
031: package com.jgoodies.validation.tests.event;
032:
033: import java.util.LinkedList;
034: import java.util.List;
035: import java.util.ListIterator;
036:
037: import javax.swing.event.ListDataEvent;
038: import javax.swing.event.ListDataListener;
039:
040: /**
041: * A ListDataListener that stores the received ListDataEvents.
042: *
043: * @author Karsten Lentzsch
044: * @version $Revision: 1.7 $
045: */
046: public final class ListDataReport implements ListDataListener {
047:
048: /**
049: * Holds a list of all received ListDataEvents.
050: */
051: private final List<ListDataEvent> allEvents = new LinkedList<ListDataEvent>();
052:
053: /**
054: * Holds a list of all received add ListDataEvents.
055: */
056: private final List<ListDataEvent> addEvents = new LinkedList<ListDataEvent>();
057:
058: /**
059: * Holds a list of all received remove ListDataEvents.
060: */
061: private final List<ListDataEvent> removeEvents = new LinkedList<ListDataEvent>();
062:
063: /**
064: * Holds a list of all received change ListDataEvents.
065: */
066: private final List<ListDataEvent> changeEvents = new LinkedList<ListDataEvent>();
067:
068: // Implementing the ListDataListener Interface ***************************
069:
070: /**
071: * Sent after the indices in the index0,index1
072: * interval have been inserted in the data model.
073: * The new interval includes both index0 and index1.
074: *
075: * @param evt a <code>ListDataEvent</code> encapsulating the
076: * event information
077: */
078: public void intervalAdded(ListDataEvent evt) {
079: allEvents.add(0, evt);
080: addEvents.add(0, evt);
081: }
082:
083: /**
084: * Sent after the indices in the index0,index1 interval
085: * have been removed from the data model. The interval
086: * includes both index0 and index1.
087: *
088: * @param evt a <code>ListDataEvent</code> encapsulating the
089: * event information
090: */
091: public void intervalRemoved(ListDataEvent evt) {
092: allEvents.add(0, evt);
093: removeEvents.add(0, evt);
094: }
095:
096: /**
097: * Sent when the contents of the list has changed in a way
098: * that's too complex to characterize with the previous
099: * methods. For example, this is sent when an item has been
100: * replaced. Index0 and index1 bracket the change.
101: *
102: * @param evt a <code>ListDataEvent</code> encapsulating the
103: * event information
104: */
105: public void contentsChanged(ListDataEvent evt) {
106: allEvents.add(0, evt);
107: changeEvents.add(0, evt);
108: }
109:
110: // Public Report API *****************************************************
111:
112: private ListDataEvent getEvent(int index) {
113: return allEvents.get(index);
114: }
115:
116: public ListDataEvent lastEvent() {
117: return eventCount() > 0 ? getEvent(0) : null;
118: }
119:
120: public ListDataEvent previousEvent() {
121: return eventCount() > 1 ? getEvent(1) : null;
122: }
123:
124: public List<ListDataEvent> eventList() {
125: return allEvents;
126: }
127:
128: public int eventCount() {
129: return allEvents.size();
130: }
131:
132: public int eventCountAdd() {
133: return addEvents.size();
134: }
135:
136: public int eventCountRemove() {
137: return removeEvents.size();
138: }
139:
140: public int eventCountChange() {
141: return changeEvents.size();
142: }
143:
144: public boolean hasEvents() {
145: return !allEvents.isEmpty();
146: }
147:
148: public void clearEventList() {
149: allEvents.clear();
150: }
151:
152: // ************************************************************************
153:
154: /**
155: * Compares this report's event list with the event list
156: * of the given object and ignores the source of the contained
157: * ListDataEvents that may differ.
158: *
159: * @param o the object to compare with
160: * @return true if equal, false if not
161: *
162: * @see java.util.AbstractList#equals(Object)
163: */
164: @Override
165: public boolean equals(Object o) {
166: if (o == this )
167: return true;
168: if (!(o instanceof ListDataReport))
169: return false;
170:
171: ListIterator<ListDataEvent> e1 = eventList().listIterator();
172: ListIterator<ListDataEvent> e2 = ((ListDataReport) o)
173: .eventList().listIterator();
174: while (e1.hasNext() && e2.hasNext()) {
175: ListDataEvent evt1 = e1.next();
176: ListDataEvent evt2 = e2.next();
177: if (!equalListDataEvents(evt1, evt2))
178: return false;
179: }
180: return !(e1.hasNext() || e2.hasNext());
181: }
182:
183: /**
184: * Poor but valid implementation. Won't be used.
185: *
186: * @return this reports hash code
187: */
188: @Override
189: public int hashCode() {
190: return eventList().size();
191: }
192:
193: /**
194: * Checks and answers whether the two given ListDataEvents
195: * have the same type and indices. The source may differ.
196: */
197: private boolean equalListDataEvents(ListDataEvent evt1,
198: ListDataEvent evt2) {
199: return evt1.getType() == evt2.getType()
200: && evt1.getIndex0() == evt2.getIndex0()
201: && evt1.getIndex1() == evt2.getIndex1();
202: }
203:
204: }
|