org.htmlunit.html.HtmlTableRow Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of xlt Show documentation
Show all versions of xlt Show documentation
XLT (Xceptance LoadTest) is an extensive load and performance test tool developed and maintained by Xceptance.
/*
* Copyright (c) 2002-2024 Gargoyle Software Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.htmlunit.html;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import org.htmlunit.SgmlPage;
/**
* Wrapper for the HTML element "tr".
*
* @author Mike Bowler
* @author David K. Taylor
* @author Christian Sell
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
*/
public class HtmlTableRow extends HtmlElement {
/** The HTML tag represented by this element. */
public static final String TAG_NAME = "tr";
/**
* Creates an instance.
*
* @param qualifiedName the qualified name of the element type to instantiate
* @param page the page that this element is contained within
* @param attributes the initial attributes
*/
HtmlTableRow(final String qualifiedName, final SgmlPage page,
final Map attributes) {
super(qualifiedName, page, attributes);
}
/**
* @return an Iterator over the all HtmlTableCell objects in this row
*/
public CellIterator getCellIterator() {
return new CellIterator();
}
/**
* @return an immutable list containing all the HtmlTableCells held by this object
* @see #getCellIterator
*/
public List getCells() {
final List result = new ArrayList<>();
for (final HtmlTableCell cell : getCellIterator()) {
result.add(cell);
}
return Collections.unmodifiableList(result);
}
/**
* @param index the 0-based index
* @return the cell at the given index
* @throws IndexOutOfBoundsException if there is no cell at the given index
*/
public HtmlTableCell getCell(final int index) throws IndexOutOfBoundsException {
int count = 0;
for (final HtmlTableCell cell : getCellIterator()) {
if (count == index) {
return cell;
}
count++;
}
throw new IndexOutOfBoundsException("No cell found for index " + index + ".");
}
/**
* Returns the value of the attribute {@code align}. Refer to the
* HTML 4.01
* documentation for details on the use of this attribute.
*
* @return the value of the attribute {@code align}
* or an empty string if that attribute isn't defined.
*/
public final String getAlignAttribute() {
return getAttributeDirect("align");
}
/**
* Returns the value of the attribute {@code char}. Refer to the
* HTML 4.01
* documentation for details on the use of this attribute.
*
* @return the value of the attribute {@code char}
* or an empty string if that attribute isn't defined.
*/
public final String getCharAttribute() {
return getAttributeDirect("char");
}
/**
* Returns the value of the attribute {@code charoff}. Refer to the
* HTML 4.01
* documentation for details on the use of this attribute.
*
* @return the value of the attribute {@code charoff}
* or an empty string if that attribute isn't defined.
*/
public final String getCharoffAttribute() {
return getAttributeDirect("charoff");
}
/**
* Returns the value of the attribute {@code valign}. Refer to the
* HTML 4.01
* documentation for details on the use of this attribute.
*
* @return the value of the attribute {@code valign}
* or an empty string if that attribute isn't defined.
*/
public final String getValignAttribute() {
return getAttributeDirect("valign");
}
/**
* Gets the table containing this row.
* @return the table
*/
public HtmlTable getEnclosingTable() {
return (HtmlTable) getEnclosingElement("table");
}
/**
* Returns the value of the attribute {@code bgcolor}. Refer to the
* HTML 4.01
* documentation for details on the use of this attribute.
*
* @return the value of the attribute {@code bgcolor}
* or an empty string if that attribute isn't defined.
*/
public final String getBgcolorAttribute() {
return getAttributeDirect("bgcolor");
}
/**
* An Iterator over the HtmlTableCells contained in this row. It will also dive
* into nested forms, even though that is illegal HTML.
*/
public class CellIterator implements Iterator, Iterable {
private HtmlTableCell nextCell_;
private HtmlForm currentForm_;
/** Creates an instance. */
public CellIterator() {
setNextCell(getFirstChild());
}
/** @return whether there is another cell available */
@Override
public boolean hasNext() {
return nextCell_ != null;
}
/**
* @return the next cell
* @throws NoSuchElementException if no cell is available
*/
@Override
public HtmlTableCell next() throws NoSuchElementException {
return nextCell();
}
/**
* Removes the cell under the cursor from the current row.
*/
@Override
public void remove() {
if (nextCell_ == null) {
throw new IllegalStateException();
}
final DomNode sibling = nextCell_.getPreviousSibling();
if (sibling != null) {
sibling.remove();
}
}
/**
* @return the next cell
* @throws NoSuchElementException if no cell is available
*/
public HtmlTableCell nextCell() throws NoSuchElementException {
if (nextCell_ != null) {
final HtmlTableCell result = nextCell_;
setNextCell(nextCell_.getNextSibling());
return result;
}
throw new NoSuchElementException();
}
/**
* Sets the internal position to the next cell, starting at the given node
* @param node the node to mark as the next cell; if this is not a cell, the
* next reachable cell will be marked.
*/
private void setNextCell(final DomNode node) {
nextCell_ = null;
for (DomNode next = node; next != null; next = next.getNextSibling()) {
if (next instanceof HtmlTableCell) {
nextCell_ = (HtmlTableCell) next;
return;
}
else if (currentForm_ == null && next instanceof HtmlForm) {
// Completely illegal HTML but some of the big sites (ie amazon) do this
currentForm_ = (HtmlForm) next;
setNextCell(next.getFirstChild());
return;
}
}
if (currentForm_ != null) {
final DomNode form = currentForm_;
currentForm_ = null;
setNextCell(form.getNextSibling());
}
}
/**
* Returns an HtmlTableCell iterator.
*
* @return an HtmlTableCell Iterator.
*/
@Override
public Iterator iterator() {
return this;
}
}
/**
* {@inheritDoc}
*/
@Override
public DisplayStyle getDefaultStyleDisplay() {
return DisplayStyle.TABLE_ROW;
}
}