IDEMPIERE-3996 Implement DisplayLogic for PrintFormatItem
This commit is contained in:
parent
df72426ab1
commit
2af8ec1a39
|
@ -23,6 +23,8 @@ import java.util.ArrayList;
|
|||
import java.util.Properties;
|
||||
|
||||
import org.compiere.model.MQuery;
|
||||
import org.compiere.util.Evaluator;
|
||||
import org.compiere.util.Util;
|
||||
|
||||
/**
|
||||
* Header Footer
|
||||
|
@ -49,6 +51,8 @@ public class HeaderFooter
|
|||
/** Header/Footer content as Array */
|
||||
private PrintElement[] m_pe = null;
|
||||
|
||||
private Page m_currentPage;
|
||||
|
||||
/**
|
||||
* Add Print Element to Page
|
||||
* @param element print element
|
||||
|
@ -86,7 +90,17 @@ public class HeaderFooter
|
|||
Point pageStart = new Point(bounds.getLocation());
|
||||
getElements();
|
||||
for (int i = 0; i < m_pe.length; i++)
|
||||
{
|
||||
if (m_currentPage != null && !Util.isEmpty(m_pe[i].getPageLogic(), true) && m_pe[i].getPrintData() != null
|
||||
&& m_pe[i].getRowIndex() >= 0)
|
||||
{
|
||||
PrintDataEvaluatee evaluatee = new PrintDataEvaluatee(m_currentPage, m_pe[i].getPrintData());
|
||||
boolean display = Evaluator.evaluateLogic(evaluatee, m_pe[i].getPageLogic());
|
||||
if (!display)
|
||||
continue;
|
||||
}
|
||||
m_pe[i].paint(g2D, 0, pageStart, m_ctx, isView);
|
||||
}
|
||||
} // paint
|
||||
|
||||
/**
|
||||
|
@ -105,4 +119,9 @@ public class HeaderFooter
|
|||
return retValue;
|
||||
} // getDrillDown
|
||||
|
||||
public void setCurrentPage(Page page)
|
||||
{
|
||||
m_currentPage = page;
|
||||
}
|
||||
|
||||
} // HeaderFooter
|
||||
|
|
|
@ -50,7 +50,6 @@ import javax.print.DocFlavor;
|
|||
import javax.print.attribute.DocAttributeSet;
|
||||
|
||||
import org.compiere.model.MClientInfo;
|
||||
import org.compiere.model.MColumn;
|
||||
import org.compiere.model.MQuery;
|
||||
import org.compiere.model.MSysConfig;
|
||||
import org.compiere.model.MTable;
|
||||
|
@ -72,7 +71,6 @@ import org.compiere.util.CLogger;
|
|||
import org.compiere.util.DB;
|
||||
import org.compiere.util.DisplayType;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.Evaluatee;
|
||||
import org.compiere.util.Evaluator;
|
||||
import org.compiere.util.KeyNamePair;
|
||||
import org.compiere.util.Msg;
|
||||
|
@ -1101,7 +1099,7 @@ public class LayoutEngine implements Pageable, Printable, Doc
|
|||
|
||||
// Type
|
||||
PrintElement element = null;
|
||||
if ( !isDisplayed(item) )
|
||||
if ( !PrintDataEvaluatee.hasPageLogic(item.getDisplayLogic()) && !isDisplayed(m_data, item) )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
@ -1214,6 +1212,14 @@ public class LayoutEngine implements Pageable, Printable, Doc
|
|||
m_currPage.addElement (element);
|
||||
else
|
||||
m_headerFooter.addElement (element);
|
||||
|
||||
if (PrintDataEvaluatee.hasPageLogic(item.getDisplayLogic()))
|
||||
{
|
||||
element.setPrintData(m_data);
|
||||
element.setRowIndex(row);
|
||||
element.setPageLogic(item.getDisplayLogic());
|
||||
}
|
||||
|
||||
//
|
||||
if (m_lastHeight[m_area] > m_maxHeightSinceNewLine[m_area])
|
||||
m_maxHeightSinceNewLine[m_area] = m_lastHeight[m_area];
|
||||
|
@ -1623,6 +1629,8 @@ public class LayoutEngine implements Pageable, Printable, Doc
|
|||
Boolean [] colSuppressRepeats = new Boolean[columnCount];
|
||||
String[] columnJustification = new String[columnCount];
|
||||
HashMap<Integer,Integer> additionalLines = new HashMap<Integer,Integer>();
|
||||
ArrayList<String> pageLogics = new ArrayList<String>();
|
||||
boolean hasPageLogic = false;
|
||||
|
||||
int col = 0;
|
||||
for (int c = 0; c < format.getItemCount(); c++)
|
||||
|
@ -1669,6 +1677,16 @@ public class LayoutEngine implements Pageable, Printable, Doc
|
|||
rowColColor.put(new Point(TableElement.ALL, col), color.getColor());
|
||||
}
|
||||
//
|
||||
if (PrintDataEvaluatee.hasPageLogic(item.getDisplayLogic()))
|
||||
{
|
||||
pageLogics.add(item.getDisplayLogic());
|
||||
hasPageLogic = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
pageLogics.add(null);
|
||||
}
|
||||
//
|
||||
col++;
|
||||
}
|
||||
}
|
||||
|
@ -1724,7 +1742,7 @@ public class LayoutEngine implements Pageable, Printable, Doc
|
|||
Serializable dataElement = null;
|
||||
if (item.isPrinted()) // Text Columns
|
||||
{
|
||||
if ( !isDisplayed(item) )
|
||||
if ( !PrintDataEvaluatee.hasPageLogic(item.getDisplayLogic()) && !isDisplayed(printData, item) )
|
||||
{
|
||||
;
|
||||
}
|
||||
|
@ -1802,6 +1820,13 @@ public class LayoutEngine implements Pageable, Printable, Doc
|
|||
|
||||
if (format == m_format)
|
||||
this.colSuppressRepeats = colSuppressRepeats;
|
||||
|
||||
if (hasPageLogic)
|
||||
{
|
||||
table.setPageLogics(pageLogics);
|
||||
table.setTablePrintData(printData);
|
||||
}
|
||||
|
||||
return table;
|
||||
} // layoutTable
|
||||
|
||||
|
@ -1891,7 +1916,9 @@ public class LayoutEngine implements Pageable, Printable, Doc
|
|||
//
|
||||
// log.fine("#" + m_id, "PageIndex=" + pageIndex + ", Copy=" + m_isCopy);
|
||||
page.paint((Graphics2D)graphics, r, false, m_isCopy); // sets context
|
||||
getHeaderFooter().setCurrentPage(page);
|
||||
getHeaderFooter().paint((Graphics2D)graphics, r, false);
|
||||
getHeaderFooter().setCurrentPage(null);
|
||||
//
|
||||
return Printable.PAGE_EXISTS;
|
||||
} // print
|
||||
|
@ -2005,81 +2032,10 @@ public class LayoutEngine implements Pageable, Printable, Doc
|
|||
return childPrintFormatDetails;
|
||||
}
|
||||
|
||||
private boolean isDisplayed(MPrintFormatItem item) {
|
||||
private boolean isDisplayed(PrintData data, MPrintFormatItem item) {
|
||||
if ( Util.isEmpty(item.getDisplayLogic() ))
|
||||
return true;
|
||||
boolean display = Evaluator.evaluateLogic(new Evaluatee() {
|
||||
|
||||
@Override
|
||||
public String get_ValueAsString(String variableName) {
|
||||
if (Page.CONTEXT_PAGE.equals(variableName)) {
|
||||
return String.valueOf(getPageNo());
|
||||
} else if (Page.CONTEXT_PAGECOUNT.equals(variableName)) {
|
||||
return String.valueOf(getNumberOfPages());
|
||||
}
|
||||
|
||||
//ref column
|
||||
String foreignColumn = "";
|
||||
int f = variableName.indexOf('.');
|
||||
if (f > 0) {
|
||||
foreignColumn = variableName.substring(f+1, variableName.length());
|
||||
variableName = variableName.substring(0, f);
|
||||
}
|
||||
|
||||
Object obj = m_data.getNode(variableName);
|
||||
if ( obj == null || !(obj instanceof PrintDataElement))
|
||||
return "";
|
||||
PrintDataElement data = (PrintDataElement) obj;
|
||||
if (data.isNull() )
|
||||
return "";
|
||||
String value = null;
|
||||
if (data.getValue() instanceof Boolean)
|
||||
value = ((Boolean)data.getValue()).booleanValue() ? "Y" : "N";
|
||||
else
|
||||
value = data.getValueAsString();
|
||||
if (!Util.isEmpty(value) && !Util.isEmpty(foreignColumn) && variableName.endsWith("_ID")) {
|
||||
String refValue = "";
|
||||
int id = 0;
|
||||
try {
|
||||
id = Integer.parseInt(value);
|
||||
} catch (Exception e){}
|
||||
if (id > 0) {
|
||||
String tableName = null;
|
||||
if (!Util.isEmpty(m_data.getTableName()))
|
||||
tableName = m_data.getTableName();
|
||||
else
|
||||
tableName = variableName.substring(0, variableName.length()-3);
|
||||
MColumn column = MColumn.get(m_data.getCtx(), tableName, variableName);
|
||||
if (column != null) {
|
||||
String foreignTable = column.getReferenceTableName();
|
||||
refValue = DB.getSQLValueString(null,
|
||||
"SELECT " + foreignColumn + " FROM " + foreignTable + " WHERE "
|
||||
+ foreignTable + "_ID = ?", id);
|
||||
} else {
|
||||
if (variableName.startsWith("#") || variableName.startsWith("$")) {
|
||||
variableName = variableName.substring(1);
|
||||
} else if (variableName.indexOf("|") > 0) {
|
||||
variableName = variableName.substring(variableName.lastIndexOf("|")+1);
|
||||
}
|
||||
String foreignTable = null;
|
||||
if (foreignColumn.indexOf(".") > 0) {
|
||||
foreignTable = foreignColumn.substring(0, foreignColumn.indexOf("."));
|
||||
} else {
|
||||
foreignTable = variableName.substring(0, variableName.length()-3);
|
||||
}
|
||||
MTable t = MTable.get(Env.getCtx(), foreignTable);
|
||||
if (t != null) {
|
||||
refValue = DB.getSQLValueString(null,
|
||||
"SELECT " + foreignColumn + " FROM " + foreignTable + " WHERE "
|
||||
+ foreignTable + "_ID = ?", id);
|
||||
}
|
||||
}
|
||||
}
|
||||
return refValue;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
}, item.getDisplayLogic());
|
||||
boolean display = Evaluator.evaluateLogic(new PrintDataEvaluatee(getPage(getPageNo()), data), item.getDisplayLogic());
|
||||
|
||||
return display;
|
||||
}
|
||||
|
|
|
@ -25,7 +25,9 @@ import java.util.ArrayList;
|
|||
import java.util.Properties;
|
||||
|
||||
import org.compiere.model.MQuery;
|
||||
import org.compiere.util.Evaluator;
|
||||
import org.compiere.util.Msg;
|
||||
import org.compiere.util.Util;
|
||||
|
||||
/**
|
||||
* Layout Page
|
||||
|
@ -118,6 +120,11 @@ public class Page
|
|||
m_pageCount = pageCount;
|
||||
} // setPageCount
|
||||
|
||||
public int getPageCount()
|
||||
{
|
||||
return m_pageCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add Print Element to Page
|
||||
* @param element print element
|
||||
|
@ -180,7 +187,17 @@ public class Page
|
|||
for (int i = 0; i < m_elements.size(); i++)
|
||||
{
|
||||
PrintElement e = (PrintElement)m_elements.get(i);
|
||||
if (e.getPrintData() != null && !Util.isEmpty(e.getPageLogic(), true) && e.getRowIndex() >= 0)
|
||||
{
|
||||
e.getPrintData().setRowIndex(e.getRowIndex());
|
||||
PrintDataEvaluatee evaluatee = new PrintDataEvaluatee(this, e.getPrintData());
|
||||
boolean display = Evaluator.evaluateLogic(evaluatee, e.getPageLogic());
|
||||
if (!display)
|
||||
continue;
|
||||
}
|
||||
e.setCurrentPage(this);
|
||||
e.paint(g2D, m_pageNo, pageStart, m_ctx, isView);
|
||||
e.setCurrentPage(null);
|
||||
}
|
||||
} // paint
|
||||
|
||||
|
|
|
@ -0,0 +1,116 @@
|
|||
/******************************************************************************
|
||||
* Project: Trek Global ERP *
|
||||
* Copyright (C) 2009-2018 Trek Global Corporation *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify it *
|
||||
* under the terms version 2 of the GNU General Public License as published *
|
||||
* by the Free Software Foundation. This program 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 General Public License for more details. *
|
||||
* You should have received a copy of the GNU General Public License along *
|
||||
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
||||
*****************************************************************************/
|
||||
package org.compiere.print.layout;
|
||||
|
||||
import org.compiere.model.MColumn;
|
||||
import org.compiere.model.MTable;
|
||||
import org.compiere.print.PrintData;
|
||||
import org.compiere.print.PrintDataElement;
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.Evaluatee;
|
||||
import org.compiere.util.Util;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author hengsin
|
||||
*
|
||||
*/
|
||||
public class PrintDataEvaluatee implements Evaluatee {
|
||||
|
||||
private PrintData m_data;
|
||||
private Page m_page;
|
||||
|
||||
public PrintDataEvaluatee(Page page, PrintData data) {
|
||||
m_data = data;
|
||||
m_page = page;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String get_ValueAsString(String variableName) {
|
||||
if (Page.CONTEXT_PAGE.equals(variableName)) {
|
||||
return String.valueOf(m_page.getPageNo());
|
||||
} else if (Page.CONTEXT_PAGECOUNT.equals(variableName)) {
|
||||
return String.valueOf(m_page.getPageCount());
|
||||
}
|
||||
|
||||
//ref column
|
||||
String foreignColumn = "";
|
||||
int f = variableName.indexOf('.');
|
||||
if (f > 0) {
|
||||
foreignColumn = variableName.substring(f+1, variableName.length());
|
||||
variableName = variableName.substring(0, f);
|
||||
}
|
||||
|
||||
Object obj = m_data.getNode(variableName);
|
||||
if ( obj == null || !(obj instanceof PrintDataElement))
|
||||
return "";
|
||||
PrintDataElement data = (PrintDataElement) obj;
|
||||
if (data.isNull() )
|
||||
return "";
|
||||
String value = null;
|
||||
if (data.getValue() instanceof Boolean)
|
||||
value = ((Boolean)data.getValue()).booleanValue() ? "Y" : "N";
|
||||
else
|
||||
value = data.getValueAsString();
|
||||
if (!Util.isEmpty(value) && !Util.isEmpty(foreignColumn) && variableName.endsWith("_ID")) {
|
||||
String refValue = "";
|
||||
int id = 0;
|
||||
try {
|
||||
id = Integer.parseInt(value);
|
||||
} catch (Exception e){}
|
||||
if (id > 0) {
|
||||
String tableName = null;
|
||||
if (!Util.isEmpty(m_data.getTableName()))
|
||||
tableName = m_data.getTableName();
|
||||
else
|
||||
tableName = variableName.substring(0, variableName.length()-3);
|
||||
MColumn column = MColumn.get(m_data.getCtx(), tableName, variableName);
|
||||
if (column != null) {
|
||||
String foreignTable = column.getReferenceTableName();
|
||||
refValue = DB.getSQLValueString(null,
|
||||
"SELECT " + foreignColumn + " FROM " + foreignTable + " WHERE "
|
||||
+ foreignTable + "_ID = ?", id);
|
||||
} else {
|
||||
if (variableName.startsWith("#") || variableName.startsWith("$")) {
|
||||
variableName = variableName.substring(1);
|
||||
} else if (variableName.indexOf("|") > 0) {
|
||||
variableName = variableName.substring(variableName.lastIndexOf("|")+1);
|
||||
}
|
||||
String foreignTable = null;
|
||||
if (foreignColumn.indexOf(".") > 0) {
|
||||
foreignTable = foreignColumn.substring(0, foreignColumn.indexOf("."));
|
||||
} else {
|
||||
foreignTable = variableName.substring(0, variableName.length()-3);
|
||||
}
|
||||
MTable t = MTable.get(Env.getCtx(), foreignTable);
|
||||
if (t != null) {
|
||||
refValue = DB.getSQLValueString(null,
|
||||
"SELECT " + foreignColumn + " FROM " + foreignTable + " WHERE "
|
||||
+ foreignTable + "_ID = ?", id);
|
||||
}
|
||||
}
|
||||
}
|
||||
return refValue;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public static boolean hasPageLogic(String displayLogic) {
|
||||
if (Util.isEmpty(displayLogic, true))
|
||||
return false;
|
||||
return displayLogic.contains("@*Page");
|
||||
}
|
||||
}
|
|
@ -30,6 +30,7 @@ import java.util.logging.Level;
|
|||
|
||||
import org.compiere.model.MQuery;
|
||||
import org.compiere.print.MPrintFormatItem;
|
||||
import org.compiere.print.PrintData;
|
||||
import org.compiere.util.CLogger;
|
||||
|
||||
/**
|
||||
|
@ -73,6 +74,14 @@ public abstract class PrintElement implements ImageObserver, Serializable
|
|||
/** Logger */
|
||||
protected CLogger log = CLogger.getCLogger(getClass());
|
||||
|
||||
private Page m_currentPage;
|
||||
|
||||
private PrintData m_printData;
|
||||
|
||||
private int m_rowIndex = -1;
|
||||
|
||||
private String m_pageLogic;
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* Get Calculated Width
|
||||
|
@ -357,4 +366,43 @@ public abstract class PrintElement implements ImageObserver, Serializable
|
|||
return sb.toString();
|
||||
} // toString
|
||||
|
||||
public void setCurrentPage(Page page)
|
||||
{
|
||||
m_currentPage = page;
|
||||
}
|
||||
|
||||
protected Page getCurrentPage()
|
||||
{
|
||||
return m_currentPage;
|
||||
}
|
||||
|
||||
public void setPrintData(PrintData printData)
|
||||
{
|
||||
m_printData = printData;
|
||||
}
|
||||
|
||||
public PrintData getPrintData()
|
||||
{
|
||||
return m_printData;
|
||||
}
|
||||
|
||||
public void setRowIndex(int row)
|
||||
{
|
||||
m_rowIndex = row;
|
||||
}
|
||||
|
||||
public int getRowIndex()
|
||||
{
|
||||
return m_rowIndex;
|
||||
}
|
||||
|
||||
public void setPageLogic(String displayLogic)
|
||||
{
|
||||
m_pageLogic = displayLogic;
|
||||
}
|
||||
|
||||
public String getPageLogic()
|
||||
{
|
||||
return m_pageLogic;
|
||||
}
|
||||
} // PrintElement
|
||||
|
|
|
@ -43,8 +43,10 @@ import java.util.regex.Pattern;
|
|||
import org.compiere.model.MQuery;
|
||||
import org.compiere.print.MPrintFormatItem;
|
||||
import org.compiere.print.MPrintTableFormat;
|
||||
import org.compiere.print.PrintData;
|
||||
import org.compiere.print.util.SerializableMatrix;
|
||||
import org.compiere.print.util.SerializableMatrixImpl;
|
||||
import org.compiere.util.Evaluator;
|
||||
import org.compiere.util.KeyNamePair;
|
||||
import org.compiere.util.NamePair;
|
||||
import org.compiere.util.Util;
|
||||
|
@ -1450,6 +1452,22 @@ public class TableElement extends PrintElement
|
|||
suppress = true;
|
||||
}
|
||||
|
||||
if (!suppress)
|
||||
{
|
||||
if (m_tablePrintData != null && m_pageLogics != null && col < m_pageLogics.size())
|
||||
{
|
||||
String pageLogic = m_pageLogics.get(col);
|
||||
if (!Util.isEmpty(pageLogic, true))
|
||||
{
|
||||
m_tablePrintData.setRowIndex(row);
|
||||
PrintDataEvaluatee evaluatee = new PrintDataEvaluatee(getCurrentPage(), m_tablePrintData);
|
||||
boolean display = Evaluator.evaluateLogic(evaluatee, pageLogic);
|
||||
if (!display)
|
||||
suppress = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( !suppress )
|
||||
{
|
||||
for (int index = 0; index < printItems.length; index++)
|
||||
|
@ -1669,6 +1687,8 @@ public class TableElement extends PrintElement
|
|||
|
||||
/** Print Data */
|
||||
private SerializableMatrix<ArrayList<Serializable>> m_printRows = new SerializableMatrixImpl<ArrayList<Serializable>>("PrintRows");
|
||||
private ArrayList<String> m_pageLogics;
|
||||
private PrintData m_tablePrintData;
|
||||
|
||||
/**
|
||||
* Insert empty Row after current Row
|
||||
|
@ -1705,4 +1725,14 @@ public class TableElement extends PrintElement
|
|||
return coordinate.toArray();
|
||||
} // getPrintItems
|
||||
|
||||
|
||||
public void setPageLogics(ArrayList<String> pageLogics)
|
||||
{
|
||||
m_pageLogics = pageLogics;
|
||||
}
|
||||
|
||||
public void setTablePrintData(PrintData printData)
|
||||
{
|
||||
m_tablePrintData = printData;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue