History

My first initial commit with all of mine experimental changes.

Dmitry Kabak (userdima committed 13 years ago

Commit d37b88d1 parent 3f5b46618352 files · +2598093 −-8690Browse files

Showing the changes to java/pkg/javax/swing/ArrayTable.java (1 of 18352 files). Show all

Unified · Split

java/pkg/javax/swing/ArrayTable.java+342−0
@@ -0,0 +1,342 @@
1/*
2 * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25package javax.swing;
26
27import java.io.IOException;
28import java.io.ObjectOutputStream;
29import java.io.Serializable;
30import java.util.Enumeration;
31import java.util.Hashtable;
32
33/*
34 * Private storage mechanism for Action key-value pairs.
35 * In most cases this will be an array of alternating
36 * key-value pairs. As it grows larger it is scaled
37 * up to a Hashtable.
38 * <p>
39 * This does no synchronization, if you need thread safety synchronize on
40 * another object before calling this.
41 *
42 * @author Georges Saab
43 * @author Scott Violet
44 */
45class ArrayTable implements Cloneable {
46 // Our field for storage
47 private Object table = null;
48 private static final int ARRAY_BOUNDARY = 8;
49
50
51 /**
52 * Writes the passed in ArrayTable to the passed in ObjectOutputStream.
53 * The data is saved as an integer indicating how many key/value
54 * pairs are being archived, followed by the the key/value pairs. If
55 * <code>table</code> is null, 0 will be written to <code>s</code>.
56 * <p>
57 * This is a convenience method that ActionMap/InputMap and
58 * AbstractAction use to avoid having the same code in each class.
59 */
60 static void writeArrayTable(ObjectOutputStream s, ArrayTable table) throws IOException {
61 Object keys[];
62
63 if (table == null || (keys = table.getKeys(null)) == null) {
64 s.writeInt(0);
65 }
66 else {
67 // Determine how many keys have Serializable values, when
68 // done all non-null values in keys identify the Serializable
69 // values.
70 int validCount = 0;
71
72 for (int counter = 0; counter < keys.length; counter++) {
73 Object key = keys[counter];
74
75 /* include in Serialization when both keys and values are Serializable */
76 if ( (key instanceof Serializable
77 && table.get(key) instanceof Serializable)
78 ||
79 /* include these only so that we get the appropriate exception below */
80 (key instanceof ClientPropertyKey
81 && ((ClientPropertyKey)key).getReportValueNotSerializable())) {
82
83 validCount++;
84 } else {
85 keys[counter] = null;
86 }
87 }
88 // Write ou the Serializable key/value pairs.
89 s.writeInt(validCount);
90 if (validCount > 0) {
91 for (Object key : keys) {
92 if (key != null) {
93 s.writeObject(key);
94 s.writeObject(table.get(key));
95 if (--validCount == 0) {
96 break;
97 }
98 }
99 }
100 }
101 }
102 }
103
104
105 /*
106 * Put the key-value pair into storage
107 */
108 public void put(Object key, Object value){
109 if (table==null) {
110 table = new Object[] {key, value};
111 } else {
112 int size = size();
113 if (size < ARRAY_BOUNDARY) { // We are an array
114 if (containsKey(key)) {
115 Object[] tmp = (Object[])table;
116 for (int i = 0; i<tmp.length-1; i+=2) {
117 if (tmp[i].equals(key)) {
118 tmp[i+1]=value;
119 break;
120 }
121 }
122 } else {
123 Object[] array = (Object[])table;
124 int i = array.length;
125 Object[] tmp = new Object[i+2];
126 System.arraycopy(array, 0, tmp, 0, i);
127
128 tmp[i] = key;
129 tmp[i+1] = value;
130 table = tmp;
131 }
132 } else { // We are a hashtable
133 if ((size==ARRAY_BOUNDARY) && isArray()) {
134 grow();
135 }
136 ((Hashtable)table).put(key, value);
137 }
138 }
139 }
140
141 /*
142 * Gets the value for key
143 */
144 public Object get(Object key) {
145 Object value = null;
146 if (table !=null) {
147 if (isArray()) {
148 Object[] array = (Object[])table;
149 for (int i = 0; i<array.length-1; i+=2) {
150 if (array[i].equals(key)) {
151 value = array[i+1];
152 break;
153 }
154 }
155 } else {
156 value = ((Hashtable)table).get(key);
157 }
158 }
159 return value;
160 }
161
162 /*
163 * Returns the number of pairs in storage
164 */
165 public int size() {
166 int size;
167 if (table==null)
168 return 0;
169 if (isArray()) {
170 size = ((Object[])table).length/2;
171 } else {
172 size = ((Hashtable)table).size();
173 }
174 return size;
175 }
176
177 /*
178 * Returns true if we have a value for the key
179 */
180 public boolean containsKey(Object key) {
181 boolean contains = false;
182 if (table !=null) {
183 if (isArray()) {
184 Object[] array = (Object[])table;
185 for (int i = 0; i<array.length-1; i+=2) {
186 if (array[i].equals(key)) {
187 contains = true;
188 break;
189 }
190 }
191 } else {
192 contains = ((Hashtable)table).containsKey(key);
193 }
194 }
195 return contains;
196 }
197
198 /*
199 * Removes the key and its value
200 * Returns the value for the pair removed
201 */
202 public Object remove(Object key){
203 Object value = null;
204 if (key==null) {
205 return null;
206 }
207 if (table !=null) {
208 if (isArray()){
209 // Is key on the list?
210 int index = -1;
211 Object[] array = (Object[])table;
212 for (int i = array.length-2; i>=0; i-=2) {
213 if (array[i].equals(key)) {
214 index = i;
215 value = array[i+1];
216 break;
217 }
218 }
219
220 // If so, remove it
221 if (index != -1) {
222 Object[] tmp = new Object[array.length-2];
223 // Copy the list up to index
224 System.arraycopy(array, 0, tmp, 0, index);
225 // Copy from two past the index, up to
226 // the end of tmp (which is two elements
227 // shorter than the old list)
228 if (index < tmp.length)
229 System.arraycopy(array, index+2, tmp, index,
230 tmp.length - index);
231 // set the listener array to the new array or null
232 table = (tmp.length == 0) ? null : tmp;
233 }
234 } else {
235 value = ((Hashtable)table).remove(key);
236 }
237 if (size()==ARRAY_BOUNDARY - 1 && !isArray()) {
238 shrink();
239 }
240 }
241 return value;
242 }
243
244 /**
245 * Removes all the mappings.
246 */
247 public void clear() {
248 table = null;
249 }
250
251 /*
252 * Returns a clone of the <code>ArrayTable</code>.
253 */
254 public Object clone() {
255 ArrayTable newArrayTable = new ArrayTable();
256 if (isArray()) {
257 Object[] array = (Object[])table;
258 for (int i = 0 ;i < array.length-1 ; i+=2) {
259 newArrayTable.put(array[i], array[i+1]);
260 }
261 } else {
262 Hashtable tmp = (Hashtable)table;
263 Enumeration keys = tmp.keys();
264 while (keys.hasMoreElements()) {
265 Object o = keys.nextElement();
266 newArrayTable.put(o,tmp.get(o));
267 }
268 }
269 return newArrayTable;
270 }
271
272 /**
273 * Returns the keys of the table, or <code>null</code> if there
274 * are currently no bindings.
275 * @param keys array of keys
276 * @return an array of bindings
277 */
278 public Object[] getKeys(Object[] keys) {
279 if (table == null) {
280 return null;
281 }
282 if (isArray()) {
283 Object[] array = (Object[])table;
284 if (keys == null) {
285 keys = new Object[array.length / 2];
286 }
287 for (int i = 0, index = 0 ;i < array.length-1 ; i+=2,
288 index++) {
289 keys[index] = array[i];
290 }
291 } else {
292 Hashtable tmp = (Hashtable)table;
293 Enumeration enum_ = tmp.keys();
294 int counter = tmp.size();
295 if (keys == null) {
296 keys = new Object[counter];
297 }
298 while (counter > 0) {
299 keys[--counter] = enum_.nextElement();
300 }
301 }
302 return keys;
303 }
304
305 /*
306 * Returns true if the current storage mechanism is
307 * an array of alternating key-value pairs.
308 */
309 private boolean isArray(){
310 return (table instanceof Object[]);
311 }
312
313 /*
314 * Grows the storage from an array to a hashtable.
315 */
316 private void grow() {
317 Object[] array = (Object[])table;
318 Hashtable<Object, Object> tmp = new Hashtable<Object, Object>(array.length/2);
319 for (int i = 0; i<array.length; i+=2) {
320 tmp.put(array[i], array[i+1]);
321 }
322 table = tmp;
323 }
324
325 /*
326 * Shrinks the storage from a hashtable to an array.
327 */
328 private void shrink() {
329 Hashtable tmp = (Hashtable)table;
330 Object[] array = new Object[tmp.size()*2];
331 Enumeration keys = tmp.keys();
332 int j = 0;
333
334 while (keys.hasMoreElements()) {
335 Object o = keys.nextElement();
336 array[j] = o;
337 array[j+1] = tmp.get(o);
338 j+=2;
339 }
340 table = array;
341 }
342}