1 /**********************************************
2 * Copyright (C) 2010 Lukas Laag
3 * This file is part of lib-gwt-svg.
4 *
5 * libgwtsvg is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Lesser General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * libgwtsvg is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public License
16 * along with libgwtsvg. If not, see http://www.gnu.org/licenses/
17 **********************************************/
18 /*
19 * Copyright (c) 2004 World Wide Web Consortium,
20 *
21 * (Massachusetts Institute of Technology, European Research Consortium for
22 * Informatics and Mathematics, Keio University). All Rights Reserved. This
23 * work is distributed under the W3C(r) Software License [1] in the hope that
24 * it will be useful, but WITHOUT ANY WARRANTY; without even the implied
25 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
26 *
27 * [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231
28 */
29
30 package org.vectomatic.dom.svg;
31
32 import java.util.Iterator;
33
34 import com.google.gwt.core.client.JavaScriptException;
35 import com.google.gwt.core.client.JavaScriptObject;
36
37 /**
38 * <p>This interface defines a list of SVGNumber objects.</p> <p>{@link org.vectomatic.dom.svg.OMSVGNumberList}
39 * has the same attributes and methods as other SVGxxxList interfaces. Implementers
40 * may consider using a single base class to implement the various SVGxxxList
41 * interfaces.</p> <p id="ReadOnlyNumberList">An {@link org.vectomatic.dom.svg.OMSVGNumberList}
42 * object can be designated as <em>read only</em>, which means that attempts
43 * to modify the object will result in an exception being thrown, as described
44 * below.</p>
45 */
46 public class OMSVGNumberList implements Iterable<OMSVGNumber> {
47 private JavaScriptObject ot;
48 protected OMSVGNumberList(JavaScriptObject ot) {
49 this.ot = ot;
50 }
51
52 // Implementation of the svg::SVGNumberList W3C IDL interface
53 /**
54 * The number of items in the list.
55 */
56 public final native int getNumberOfItems() /*-{
57 return this.@org.vectomatic.dom.svg.OMSVGNumberList::ot.numberOfItems;
58 }-*/;
59 /**
60 * Clears all existing current items from the list, with the result being
61 * an empty list.
62 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
63 * corresponds to a <a href="svgdom.html#ReadOnlyNodes">read only attribute</a>
64 * or when the object itself is <a href="#ReadOnlyNumberList">read only</a>.
65 */
66 public final native void clear() throws JavaScriptException /*-{
67 this.@org.vectomatic.dom.svg.OMSVGNumberList::ot.clear();
68 }-*/;
69 /**
70 * Clears all existing current items from the list and re-initializes the
71 * list to hold the single item specified by the parameter. If the inserted
72 * item is already in a list, it is removed from its previous list before
73 * it is inserted into this list. The inserted item is the item itself and
74 * not a copy.
75 * @param newItem The item which should become the only member of the list.
76 * @return The item being inserted into the list.
77 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
78 * corresponds to a <a href="svgdom.html#ReadOnlyNodes">read only attribute</a>
79 * or when the object itself is <a href="#ReadOnlyNumberList">read only</a>.
80 */
81 public final native OMSVGNumber initialize(OMSVGNumber newItem) throws JavaScriptException /*-{
82 return this.@org.vectomatic.dom.svg.OMSVGNumberList::ot.initialize(newItem);
83 }-*/;
84 /**
85 * Returns the specified item from the list. The returned item is the item
86 * itself and not a copy. Any changes made to the item are immediately reflected
87 * in the list.
88 * @param index The index of the item from the list which is to be returned.
89 * The first item is number 0.
90 * @return The selected item.
91 * @throws DOMException(INDEX_SIZE_ERR) Raised if the index number is greater
92 * than or equal to {@link org.vectomatic.dom.svg.OMSVGNumberList#getNumberOfItems()}.
93 */
94 public final native OMSVGNumber getItem(int index) throws JavaScriptException /*-{
95 return this.@org.vectomatic.dom.svg.OMSVGNumberList::ot.getItem(index);
96 }-*/;
97 /**
98 * Inserts a new item into the list at the specified position. The first item
99 * is number 0. If <var>newItem</var> is already in a list, it is removed
100 * from its previous list before it is inserted into this list. The inserted
101 * item is the item itself and not a copy. If the item is already in this
102 * list, note that the index of the item to insert before is <i>before</i>
103 * the removal of the item.
104 * @param newItem The item which is to be inserted into the list.
105 * @param index The index of the item before which the new item is to be
106 * inserted. The first item is number 0. If the index is equal to 0, then
107 * the new item is inserted at the front of the list. If the index is greater
108 * than or equal to {@link org.vectomatic.dom.svg.OMSVGNumberList#getNumberOfItems()},
109 * then the new item is appended to the end of the list.
110 * @return The inserted item.
111 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
112 * corresponds to a <a href="svgdom.html#ReadOnlyNodes">read only attribute</a>
113 * or when the object itself is <a href="#ReadOnlyNumberList">read only</a>.
114 */
115 public final native OMSVGNumber insertItemBefore(OMSVGNumber newItem, int index) throws JavaScriptException /*-{
116 return this.@org.vectomatic.dom.svg.OMSVGNumberList::ot.insertItemBefore(newItem, index);
117 }-*/;
118 /**
119 * Replaces an existing item in the list with a new item. If <var>newItem</var>
120 * is already in a list, it is removed from its previous list before it is
121 * inserted into this list. The inserted item is the item itself and not
122 * a copy. If the item is already in this list, note that the index of the
123 * item to replace is <i>before</i> the removal of the item.
124 * @param newItem The item which is to be inserted into the list.
125 * @param index The index of the item which is to be replaced. The first
126 * item is number 0.
127 * @return The inserted item.
128 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
129 * corresponds to a <a href="svgdom.html#ReadOnlyNodes">read only attribute</a>
130 * or when the object itself is <a href="#ReadOnlyNumberList">read only</a>.
131 * @throws DOMException(INDEX_SIZE_ERR) Raised if the index number is greater
132 * than or equal to {@link org.vectomatic.dom.svg.OMSVGNumberList#getNumberOfItems()}.
133 */
134 public final native OMSVGNumber replaceItem(OMSVGNumber newItem, int index) throws JavaScriptException /*-{
135 return this.@org.vectomatic.dom.svg.OMSVGNumberList::ot.replaceItem(newItem, index);
136 }-*/;
137 /**
138 * Removes an existing item from the list.
139 * @param index The index of the item which is to be removed. The first
140 * item is number 0.
141 * @return The removed item.
142 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
143 * cannot be modified.
144 * @throws DOMException(INDEX_SIZE_ERR) Raised if the index number is greater
145 * than or equal to {@link org.vectomatic.dom.svg.OMSVGNumberList#getNumberOfItems()}.
146 */
147 public final native OMSVGNumber removeItem(int index) throws JavaScriptException /*-{
148 return this.@org.vectomatic.dom.svg.OMSVGNumberList::ot.removeItem(index);
149 }-*/;
150 /**
151 * Inserts a new item at the end of the list. If <var>newItem</var> is already
152 * in a list, it is removed from its previous list before it is inserted into
153 * this list. The inserted item is the item itself and not a copy.
154 * @param newItem The item which is to be inserted. The first item is number
155 * 0.
156 * @return The inserted item.
157 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
158 * cannot be modified.
159 */
160 public final native OMSVGNumber appendItem(OMSVGNumber newItem) throws JavaScriptException /*-{
161 return this.@org.vectomatic.dom.svg.OMSVGNumberList::ot.appendItem(newItem);
162 }-*/;
163
164 // Helper methods
165 /**
166 * Inserts a new value into the list at the specified position. The first value
167 * is number 0. The value is wrapped into a {@link org.vectomatic.dom.svg.OMSVGNumber}
168 * @param svg The {@link org.vectomatic.dom.svg.OMSVGSVGElement} used to
169 * instantiate the float wrapper.
170 * @param value The value which is to be inserted into the list.
171 * @param index The index of the value before which the new value is to be
172 * inserted. The first value is number 0. If the index is equal to 0, then
173 * the new value is inserted at the front of the list. If the index is greater
174 * than or equal to {@link org.vectomatic.dom.svg.OMSVGNumberList#getNumberOfItems()},
175 * then the new value is appended to the end of the list.
176 * @return The inserted value wrapper.
177 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
178 * corresponds to a <a href="svgdom.html#ReadOnlyNodes">read only attribute</a>
179 * or when the object itself is <a href="#ReadOnlyNumberList">read only</a>.
180 */
181 public final OMSVGNumber insertItemBefore(OMSVGSVGElement svg, float value, int index) throws JavaScriptException {
182 return insertItemBefore(svg.createSVGNumber(value), index);
183 }
184 /**
185 * Inserts a new value at the end of the list. The value is wrapped into
186 * a {@link org.vectomatic.dom.svg.OMSVGNumber}
187 * @param svg The {@link org.vectomatic.dom.svg.OMSVGSVGElement} used to
188 * instantiate the float wrapper.
189 * @param value The value which is to be inserted. The first value is number
190 * 0.
191 * @return The inserted value wrapper.
192 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
193 * cannot be modified.
194 */
195 public final OMSVGNumber appendItem(OMSVGSVGElement svg, float value) throws JavaScriptException {
196 return appendItem(svg.createSVGNumber(value));
197 }
198 /**
199 * Inserts an array of values at the end of the list. The values are wrapped into
200 * {@link org.vectomatic.dom.svg.OMSVGNumber} objects
201 * @param svg The {@link org.vectomatic.dom.svg.OMSVGSVGElement} used to
202 * instantiate the float wrappers.
203 * @param values The array of values which is to be inserted. The first value is number
204 * 0.
205 * @return The array of inserted value wrappers.
206 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
207 * cannot be modified.
208 */
209 public final OMSVGNumber[] appendItems(OMSVGSVGElement svg, float[] values) throws JavaScriptException {
210 OMSVGNumber[] newItems = new OMSVGNumber[values.length];
211 for (int i = 0; i < values.length; i++) {
212 newItems[i] = appendItem(svg, values[i]);
213 }
214 return newItems;
215 }
216
217 /**
218 * Replaces an existing value in the list with a new value. The new value is wrapped into
219 * a {@link org.vectomatic.dom.svg.OMSVGNumber}. If <var>value</var>
220 * is already in a list, it is removed from its previous list before it is
221 * inserted into this list.
222 * @param svg The {@link org.vectomatic.dom.svg.OMSVGSVGElement} used to
223 * instantiate the float wrapper.
224 * @param value The value which is to be inserted into the list.
225 * @param index The index of the value which is to be replaced. The first
226 * item is number 0.
227 * @return The inserted value wrapper.
228 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
229 * corresponds to a <a href="svgdom.html#ReadOnlyNodes">read only attribute</a>
230 * or when the object itself is <a href="#ReadOnlyNumberList">read only</a>.
231 * @throws DOMException(INDEX_SIZE_ERR) Raised if the index number is greater
232 * than or equal to {@link org.vectomatic.dom.svg.OMSVGNumberList#getNumberOfItems()}.
233 */
234 public final OMSVGNumber replaceItem(OMSVGSVGElement svg, float value, int index) throws JavaScriptException {
235 return replaceItem(svg.createSVGNumber(value), index);
236 }
237
238 /**
239 * Returns an iterator over the {@link org.vectomatic.dom.svg.OMSVGNumber}
240 * elements in this list in proper sequence.
241 *
242 * <p>This implementation returns a straightforward implementation of the
243 * iterator interface, relying on the backing list's {@code getNumberOfItems()},
244 * and {@code getItem(int)} methods.
245 *
246 * <p>Note that the iterator returned by this method will throw an
247 * {@code UnsupportedOperationException} in response to its
248 * {@code remove} method.
249 *
250 * @return an iterator over the {@link org.vectomatic.dom.svg.OMSVGNumber}
251 * elements in this list in proper sequence
252 */
253 @Override
254 public final Iterator<OMSVGNumber> iterator() {
255 return new Iterator<OMSVGNumber>() {
256 private int index;
257 @Override
258 public boolean hasNext() {
259 return index < getNumberOfItems();
260 }
261
262 @Override
263 public OMSVGNumber next() {
264 return getItem(index++);
265 }
266
267 @Override
268 public void remove() {
269 throw new UnsupportedOperationException();
270 }
271 };
272 }
273 }