
org.htmlunit.javascript.host.html.HTMLTableRowElement Maven / Gradle / Ivy
/*
* 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.javascript.host.html;
import static org.htmlunit.BrowserVersionFeatures.JS_TABLE_ROW_DELETE_CELL_REQUIRES_INDEX;
import static org.htmlunit.javascript.configuration.SupportedBrowser.CHROME;
import static org.htmlunit.javascript.configuration.SupportedBrowser.EDGE;
import static org.htmlunit.javascript.configuration.SupportedBrowser.FF;
import static org.htmlunit.javascript.configuration.SupportedBrowser.FF_ESR;
import static org.htmlunit.javascript.configuration.SupportedBrowser.IE;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
import org.htmlunit.html.DomElement;
import org.htmlunit.html.DomNode;
import org.htmlunit.html.HtmlPage;
import org.htmlunit.html.HtmlTable;
import org.htmlunit.html.HtmlTableRow;
import org.htmlunit.javascript.JavaScriptEngine;
import org.htmlunit.javascript.configuration.JsxClass;
import org.htmlunit.javascript.configuration.JsxConstructor;
import org.htmlunit.javascript.configuration.JsxFunction;
import org.htmlunit.javascript.configuration.JsxGetter;
import org.htmlunit.javascript.configuration.JsxSetter;
/**
* The JavaScript object {@code HTMLTableRowElement}.
*
* @author Marc Guillemot
* @author Chris Erskine
* @author Ahmed Ashour
* @author Ronald Brill
* @author Frank Danek
*/
@JsxClass(domClass = HtmlTableRow.class)
public class HTMLTableRowElement extends HTMLTableComponent {
/**
* Creates an instance.
*/
public HTMLTableRowElement() {
}
/**
* JavaScript constructor.
*/
@Override
@JsxConstructor({CHROME, EDGE, FF, FF_ESR})
public void jsConstructor() {
super.jsConstructor();
}
/**
* Returns the index of the row within the parent table.
* @return the index of the row within the parent table
* @see MSDN Documentation
*/
@JsxGetter
public int getRowIndex() {
final HtmlTableRow row = (HtmlTableRow) getDomNodeOrDie();
final HtmlTable table = row.getEnclosingTable();
if (table == null) { // a not attached document.createElement('TR')
return -1;
}
return table.getRows().indexOf(row);
}
/**
* Returns the index of the row within the enclosing thead, tbody or tfoot.
* @return the index of the row within the enclosing thead, tbody or tfoot
* @see MSDN Documentation
* @see
* DOM Level 1
*/
@JsxGetter
public int getSectionRowIndex() {
DomNode row = getDomNodeOrDie();
final HtmlTable table = ((HtmlTableRow) row).getEnclosingTable();
if (table == null) { // a not attached document.createElement('TR')
return -1;
}
int index = -1;
while (row != null) {
if (row instanceof HtmlTableRow) {
index++;
}
row = row.getPreviousSibling();
}
return index;
}
/**
* Returns the cells in the row.
* @return the cells in the row
*/
@JsxGetter
public Object getCells() {
final HtmlTableRow row = (HtmlTableRow) getDomNodeOrDie();
final HTMLCollection cells = new HTMLCollection(row, false);
cells.setElementsSupplier((Supplier> & Serializable) () -> new ArrayList<>(row.getCells()));
return cells;
}
/**
* Returns the value of the {@code bgColor} attribute.
* @return the value of the {@code bgColor} attribute
* @see MSDN Documentation
*/
@JsxGetter
public String getBgColor() {
return getDomNodeOrDie().getAttribute("bgColor");
}
/**
* Sets the value of the {@code bgColor} attribute.
* @param bgColor the value of the {@code bgColor} attribute
* @see MSDN Documentation
*/
@JsxSetter
public void setBgColor(final String bgColor) {
setColorAttribute("bgColor", bgColor);
}
/**
* Inserts a new cell at the specified index in the element's cells collection. If the index
* is -1 or there is no index specified, then the cell is appended at the end of the
* element's cells collection.
* @see MSDN Documentation
* @param index specifies where to insert the cell in the tr.
* The default value is -1, which appends the new cell to the end of the cells collection
* @return the newly-created cell
*/
@JsxFunction
public Object insertCell(final Object index) {
int position = -1;
if (!JavaScriptEngine.isUndefined(index)) {
position = (int) JavaScriptEngine.toNumber(index);
}
final HtmlTableRow htmlRow = (HtmlTableRow) getDomNodeOrDie();
final boolean indexValid = position >= -1 && position <= htmlRow.getCells().size();
if (indexValid) {
final DomElement newCell = ((HtmlPage) htmlRow.getPage()).createElement("td");
if (position == -1 || position == htmlRow.getCells().size()) {
htmlRow.appendChild(newCell);
}
else {
htmlRow.getCell(position).insertBefore(newCell);
}
return getScriptableFor(newCell);
}
throw JavaScriptEngine.reportRuntimeError("Index or size is negative or greater than the allowed amount");
}
/**
* Deletes the cell at the specified index in the element's cells collection. If the index
* is -1 (or while simulating IE, when there is no index specified), then the last cell is deleted.
* @see MSDN Documentation
* @see W3C DOM Level2
* @param index specifies the cell to delete.
*/
@JsxFunction
public void deleteCell(final Object index) {
int position = -1;
if (!JavaScriptEngine.isUndefined(index)) {
position = (int) JavaScriptEngine.toNumber(index);
}
else if (getBrowserVersion().hasFeature(JS_TABLE_ROW_DELETE_CELL_REQUIRES_INDEX)) {
throw JavaScriptEngine.reportRuntimeError("No enough arguments");
}
final HtmlTableRow htmlRow = (HtmlTableRow) getDomNodeOrDie();
if (position == -1) {
position = htmlRow.getCells().size() - 1;
}
final boolean indexValid = position >= -1 && position <= htmlRow.getCells().size();
if (!indexValid) {
throw JavaScriptEngine.reportRuntimeError("Index or size is negative or greater than the allowed amount");
}
htmlRow.getCell(position).remove();
}
/**
* Overwritten to throw an exception.
* @param value the new value for replacing this node
*/
@Override
public void setOuterHTML(final Object value) {
throw JavaScriptEngine.reportRuntimeError("outerHTML is read-only for tag 'tr'");
}
/**
* Gets the {@code borderColor} attribute.
* @return the attribute
*/
@JsxGetter(IE)
public String getBorderColor() {
return getDomNodeOrDie().getAttribute("borderColor");
}
/**
* Sets the {@code borderColor} attribute.
* @param borderColor the new attribute
*/
@JsxSetter(IE)
public void setBorderColor(final String borderColor) {
setColorAttribute("borderColor", borderColor);
}
/**
* Gets the {@code borderColor} attribute.
* @return the attribute
*/
@JsxGetter(IE)
public String getBorderColorDark() {
return getDomNodeOrDie().getAttribute("borderColorDark");
}
/**
* Sets the {@code borderColor} attribute.
* @param borderColor the new attribute
*/
@JsxSetter(IE)
public void setBorderColorDark(final String borderColor) {
setColorAttribute("borderColorDark", borderColor);
}
/**
* Gets the {@code borderColor} attribute.
* @return the attribute
*/
@JsxGetter(IE)
public String getBorderColorLight() {
return getDomNodeOrDie().getAttribute("borderColorLight");
}
/**
* Sets the {@code borderColor} attribute.
* @param borderColor the new attribute
*/
@JsxSetter(IE)
public void setBorderColorLight(final String borderColor) {
setColorAttribute("borderColorLight", borderColor);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy