blob: d70738e81cc9b1e58b2ae6524a549e63ee7a41ad [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2003-2005 Sun Microsystems, Inc. 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. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package sun.awt.X11;
27
28import java.util.*;
29
30/**
31 * Helper class to ease the work with the lists of atoms.
32 */
33class XAtomList {
34 Set<XAtom> atoms = new HashSet<XAtom>();
35
36 /**
37 * Creates empty list.
38 */
39 public XAtomList() {
40 }
41
42 /**
43 * Creates instance of XAtomList and initializes it with
44 * the contents pointer by <code>data</code>.
45 * Uses default display to initialize atoms.
46 */
47 public XAtomList(long data, int count) {
48 init(data, count);
49 }
50 private void init(long data, int count) {
51 for (int i = 0; i < count; i++) {
52 add(new XAtom(XToolkit.getDisplay(), XAtom.getAtom(data+count*XAtom.getAtomSize())));
53 }
54 }
55
56 /**
57 * Creates instance of XAtomList and initializes it with
58 * the arrays of atoms. Array can contain null atoms.
59 */
60 public XAtomList(XAtom[] atoms) {
61 init(atoms);
62 }
63 private void init(XAtom[] atoms) {
64 for (int i = 0; i < atoms.length; i++) {
65 add(atoms[i]);
66 }
67 }
68
69 /**
70 * Returns contents of the list as array of atoms.
71 */
72 public XAtom[] getAtoms() {
73 XAtom[] res = new XAtom[size()];
74 Iterator<XAtom> iter = atoms.iterator();
75 int i = 0;
76 while (iter.hasNext()) {
77 res[i++] = iter.next();
78 }
79 return res;
80 }
81
82 /**
83 * Returns contents of the list as pointer to native data
84 * The size of the native data is size of the list multiplied by
85 * size of the Atom type on the platform. Caller is responsible for
86 * freeing the data by Unsafe.freeMemory when it is no longer needed.
87 */
88 public long getAtomsData() {
89 return XAtom.toData(getAtoms());
90 }
91
92 /**
93 * Returns true if this list contains the atom <code>atom</code>
94 */
95 public boolean contains(XAtom atom) {
96 return atoms.contains(atom);
97 }
98
99 /**
100 * Add atom to the list. Does nothing if list already contains this atom.
101 */
102 public void add(XAtom atom) {
103 atoms.add(atom);
104 }
105
106 /**
107 * Removes atom from the list. Does nothing if arrays doesn't conaint this atom.
108 */
109 public void remove(XAtom atom) {
110 atoms.remove(atom);
111 }
112
113
114 /**
115 * Returns size of the list
116 */
117 public int size() {
118 return atoms.size();
119 }
120
121 /**
122 * Returns a subset of a list which is intersection of this set and set build by mapping <code>mask</code> in
123 * <code>mapping</code>.
124 */
125 public XAtomList subset(int mask, Map<Integer, XAtom> mapping) {
126 XAtomList res = new XAtomList();
127 Iterator<Integer> iter = mapping.keySet().iterator();
128 while (iter.hasNext()) {
129 Integer bits = iter.next();
130 if ( (mask & bits.intValue()) == bits.intValue() ) {
131 XAtom atom = mapping.get(bits);
132 if (contains(atom)) {
133 res.add(atom);
134 }
135 }
136 }
137 return res;
138 }
139
140 /**
141 * Returns iterator for items.
142 */
143 public Iterator<XAtom> iterator() {
144 return atoms.iterator();
145 }
146
147 /**
148 * Merges without duplicates all the atoms from another list
149 */
150 public void addAll(XAtomList atoms) {
151 Iterator<XAtom> iter = atoms.iterator();
152 while(iter.hasNext()) {
153 add(iter.next());
154 }
155 }
156
157 public String toString() {
158 StringBuffer buf = new StringBuffer();
159 buf.append("[");
160 Iterator iter = atoms.iterator();
161 while (iter.hasNext()) {
162 buf.append(iter.next().toString());
163 if (iter.hasNext()) {
164 buf.append(", ");
165 }
166 }
167 buf.append("]");
168 return buf.toString();
169 }
170}