public int getIndex() { Node parent; NodeList options; int i; // Locate the parent SELECT. Note that this OPTION might be inside a // OPTGROUP inside the SELECT. Or it might not have a parent SELECT. // Everything is possible. If no parent is found, return -1. parent = getParentNode(); while ( parent != null && ! ( parent instanceof HTMLSelectElement ) ) parent = parent.getParentNode(); if ( parent != null ) { // Use getElementsByTagName() which creates a snapshot of all the // OPTION elements under the SELECT. Access to the returned NodeList // is very fast and the snapshot solves many synchronization problems. options = ( (HTMLElement) parent ).getElementsByTagName( "OPTION" ); for ( i = 0 ; i < options.getLength() ; ++i ) if ( options.item( i ) == this ) return i; } return -1; }
public void setIndex( int index ) { Node parent; NodeList options; Node item; // Locate the parent SELECT. Note that this OPTION might be inside a // OPTGROUP inside the SELECT. Or it might not have a parent SELECT. // Everything is possible. If no parent is found, just return. parent = getParentNode(); while ( parent != null && ! ( parent instanceof HTMLSelectElement ) ) parent = parent.getParentNode(); if ( parent != null ) { // Use getElementsByTagName() which creates a snapshot of all the // OPTION elements under the SELECT. Access to the returned NodeList // is very fast and the snapshot solves many synchronization problems. // Make sure this OPTION is not replacing itself. options = ( (HTMLElement) parent ).getElementsByTagName( "OPTION" ); if ( options.item( index ) != this ) { // Remove this OPTION from its parent. Place this OPTION right // before indexed OPTION underneath it's direct parent (might // be an OPTGROUP). getParentNode().removeChild( this ); item = options.item( index ); item.getParentNode().insertBefore( this, item ); } } }
@Override public Optional<Select> getSelect() { if (element instanceof HTMLSelectElement) { return Optional.of(new Select(this)); } else { return Optional.empty(); } }