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 SVGPathSeg objects.</p> <p>{@link org.vectomatic.dom.svg.OMSVGPathSegList}
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>
42 */
43 public class OMSVGPathSegList implements Iterable<OMSVGPathSeg> {
44 private JavaScriptObject ot;
45 protected OMSVGPathSegList(JavaScriptObject ot) {
46 this.ot = ot;
47 }
48
49 // Implementation of the svg::SVGPathSegList W3C IDL interface
50 /**
51 * The number of items in the list.
52 */
53 public final native int getNumberOfItems() /*-{
54 return this.@org.vectomatic.dom.svg.OMSVGPathSegList::ot.numberOfItems;
55 }-*/;
56 /**
57 * Clears all existing current items from the list, with the result being
58 * an empty list.
59 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
60 * cannot be modified.
61 */
62 public final native void clear() throws JavaScriptException /*-{
63 this.@org.vectomatic.dom.svg.OMSVGPathSegList::ot.clear();
64 }-*/;
65 /**
66 * Clears all existing current items from the list and re-initializes the
67 * list to hold the single item specified by the parameter. If the inserted
68 * item is already in a list, it is removed from its previous list before
69 * it is inserted into this list. The inserted item is the item itself and
70 * not a copy.
71 * @param newItem The item which should become the only member of the list.
72 * @return The item being inserted into the list.
73 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
74 * cannot be modified.
75 */
76 public final native OMSVGPathSeg initialize(OMSVGPathSeg newItem) throws JavaScriptException /*-{
77 return this.@org.vectomatic.dom.svg.OMSVGPathSegList::ot.initialize(newItem);
78 }-*/;
79 /**
80 * Returns the specified item from the list. The returned item is the item
81 * itself and not a copy. Any changes made to the item are immediately reflected
82 * in the list.
83 * @param index The index of the item from the list which is to be returned.
84 * The first item is number 0.
85 * @return The selected item.
86 * @throws DOMException(INDEX_SIZE_ERR) Raised if the index number is greater
87 * than or equal to {@link org.vectomatic.dom.svg.OMSVGPathSegList#getNumberOfItems()}.
88 */
89 public final native OMSVGPathSeg getItem(int index) throws JavaScriptException /*-{
90 return this.@org.vectomatic.dom.svg.OMSVGPathSegList::ot.getItem(index);
91 }-*/;
92 /**
93 * Inserts a new item into the list at the specified position. The first item
94 * is number 0. If <var>newItem</var> is already in a list, it is removed
95 * from its previous list before it is inserted into this list. The inserted
96 * item is the item itself and not a copy. If the item is already in this
97 * list, note that the index of the item to insert before is <i>before</i>
98 * the removal of the item.
99 * @param newItem The item which is to be inserted into the list.
100 * @param index The index of the item before which the new item is to be
101 * inserted. The first item is number 0. If the index is equal to 0, then
102 * the new item is inserted at the front of the list. If the index is greater
103 * than or equal to {@link org.vectomatic.dom.svg.OMSVGPathSegList#getNumberOfItems()},
104 * then the new item is appended to the end of the list.
105 * @return The inserted item.
106 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
107 * cannot be modified.
108 */
109 public final native OMSVGPathSeg insertItemBefore(OMSVGPathSeg newItem, int index) throws JavaScriptException /*-{
110 return this.@org.vectomatic.dom.svg.OMSVGPathSegList::ot.insertItemBefore(newItem, index);
111 }-*/;
112 /**
113 * Replaces an existing item in the list with a new item. If <var>newItem</var>
114 * is already in a list, it is removed from its previous list before it is
115 * inserted into this list. The inserted item is the item itself and not
116 * a copy. If the item is already in this list, note that the index of the
117 * item to replace is <i>before</i> the removal of the item.
118 * @param newItem The item which is to be inserted into the list.
119 * @param index The index of the item which is to be replaced. The first
120 * item is number 0.
121 * @return The inserted item.
122 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
123 * cannot be modified.
124 * @throws DOMException(INDEX_SIZE_ERR) Raised if the index number is greater
125 * than or equal to {@link org.vectomatic.dom.svg.OMSVGPathSegList#getNumberOfItems()}.
126 */
127 public final native OMSVGPathSeg replaceItem(OMSVGPathSeg newItem, int index) throws JavaScriptException /*-{
128 return this.@org.vectomatic.dom.svg.OMSVGPathSegList::ot.replaceItem(newItem, index);
129 }-*/;
130 /**
131 * Removes an existing item from the list.
132 * @param index The index of the item which is to be removed. The first
133 * item is number 0.
134 * @return The removed item.
135 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
136 * cannot be modified.
137 * @throws DOMException(INDEX_SIZE_ERR) Raised if the index number is greater
138 * than or equal to {@link org.vectomatic.dom.svg.OMSVGPathSegList#getNumberOfItems()}.
139 */
140 public final native OMSVGPathSeg removeItem(int index) throws JavaScriptException /*-{
141 return this.@org.vectomatic.dom.svg.OMSVGPathSegList::ot.removeItem(index);
142 }-*/;
143 /**
144 * Inserts a new item at the end of the list. If <var>newItem</var> is already
145 * in a list, it is removed from its previous list before it is inserted into
146 * this list. The inserted item is the item itself and not a copy.
147 * @param newItem The item which is to be inserted. The first item is number
148 * 0.
149 * @return The inserted item.
150 * @throws DOMException(NO_MODIFICATION_ALLOWED_ERR) Raised when the list
151 * cannot be modified.
152 */
153 public final native OMSVGPathSeg appendItem(OMSVGPathSeg newItem) throws JavaScriptException /*-{
154 return this.@org.vectomatic.dom.svg.OMSVGPathSegList::ot.appendItem(newItem);
155 }-*/;
156
157 /**
158 * Returns an iterator over the {@link org.vectomatic.dom.svg.OMSVGPathSeg}
159 * elements in this list in proper sequence.
160 *
161 * <p>This implementation returns a straightforward implementation of the
162 * iterator interface, relying on the backing list's {@code getNumberOfItems()},
163 * and {@code getItem(int)} methods.
164 *
165 * <p>Note that the iterator returned by this method will throw an
166 * {@code UnsupportedOperationException} in response to its
167 * {@code remove} method.
168 *
169 * @return an iterator over the {@link org.vectomatic.dom.svg.OMSVGPathSeg}
170 * elements in this list in proper sequence
171 */
172 @Override
173 public final Iterator<OMSVGPathSeg> iterator() {
174 return new Iterator<OMSVGPathSeg>() {
175 private int index;
176 @Override
177 public boolean hasNext() {
178 return index < getNumberOfItems();
179 }
180
181 @Override
182 public OMSVGPathSeg next() {
183 return getItem(index++);
184 }
185
186 @Override
187 public void remove() {
188 throw new UnsupportedOperationException();
189 }
190 };
191 }
192 }