package org.openswing.swing.export.java; import java.io.*; import java.lang.reflect.*; import java.sql.Date; import java.text.*; import java.util.*; import java.awt.*; import org.openswing.swing.message.receive.java.*; import org.openswing.swing.message.send.java.*; import com.lowagie.text.*; import com.lowagie.text.Font; import com.lowagie.text.Rectangle; import com.lowagie.text.rtf.*; /** * <p>Title: OpenSwing Framework</p> * <p>Description: This class is used to export grid data in RTF format.</p> * <p>Copyright: Copyright (C) 2006 Mauro Carniel</p> * * <p> This file is part of OpenSwing Framework. * This library is free software; you can redistribute it and/or * modify it under the terms of the (LGPL) Lesser General Public * License as published by the Free Software Foundation; * * GNU LESSER GENERAL PUBLIC LICENSE * Version 2.1, February 1999 * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * The author may be contacted at: * maurocarniel@tin.it</p> * * @author Mauro Carniel * @version 1.0 */ public class ExportToRTF14 { public ExportToRTF14() { } /** * @param opt export options * @return Excel document, as byte array */ public byte[] getDocument(ExportOptions opt) throws Throwable { // Document document = new Document(new Rectangle(total+30,PageSize.A4.height())); // Document document = new Document(new Rectangle(PageSize.A4.width(),PageSize.A4.height())); Document document = new Document(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); RtfWriter2 w = RtfWriter2.getInstance(document,baos); document.open(); Object obj = null; for(int i=0;i<opt.getComponentsExportOptions().size();i++) { obj = opt.getComponentsExportOptions().get(i); processComponent(null,0,document,opt,obj); } document.close(); return baos.toByteArray(); } private void processComponent(Table table,int parentTableCols,Document document,ExportOptions opt,Object obj) throws Throwable { if (obj!=null) { GridExportCallbacks callbacks = null; if (obj instanceof GridExportOptions) { callbacks = (GridExportCallbacks)((GridExportOptions)obj).getCallbacks(); if (callbacks!=null) processComponent(table,parentTableCols,document,opt,callbacks.getHeaderComponent()); prepareGrid(table,parentTableCols,document,opt,(GridExportOptions)obj); if (callbacks!=null) processComponent(table,parentTableCols,document,opt,callbacks.getFooterComponent()); } else if (obj instanceof ComponentExportOptions) prepareGenericComponent(table,parentTableCols,document,opt,(ComponentExportOptions)obj); else return; if (table!=null) { Cell cell = new Cell(new Paragraph("\n")); // cell.setColspan(parentTableCols); table.addCell(cell); } else document.add(new Paragraph("\n")); } } private void prepareGenericComponent(Table parentTable,int parentTableCols,Document document,ExportOptions exportOptions,ComponentExportOptions opt) throws Throwable { if (opt.getCellsContent()==null || opt.getCellsContent().length==0) return; int cols = opt.getCellsContent()[0].length; Object[] row = null; Object obj = null; SimpleDateFormat sdatf = new SimpleDateFormat(exportOptions.getDateTimeFormat()); int[] headerwidths = new int[cols]; for(int i=0;i<headerwidths.length;i++) headerwidths[i] = (int)PageSize.A4.width()/cols; Table table = new Table(cols); table.setWidths(headerwidths); table.setBorderWidth(2); table.setBorderColor(Color.black); table.setGrayFill(exportOptions.getExportToRTFAdapter().getHeaderGrayFill()); table.setPadding(3); for(int i=0;i<opt.getCellsContent().length;i++) { row = opt.getCellsContent()[i]; for(int j=0;j<row.length;j++) { obj = row[j]; if (obj!=null) { if (obj instanceof Date || obj instanceof java.util.Date || obj instanceof java.sql.Timestamp) { table.addCell(new Phrase(sdatf.format((java.util.Date)obj),(Font)exportOptions.getExportToRTFAdapter().getGenericComponentFont(i,j,obj))); } else { table.addCell(new Phrase(obj.toString(),(Font)exportOptions.getExportToRTFAdapter().getGenericComponentFont(i,j,obj))); } } else { table.addCell(new Phrase("",(Font)exportOptions.getExportToRTFAdapter().getGenericComponentFont(i,j,null))); } } } if (parentTable!=null) { Cell c = new Cell(table); // c.setColspan(parentTableCols); parentTable.addCell(c); } else document.add(table); } private void prepareGrid(Table parentTable,int parentTableCols,Document document,ExportOptions exportOptions,GridExportOptions opt) throws Throwable { // prepare vo getters methods... String methodName = null; String attributeName = null; Hashtable gettersMethods = new Hashtable(); Method[] voMethods = opt.getValueObjectType().getMethods(); for(int i=0;i<voMethods.length;i++) { methodName = voMethods[i].getName(); if (methodName.startsWith("get")) { attributeName = methodName.substring(3,4).toLowerCase()+methodName.substring(4); if (opt.getExportAttrColumns().contains(attributeName)) gettersMethods.put(attributeName,voMethods[i]); } } Response response = null; int start = 0; int rownum = 0; Object value = null; Object vo = null; int type; SimpleDateFormat sdf = new SimpleDateFormat(exportOptions.getDateFormat()); SimpleDateFormat sdatf = new SimpleDateFormat(exportOptions.getDateTimeFormat()); SimpleDateFormat stf = new SimpleDateFormat(exportOptions.getTimeFormat()); int headerwidths[] = new int[opt.getExportColumns().size()]; int total = 0; for(int i=0;i<opt.getExportColumns().size();i++) { headerwidths[i] = Math.max( opt.getExportColumns().get(i).toString().length()*10, ((Integer)opt.getColumnsWidth().get(opt.getExportAttrColumns().get(i))).intValue() ); total += headerwidths[i]; } // Document document = new Document(); // ByteArrayOutputStream baos = new ByteArrayOutputStream(); // RtfWriter2 w = RtfWriter2.getInstance(document,baos); // document.open(); Paragraph line = null; if (opt.getTitle()!=null && !opt.getTitle().equals("")) { line = new Paragraph(opt.getTitle(),(Font)exportOptions.getExportToRTFAdapter().getFontTitle()); line.setAlignment(Element.ALIGN_CENTER); document.add(line); document.add(new Paragraph("")); } String[] filters = opt.getFilteringConditions(); if (filters!=null) { for(int i=0;i<filters.length;i++) { line = new Paragraph(filters[i]); document.add(line); } document.add(new Paragraph("")); } Table table = new Table(opt.getExportColumns().size()); table.setWidths(headerwidths); table.setBorderWidth(2); table.setBorderColor(Color.black); table.setGrayFill(exportOptions.getExportToRTFAdapter().getHeaderGrayFill()); table.setPadding(3); Phrase cell = null; for(int i=0;i<opt.getExportColumns().size();i++) { cell = new Phrase( opt.getExportColumns().get(i).toString(), (Font)exportOptions.getExportToRTFAdapter().getHeaderFont(opt.getExportAttrColumns().get(i).toString()) ); table.addCell(cell); } // table.setHeaderRows(1); // table.getDefaultCell().setBorderWidth(1); // table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); // table.getDefaultCell().setVerticalAlignment(Element.ALIGN_TOP); for(int j=0;j<opt.getTopRows().size();j++) { // create a row for each top rows... vo = opt.getTopRows().get(j); appendRow( document, exportOptions, table, vo, opt, gettersMethods, sdf, sdatf, stf, j, 0 ); } do { response=opt.getGridDataLocator().loadData( GridParams.NEXT_BLOCK_ACTION, start, opt.getFilteredColumns(), opt.getCurrentSortedColumns(), opt.getCurrentSortedVersusColumns(), opt.getValueObjectType(), opt.getOtherGridParams() ); if (response.isError()) throw new Exception(response.getErrorMessage()); boolean even = false; for(int j=0;j<((VOListResponse)response).getRows().size();j++) { if (even) { even = false; } else { even = true; } vo = ((VOListResponse)response).getRows().get(j); appendRow( document, exportOptions, table, vo, opt, gettersMethods, sdf, sdatf, stf, rownum, 1 ); rownum++; } start = start+((VOListResponse)response).getRows().size(); if ( !((VOListResponse)response).isMoreRows() ) break; } while (rownum<opt.getMaxRows()); for(int j=0;j<opt.getBottomRows().size();j++) { // create a row for each bottom rows... table.setGrayFill(exportOptions.getExportToRTFAdapter().getBottomRowsGrayFill(j)); vo = opt.getBottomRows().get(j); appendRow( document, exportOptions, table, vo, opt, gettersMethods, sdf, sdatf, stf, j, 2 ); } // rtfTable.importTable(table,total); if (parentTable!=null) { Cell c = new Cell(table); // c.setColspan(parentTableCols); parentTable.addCell(c); // table.setCellsFitPage(true); // parentTable.insertTable(table,new Point(parentTable.getNextRow()+1,0)); } else document.add(table); // document.add(table); } /** * Append current row to result. * @return current row to append */ private void appendRow( Document document, ExportOptions exportOptions, Table table, Object vo, GridExportOptions opt, Hashtable gettersMethods, SimpleDateFormat sdf, SimpleDateFormat sdatf, SimpleDateFormat stf, int row, int tableType // 0 = header, 1 = body, 2 = footer ) throws Throwable { int type; String aName = null; Method getter = null; Class clazz = null; Object obj = null; for(int i=0;i<opt.getExportColumns().size();i++) { // value = ((Method)gettersMethods.get(opt.getExportAttrColumns().get(i))).invoke(vo,new Object[0]); clazz = vo.getClass(); obj = vo; aName = opt.getExportAttrColumns().get(i).toString(); // check if the specified attribute is a composed attribute and there exist inner v.o. to instantiate... while(aName.indexOf(".")!=-1) { try { getter = clazz.getMethod( "get" + aName.substring(0, 1). toUpperCase() + aName.substring(1,aName.indexOf(".")), new Class[0] ); } catch (NoSuchMethodException ex2) { getter = clazz.getMethod("is"+aName.substring(0,1).toUpperCase()+aName.substring(1,aName.indexOf(".")),new Class[0]); } aName = aName.substring(aName.indexOf(".")+1); clazz = getter.getReturnType(); obj = getter.invoke(obj,new Object[0]); if (obj==null) break; } try { getter = clazz.getMethod( "get" + aName.substring(0, 1). toUpperCase() + aName.substring(1), new Class[0] ); } catch (NoSuchMethodException ex2) { getter = clazz.getMethod("is"+aName.substring(0,1).toUpperCase()+aName.substring(1),new Class[0]); } if (obj!=null) obj = getter.invoke(obj,new Object[0]); if (obj!=null) { if (obj instanceof Date || obj instanceof java.util.Date || obj instanceof java.sql.Timestamp) { type = ((Integer)opt.getColumnsType().get(opt.getExportAttrColumns().get(i))).intValue(); if (type==opt.TYPE_DATE) { // table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(new Phrase(sdf.format((java.util.Date)obj),(Font)exportOptions.getExportToRTFAdapter().getRowFont(aName))); } else if (type==opt.TYPE_DATE_TIME) { // table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(new Phrase(sdatf.format((java.util.Date)obj),(Font)exportOptions.getExportToRTFAdapter().getRowFont(aName))); } else if (type==opt.TYPE_TIME) { // table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(new Phrase(stf.format((java.util.Date)obj),(Font)exportOptions.getExportToRTFAdapter().getRowFont(aName))); } } else { // table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT); table.addCell(new Phrase(obj.toString(),(Font)exportOptions.getExportToRTFAdapter().getRowFont(aName))); } } else { table.addCell(new Phrase("",(Font)exportOptions.getExportToRTFAdapter().getRowFont(aName))); } } if (opt.getCallbacks()!=null) { if (tableType==0) processComponent( table, opt.getExportColumns().size(), document, exportOptions, opt.getCallbacks().getComponentPerRowInHeader( (ValueObject)vo, row ) ); else if (tableType==1) processComponent( table, opt.getExportColumns().size(), document, exportOptions, opt.getCallbacks().getComponentPerRow( (ValueObject)vo, row ) ); else if (tableType==2) processComponent( table, opt.getExportColumns().size(), document, exportOptions, opt.getCallbacks().getComponentPerRowInFooter( (ValueObject)vo, row ) ); } } }