/******************************************************************************
* Product: Adempiere ERP & CRM Smart Business Solution *
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
* 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. *
* For the text or an alternative of this public license, you may reach us *
* ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA *
* or via info@compiere.org or http://www.compiere.org/license.html *
*****************************************************************************/
package org.compiere.print;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Image;
import java.awt.Stroke;
import java.awt.Toolkit;
import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
import java.util.logging.Level;
import org.compiere.model.MAttachment;
import org.compiere.model.MImage;
import org.compiere.model.X_AD_PrintTableFormat;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
import org.compiere.util.Env;
import org.compiere.util.Util;
import org.idempiere.cache.ImmutablePOSupport;
import org.idempiere.cache.IntPOCopyCache;
/**
* Table Print Format
*
* @author Jorg Janke
* @author victor.perez@e-evolution.com, e-Evolution
*
BF [ 2011567 ] Implement Background Image for Document printed
* https://sourceforge.net/p/adempiere/feature-requests/477/
* @version $Id: MPrintTableFormat.java,v 1.3 2006/07/30 00:53:02 jjanke Exp $
*/
public class MPrintTableFormat extends X_AD_PrintTableFormat implements ImmutablePOSupport
{
/**
* generated serial id
*/
private static final long serialVersionUID = -1608017405401341288L;
/**
* UUID based Constructor
* @param ctx Context
* @param AD_PrintTableFormat_UU UUID key
* @param trxName Transaction
*/
public MPrintTableFormat(Properties ctx, String AD_PrintTableFormat_UU, String trxName) {
super(ctx, AD_PrintTableFormat_UU, trxName);
if (Util.isEmpty(AD_PrintTableFormat_UU))
setInitialDefaults();
}
/**
* Standard Constructor
* @param ctx context
* @param AD_PrintTableFormat_ID table format
* @param trxName transaction
*/
public MPrintTableFormat (Properties ctx, int AD_PrintTableFormat_ID, String trxName)
{
super (ctx, AD_PrintTableFormat_ID, trxName);
if (AD_PrintTableFormat_ID == 0)
setInitialDefaults();
} // MPrintTableFormat
/**
* Set the initial defaults for a new record
*/
private void setInitialDefaults() {
setIsDefault (false);
setIsPaintHeaderLines (true); // Y
setIsPaintBoundaryLines (false);
setIsPaintHLines (false);
setIsPaintVLines (false);
setIsPrintFunctionSymbols (true);
}
/**
* Load Constructor
* @param ctx context
* @param rs result set
* @param trxName transaction
*/
public MPrintTableFormat (Properties ctx, ResultSet rs, String trxName)
{
super(ctx, rs, trxName);
} // MPrintTableFormat
/**
* Copy Constructor
* @param copy
*/
public MPrintTableFormat(MPrintTableFormat copy)
{
this(Env.getCtx(), copy);
}
/**
* Copy Constructor
* @param ctx
* @param copy
*/
public MPrintTableFormat(Properties ctx, MPrintTableFormat copy)
{
this(ctx, copy, (String) null);
}
/**
* Copy Constructor
* @param ctx
* @param copy
* @param trxName
*/
public MPrintTableFormat(Properties ctx, MPrintTableFormat copy, String trxName)
{
this(ctx, 0, trxName);
copyPO(copy);
this.standard_Font = copy.standard_Font;
this.funct_Font = copy.funct_Font;
this.functBG_Color = copy.functBG_Color;
this.functFG_Color = copy.functFG_Color;
this.hdrLine_Color = copy.hdrLine_Color;
this.header_Font = copy.header_Font;
this.header_Stroke = copy.header_Stroke;
this.headerBG_Color = copy.headerBG_Color;
this.headerFG_Color = copy.headerFG_Color;
this.lineH_Color = copy.lineH_Color;
this.lineH_Stroke = copy.lineH_Stroke;
this.lineV_Color = copy.lineV_Color;
this.lineV_Stroke = copy.lineV_Stroke;
this.m_image = copy.m_image;
this.m_image_water_mark = copy.m_image_water_mark;
this.pageFooter_Font = copy.pageFooter_Font;
this.pageFooterBG_Color = copy.pageFooterBG_Color;
this.pageFooterFG_Color = copy.pageFooterFG_Color;
this.pageHeader_Font = copy.pageHeader_Font;
this.pageHeaderBG_Color = copy.pageHeaderBG_Color;
this.pageHeaderFG_Color = copy.pageHeaderFG_Color;
this.parameter_Color = copy.parameter_Color;
this.parameter_Font = copy.parameter_Font;
}
private Font standard_Font = new Font(null);
private Font pageHeader_Font;
private Font pageFooter_Font;
private Color pageHeaderFG_Color;
private Color pageHeaderBG_Color;
private Color pageFooterFG_Color;
private Color pageFooterBG_Color;
private Font parameter_Font;
private Color parameter_Color;
private Font header_Font;
private Color headerFG_Color;
private Color headerBG_Color;
private Color hdrLine_Color;
private Stroke header_Stroke; // -
private Font funct_Font;
private Color functFG_Color;
private Color functBG_Color;
private Color lineH_Color;
private Color lineV_Color;
private Stroke lineH_Stroke; // -
private Stroke lineV_Stroke; // |
//
private Image m_image = null;
private Image m_image_water_mark = null;
/**
* Set Standard Font to derive other fonts if not defined
* @param standardFont standard font
*/
public void setStandard_Font(Font standardFont)
{
if (standardFont != null)
standard_Font = standardFont;
} // setStandard_Font
/**
* Get Standard Font
* @return standard font
*/
public Font getStandard_Font()
{
return standard_Font;
} // getStandard_Font
/**
* Get Table Header Font
* @return set table header font or fall back to the default of bold standard font
*/
public Font getHeader_Font()
{
if (header_Font != null)
return header_Font;
int i = getHdr_PrintFont_ID();
if (i != 0)
header_Font = MPrintFont.get(i).getFont();
if (header_Font == null)
header_Font = new Font (standard_Font.getName(), Font.BOLD, standard_Font.getSize());
return header_Font;
} // getHeader_Font
/**
* Get Header Foreground
* @return set header foreground color or fallback to the default of black blue.
*/
public Color getHeaderFG_Color()
{
if (headerFG_Color != null)
return headerFG_Color;
int i = getHdrTextFG_PrintColor_ID();
if (i != 0)
headerFG_Color = MPrintColor.get(getCtx(), i).getColor();
if (headerFG_Color == null)
headerFG_Color = MPrintColor.blackBlue;
return headerFG_Color;
} // getHeaderFG_Color
/**
* Get Header BG Color
* @return set header background color or fallback to the default of cyan
*/
public Color getHeaderBG_Color()
{
if (headerBG_Color != null)
return headerBG_Color;
int i = getHdrTextBG_PrintColor_ID();
if (i != 0)
headerBG_Color = MPrintColor.get(getCtx(), i).getColor();
if (headerBG_Color == null)
headerBG_Color = Color.cyan;
return headerBG_Color;
} // getHeaderBG_Color
/**
* Get Header Line Color
* @return set header line color or fall back to the default of black blue
*/
public Color getHeaderLine_Color()
{
if (hdrLine_Color != null)
return hdrLine_Color;
int i = getHdrLine_PrintColor_ID();
if (i != 0)
hdrLine_Color = MPrintColor.get(getCtx(), i).getColor();
if (hdrLine_Color == null)
hdrLine_Color = MPrintColor.blackBlue;
return hdrLine_Color;
} // getHeaderLine_Color
/**
* Get Header Stroke
* @return Header Stroke (default solid 2pt)
*/
public Stroke getHeader_Stroke()
{
if (header_Stroke == null)
{
float width = getHdrStroke().floatValue();
if (getHdrStrokeType() == null || HDRSTROKETYPE_SolidLine.equals(getHdrStrokeType()))
header_Stroke = new BasicStroke(width); // -
//
else if (HDRSTROKETYPE_DashedLine.equals(getHdrStrokeType()))
header_Stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
1.0f, getPatternDashed(width), 0.0f); // - -
else if (HDRSTROKETYPE_DottedLine.equals(getHdrStrokeType()))
header_Stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
1.0f, getPatternDotted(width), 0.0f); // . . .
else if (HDRSTROKETYPE_Dash_DottedLine.equals(getHdrStrokeType()))
header_Stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
1.0f, getPatternDash_Dotted(width), 0.0f); // - . -
// default / fallback
if (header_Stroke == null)
header_Stroke = new BasicStroke(width); // -
}
return header_Stroke;
} // getHeader_Stroke
/**
* Get Header Stroke for horizontal Lines
* @return stroke in pt (default 2)
*/
public BigDecimal getHdrStroke()
{
BigDecimal retValue = super.getHdrStroke();
if (retValue == null || Env.ZERO.compareTo(retValue) >= 0)
retValue = BigDecimal.valueOf(2.0);
return retValue;
} // getHdrStroke
/**
* Get Function Font
* @return set function font or fall back to the default of BoldItalic standard font
*/
public Font getFunct_Font()
{
if (funct_Font != null)
return funct_Font;
int i = getFunct_PrintFont_ID();
if (i != 0)
funct_Font = MPrintFont.get(i).getFont();
if (funct_Font == null)
funct_Font = new Font (standard_Font.getName(), Font.BOLD|Font.ITALIC, standard_Font.getSize());
return funct_Font;
} // getFunct_Font
/**
* Get Function BG Color
* @return set function background color or fallback to the default of white
*/
public Color getFunctBG_Color()
{
if (functBG_Color != null)
return functBG_Color;
int i = getFunctBG_PrintColor_ID();
if (i != 0)
functBG_Color = MPrintColor.get(getCtx(), i).getColor();
if (functBG_Color == null)
functBG_Color = Color.white;
return functBG_Color;
} // getFunctBG_Color
/**
* Get Function FG Color
* @return set function foreground color or fallback to the default of dark green
*/
public Color getFunctFG_Color()
{
if (functFG_Color != null)
return functFG_Color;
int i = getFunctFG_PrintColor_ID();
if (i != 0)
functFG_Color = MPrintColor.get(getCtx(), i).getColor();
if (functFG_Color == null)
functFG_Color = MPrintColor.darkGreen;
return functFG_Color;
} // getFunctFG_Color
/**
* Get Parameter Font
* @return set parameter font of fallback to the default of Italic standard font
*/
public Font getParameter_Font()
{
if (parameter_Font == null)
parameter_Font = new Font (standard_Font.getName(), Font.ITALIC, standard_Font.getSize());
return parameter_Font;
} // getParameter_Font
/**
* Get Parameter Color
* @return set parameter color or fallback to the default of dark gray
*/
public Color getParameter_Color()
{
if (parameter_Color == null)
parameter_Color = Color.darkGray;
return parameter_Color;
} // getParameter_Color
/**
* Get Top Page Header Font
* @return set page header font or fallback to the default of Bold standard font
*/
public Font getPageHeader_Font()
{
if (pageHeader_Font == null)
pageHeader_Font = new Font (standard_Font.getName(), Font.BOLD, standard_Font.getSize());
return pageHeader_Font;
} // getPageHeader_Font
/**
* Get Page Header FG_Color
* @return set page header foreground color or fallback to the default of blue black
*/
public Color getPageHeaderFG_Color()
{
if (pageHeaderFG_Color == null)
pageHeaderFG_Color = MPrintColor.blackBlue;
return pageHeaderFG_Color;
} // getPageHeaderFG_Color
/**
* Get Page Header BG_Color
* @return set page header background color or fallback to the default of white
*/
public Color getPageHeaderBG_Color()
{
if (pageHeaderBG_Color == null)
pageHeaderBG_Color = Color.white;
return pageHeaderBG_Color;
} // getPageHeaderBG_Color
/**
* Get Page Footer Font
* @return set page footer font or fallback to the default of 2pt smaller standard font
*/
public Font getPageFooter_Font()
{
if (pageFooter_Font == null)
pageFooter_Font = new Font (standard_Font.getName(), Font.PLAIN, standard_Font.getSize()-2);
return pageFooter_Font;
} // getPageFooter_Font
/**
* Get PageFooter FG_Color
* @return set page footer foreground color or fallback to the default of black blue
*/
public Color getPageFooterFG_Color()
{
if (pageFooterFG_Color == null)
pageFooterFG_Color = MPrintColor.blackBlue;
return pageFooterFG_Color;
} // getPageFooterFG_Color
/**
* Get Page Footer BG_Color
* @return set page footer background color or fallback to the default of white
*/
public Color getPageFooterBG_Color()
{
if (pageFooterBG_Color == null)
pageFooterBG_Color = Color.white;
return pageFooterBG_Color;
} // getPageFooterBG_Color
/**
* Get Horizontal Line Color.
* @return set horizontal line color or fallback to the default of light gray
*/
public Color getHLine_Color()
{
if (lineH_Color != null)
return lineH_Color;
int i = getLine_PrintColor_ID();
if (i != 0)
lineH_Color = MPrintColor.get(getCtx(), i).getColor();
if (lineH_Color == null)
lineH_Color = Color.lightGray;
return lineH_Color;
} // getHLine_Color
/**
* Get Vertical Line Color.
* @return set vertical line color or fallback to the default of light gray
*/
public Color getVLine_Color()
{
if (lineV_Color != null)
return lineV_Color;
int i = getLine_PrintColor_ID();
if (i != 0)
lineV_Color = MPrintColor.get(getCtx(), i).getColor();
if (lineV_Color == null)
lineV_Color = Color.lightGray;
return lineV_Color;
} // getVLine_Color
/**
* Get Horizontal Line Stroke -
* (same DB line column)
* @return solid line baded on line width (default solid 1p)
*/
public Stroke getHLine_Stroke()
{
if (lineH_Stroke == null)
{
float width = getLineStroke().floatValue() / 2;
if (getHdrStrokeType() == null || LINESTROKETYPE_DottedLine.equals(getLineStrokeType()))
lineH_Stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
1.0f, getPatternDotted(width), 0.0f); // . . .
//
else if (LINESTROKETYPE_SolidLine.equals(getLineStrokeType()))
lineH_Stroke = new BasicStroke(width); // -
else if (LINESTROKETYPE_DashedLine.equals(getLineStrokeType()))
lineH_Stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
1.0f, getPatternDashed(width), 0.0f); // - -
else if (LINESTROKETYPE_Dash_DottedLine.equals(getLineStrokeType()))
lineH_Stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
1.0f, getPatternDash_Dotted(width), 0.0f); // - . -
// default / fallback
if (lineH_Stroke == null)
lineH_Stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
1.0f, getPatternDotted(width), 0.0f); // . . .
}
return lineH_Stroke;
} // getHLine_Stroke
/**
* Get Vertical Line Stroke |
* (same DB line column)
* @return line based on line (1/2 of) width and stroke (default dotted 1/2p
*/
public Stroke getVLine_Stroke()
{
if (lineV_Stroke == null)
{
float width = getLineStroke().floatValue() / 2;
if (getHdrStrokeType() == null || LINESTROKETYPE_DottedLine.equals(getLineStrokeType()))
lineV_Stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
1.0f, getPatternDotted(width), 0.0f); // . . .
//
else if (LINESTROKETYPE_SolidLine.equals(getLineStrokeType()))
lineV_Stroke = new BasicStroke(width); // -
else if (LINESTROKETYPE_DashedLine.equals(getLineStrokeType()))
lineV_Stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
1.0f, getPatternDashed(width), 0.0f); // - -
else if (LINESTROKETYPE_Dash_DottedLine.equals(getLineStrokeType()))
lineV_Stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
1.0f, getPatternDash_Dotted(width), 0.0f); // - . -
// default / fallback
if (lineV_Stroke == null)
lineV_Stroke = new BasicStroke(width, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL,
1.0f, getPatternDotted(width), 0.0f); // . . .
}
return lineV_Stroke;
} // getVLine_Stroke
/**
* Get Horizontal Stroke for Lines -
* @return stroke in pt (default 1)
*/
public BigDecimal getLineStroke()
{
BigDecimal retValue = super.getLineStroke();
if (retValue == null || Env.ZERO.compareTo(retValue) >= 0)
retValue = Env.ONE;
return retValue;
} // getLineStroke
/**
* Get Vertical Stroke for Lines |
* @return stroke in pt (default 1)
*/
public BigDecimal getVLineStroke()
{
BigDecimal retValue = super.getLineStroke();
if (retValue == null || Env.ZERO.compareTo(retValue) >= 0)
retValue = Env.ONE;
return retValue;
} // getVLineStroke
/**
* Get Pattern Dotted . . . .
* @param width width of line
* @return pattern
*/
private float[] getPatternDotted (float width)
{
return new float[] {2*width, 2*width};
} // getPatternDotted
/**
* Get Pattern Dashed - - - -
* @param width width of line
* @return pattern
*/
private float[] getPatternDashed (float width)
{
return new float[] {10*width, 4*width};
} // getPatternDashed
/**
* Get Pattern Dash Dotted - . - .
* @param width width of line
* @return pattern
*/
private float[] getPatternDash_Dotted (float width)
{
return new float[] {10*width, 2*width, 2*width, 2*width};
} // getPatternDash_Dotted
private static IntPOCopyCache s_cache
= new IntPOCopyCache(Table_Name, 3);
/** Static Logger */
private static CLogger s_log = CLogger.getCLogger(MPrintTableFormat.class);
/**
* Get Print Table Format.
* @param ctx context
* @param AD_PrintTableFormat_ID print table format id, 0 to get default print table format
* @param standard_font standard font
* @return Print Table Format
*/
static public MPrintTableFormat get (Properties ctx, int AD_PrintTableFormat_ID, Font standard_font)
{
Integer ii = Integer.valueOf(AD_PrintTableFormat_ID);
MPrintTableFormat tf = s_cache.get(ii, e -> new MPrintTableFormat(ctx, e));
if (tf == null)
{
if (AD_PrintTableFormat_ID == 0)
{
tf = getDefault (ctx);
}
else
{
tf = new MPrintTableFormat (ctx, AD_PrintTableFormat_ID, (String)null);
if (tf.get_ID() != AD_PrintTableFormat_ID)
return null;
}
s_cache.put(tf.get_ID(), tf, e -> new MPrintTableFormat(Env.getCtx(), e));
}
tf.setStandard_Font(standard_font);
return tf;
} // get
/**
* Get Print Table Format
* @param ctx context
* @param AD_PrintTableFormat_ID print table format id, 0 to get default print table format
* @param AD_PrintFont_ID standard font
* @return Print Table Format
*/
static public MPrintTableFormat get (Properties ctx, int AD_PrintTableFormat_ID, int AD_PrintFont_ID)
{
return get (ctx, AD_PrintTableFormat_ID, MPrintFont.get (AD_PrintFont_ID).getFont());
} // get
/**
* Get Default Print Table Format.
* @param ctx context
* @return Default Print Table Format (need to set standard font)
*/
static public MPrintTableFormat getDefault (Properties ctx)
{
MPrintTableFormat tf = null;
String sql = "SELECT * FROM AD_PrintTableFormat "
+ "WHERE AD_Client_ID IN (0,?) AND IsActive='Y' "
+ "ORDER BY IsDefault DESC, AD_Client_ID DESC";
int AD_Client_ID = Env.getAD_Client_ID(ctx);
PreparedStatement pstmt = null;
ResultSet rs = null;
try
{
pstmt = DB.prepareStatement(sql, null);
pstmt.setInt(1, AD_Client_ID);
rs = pstmt.executeQuery();
if (rs.next())
tf = new MPrintTableFormat (ctx, rs, null);
}
catch (Exception e)
{
s_log.log(Level.SEVERE, sql, e);
}
finally
{
DB.close(rs, pstmt);
rs = null; pstmt = null;
}
return tf;
} // get
/**
* Get the Image
* @return image or null
*/
public Image getImage()
{
if(m_image != null)
{
return m_image;
}
//
if(isImageIsAttached())
{
MAttachment attachment = MAttachment.get(getCtx(), Table_ID, get_ID(), get_UUID(), null);
if (attachment == null)
{
log.log(Level.WARNING, "No Attachment - ID=" + get_ID());
return null;
}
if (attachment.getEntryCount() != 1)
{
log.log(Level.WARNING, "Need just 1 Attachment Entry = " + attachment.getEntryCount());
return null;
}
byte[] imageData = attachment.getEntryData(0);
if (imageData != null)
{
m_image = Toolkit.getDefaultToolkit().createImage(imageData);
}
if (m_image != null)
{
if (log.isLoggable(Level.FINE)) log.fine(attachment.getEntryName(0) + " - Size=" + imageData.length);
}
else
{
log.log(Level.WARNING, attachment.getEntryName(0) + " - not loaded (must be gif or jpg) - ID=" + get_ID());
}
}
else if (getImageURL() != null)
{
URL url;
try
{
url = new URL(getImageURL());
Toolkit tk = Toolkit.getDefaultToolkit();
m_image = tk.getImage(url);
}
catch (MalformedURLException e)
{
log.log(Level.WARNING, "Malformed URL - "+getImageURL(), e);
}
}
return m_image;
} // getImage
/**
* Get the Image
* @return image or null
*/
public Image getImageWaterMark()
{
if(m_image_water_mark != null)
{
return m_image_water_mark;
}
//
if(getAD_Image_ID() > 0)
{
m_image_water_mark = MImage.get(getCtx(), getAD_Image_ID()).getImage();
}
return m_image_water_mark;
} // getImage
@Override
public MPrintTableFormat markImmutable() {
if (is_Immutable())
return this;
makeImmutable();
return this;
}
} // MPrintTableFormat