diff options
Diffstat (limited to 'xmerge/java/org/openoffice/xmerge/converter/xml/sxc/SxcDocumentSerializer.java')
-rw-r--r-- | xmerge/java/org/openoffice/xmerge/converter/xml/sxc/SxcDocumentSerializer.java | 992 |
1 files changed, 0 insertions, 992 deletions
diff --git a/xmerge/java/org/openoffice/xmerge/converter/xml/sxc/SxcDocumentSerializer.java b/xmerge/java/org/openoffice/xmerge/converter/xml/sxc/SxcDocumentSerializer.java deleted file mode 100644 index 9e0d30831d24..000000000000 --- a/xmerge/java/org/openoffice/xmerge/converter/xml/sxc/SxcDocumentSerializer.java +++ /dev/null @@ -1,992 +0,0 @@ -/************************************************************************ - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org 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 version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -package org.openoffice.xmerge.converter.xml.sxc; - -import java.awt.Color; - -import org.w3c.dom.NodeList; -import org.w3c.dom.Node; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Element; - -import java.io.IOException; -import java.util.Vector; -import java.util.Enumeration; - -import org.openoffice.xmerge.Document; -import org.openoffice.xmerge.ConvertData; -import org.openoffice.xmerge.ConvertException; -import org.openoffice.xmerge.DocumentSerializer; - -import org.openoffice.xmerge.converter.xml.OfficeConstants; -import org.openoffice.xmerge.converter.xml.sxc.SxcDocument; -import org.openoffice.xmerge.converter.xml.ParaStyle; -import org.openoffice.xmerge.converter.xml.sxc.CellStyle; -import org.openoffice.xmerge.converter.xml.StyleCatalog; - -import org.openoffice.xmerge.util.Debug; -import org.openoffice.xmerge.util.XmlUtil; - -/** - * <p>General spreadsheet implementation of <code>DocumentSerializer</code> - * for the {@link - * org.openoffice.xmerge.converter.xml.sxc.SxcPluginFactory - * SxcPluginFactory}. Used with SXC <code>Document</code> objects.</p> - * - * <p>The <code>serialize</code> method traverses the DOM - * <code>Document</code> from the given <code>Document</code> object. - * It uses a <code>DocEncoder</code> object for the actual conversion - * of contents to the device spreadsheet format.</p> - * - * @author Paul Rank - * @author Mark Murnane - */ -public abstract class SxcDocumentSerializer implements OfficeConstants, - DocumentSerializer { - - /** The cell foreground <code>Color</code>. */ - private Color foreground = Color.black; - - /** The cell background <code>Color</code>. */ - private Color background = Color.white; - - /** The cell format. */ - private long format = 0; - - /** <code>Format</code> object describing the cell. */ - private Format fmt = null; - - /** The row number. */ - private int rowID = 1; - - /** The column number. */ - private int colID = 1; - - /** The number of times the current row is repeated. */ - private int rowsRepeated = 1; - - /** The number of times the current column is repeated. */ - private int colsRepeated = 1; - - /** The number of times the current column is repeated. */ - private StyleCatalog styleCat = null; - /** - * An array of column widths of the current worksheet. Width is - * measured in number of characters. - */ - private Vector ColumnRowList; - - /** Width, in characters, of the current cell display data. */ - private int displayWidth = 0; - - /** - * A <code>SpreadsheetEncoder</code> object for encoding to - * appropriate format. - */ - protected SpreadsheetEncoder encoder = null; - - /** <code>SxcDocument</code> object that this converter processes. */ - protected SxcDocument sxcDoc = null; - - - /** - * Constructor. - * - * @param document Input <code>SxcDocument</code> - * <code>Document</code>. - */ - public SxcDocumentSerializer(Document document) { - fmt = new Format(); - sxcDoc = (SxcDocument) document; - } - - - /** - * <p>Method to convert a DOM <code>Document</code> into - * "Device" <code>Document</code> objects.</p> - * - * <p>This method is not thread safe for performance reasons. - * This method should not be called from within two threads. - * It would be best to call this method only once per object - * instance.</p> - * - * @return <code>ConvertData</code> containing "Device" - * <code>Document</code> objects. - * - * @throws ConvertException If any conversion error occurs. - * @throws IOException If any I/O error occurs. - */ - public abstract ConvertData serialize() throws ConvertException, - IOException; - - - /** - * This method traverses <i>office:settings</i> <code>Element</code>. - * - * @param node <i>office:settings</i> <code>Node</code>. - * - * @throws IOException If any I/O error occurs. - */ - public void traverseSettings(Node node) throws IOException { - if (node.hasChildNodes()) { - - NodeList nodeList = node.getChildNodes(); - int len = nodeList.getLength(); - for (int i = 0; i < len; i++) { - Node child = nodeList.item(i); - - if (child.getNodeType() == Node.ELEMENT_NODE) { - String nodeName = child.getNodeName(); - - if (nodeName.equals(TAG_CONFIG_ITEM_SET)) { - - traverseSettings(child); - - } else if (nodeName.equals(TAG_CONFIG_ITEM_MAP_INDEXED)) { - - traverseSettings(child); - - } else if (nodeName.equals(TAG_CONFIG_ITEM_MAP_ENTRY)) { - - BookSettings bs = new BookSettings(child); - encoder.addSettings(bs); - - } else { - - Debug.log(Debug.TRACE, "<OTHERS " + XmlUtil.getNodeInfo(child) + " />"); - } - } - } - } - } - - /* - * Handles the loading of defined styles from the style.xml file as well - * as automatic styles from the content.xml file. - * - * Any change to a defined style, such as a short bold section, falls into - * the latter category. - */ - protected void loadStyles(SxcDocument sxcDoc) { - - org.w3c.dom.Document contentDom = sxcDoc.getContentDOM(); - - styleCat = new StyleCatalog(25); - - NodeList nl = null; - String families[] = new String[] { SxcConstants.COLUMN_STYLE_FAMILY, - SxcConstants.ROW_STYLE_FAMILY, - SxcConstants.TABLE_CELL_STYLE_FAMILY }; - Class classes[] = new Class[] { ColumnStyle.class, - RowStyle.class, - CellStyle.class}; - - /* - * Process the content XML for any other style info. - * Should only be automatic types here. - */ - nl = contentDom.getElementsByTagName(TAG_OFFICE_AUTOMATIC_STYLES); - if (nl.getLength() != 0) { - styleCat.add(nl.item(0), families, classes, null, false); - } - } - - /** - * This method traverses <i>office:body</i> <code>Element</code>. - * - * @param node <i>office:body</i> <code>Node</code>. - * - * @throws IOException If any I/O error occurs. - */ - protected void traverseBody(Node node) throws IOException { - - Debug.log(Debug.TRACE, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); - Debug.log(Debug.TRACE, "<DEBUGLOG>"); - - if (node.hasChildNodes()) { - - NodeList nodeList = node.getChildNodes(); - int len = nodeList.getLength(); - - for (int i = 0; i < len; i++) { - Node searchNode = nodeList.item(i); - if (searchNode.getNodeType() == Node.ELEMENT_NODE) { - - String nodeName = searchNode.getNodeName(); - - if (nodeName.equals(TAG_NAMED_EXPRESSIONS)) { - - traverseNamedExpressions(searchNode); - - } else { - - Debug.log(Debug.TRACE, "Skipping " + XmlUtil.getNodeInfo(searchNode) + " />"); - } - } - } - - for (int i = 0; i < len; i++) { - Node child = nodeList.item(i); - - if (child.getNodeType() == Node.ELEMENT_NODE) { - String nodeName = child.getNodeName(); - - if (nodeName.equals(TAG_TABLE)) { - - traverseTable(child); - - } else { - - Debug.log(Debug.TRACE, "<OTHERS " + XmlUtil.getNodeInfo(child) + " />"); - } - } - } - } - - Debug.log(Debug.TRACE, "</DEBUGLOG>"); - } - - - /** - * This method traverses the <i>table:table</i> element - * <code>Node</code>. - * - * @param node A <i>table:table</i> <code>Node</code>. - * - * @throws IOException If any I/O error occurs. - */ - protected void traverseNamedExpressions(Node node) throws IOException { - - Debug.log(Debug.TRACE, "<NAMED:EXPRESSIONS>"); - - NamedNodeMap att = node.getAttributes(); - - if (node.hasChildNodes()) { - - NodeList nodeList = node.getChildNodes(); - int len = nodeList.getLength(); - - for (int i = 0; i < len; i++) { - Node child = nodeList.item(i); - - if (child.getNodeType() == Node.ELEMENT_NODE) { - NameDefinition nd = new NameDefinition(child); - encoder.setNameDefinition(nd); - } - } - } - - Debug.log(Debug.TRACE, "</NAMED:EXPRESSIONS>"); - } - - /** - * This method traverses the <i>table:table</i> element - * <code>Node</code>. - * - * @param node A <i>table:table</i> <code>Node</code>. - * - * @throws IOException If any I/O error occurs. - */ - protected void traverseTable(Node node) throws IOException { - - Debug.log(Debug.TRACE, "<TABLE>"); - - ColumnRowList = new Vector(); - - // Get table attributes - // TODO - extract style from attribute - - NamedNodeMap att = node.getAttributes(); - - String tableName = - att.getNamedItem(ATTRIBUTE_TABLE_NAME).getNodeValue(); - - rowID = 1; - - encoder.createWorksheet(tableName); - - if (node.hasChildNodes()) { - - NodeList nodeList = node.getChildNodes(); - int len = nodeList.getLength(); - - for (int i = 0; i < len; i++) { - Node child = nodeList.item(i); - - if (child.getNodeType() == Node.ELEMENT_NODE) { - String nodeName = child.getNodeName(); - - if (nodeName.equals(TAG_TABLE_ROW)) { - // TODO - handle all the possible rows - // spelled out in the entities - - traverseTableRow(child); - - } else if (nodeName.equals(TAG_TABLE_COLUMN)) { - - traverseTableColumn(child); - - } else if (nodeName.equals(TAG_TABLE_SCENARIO)) { - - // TODO - - } else { - - Debug.log(Debug.TRACE, "<OTHERS " + XmlUtil.getNodeInfo(child) + " />"); - } - } - } - } - - // Add column width info to the current sheet - encoder.setColumnRows(ColumnRowList); - - Debug.log(Debug.TRACE, "</TABLE>"); - } - - /** - * This method traverses the <i>table:table-row</i> element - * <code>Node</code>. - * - * @param node A <i>table:table-row</i> <code>Node</code>. - * - * @throws IOException If any I/O error occurs. - */ - protected void traverseTableRow(Node node) throws IOException { - - // Get the attributes of the row - NamedNodeMap cellAtt = node.getAttributes(); - - if (cellAtt != null) { - - Node rowStyle = - cellAtt.getNamedItem(ATTRIBUTE_TABLE_STYLE_NAME); - - Node tableNumRowRepeatingNode = cellAtt.getNamedItem(ATTRIBUTE_TABLE_NUM_ROWS_REPEATED); - int repeatedRows = 1; - - if(tableNumRowRepeatingNode!=null) { - String repeatStr = tableNumRowRepeatingNode.getNodeValue(); - Debug.log(Debug.TRACE, "traverseTableRow() repeated-rows : " + repeatStr); - repeatedRows = Integer.parseInt(repeatStr); - } - - String styleName = new String(""); - - if ( rowStyle != null) { - styleName = rowStyle.getNodeValue(); - } - if(styleName.equalsIgnoreCase("Default") || styleName.length()==0) { - - Debug.log(Debug.TRACE, "No defined Row Style Attribute was found"); - - } else { - - RowStyle rStyle = ( RowStyle)styleCat.lookup(styleName, - SxcConstants.ROW_STYLE_FAMILY, null, - RowStyle.class); - - int rowHeight = rStyle.getRowHeight(); - - Debug.log(Debug.TRACE, "traverseTableRow() Row Height : " + rowHeight); - ColumnRowInfo ri = new ColumnRowInfo( rowHeight, - repeatedRows, - ColumnRowInfo.ROW, - rowHeight!=0); - ColumnRowList.add(ri); - } - - // Get the attribute representing the number of rows repeated - Node rowsRepeatedNode = - cellAtt.getNamedItem(ATTRIBUTE_TABLE_NUM_ROWS_REPEATED); - - // There is a number of rows repeated attribute: - if (rowsRepeatedNode != null) { - - // Get the number of times the row is repeated - String rowsRepeatedString = rowsRepeatedNode.getNodeValue(); - - Integer rowsRepeatedInt = new Integer(rowsRepeatedString); - - rowsRepeated = rowsRepeatedInt.intValue(); - - } else { - - // The row is not repeated - rowsRepeated = 1; - } - } - - Debug.log(Debug.TRACE, "<TR>"); - - if (node.hasChildNodes()) { - - NodeList nodeList = node.getChildNodes(); - int len = nodeList.getLength(); - - for (int i = 0; i < len; i++) { - Node child = nodeList.item(i); - - if (child.getNodeType() == Node.ELEMENT_NODE) { - String nodeName = child.getNodeName(); - - if (nodeName.equals(TAG_TABLE_CELL)) { - - traverseCell(child); - - } else { - - Debug.log(Debug.TRACE, "<OTHERS " + XmlUtil.getNodeInfo(child) + " />"); - } - } - } - } - - // Increase the row counter by the number of rows which are repeated - rowID += rowsRepeated; - - // Re-initialize number of rows repeated before processing the next - // row data. - rowsRepeated = 1; - - // When starting a new row, set the column counter back to the - // first column. - colID = 1; - - // Re-initialize number of columns repeated before processing - // the next row data. - colsRepeated = 1; - - Debug.log(Debug.TRACE, "</TR>"); - } - - - /** - * This method traverses the <i>table:table-column</i> - * <code>Node</code>. Not yet implemented. - * - * @param node A <i>table:table-column</i> <code>Node</code>. - * - * @throws IOException If any I/O error occurs. - */ - protected void traverseTableColumn(Node node) throws IOException { - - Debug.log(Debug.TRACE, "traverseColumn() : "); - NamedNodeMap cellAtt = node.getAttributes(); - Node tableStyleNode = cellAtt.getNamedItem(ATTRIBUTE_TABLE_STYLE_NAME); - Node tableNumColRepeatingNode = cellAtt.getNamedItem(ATTRIBUTE_TABLE_NUM_COLUMNS_REPEATED); - Node tableDefaultCellStyle = cellAtt.getNamedItem(ATTRIBUTE_DEFAULT_CELL_STYLE); - - int repeatedColumns = 1; - int columnWidth = 0; - ColumnRowInfo col = new ColumnRowInfo(ColumnRowInfo.COLUMN); - - if(tableNumColRepeatingNode!=null) { - Debug.log(Debug.TRACE, "traverseColumn() repeated-cols : " + tableNumColRepeatingNode.getNodeValue()); - repeatedColumns = Integer.parseInt(tableNumColRepeatingNode.getNodeValue()); - col.setRepeated(repeatedColumns); - } - - String cellStyleName = new String(""); - - if(tableDefaultCellStyle!=null) { - cellStyleName = tableDefaultCellStyle.getNodeValue(); - - Debug.log(Debug.TRACE, "traverseColumn() default-cell-style : " + cellStyleName); - } - - if(cellStyleName.equalsIgnoreCase("Default") || cellStyleName.length()==0) { - - Debug.log(Debug.TRACE, "No default cell Style Attribute was found"); - - } else { - - CellStyle cellStyle = (CellStyle)styleCat.lookup(cellStyleName, - SxcConstants.TABLE_CELL_STYLE_FAMILY, null, - CellStyle.class); - Format defaultFmt = new Format(cellStyle.getFormat()); - col.setFormat(defaultFmt); - } - - String styleName = new String(""); - - if(tableStyleNode!=null) { - styleName = tableStyleNode.getNodeValue(); - } - - if(styleName.equalsIgnoreCase("Default") || styleName.length()==0) { - - Debug.log(Debug.TRACE, "No defined Style Attribute was found"); - - } else { - - ColumnStyle cStyle = (ColumnStyle)styleCat.lookup(styleName, - SxcConstants.COLUMN_STYLE_FAMILY, null, - ColumnStyle.class); - - columnWidth = cStyle.getColWidth(); - col.setSize(columnWidth); - Debug.log(Debug.TRACE, "traverseColumn() Column Width : " + columnWidth); - - } - ColumnRowList.add(col); - } - - /** - * This method traverses a <i>table:table-cell</i> element - * <code>Node</code>. - * - * @param node a <i>table:table-cell</i> <code>Node</code>. - * - * @throws IOException if any I/O error occurs. - */ - protected void traverseCell(Node node) throws IOException { - - NamedNodeMap cellAtt = node.getAttributes(); - - int debug_i=0; - Node debug_attrib = null; - fmt.clearFormatting(); - if (cellAtt == null || cellAtt.item(0) == null) - { - Debug.log(Debug.INFO, "No Cell Attributes\n"); - // return; - } - else - { - while ((debug_attrib = cellAtt.item(debug_i++)) != null) - { - Debug.log(Debug.INFO, "Cell Attribute " + debug_i + - ": " + debug_attrib.getNodeName() + " : " + - debug_attrib.getNodeValue() + "\n"); - } - } - - // Get the type of data in the cell - Node tableValueTypeNode = - cellAtt.getNamedItem(ATTRIBUTE_TABLE_VALUE_TYPE); - - // Get the number of columns this cell is repeated - Node colsRepeatedNode = - cellAtt.getNamedItem(ATTRIBUTE_TABLE_NUM_COLUMNS_REPEATED); - - // Get the style type - Node tableStyleNode = - cellAtt.getNamedItem(ATTRIBUTE_TABLE_STYLE_NAME); - - String styleName = new String(""); - - if(tableStyleNode!=null) { - styleName = tableStyleNode.getNodeValue(); - } - - if(styleName.equalsIgnoreCase("Default")) { - - Debug.log(Debug.TRACE, "No defined Style Attribute was found"); - - } else if(styleName.length()!=0) { - - CellStyle cStyle = (CellStyle)styleCat.lookup(styleName, - SxcConstants.TABLE_CELL_STYLE_FAMILY, null, - CellStyle.class); - - Format definedFormat = cStyle.getFormat(); - fmt = new Format(definedFormat); - } - - // There is a number of cols repeated attribute - if (colsRepeatedNode != null) { - - // Get the number of times the cell is repeated - String colsRepeatedString = colsRepeatedNode.getNodeValue(); - - Integer colsRepeatedInt = new Integer(colsRepeatedString); - colsRepeated = colsRepeatedInt.intValue(); - } else { - - // The cell is not repeated - colsRepeated = 1; - } - - - // if there is no style we need to check to see if there is a default - // cell style defined in the table-column's - - if (fmt.isDefault() && styleName.length()==0) { - int index = 1; - for(Enumeration e = ColumnRowList.elements();e.hasMoreElements();) { - ColumnRowInfo cri = (ColumnRowInfo) e.nextElement(); - if(cri.isColumn()) { - if(colID>=index && colID<(index+cri.getRepeated())) { - fmt = new Format(cri.getFormat()); - } - index += cri.getRepeated(); - } - } - } - - - // for (int j = 0; j < colsRepeated; j++) { - - - if (tableValueTypeNode != null) { - - // Make sure we initialize to 0 the width of the current cell - displayWidth = 0; - - String cellType = - tableValueTypeNode.getNodeValue(); - - if (cellType.equalsIgnoreCase(CELLTYPE_STRING)) { - - // has text:p tag - fmt.setCategory(CELLTYPE_STRING); - Node tableStringValueNode = cellAtt.getNamedItem(ATTRIBUTE_TABLE_STRING_VALUE); - Debug.log(Debug.TRACE,"Cell Type String : " + tableStringValueNode); - if(tableStringValueNode != null) { - fmt.setValue(tableStringValueNode.getNodeValue()); - } - - } else if (cellType.equalsIgnoreCase(CELLTYPE_FLOAT)) { - - // has table:value attribute - // has text:p tag - - // Determine the number of decimal places StarCalc - // is displaying for this floating point output. - fmt.setCategory(CELLTYPE_FLOAT); - fmt.setDecimalPlaces(getDecimalPlaces(node)); - Node tableValueNode = cellAtt.getNamedItem(ATTRIBUTE_TABLE_VALUE); - fmt.setValue(tableValueNode.getNodeValue()); - - - } else if (cellType.equalsIgnoreCase(CELLTYPE_TIME)) { - - // has table:time-value attribute - // has text:p tag - which is the value we convert - - fmt.setCategory(CELLTYPE_TIME); - Node tableTimeNode = cellAtt.getNamedItem(ATTRIBUTE_TABLE_TIME_VALUE); - fmt.setValue(tableTimeNode.getNodeValue()); - - } else if (cellType.equalsIgnoreCase(CELLTYPE_DATE)) { - - // has table:date-value attribute - // has text:p tag - which is the value we convert - - fmt.setCategory(CELLTYPE_DATE); - Node tableDateNode = cellAtt.getNamedItem(ATTRIBUTE_TABLE_DATE_VALUE); - fmt.setValue(tableDateNode.getNodeValue()); - - } else if (cellType.equalsIgnoreCase(CELLTYPE_CURRENCY)) { - - // has table:currency - // has table:value attribute - // has text:p tag - - fmt.setCategory(CELLTYPE_CURRENCY); - fmt.setDecimalPlaces(getDecimalPlaces(node)); - Node tableValueNode = cellAtt.getNamedItem(ATTRIBUTE_TABLE_VALUE); - fmt.setValue(tableValueNode.getNodeValue()); - - } else if (cellType.equalsIgnoreCase(CELLTYPE_BOOLEAN)) { - - // has table:boolean-value attribute - // has text:p tag - which is the value we convert - - fmt.setCategory(CELLTYPE_BOOLEAN); - Node tableBooleanNode = cellAtt.getNamedItem(ATTRIBUTE_TABLE_BOOLEAN_VALUE); - fmt.setValue(tableBooleanNode.getNodeValue()); - - } else if (cellType.equalsIgnoreCase(CELLTYPE_PERCENT)) { - - // has table:value attribute - // has text:p tag - - fmt.setCategory(CELLTYPE_PERCENT); - fmt.setDecimalPlaces(getDecimalPlaces(node)); - Node tableValueNode = cellAtt.getNamedItem(ATTRIBUTE_TABLE_VALUE); - fmt.setValue(tableValueNode.getNodeValue()); - - } else { - - Debug.log(Debug.TRACE,"No defined value type" + cellType); - // Should never get here - - } - } - - Node tableFormulaNode = cellAtt.getNamedItem(ATTRIBUTE_TABLE_FORMULA); - - if(tableFormulaNode != null) - { - if(tableValueTypeNode == null) { // If there is no value-type Node we must assume string-value - fmt.setCategory(CELLTYPE_STRING); - Node tableStringValueNode = cellAtt.getNamedItem(ATTRIBUTE_TABLE_STRING_VALUE); - fmt.setValue(tableStringValueNode.getNodeValue()); - } - String cellFormula = tableFormulaNode.getNodeValue(); - addCell(cellFormula); - } else { - - // Text node, Date node, or Time node - // - Debug.log(Debug.INFO, - "TextNode, DateNode, TimeNode or BooleanNode\n"); - // This handles the case where we have style information but no content - if (node.hasChildNodes()) { - NodeList childList = node.getChildNodes(); - int len = childList.getLength(); - - for (int i = 0; i < len; i++) { - Node child = childList.item(i); - if (child.getNodeType() == Node.ELEMENT_NODE) { - String childName = child.getNodeName(); - if (childName.equals(TAG_PARAGRAPH)) { - traverseParagraph(child); - } - } - } - } else if(!fmt.isDefault()) { - addCell(""); - } - } - - // Clear out format for current cell after it is written - format = 0; - - // Increase the column counter by the number of times the - // last cell was repeated. - colID += colsRepeated; - - // Re-initialize the number of columns repeated before processing - // the next cell data. - colsRepeated = 1; - - } - - - /** - * This method traverses the <i>text:p</i> element <code>Node</code>. - * - * @param node A <i>text:p</i> <code>Node</code>. - * - * @throws IOException If any I/O error occurs. - */ - protected void traverseParagraph(Node node) throws IOException { - - NamedNodeMap cellAtt = node.getAttributes(); - - int debug_i=0; - Node debug_attrib = null; - if (cellAtt == null || cellAtt.item(0) == null) - { - Debug.log(Debug.INFO, "No Paragraph Attributes\n"); - } - else - { - while ((debug_attrib = cellAtt.item(debug_i++)) != null) - { - Debug.log(Debug.INFO, "Paragraph Attribute " + debug_i + - ": " + debug_attrib.getNodeName() + " : " + - debug_attrib.getNodeValue() + "\n"); - } - } - - if (node.hasChildNodes()) { - - NodeList nodeList = node.getChildNodes(); - - int len = nodeList.getLength(); - - StringBuffer buffer = new StringBuffer(); - - for (int i = 0; i < len; i++) { - - Node child = nodeList.item(i); - - // TODO: need to handle space/tabs/newline nodes later - short nodeType = child.getNodeType(); - - switch (nodeType) { - - case Node.TEXT_NODE: - buffer.append(child.getNodeValue()); - break; - - case Node.ENTITY_REFERENCE_NODE: - - NodeList nodeList2 = child.getChildNodes(); - int len2 = nodeList2.getLength(); - - for (int j = 0; j < len2; j++) { - Node child2 = nodeList2.item(j); - - if (child2.getNodeType() == Node.TEXT_NODE) { - buffer.append(child2.getNodeValue()); - } - } - - break; - } - } - - String s = buffer.toString(); - // displayWidth = calculateContentWidth(s); - addCell(s); - - } - } - - - /** - * This method will take the input cell value and add - * it to the spreadsheet <code>Document</code> we are currently - * encoding. This method correctly handles cells that are - * repeated in either the row, cell, or both directions. - * - * @param cellValue The contents of the cell we want to add - * to the spreadsheet <code>Document</code>. - * - * @throws IOException If any I/O error occurs. - */ - protected void addCell(String cellValue) throws IOException { - - int col = colID; - int row = rowID; - - for (int i = 0; i < rowsRepeated; i++) { - - // Log the columns when there are rowsRepeated. - if (i > 0) { - Debug.log(Debug.TRACE, "</TR>"); - Debug.log(Debug.TRACE, "<TR>"); - } - - col = colID; - - for (int j = 0; j < colsRepeated; j++) { - - Debug.log(Debug.TRACE, "<TD>"); - - - // Add the cell data to the encoded spreadsheet document - encoder.addCell(row, col, fmt, cellValue); - - Debug.log(Debug.TRACE, cellValue); - Debug.log(Debug.TRACE, "</TD>"); - - col++; - } - - row++; - - } - - } - - - - /** - * This method takes a <i>table:table-cell</i> <code>Node</code> - * and traverses down to the <i>text:p</i> tag. The value is - * extracted from the <i>text:p</i> tag and the number of decimal - * places is calculated. - * - * @param node A <i>table:table-cell</i> <code>Node</code>. - * - * @return The number of decimal places in the display - * string of the data in the input <code>Node</code>. - */ - protected int getDecimalPlaces(Node node) { - - int decimals = 0; - - Element element = null; - - // cast org.w3c.dom.Node to org.w3c.dom.Element - if (node instanceof Element) { - element = (Element) node; - } else { - return decimals; - } - - // Traverse to the text:p element, there should only be one. - NodeList list = element.getElementsByTagName(TAG_PARAGRAPH); - - if (list.getLength() != 1) { - return decimals; - } - - Node paragraph = list.item(0); - - if (paragraph.hasChildNodes()) { - - NodeList nodeList = paragraph.getChildNodes(); - - int len = nodeList.getLength(); - - for (int j = 0; j < len; j++) { - - Node child = nodeList.item(j); - - if (child.getNodeType() == Node.TEXT_NODE) { - - String s = child.getNodeValue(); - - // displayWidth = calculateContentWidth(s); - - int k = s.lastIndexOf("."); - if (k > 0) { - s = s.substring(k+1); - decimals = s.length(); - } - } - } - } - - return decimals; - } - - /* - * Utility method to retrieve a Node attribute. - */ - private String getAttribute (Node node, String attribute) { - NamedNodeMap attrNodes = node.getAttributes(); - - if (attrNodes != null) { - Node attr = attrNodes.getNamedItem(attribute); - if (attr != null) { - return attr.getNodeValue(); - } - } - return null; - } - -} - |