package org.jdom;
import java.util.*;
/**
*
* The AttributeList
class is a list that manages the parent/child
* relationship of an attribute and its parent Elemebt. It is designed to be
* embedded in an Element object.
*
*
* @author Philippe Riand
*/
public class AttributeList extends ArrayList {
protected Element parentElement;
/**
* Constructs an empty list with the specified initial capacity.
*
* @param initialCapacity the initial capacity of the list.
* @exception IllegalArgumentException if the specified initial capacity
* is negative
*/
public AttributeList(Element parentElement, int initialCapacity) {
super(initialCapacity);
this.parentElement = parentElement;
}
/**
* Assign the attribute parent.
* @param obj the attribute to assign
* @param parent the new parent Element
*/
private void assignParent(Object obj, Element parent) {
((Attribute)obj).setParent(parent);
}
/**
* Replaces the element at the specified position in this list with
* the specified element.
*
* @param index index of element to replace.
* @param element element to be stored at the specified position.
* @return the element previously at the specified position.
* @throws IndexOutOfBoundsException if index out of range
* (index < 0 || index >= size()).
*/
public Object set(int index, Object element) {
assignParent(get(index),null);
assignParent(element,parentElement);
return super.set(index,element);
}
/**
* Appends the specified element to the end of this list.
*
* @param o element to be appended to this list.
* @return true (as per the general contract of Collection.add).
*/
public boolean add(Object o) {
assignParent(o,parentElement);
return super.add(o);
}
/**
* Inserts the specified element at the specified position in this
* list. Shifts the element currently at that position (if any) and
* any subsequent elements to the right (adds one to their indices).
*
* @param index index at which the specified element is to be inserted.
* @param element element to be inserted.
* @throws IndexOutOfBoundsException if index is out of range
* (index < 0 || index > size()).
*/
public void add(int index, Object element) {
assignParent(element,parentElement);
super.add(index,element);
}
/**
* Removes the element at the specified position in this list.
* Shifts any subsequent elements to the left (subtracts one from their
* indices).
*
* @param index the index of the element to removed.
* @return the element that was removed from the list.
* @throws IndexOutOfBoundsException if index out of range (index
* < 0 || index >= size()).
*/
public Object remove(int index) {
assignParent(get(index),null);
return remove(index);
}
/**
* Removes all of the elements from this list. The list will
* be empty after this call returns.
*/
public void clear() {
int count = size();
for( int i=0; i(index
* < 0 || index > size()).
*/
public boolean addAll(Collection c) {
int oldSize = size();
boolean result = super.addAll(c);
int newSize = size();
for( int i=oldSize; i(index
* < 0 || index > size()).
*/
public boolean addAll(int index, Collection c) {
int oldSize = size();
boolean result = super.addAll(index,c);
int lastIndex = index + (size()-oldSize);
for( int i=index; i(toIndex - fromIndex) elements.
* (If toIndex==fromIndex, this operation has no effect.)
*
* @param fromIndex index of first element to be removed.
* @param toIndex index after last element to be removed.
*/
protected void removeRange(int fromIndex, int toIndex) {
for( int i=fromIndex; i