Vector<Row> oldList = null;
if (rowRepository.containsKey(maRowElement)) {
oldList = rowRepository.remove(maRowElement);
}
int offetAfterCurrentRow = repeateNum - mnRepeatedIndex - 1;
TableTableRowElement currentRowElement = null;
TableTableRowElement newBeforeRowElement = null;
TableTableRowElement newAfterRowElement = null;
List<TableTableCellElementBase> newBeforeCellElements = new ArrayList<TableTableCellElementBase>();
List<TableTableCellElementBase> newCurrentCellElements = new ArrayList<TableTableCellElementBase>();
List<TableTableCellElementBase> newAfterCellElements = new ArrayList<TableTableCellElementBase>();
if (mnRepeatedIndex > 0) {
newBeforeRowElement = (TableTableRowElement) maRowElement.cloneNode(true);
if (mnRepeatedIndex > 1) {
newBeforeRowElement.setTableNumberRowsRepeatedAttribute(mnRepeatedIndex);
} else {
newBeforeRowElement.removeAttributeNS(tableNameSpaceURI, "number-rows-repeated");
}
// insert new before repeated row
rowOwnerElement.insertBefore(newBeforeRowElement, maRowElement);
// update row cache
if (oldList != null) {
Vector<Row> newBeforeList = new Vector<Row>(mnRepeatedIndex);
for (int i = 0; i < mnRepeatedIndex && i < oldList.size(); i++) {
Row beforeRow = oldList.get(i);
if (beforeRow != null) {
beforeRow.maRowElement = newBeforeRowElement;
beforeRow.mRowsRepeatedNumber = -1;
newBeforeList.add(i, beforeRow);
}
}
rowRepository.put(newBeforeRowElement, newBeforeList);
// create new cell element map.
for (Node n : new DomNodeList(newBeforeRowElement.getChildNodes())) {
int columnsRepeatedNumber = ((TableTableCellElementBase) n)
.getTableNumberColumnsRepeatedAttribute();
for (int i = 0; i < columnsRepeatedNumber; i++) {
newBeforeCellElements.add((TableTableCellElementBase) n);
}
}
}
}
currentRowElement = (TableTableRowElement) maRowElement.cloneNode(true);
currentRowElement.removeAttributeNS(tableNameSpaceURI, "number-rows-repeated");
rowOwnerElement.insertBefore(currentRowElement, maRowElement);
// create new cell element map.
for (Node n : new DomNodeList(currentRowElement.getChildNodes())) {
int columnsRepeatedNumber = ((TableTableCellElementBase) n).getTableNumberColumnsRepeatedAttribute();
for (int i = 0; i < columnsRepeatedNumber; i++) {
newCurrentCellElements.add((TableTableCellElementBase) n);
}
}
if (offetAfterCurrentRow > 0) {
newAfterRowElement = (TableTableRowElement) maRowElement.cloneNode(true);
if (offetAfterCurrentRow > 1) {
newAfterRowElement.setTableNumberRowsRepeatedAttribute(offetAfterCurrentRow);
} else {
newAfterRowElement.removeAttributeNS(tableNameSpaceURI, "number-rows-repeated");
}
rowOwnerElement.insertBefore(newAfterRowElement, maRowElement);
// update row cache
if (oldList != null) {
Vector<Row> newAfterList = new Vector<Row>(offetAfterCurrentRow);
for (int i = mnRepeatedIndex + 1; i < repeateNum && i < oldList.size(); i++) {
Row afterRow = oldList.get(i);
if (afterRow != null) {
afterRow.maRowElement = newAfterRowElement;
afterRow.mnRepeatedIndex = i - mnRepeatedIndex - 1;
afterRow.mRowsRepeatedNumber = -1;
newAfterList.add(afterRow.mnRepeatedIndex, afterRow);
}
}
rowRepository.put(newAfterRowElement, newAfterList);
// create new cell element map.
for (Node n : new DomNodeList(newAfterRowElement.getChildNodes())) {
int columnsRepeatedNumber = ((TableTableCellElementBase) n)
.getTableNumberColumnsRepeatedAttribute();
for (int i = 0; i < columnsRepeatedNumber; i++) {
newAfterCellElements.add((TableTableCellElementBase) n);
}