📄 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 Smart Business Solution. The Initial
* Developer of the Original Code is Jorg Janke. Portions created by Jorg Janke
* are Copyright (C) 1999-2005 Jorg Janke.
* All parts are Copyright (C) 1999-2005 ComPiere, Inc. All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.print;
import java.awt.print.*;
import java.io.*;
import java.net.*;
import java.sql.*;
import java.util.*;
import java.util.logging.*;
import javax.print.*;
import javax.print.attribute.*;
import javax.print.attribute.standard.*;
import javax.print.event.*;
import javax.xml.transform.stream.*;
import org.apache.ecs.*;
import org.apache.ecs.xhtml.*;
import org.compiere.model.*;
import org.compiere.print.layout.*;
import org.compiere.process.*;
import org.compiere.util.*;
import com.qoppa.pdf.*;
/**
* Report Engine.
* For a given PrintFormat,
* create a Report
*
* @author Jorg Janke
* @version $Id: ReportEngine.java,v 1.65 2006/01/09 19:44:27 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, PrintInfo info)
{
if (pf == null)
throw new IllegalArgumentException("ReportEngine - no PrintFormat");
log.info(pf + " -- " + query);
m_ctx = ctx;
//
m_printFormat = pf;
m_info = info;
setQuery(query); // loads Data
} // ReportEngine
/** Static Logger */
private static CLogger log = CLogger.getCLogger (ReportEngine.class);
/** Context */
private Properties m_ctx;
/** Print Format */
private MPrintFormat m_printFormat;
/** Print Info */
private PrintInfo m_info;
/** 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
/**
* Get PrintData
* @return print data
*/
public PrintData getPrintData()
{
return m_printData;
} // getPrintData
/**
* 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 ("No print format");
if (m_printData == null)
throw new IllegalStateException ("No print data (Delete Print Format and restart)");
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 Print Info
* @return info
*/
public PrintInfo getPrintInfo()
{
return m_info;
} // getPrintInfo
/**
* 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
*/
public void print ()
{
log.info(m_info.toString());
if (m_layout == null)
layout();
// Paper Attributes: media-printable-area, orientation-requested, media
PrintRequestAttributeSet prats = m_layout.getPaper().getPrintRequestAttributeSet();
// add: copies, job-name, priority
if (m_info.isDocumentCopy() || m_info.getCopies() < 1)
prats.add (new Copies(1));
else
prats.add (new Copies(m_info.getCopies()));
Locale locale = Language.getLoginLanguage().getLocale();
prats.add(new JobName(m_printFormat.getName(), locale));
prats.add(PrintUtil.getJobPriority(m_layout.getNumberOfPages(), m_info.getCopies(), true));
try
{
// PrinterJob
PrinterJob job = getPrinterJob(m_info.getPrinterName());
// job.getPrintService().addPrintServiceAttributeListener(this);
job.setPageable(m_layout.getPageable(false)); // no copy
// Dialog
try
{
if (m_info.isWithDialog() && !job.printDialog(prats))
return;
}
catch (Exception e)
{
log.log(Level.WARNING, "Operating System Print Issue, check & try again", e);
return;
}
// submit
boolean printCopy = m_info.isDocumentCopy() && m_info.getCopies() > 1;
ArchiveEngine.get().archive(m_layout, m_info);
PrintUtil.print(job, prats, false, printCopy);
// Document: Print Copies
if (printCopy)
{
log.info("Copy " + (m_info.getCopies()-1));
prats.add(new Copies(m_info.getCopies()-1));
job = getPrinterJob(m_info.getPrinterName());
// job.getPrintService().addPrintServiceAttributeListener(this);
job.setPageable (m_layout.getPageable(true)); // Copy
PrintUtil.print(job, prats, false, false);
}
}
catch (Exception e)
{
log.log(Level.SEVERE, "", e);
}
} // 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)
**/
log.fine("attributeUpdate - " + psae);
// PrintUtil.dump (psae.getAttributes());
} // attributeUpdate
/**
* Get PrinterJob based on PrinterName
* @param printerName optional Printer Name
* @return PrinterJob
*/
private PrinterJob getPrinterJob (String printerName)
{
if (printerName != null && printerName.length() > 0)
return CPrinter.getPrinterJob(printerName);
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(m_printerName));
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 the 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.getLoginLanguage();
FileWriter fw = new FileWriter (file, false);
return createHTML (new BufferedWriter(fw), onlyTable, lang);
}
catch (FileNotFoundException fnfe)
{
log.log(Level.SEVERE, "(f) - " + fnfe.toString());
}
catch (Exception e)
{
log.log(Level.SEVERE, "(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)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -