package org.openswing.swing.items.client;
import java.io.*;
import java.lang.reflect.*;
import java.text.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;
import org.openswing.swing.table.columns.client.*;
import org.openswing.swing.util.client.*;
import org.openswing.swing.util.java.*;
/**
* <p>Title: OpenSwing Framework</p>
* <p>Description: Renderer for a ComboBoxVOControl or ListVOControl.</p>
* <p>Copyright: Copyright (C) 2006 Mauro Carniel</p>
*
* <p> This file is part of OpenSwing Framework.
* This library is free software; you can redistribute it and/or
* modify it under the terms of the (LGPL) Lesser General Public
* License as published by the Free Software Foundation;
*
* GNU LESSER GENERAL PUBLIC LICENSE
* Version 2.1, February 1999
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* The author may be contacted at:
* maurocarniel@tin.it</p>
*
* @author Mauro Carniel
* @version 1.0
*/
public class ItemRenderer extends JPanel implements ListCellRenderer, Serializable {
protected static Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
/** columns associated to lookup grid */
private Column[] colProperties = null;
/** collection of pairs <v.o. attribute name,Method object, related to the attribute getter method> */
private Hashtable getters = new Hashtable();
/** current vo */
private Object vo = null;
private SimpleDateFormat sdf = null;
/** component left margin, with respect to component container */
private int leftMargin = 0;
/** component right margin, with respect to component container */
private int rightMargin = 0;
/** component top margin, with respect to component container */
private int topMargin = 0;
/** component bottom margin, with respect to component container */
private int bottomMargin = 0;
public ItemRenderer() {
super();
setOpaque(true);
setBorder(noFocusBorder);
sdf = new SimpleDateFormat(ClientSettings.getInstance().getResources().getDateMask(Consts.TYPE_DATE));
}
public void init(Hashtable getters,Column[] colProperties,int leftMargin,int rightMargin,int topMargin,int bottomMargin) {
this.getters = getters;
this.colProperties = colProperties;
this.leftMargin = leftMargin;
this.rightMargin = rightMargin;
this.topMargin = topMargin;
this.bottomMargin = bottomMargin;
}
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}
else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
setFont(list.getFont());
this.vo = value;
repaint();
return this;
}
public Dimension getPreferredSize() {
Dimension size = new JLabel(" ").getPreferredSize();
if (colProperties!=null) {
int width = 0;
for(int i=0;i<colProperties.length;i++) {
if (colProperties[i].isColumnVisible())
width += colProperties[i].getPreferredWidth() + 6;
}
size = new Dimension(width,(int)size.getHeight());
}
return size;
}
public void paint(Graphics g) {
super.paint(g);
if (vo!=null && getters!=null && colProperties!=null) {
int x = 0;
Object obj = null;
Object val = null;
String valS = null;
Color col = g.getColor();
Color col2 = Color.gray;
for(int i=0;i<colProperties.length;i++) {
if (colProperties[i].isColumnVisible()) {
try {
if (colProperties[i].getColumnName().indexOf('.') > 0) {
String hostProperty = colProperties[i].getColumnName().substring(0, colProperties[i].getColumnName().indexOf('.'));
obj = vo.getClass().getMethod("get"+hostProperty.substring(0,1).toUpperCase()+hostProperty.substring(1), new Class[0]).invoke(vo, new Object[0]);
} else {
obj = vo;
}
val = ( (Method) getters.get(colProperties[i].getColumnName())).invoke(obj, new Object[0]);
if (val!=null) {
if (colProperties[i] instanceof DateColumn) {
valS = sdf.format((java.util.Date)val);
}
else
valS = val.toString();
}
else
valS = null;
if (x != 0) {
g.setColor(col2);
g.drawLine(x - 3, 0, x - 3, getHeight());
}
if (valS != null) {
g.setColor(col);
// g.drawString(valS, x, getHeight()-g.getFontMetrics().getDescent());
int hOffset= Math.max(0,( getHeight()+1 - g.getFontMetrics().getHeight() )/2);
g.drawString(valS, x+leftMargin, getHeight()+topMargin - g.getFontMetrics().getDescent() - hOffset);
}
x += colProperties[i].getPreferredWidth() + 6;
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}
g.setColor(col);
}
}
/**
* A subclass of ItemRenderer that implements UIResource.
* ItemRenderer doesn't implement UIResource
* directly so that applications can safely override the
* cellRenderer property with ItemRenderer subclasses.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
* future Swing releases. The current serialization support is
* appropriate for short term storage or RMI between applications running
* the same version of Swing. As of 1.4, support for long term storage
* of all JavaBeans<sup><font size="-2">TM</font></sup>
* has been added to the <code>java.beans</code> package.
* Please see {@link java.beans.XMLEncoder}.
*/
public static class UIResource extends ItemRenderer implements javax.swing.plaf.UIResource {
}
}