/* * codjo.net * * Common Apache License 2.0 */ package net.codjo.utils.sql; //Lib import net.codjo.gui.renderer.NumberFormatRenderer; import net.codjo.operation.OperationInterruptedException; import java.awt.Component; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumnModel; /** * Permet de formater les donn�es de la GenericTable pour l'export et l'impression. * * @author $Author: blazart $ * @version $Revision: 1.3 $ */ public class DataFormater { private int colsNumber; private int currentLine = 0; private GenericTable genericTable; /** * Constructeur. * * @param gt La GenericTable. */ public DataFormater(GenericTable gt) { genericTable = gt; colsNumber = genericTable.getColumnCount(); } /** * Rempli un FileWriter avec toutes les donn�es de la GenericTable pour l'export. * * @param out Le FileWriter. * * @throws IOException Pb d'IO ? * @throws OperationInterruptedException Interruption utilisateur. */ public void buildDataForExport(FileWriter out) throws IOException, OperationInterruptedException { out.write(buildHeaderLine("\t")); if (!genericTable.hasMoreData()) { buildAPageOfDataForExport(1, genericTable.getRowCount(), out); } else { buildAPageOfDataForExport(1, genericTable.getRowCount(), out); while (genericTable.hasMoreData()) { genericTable.nextPage(); buildAPageOfDataForExport(1, genericTable.getRowCount(), out); } } } /** * Construit une String contenant toutes les donn�es de la GenericTable pour l'impression. * * @return La String. */ public String buildDataForPrint() { StringBuffer data = new StringBuffer(buildHeaderLine(" ")); if (!genericTable.hasMoreData()) { data.append(buildAPageOfDataForPrint(1, genericTable.getRowCount())); } else { data.append(buildAPageOfDataForPrint(1, genericTable.getRowCount())); while (genericTable.hasMoreData()) { genericTable.nextPage(); data.append(buildAPageOfDataForPrint(1, genericTable.getRowCount())); } } return data.toString(); } /** * Retourne le num�ro de la ligne export�e. * * @return Le num�ro de la ligne export�e. */ public int getCurrentLine() { return currentLine; } protected Object getRenderedValue(JTable table, int row, int col) { TableCellRenderer renderer = table.getCellRenderer(row, table.convertColumnIndexToView(col)); Object value = table.getValueAt(row, col); if (renderer != null && renderer instanceof NumberFormatRenderer) { Component component = renderer .getTableCellRendererComponent(table, value, false, false, row, col); if (component instanceof JLabel) { return ((JLabel)component).getText(); } } return value; } /** * Construit une String contenant les donn�es d'une ligne de la GenericTable. * * @param row Num�ro de la ligne. * @param delimiter Le d�limiteur de colonnes. * @param newLine Le caract�re "Nouvelle ligne" (String). * @param returnChar Le caract�re "Retour chariot" (String). * @param isAnExport TODO * * @return La String. */ private String buildALineOfData(int row, String delimiter, String newLine, String returnChar, boolean isAnExport) { StringBuffer dataRow = new StringBuffer(); StringBuffer field; int position; for (int i = 0; i < colsNumber; i++) { Object value = getRenderedValue(genericTable, row, i); if (value == null) { dataRow.append(""); } else { if (isAnExport) { field = new StringBuffer(value.toString()); //On vire les caract�res importuns while ((position = field.toString().indexOf("\n")) != -1) { field.delete(position, position + 1); } while ((position = field.toString().indexOf(delimiter)) != -1) { field.delete(position, position + 1); } dataRow.append(field.toString()); } else { dataRow.append(value.toString()); } } if (i < colsNumber) { dataRow.append(delimiter); } } dataRow.append(returnChar).append(newLine); return dataRow.toString(); } /** * Rempli un FileWriter avec les donn�es du Buffer de la GenericTable pour l'export. * * @param firstRow La premi�re ligne du Buffer. * @param lastRow La derni�re ligne du Buffer. * @param out Le FileWriter. * * @throws IOException Pb d'IO ? * @throws OperationInterruptedException Interruption utilisateur. */ private void buildAPageOfDataForExport(int firstRow, int lastRow, FileWriter out) throws IOException, OperationInterruptedException { for (int i = firstRow - 1; i < lastRow; i++) { if (Thread.interrupted()) { throw new OperationInterruptedException( "Export interrompu par l'utilisateur"); } currentLine++; out.write(buildALineOfData(i, "\t", "\n", "\r", true)); } } /** * Construit une String contenant les donn�es du Buffer de la GenericTable pour l'impression. * * @param firstRow La premi�re ligne du Buffer. * @param lastRow La derni�re ligne du Buffer. * * @return La String. */ private String buildAPageOfDataForPrint(int firstRow, int lastRow) { StringBuffer data = new StringBuffer(); for (int i = firstRow - 1; i < lastRow; i++) { data.append(buildALineOfData(i, " ", "\n", "", false)); } return data.toString(); } private String buildHeaderLine(String columnSeparator) { TableColumnModel colModel = genericTable.getColumnModel(); StringWriter header = new StringWriter(); PrintWriter writer = new PrintWriter(header); for (int i = 0; i < colModel.getColumnCount(); i++) { writer.print(colModel.getColumn(i).getHeaderValue()); if (i + 1 < colModel.getColumnCount()) { writer.print(columnSeparator); } } writer.println(); return header.toString(); } }