/*
* GNU LESSER GENERAL PUBLIC LICENSE Copyright (C) 2006 The Lobo Project
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Contact info: lobochief@users.sourceforge.net
*/
/*
* Created on Dec 4, 2005
*/
package com.nvarghese.beowulf.common.cobra.html.domimpl;
import java.util.ArrayList;
import org.w3c.dom.DOMException;
import org.w3c.dom.Node;
import org.w3c.dom.html2.HTMLCollection;
import org.w3c.dom.html2.HTMLElement;
import org.w3c.dom.html2.HTMLTableRowElement;
public class HTMLTableRowElementImpl extends HTMLAbstractUIElement implements HTMLTableRowElement {
/*
* Patched the parent class to disable stylesheets and also to support TR
* events
*/
public HTMLTableRowElementImpl(String name) {
super(name);
}
public HTMLTableRowElementImpl() {
super("TR");
}
public int getRowIndex() {
NodeImpl parent = (NodeImpl) this.getParentNode();
if (parent == null) {
return -1;
}
try {
parent.visit(new NodeVisitor() {
private int count = 0;
public void visit(Node node) {
if (node instanceof HTMLTableRowElementImpl) {
if (HTMLTableRowElementImpl.this == node) {
throw new StopVisitorException(new Integer(this.count));
}
this.count++;
}
}
});
} catch (StopVisitorException sve) {
return ((Integer) sve.getTag()).intValue();
}
return -1;
}
public int getSectionRowIndex() {
// TODO Auto-generated method stub
return 0;
}
public HTMLCollection getCells() {
NodeFilter filter = new NodeFilter() {
public boolean accept(Node node) {
return node instanceof HTMLTableCellElementImpl;
}
};
return new DescendentHTMLCollection(this, filter, this.treeLock, false);
}
public String getAlign() {
return this.getAttribute("align");
}
public void setAlign(String align) {
this.setAttribute("align", align);
}
public String getBgColor() {
return this.getAttribute("bgcolor");
}
public void setBgColor(String bgColor) {
this.setAttribute("bgcolor", bgColor);
}
public String getCh() {
return this.getAttribute("ch");
}
public void setCh(String ch) {
this.setAttribute("ch", ch);
}
public String getChOff() {
return this.getAttribute("choff");
}
public void setChOff(String chOff) {
this.setAttribute("choff", chOff);
}
public String getVAlign() {
return this.getAttribute("valign");
}
public void setVAlign(String vAlign) {
this.setAttribute("valign", vAlign);
}
/**
* Inserts a TH element at the specified index.
* <p>
* Note: This method is non-standard.
*
* @param index
* The cell index to insert at.
* @return The element that was inserted.
* @throws DOMException
* When the index is out of range.
*/
public HTMLElement insertHeader(int index) throws DOMException {
return this.insertCell(index, "TH");
}
public HTMLElement insertCell(int index) throws DOMException {
return this.insertCell(index, "TD");
}
private HTMLElement insertCell(int index, String tagName) throws DOMException {
org.w3c.dom.Document doc = this.document;
if (doc == null) {
throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, "Orphan element");
}
HTMLElement cellElement = (HTMLElement) doc.createElement(tagName);
synchronized (this.treeLock) {
if (index == -1) {
this.appendChild(cellElement);
return cellElement;
}
ArrayList nl = this.nodeList;
if (nl != null) {
int size = nl.size();
int trcount = 0;
for (int i = 0; i < size; i++) {
Node node = (Node) nl.get(i);
if (node instanceof org.w3c.dom.html2.HTMLTableCellElement) {
if (trcount == index) {
this.insertAt(cellElement, i);
return cellElement;
}
trcount++;
}
}
} else {
this.appendChild(cellElement);
return cellElement;
}
}
throw new DOMException(DOMException.INDEX_SIZE_ERR, "Index out of range");
}
public void deleteCell(int index) throws DOMException {
synchronized (this.treeLock) {
ArrayList nl = this.nodeList;
if (nl != null) {
int size = nl.size();
int trcount = 0;
for (int i = 0; i < size; i++) {
Node node = (Node) nl.get(i);
if (node instanceof org.w3c.dom.html2.HTMLTableCellElement) {
if (trcount == index) {
this.removeChildAt(index);
}
trcount++;
}
}
}
}
throw new DOMException(DOMException.INDEX_SIZE_ERR, "Index out of range");
}
}