📄 reportengine.java
字号:
/******************************************************************************
* The contents of this file are subject to the Compiere License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.compiere.org/license.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Original Code is Compiere ERP & CRM Business Solution
* The Initial Developer of the Original Code is Jorg Janke and ComPiere, Inc.
* Portions created by Jorg Janke are Copyright (C) 1999-2002 Jorg Janke, parts
* created by ComPiere are Copyright (C) ComPiere, Inc.; All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.print;
import java.io.*;
import java.util.*;
import java.sql.*;
import javax.xml.transform.stream.*;
import java.awt.print.*;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import javax.print.event.*;
import org.apache.ecs.*;
import org.apache.ecs.xhtml.*;
import org.apache.log4j.Logger;
import org.compiere.util.*;
import org.compiere.model.*;
import org.compiere.print.layout.*;
// You can get a demo version via http://www.qoppa.com/demo/jPDFPrinter.jar
// The full version is included in the ComPiere Support, and you can get it also from http://www.qoppa.com
import com.qoppa.pdfPrinter.PDFPrinterJob;
/**
* Report Engine.
* For a given PrintFormat,
* create a Report
*
* @author Jorg Janke
* @version $Id: ReportEngine.java,v 1.35 2003/04/24 06:15:06 jjanke Exp $
*/
public class ReportEngine implements PrintServiceAttributeListener
{
/**
* Constructor
* @param ctx context
* @param pf Print Format
* @param query Optional Query
*/
public ReportEngine (Properties ctx, MPrintFormat pf, MQuery query)
{
if (pf == null)
throw new IllegalArgumentException("ReportEngine - no PrintFormat");
log.debug(pf + " - " + query);
m_ctx = ctx;
m_printFormat = pf;
setQuery(query); // loads Data
} // ReportEngine
/** Logger */
private Logger log = Logger.getLogger (getClass());
/** Context */
private Properties m_ctx;
/** Print Format */
private MPrintFormat m_printFormat;
/** Query */
private MQuery m_query;
/** Query Data */
private PrintData m_printData;
/** Layout */
private LayoutEngine m_layout = null;
/** Printer */
private String m_printerName = Ini.getProperty(Ini.P_PRINTER);
/** View */
private View m_view = null;
/**
* Set PrintFormat.
* If Layout was created, re-create layout
* @param pf print format
*/
protected void setPrintFormat (MPrintFormat pf)
{
m_printFormat = pf;
if (m_layout != null)
{
setPrintData();
m_layout.setPrintFormat(pf, false);
m_layout.setPrintData(m_printData, m_query, true); // format changes data
}
if (m_view != null)
m_view.revalidate();
} // setPrintFormat
/**
* Set Query and generate PrintData.
* If Layout was created, re-create layout
* @param query query
*/
protected void setQuery (MQuery query)
{
m_query = query;
if (query == null)
return;
//
setPrintData();
if (m_layout != null)
m_layout.setPrintData(m_printData, m_query, true);
if (m_view != null)
m_view.revalidate();
} // setQuery
/**
* Get Query
* @return query
*/
public MQuery getQuery()
{
return m_query;
} // getQuery
/**
* Set PrintData for Format restricted by Query.
* Nothing set if there is no query
* Sets m_printData
*/
private void setPrintData()
{
if (m_query == null)
return;
DataEngine de = new DataEngine(m_printFormat.getLanguage());
setPrintData(de.getPrintData (m_ctx, m_printFormat, m_query));
// m_printData.dump();
} // setPrintData
/**
* Set PrintData
* @param printData printData
*/
public void setPrintData (PrintData printData)
{
if (printData == null)
return;
m_printData = printData;
} // setPrintData
/*************************************************************************/
/**
* Layout
*/
private void layout()
{
if (m_printFormat == null)
throw new IllegalStateException ("ReportEngine.layout - no print format");
if (m_printData == null)
throw new IllegalStateException ("ReportEngine.layout - no print data");
m_layout = new LayoutEngine (m_printFormat, m_printData, m_query);
} // layout
/**
* Get Layout
* @return Layout
*/
protected LayoutEngine getLayout()
{
if (m_layout == null)
layout();
return m_layout;
} // getLayout
/**
* Get PrintFormat (Report) Name
* @return name
*/
public String getName()
{
return m_printFormat.getName();
} // getName
/**
* Get PrintFormat
* @return print format
*/
public MPrintFormat getPrintFormat()
{
return m_printFormat;
} // getPrintFormat
/**
* Get PrintLayout (Report) Context
* @return context
*/
public Properties getCtx()
{
return m_layout.getCtx();
} // getCtx
/**
* Get Row Count
* @return row count
*/
public int getRowCount()
{
return m_printData.getRowCount();
} // getRowCount
/**
* Get Column Count
* @return column count
*/
public int getColumnCount()
{
if (m_layout != null)
return m_layout.getColumnCount();
return 0;
} // getColumnCount
/*************************************************************************/
/**
* Get View Panel
* @return view panel
*/
public View getView()
{
if (m_layout == null)
layout();
if (m_view == null)
m_view = new View (m_layout);
return m_view;
} // getView
/*************************************************************************/
/**
* Print Report
* @param withDialog show PrintDialog
* @param isDocument if true enables copy indicator
* @param copies copies
*/
public void print (boolean withDialog, int copies, boolean isDocument)
{
log.info("print - Copies=" + copies + ", Document=" + isDocument);
if (m_layout == null)
layout();
Print print = new Print (m_layout, false);
// Paper Attributes: media-printable-area, orientation-requested, media
PrintRequestAttributeSet prats = m_layout.getPaper().getPrintRequestAttributeSet();
// add: copies, job-name, priority
if (isDocument || copies < 1)
prats.add(new Copies(1));
else
prats.add(new Copies(copies));
prats.add(new JobName(m_printFormat.getName(), Language.getLanguage().getLocale()));
prats.add(PrintUtil.getJobPriority(m_layout.getPageCount(), 1, true));
// PrinterJob
PrinterJob job = getPrinterJob();
// job.getPrintService().addPrintServiceAttributeListener(this);
job.setPageable(print);
// Dialog
if (withDialog && !job.printDialog(prats))
return;
// submit
boolean printCopy = isDocument && copies > 1;
PrintUtil.print(job, prats, false, printCopy);
// Document: Print Copies
if (printCopy)
{
log.info("print - Copy " + (copies-1));
print = new Print (m_layout, true); // isCopy
prats.add(new Copies(copies-1));
job = getPrinterJob();
// job.getPrintService().addPrintServiceAttributeListener(this);
job.setPageable (print);
PrintUtil.print(job, prats, false, false);
}
} // print
/**
* Print Service Attribute Listener.
* @param psae event
*/
public void attributeUpdate(PrintServiceAttributeEvent psae)
{
/**
PrintEvent on Win32 Printer : \\MAIN\HP LaserJet 5L
PrintServiceAttributeSet - length=2
queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
printer-is-accepting-jobs = accepting-jobs (class javax.print.attribute.standard.PrinterIsAcceptingJobs)
PrintEvent on Win32 Printer : \\MAIN\HP LaserJet 5L
PrintServiceAttributeSet - length=1
queued-job-count = 1 (class javax.print.attribute.standard.QueuedJobCount)
PrintEvent on Win32 Printer : \\MAIN\HP LaserJet 5L
PrintServiceAttributeSet - length=1
queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
**/
System.out.println(psae);
PrintUtil.dump (psae.getAttributes());
} // attributeUpdate
/**
* Get PrinterJob based on PrinterName
* @return PrinterJob
*/
private PrinterJob getPrinterJob()
{
return CPrinter.getPrinterJob(m_printerName);
} // getPrinterJob
/**
* Show Dialog and Set Paper
* Optionally re-calculate layout
*/
public void pageSetupDialog ()
{
if (m_layout == null)
layout();
m_layout.pageSetupDialog(getPrinterJob());
if (m_view != null)
m_view.revalidate();
} // pageSetupDialog
/**
* Set Printer (name)
* @param printerName valid printer name
*/
public void setPrinterName(String printerName)
{
if (printerName == null)
m_printerName = Ini.getProperty(Ini.P_PRINTER);
else
m_printerName = printerName;
} // setPrinterName
/**
* Get Printer (name)
* @return printer name
*/
public String getPrinterName()
{
return m_printerName;
} // getPrinterName
/*************************************************************************/
/**
* Create HTML File
* @param file file
* @param onlyTable if false create complete HTML document
* @param language optional language - if null teh default language is used to format nubers/dates
* @return true if success
*/
public boolean createHTML (File file, boolean onlyTable, Language language)
{
try
{
Language lang = language;
if (lang == null)
lang = Language.getLanguage();
FileWriter fw = new FileWriter (file, false);
return createHTML (new BufferedWriter(fw), onlyTable, lang);
}
catch (FileNotFoundException fnfe)
{
log.error("createHTML(f) - " + fnfe.toString());
}
catch (Exception e)
{
log.error("createHTML(f)", e);
}
return false;
} // createHTML
/**
* Write HTML to writer
* @param writer writer
* @param onlyTable if false create complete HTML document
* @param language optional language - if null nubers/dates are not formatted
* @return true if success
*/
public boolean createHTML (Writer writer, boolean onlyTable, Language language)
{
try
{
table table = new table();
//
// for all rows (-1 = header row)
for (int row = -1; row < m_printData.getRowCount(); row++)
{
tr tr = new tr();
table.addElement(tr);
if (row != -1)
m_printData.setRowIndex(row);
// for all columns
for (int col = 0; col < m_printFormat.getItemCount(); col++)
{
MPrintFormatItem item = m_printFormat.getItem(col);
if (item.isPrinted())
{
// header row
if (row == -1)
{
th th = new th();
tr.addElement(th);
th.addElement(Util.maskHTML(item.getPrintName(language)));
}
else
{
td td = new td();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -