001: /*
002: * <copyright>
003: *
004: * Copyright 1997-2004 BBNT Solutions, LLC
005: * under sponsorship of the Defense Advanced Research Projects
006: * Agency (DARPA).
007: *
008: * You can redistribute this software and/or modify it under the
009: * terms of the Cougaar Open Source License as published on the
010: * Cougaar Open Source Website (www.cougaar.org).
011: *
012: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
013: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
014: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
015: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
016: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
017: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
018: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
019: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
020: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
021: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
022: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
023: *
024: * </copyright>
025: */
026:
027: package org.cougaar.mlm.debug.ui.draw;
028:
029: import java.util.Enumeration;
030: import java.util.NoSuchElementException;
031: import java.util.Vector;
032:
033: /** Class OMVector
034: *
035: * a vector of objects and an encapsulated enumerator.
036: *
037: **/
038: public class OMVector {
039:
040: // vector of objects
041: Vector vertices = null;
042: int size_ = 0; // number of elements
043: int tail_ = -1; // index for reverse iteration
044:
045: // vector iterator
046: Enumeration en = null;
047:
048: public OMVector() {
049: vertices = new Vector();
050: }
051:
052: public OMVector(int capacity) {
053: vertices = new Vector(capacity);
054: }
055:
056: public/*synchronized*/void add(Object p) {
057: vertices.addElement(p);
058: ++size_;
059: }
060:
061: public/*synchronized*/void add(Object[] pts, boolean decompose) {
062: for (int i = 0; i < pts.length; i++)
063: vertices.addElement(pts[i]);
064: size_ = vertices.size();
065: }
066:
067: public/*synchronized*/void add(OMVector v) {
068: vertices.addElement(v);
069: ++size_;
070: }
071:
072: public/*synchronized*/void add(OMVector v, boolean decompose) {
073: v.resetEnumerator();
074: while (v.hasMoreElements())
075: vertices.addElement(v.nextElement(true));
076: size_ = vertices.size();
077: }
078:
079: public/*synchronized*/void insertAt(Object p, int index) {
080: vertices.insertElementAt(p, index);
081: ++size_;
082: }
083:
084: public/*synchronized*/boolean remove(Object p) {
085: boolean removed = vertices.removeElement(p);
086: if (removed)
087: --size_;
088: return removed;
089: }
090:
091: public/*synchronized*/void removeAt(int index) {
092: vertices.removeElementAt(index);
093: --size_;
094: }
095:
096: public/*synchronized*/int size() {
097: return size_/*vertices.size()*/;
098: }
099:
100: /** nextElement(true) - returns the next element, wrap if we've
101: reached the end of the array, or return null if array is zero
102: sized. */
103: public/*synchronized*/Object nextElement(boolean wrap) {
104: if (size_ == 0)
105: return null;
106:
107: while (true) {
108: try {
109: return en.nextElement();
110: } catch (NoSuchElementException e) {
111: resetEnumerator();
112: continue;
113: }
114: }
115: }
116:
117: /** nextElement() - returns the next element or throws an
118: exception. */
119: public/*synchronized*/Object nextElement()
120: throws NoSuchElementException {
121: return en.nextElement();
122: }
123:
124: /** elementAt() - returns object at the specified index or an
125: exception is thrown */
126: public/*synchronized*/Object elementAt(int index) {
127: return vertices.elementAt(index);
128: }
129:
130: /** hasMoreElements() */
131: public/*synchronized*/boolean hasMoreElements() {
132: return en.hasMoreElements();
133: }
134:
135: /** previousElement() - returns elements starting at the end of
136: the vector and working to the front. Behavior is undefined if
137: you add to or remove elements from the Vector while you're
138: iterating. does not wrap the index. */
139: public/*synchronized*/Object previousElement() {
140: return vertices.elementAt(tail_--);
141: }
142:
143: /** previousElement(wrap) - returns elements starting at the end
144: of the vector, working to the front. Behavior is undefined if
145: you add to or remove elements from the Vector while you're
146: iterating. wraps the index. */
147: public/*synchronized*/Object previousElement(boolean wrap) {
148: Object obj = vertices.elementAt(tail_--);
149: if (tail_ < 0)
150: tail_ = size_ - 1;
151: return obj;
152: }
153:
154: /** resetEnumerator() - resets the Enumerator to a starting
155: state. the state of the enumerator is invalid until the first
156: call to resetEnumerator(). */
157: public/*synchronized*/void resetEnumerator() {
158: en = vertices.elements();
159: tail_ = size_ - 1;
160: }
161: }
|