if (cellController == null)
{
Log.warn("Image is not contained in a table. Unable to calculate the image-size.");
return null;
}
final Element tableCell = (Element) cellController.getNode();
final int rowSpan = TextUtilities.parseInt
((String) tableCell.getAttribute(OfficeNamespaces.TABLE_NS, "number-rows-spanned"), 1);
final int colSpan = TextUtilities.parseInt
((String) tableCell.getAttribute(OfficeNamespaces.TABLE_NS, "number-columns-spanned"), 1);
if (rowSpan < 1 || colSpan < 1)
{
Log.warn("Rowspan or colspan for image-size calculation was invalid.");
return null;
}
final LayoutController rowController = cellController.getParent();
if (rowController == null)
{
Log.warn("Table-Cell has no parent. Unable to calculate the image-size.");
return null;
}
final Section tableRow = (Section) rowController.getNode();
// we are now making the assumption, that the row is a section, that contains the table-cell.
// This breaks the ability to return nodes or to construct reports on the fly, but the OO-report format
// is weird anyway and wont support such advanced techniques for the next few centuries ..
final int columnPos = findNodeInSection(tableRow, tableCell,"covered-table-cell");
if (columnPos == -1)
{
Log.warn("Table-Cell is not a direct child of the table-row. Unable to calculate the image-size.");
return null;
}
final LayoutController tableController = rowController.getParent();
if (tableController == null)
{
Log.warn("Table-Row has no Table. Unable to calculate the image-size.");
return null;
}
final Section table = (Section) tableController.getNode();
// ok, we got a table, so as next we have to search for the columns now.
final Section columns = (Section) table.findFirstChild(OfficeNamespaces.TABLE_NS, "table-columns");
if (columns.getNodeCount() <= columnPos + colSpan)
{
// the colspan is to large. The table definition is therefore invalid. We do not try to fix this.
Log.warn(
"The Table's defined columns do not match the col-span or col-position. Unable to calculate the image-size.");
return null;
}
final ImageElementContext context = new ImageElementContext(colSpan, rowSpan);
final Node[] columnDefs = columns.getNodeArray();
int columnCounter = 0;
for (int i = 0; i < columnDefs.length; i++)
{
final Element column = (Element) columnDefs[i];
if (ObjectUtilities.equal(column.getNamespace(), OfficeNamespaces.TABLE_NS) == false ||
ObjectUtilities.equal(column.getType(), "table-column") == false)
{
continue;
}
if (columnCounter >= columnPos)
{
final String colStyle = (String) column.getAttribute(OfficeNamespaces.TABLE_NS, "style-name");
context.setColStyle(columnCounter - columnPos, colStyle);
}
columnCounter += 1;
if (columnCounter >= (columnPos + colSpan))
{
break;
}
}
// finally search the styles for the row now.
final int rowPos = findNodeInSection(table, tableRow,null);
if (rowPos == -1)
{
Log.warn("Table-Cell is not a direct child of the table-row. Unable to calculate the image-size.");
return null;
}
final Node[] rows = table.getNodeArray();
int rowCounter = 0;
for (int i = 0; i < rows.length; i++)
{
final Element row = (Element) rows[i];
if (ObjectUtilities.equal(row.getNamespace(), OfficeNamespaces.TABLE_NS) == false ||
ObjectUtilities.equal(row.getType(), "table-row") == false)
{
continue;
}
if (rowCounter >= rowPos)
{
final String rowStyle = (String) row.getAttribute(OfficeNamespaces.TABLE_NS, "style-name");
context.setRowStyle(rowCounter - rowPos, rowStyle);
}
rowCounter += 1;