/******************************************************************************
* 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.grid.ed;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Insets;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import org.adempiere.plaf.AdempierePLAF;
import org.compiere.model.GridField;
import org.compiere.model.Lookup;
import org.compiere.util.CLogger;
import org.compiere.util.DisplayType;
import org.omidp.util.LocaleUtil;
import org.omidp.util.PersianCalendar;
/**
* Table Cell Renderer based on DisplayType
*
* @author Jorg Janke
* @version $Id: VCellRenderer.java,v 1.4 2006/07/30 00:51:27 jjanke Exp $
*
* @author Teo Sarca
* <li>FR [ 2866571 ] VCellRenderer: implement getters
* https://sourceforge.net/tracker/?func=detail&aid=2866571&group_id=176962&atid=879335</li>
* <li>FR [ 3051618 ] VCellRenderer: preferred width from field.</li>
*/
public final class VCellRenderer extends DefaultTableCellRenderer
{
/**
*
*/
private static final long serialVersionUID = 3135422746697244864L;
/**
* Constructor for Grid
* @param mField field model
*/
public VCellRenderer(GridField mField)
{
this (mField.getDisplayType());
m_columnName = mField.getColumnName();
this.setName(m_columnName);
m_lookup = mField.getLookup();
m_password = mField.isEncryptedField();
if (mField.getPreferredWidthInListView()>0) {
int height = this.getPreferredSize().height;
setPreferredSize(new Dimension(mField.getPreferredWidthInListView(), height));
}
} // VCellRenderer
/**
* Constructor for MiniGrid
* @param displayType Display Type
*/
public VCellRenderer (int displayType)
{
super();
m_displayType = displayType;
// Number
if (DisplayType.isNumeric(m_displayType))
{
m_numberFormat = DisplayType.getNumberFormat(m_displayType);
setHorizontalAlignment(JLabel.RIGHT);
}
// Date
else if (DisplayType.isDate(m_displayType))
m_dateFormat = DisplayType.getDateFormat(m_displayType);
//
else if (m_displayType == DisplayType.YesNo)
{
m_check = new JCheckBox();
m_check.setMargin(new Insets(0,0,0,0));
m_check.setHorizontalAlignment(JLabel.CENTER);
m_check.setOpaque(true);
}
} // VCellRenderer
private int m_displayType;
private String m_columnName = null;
private Lookup m_lookup = null;
private boolean m_password = false;
//
private SimpleDateFormat m_dateFormat = null;
private DecimalFormat m_numberFormat = null;
private JCheckBox m_check = null;
/** Logger */
private static CLogger log = CLogger.getCLogger(VCellRenderer.class);
/**
* Get TableCell RendererComponent.
* @param table table
* @param value value
* @param isSelected selected
* @param hasFocus focus
* @param row row
* @param col col
* @return component
*/
public Component getTableCellRendererComponent (JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int col)
{
// log.finest(m_columnName
// + ": Value=" + (value == null ? "null" : value.toString())
// + ", Row=" + row + ", Col=" + col);
Component c = null;
if (m_displayType == DisplayType.YesNo)
c = m_check;
else
{ // returns JLabel
c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, col);
//c.setFont(AdempierePLAF.getFont_Field());
c.setFont(table.getFont());
}
// Background & Foreground
Color bg = AdempierePLAF.getFieldBackground_Normal();
Color fg = AdempierePLAF.getTextColor_Normal();
// Inactive Background
boolean ro = !table.isCellEditable(row, col);
if (ro)
{
bg = AdempierePLAF.getFieldBackground_Inactive();
if (isSelected && !hasFocus)
bg = bg.darker();
}
// Foreground
int cCode = 0;
// Grid
if (table instanceof org.compiere.grid.VTable)
cCode = ((org.compiere.grid.VTable)table).getColorCode (row);
// MiniGrid
else if (table instanceof org.compiere.minigrid.MiniTable)
cCode = ((org.compiere.minigrid.MiniTable)table).getColorCode (row);
//
if (cCode == 0)
; // Black
else if (cCode < 0)
fg = AdempierePLAF.getTextColor_Issue(); // Red
else
fg = AdempierePLAF.getTextColor_OK(); // Blue
// Highlighted row
if (isSelected)
{
// Windows is white on blue
bg = table.getSelectionBackground();
fg = table.getSelectionForeground();
if (hasFocus)
bg = org.adempiere.apps.graph.GraphUtil.brighter(bg, .9);
}
// Set Color
c.setBackground(bg);
c.setForeground(fg);
//
// log.fine( "r=" + row + " c=" + col, // + " - " + c.getClass().getName(),
// "sel=" + isSelected + ", focus=" + hasFocus + ", edit=" + table.isCellEditable(row, col));
// Log.trace(7, "BG=" + (bg.equals(Color.white) ? "white" : bg.toString()), "FG=" + (fg.equals(Color.black) ? "black" : fg.toString()));
// Format it
setValue(value);
return c;
} // getTableCellRendererComponent
/**
* Format Display Value.
* Default is JLabel
* @param value (key)value
*/
protected void setValue (Object value)
{
String retValue = null;
try
{
// Checkbox
if (m_displayType == DisplayType.YesNo)
{
if (value instanceof Boolean)
m_check.setSelected(((Boolean)value).booleanValue());
else
m_check.setSelected("Y".equals(value));
return;
}
else if (value == null)
;
// Number
else if (DisplayType.isNumeric(m_displayType))
retValue = m_numberFormat.format(value);
// Date
else if (DisplayType.isDate(m_displayType)){
if(LocaleUtil.isIranLocale())
retValue = new PersianCalendar().GregorianToSolar(m_dateFormat.format(value));
else
retValue = m_dateFormat.format(value);
}
// Row ID
else if (m_displayType == DisplayType.RowID)
retValue = "";
// Lookup
else if (m_lookup != null && (DisplayType.isLookup(m_displayType)
|| m_displayType == DisplayType.Location
|| m_displayType == DisplayType.Account
|| m_displayType == DisplayType.Locator
|| m_displayType == DisplayType.PAttribute ))
retValue = m_lookup.getDisplay(value);
// Button
else if (m_displayType == DisplayType.Button)
{
if ("Record_ID".equals(m_columnName))
retValue = "#" + value + "#";
else
retValue = null;
}
// Password (fixed string)
else if (m_password)
retValue = "**********";
// other (String ...)
else
{
super.setValue(value);
return;
}
}
catch (Exception e)
{
log.log(Level.SEVERE, "(" + value + ") " + value.getClass().getName() , e);
retValue = value.toString();
}
super.setValue(retValue);
} // setValue
/**
* to String
* @return String representation
*/
public String toString()
{
return "VCellRenderer[" + m_columnName
+ ",DisplayType=" + m_displayType + " - " + m_lookup + "]";
} // toString
/**
* Dispose
*/
public void dispose()
{
if (m_lookup != null)
m_lookup.dispose();
m_lookup = null;
} // dispose
public String getColumnName()
{
return m_columnName;
}
public Lookup getLookup()
{
return m_lookup;
}
public int getDisplayType()
{
return m_displayType;
}
public boolean isPassword()
{
return m_password;
}
} // VCellRenderer