View Javadoc
1 /*
2 * Copyright (c) 2003 Scott Howlett & Paul Libbrecht.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 *
17 * 3. The end-user documentation included with the redistribution,
18 * if any, must include the following acknowledgment:
19 * "This product includes software developed by the Xwing
20 * Project ( http://xwing.sourceforge.net/ )."
21 * Alternately, this acknowledgment may appear in the software itself,
22 * if and wherever such third-party acknowledgments normally appear.
23 *
24 * 4. The name "Xwing" must not be used to endorse or promote products
25 * derived from this software without prior written permission. For
26 * written permission, please contact the project authors via
27 * the Xwing project site, http://xwing.sourceforge.net/ .
28 *
29 * 5. Products derived from this software may not be called "Xwing",
30 * nor may "Xwing" appear in their name, without prior written
31 * permission of the Xwing project.
32 *
33 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
34 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
35 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
36 * DISCLAIMED. IN NO EVENT SHALL THE XWING AUTHORS OR THE PROJECT
37 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
38 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
39 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
40 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
41 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
42 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
43 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44 * SUCH DAMAGE.
45 *
46 * For more information on Xwing, please see
47 * < http://xwing.sourceforge.net/ >.
48 */
49
50 package net.sourceforge.xwing;
51
52 import java.util.List;
53
54 import javax.swing.AbstractListModel;
55
56 import org.apache.commons.lang.ArrayUtils;
57
58 import net.sourceforge.xwing.util.SequenceUtils;
59
60 /***
61 * A ListModel that accepts wholesale updates to its contents in
62 * the form of new Lists but reports as changes only the differences.
63 *
64 * @author Scott Howlett
65 * @version $Revision: 1.2 $
66 */
67 public class DiffingListModel extends AbstractListModel {
68 private Object[] cachedValue;
69
70 /***
71 * Create a new empty DiffingListModel.
72 */
73 public DiffingListModel() {
74 cachedValue = ArrayUtils.EMPTY_OBJECT_ARRAY;
75 }
76
77 /***
78 * Create a new DiffingListModel from the supplied
79 * initial value.
80 * @param initialValue The initial value of this
81 * DiffingListModel.
82 */
83
84 public DiffingListModel(List initialValue) {
85 cachedValue =
86 (initialValue == null || initialValue.size() == 0)
87 ? ArrayUtils.EMPTY_OBJECT_ARRAY
88 : initialValue.toArray();
89 }
90
91 /***
92 * Set our contents to the supplied value. We will
93 * calculate the delta between our previous content
94 * and the new content and broadcast an appropriate
95 * ListDataEvent.
96 * @param newValue Our new content.
97 */
98 public void setList(List newValue) {
99
100 Object[] tmp =
101 (newValue == null || newValue.size() == 0)
102 ? ArrayUtils.EMPTY_OBJECT_ARRAY
103 : newValue.toArray();
104
105 SequenceUtils.ChangeInfo change = null;
106
107 synchronized (this) {
108 if (tmp != cachedValue) {
109 change = SequenceUtils.findDifference(cachedValue, tmp);
110 cachedValue = tmp;
111 }
112 }
113
114 if (change != null) {
115
116 switch (change.getChangeType()) {
117 case SequenceUtils.COMPLEX_CHANGE :
118 fireContentsChanged(this, 0, tmp.length - 1);
119 break;
120
121 case SequenceUtils.INTERVAL_ADDED :
122 fireIntervalAdded(
123 this,
124 change.getFirstIndex(),
125 change.getLastIndex());
126 break;
127
128 case SequenceUtils.INTERVAL_REMOVED :
129 fireIntervalRemoved(
130 this,
131 change.getFirstIndex(),
132 change.getLastIndex());
133 break;
134
135 case SequenceUtils.NO_CHANGE :
136 default :
137 break;
138 }
139 }
140 }
141
142 public int getSize() {
143 return cachedValue.length;
144 }
145
146 public Object getElementAt(int index) {
147 return cachedValue[index];
148 }
149 }
This page was automatically generated by Maven