/*******************************************************************************
* Copyright (c) 2014 Mirko Paturzo (Exeura srl).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Mirko Paturzo - initial API and implementation
*******************************************************************************/
package org.eclipse.nebula.widgets.grid;
import java.io.OutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* Some tools for Grid.
*
* @author Mirko Paturzo <mirko.paturzo@exeura.eu>
*/
public class GridUtils
{
private static final String INDET_PROPERTY = "{http://xml.apache.org/xslt}indent-amount";
private static final String INDENT_VALUE = "2";
private static final String INDENT_ACCEPTED_VALUE = "yes";
/**
* Tags in xml
*/
private static final String GRID_TAG = "grid";
private static final String HEADER_TAG = "header";
private static final String COLUMN_TAG = "column";
private static final String CHILDREN_TAG = "children";
private static final String ROWS_TAG = "rows";
private static final String ROW_TAG = "row";
private static final String ID_TAG = "id";
/**
* This method export a grid into a outputstream using xml.
* SWT Main thread is required for the export.
* Full supports for Grid Table.
* Grid Tree only visible items was exported.
*
* @param grid the grid who will be export to xml.
* @param outputStream used for the export.
* @throws ParserConfigurationException
* @throws TransformerException
*/
public static void gridToXml(Grid grid, OutputStream outputStream) throws ParserConfigurationException,
TransformerException
{
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
final Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement(GRID_TAG);
doc.appendChild(rootElement);
GridColumn[] columnsArray = grid.getColumns();
Element header = doc.createElement(HEADER_TAG);
rootElement.appendChild(header);
for (int column = 0; column < columnsArray.length; column++)
{
Element columnElement = doc.createElement(COLUMN_TAG);
columnElement.appendChild(doc.createTextNode(columnsArray[column].getText()));
header.appendChild(columnElement);
Attr columnNumber = doc.createAttribute(ID_TAG);
columnNumber.setValue(Integer.toString(column));
columnElement.setAttributeNode(columnNumber);
}
GridItem[] itemsList = grid.getItems();
DataVisualizer dataVisualizer = grid.getDataVisualizer();
Element rowsElement = doc.createElement(ROWS_TAG);
rootElement.appendChild(rowsElement);
writeChildren(doc, rowsElement, columnsArray, itemsList, dataVisualizer, 0);
// write the content into xml file
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, INDENT_ACCEPTED_VALUE);
transformer.setOutputProperty(INDET_PROPERTY, INDENT_VALUE);
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(outputStream);
// Output to console for testing
// StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
}
private static void writeChildren(Document doc, Element rootElement, GridColumn[] columnsList,
GridItem[] itemsArray, DataVisualizer dataVisualizer, int level)
{
for (int row = 0; row < itemsArray.length; row++)
{
GridItem gridItem = itemsArray[row];
if (gridItem.isVisible() && gridItem.getLevel() == level)
{
Element rowElement = writeGridItemInformation(doc, rootElement, columnsList, dataVisualizer, gridItem);
GridItem[] items = gridItem.getItems();
if (items.length > 0)
{
Element childrenElement = doc.createElement(CHILDREN_TAG);
rowElement.appendChild(childrenElement);
writeChildren(doc, childrenElement, columnsList, items,
gridItem.getParent().getDataVisualizer(), level + 1);
}
}
}
}
private static Element writeGridItemInformation(Document doc, Element rootElement, GridColumn[] columnsList,
DataVisualizer dataVisualizer, GridItem item)
{
Element rowElement = doc.createElement(ROW_TAG);
rootElement.appendChild(rowElement);
// Attr rowNumber = doc.createAttribute("id");
// rowNumber.setValue(Integer.toString(item.getRowIndex()));
// rowElement.setAttributeNode(rowNumber);
for (int column = 0; column < columnsList.length; column++)
{
String text = dataVisualizer.getText(item, column);
if (text != null)
{
Element columnElement = doc.createElement(COLUMN_TAG);
columnElement.appendChild(doc.createTextNode(text));
rowElement.appendChild(columnElement);
Attr columnNumber = doc.createAttribute(ID_TAG);
columnNumber.setValue(Integer.toString(column));
columnElement.setAttributeNode(columnNumber);
}
}
return rowElement;
}
}