/*
*
*
*/
package tablerenderer;
import op.tools.SYSTools;
import org.apache.log4j.Logger;
import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import java.awt.*;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* Diese Klasse implementiert einen Renderer für den JTable mit automatischer Anpassung der Zeilenhöhe und
* Interpretation von HTML Code in den Zellen.
* Ich habe die ursprüngliche Klasse im JavaSpecialist Newsletter #106 gefunden und weitestgehend* unverändert übernommen.
* Vielen Dank an den Autor Dr. Heinz M. Kabutz.
*
* @author Heinz Kabutz: This code is from The Java Specialists' Newsletter http://www.javaspecialists.eu, used with permission.
* @see "http://www.offene-pflege.de/component/content/article/3-informationen/9-quellen#TJSN"
* <p/>
* geringe Änderung zur HTML Fähigkeit. JTextPane statt JTextArea
*/
public class RNDHTML implements TableCellRenderer {
// private final DefaultTableCellRenderer adaptee = new DefaultTableCellRenderer();
/**
* map from table to map of rows to map of column heights
*/
private final Map cellSizes = new HashMap();
// private Closure fileDropActivity = null;
protected JTextPane txt;
protected JPanel panel;
private Logger logger = Logger.getLogger(getClass());
// public RNDHTML() {
// this(null);
//
// }
//
// public RNDHTML(FileDrop.Listener fileDropListener) {
// this();
// new FileDrop(txt, fileDropListener);
// }
public RNDHTML() {
// Dieser Trick mit dem Einbetten der JTextPane ist nur wegen dem Nimbus Bug bei der Hintergrundfarbe einer Text Component.
// http://solutioncrawler.wordpress.com/2009/10/07/nimbus-lookfeel-und-seine-eigenarten/
txt = new JTextPane();
txt.setEditable(false);
txt.setContentType("text/html");
txt.setOpaque(false);
txt.setBackground(new Color(0, 0, 0, 0));
// if (kit != null) {
// txt.setEditorKit(kit);
// }
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
panel.add(txt);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected, boolean hasFocus, int row, int column) {
txt.setText(SYSTools.catchNull(obj)); //https://github.com/tloehr/Offene-Pflege.de/issues/68
// This line was very important to get it working with JDK1.4
TableColumnModel columnModel = table.getColumnModel();
txt.setSize(columnModel.getColumn(column).getWidth(), 100000);
int height_wanted = (int) txt.getPreferredSize().getHeight();
addSize(table, row, column, height_wanted);
height_wanted = findTotalMaximumRowSize(table, row);
if (height_wanted != table.getRowHeight(row)) {
table.setRowHeight(row, Math.max(1, height_wanted));
}
panel.setBackground(SYSTools.getTableCellBackgroundColor(isSelected, row));
return panel;
}
private void addSize(JTable table, int row, int column, int height) {
//OpenCare.logger.debug("HTMLRenderer: addSize()");
Map rows = (Map) cellSizes.get(table);
if (rows == null) {
cellSizes.put(table, rows = new HashMap());
}
Map rowheights = (Map) rows.get(new Integer(row));
if (rowheights == null) {
rows.put(new Integer(row), rowheights = new HashMap());
}
rowheights.put(new Integer(column), new Integer(height));
}
/**
* Look through all columns and get the renderer. If it is
* also a TextAreaRenderer, we look at the maximum height in
* its hash table for this row.
*/
private int findTotalMaximumRowSize(JTable table, int row) {
//OpenCare.logger.debug("HTMLRenderer: findTotalMaximumRowSize()");
int maximum_height = 0;
Enumeration columns = table.getColumnModel().getColumns();
while (columns.hasMoreElements()) {
TableColumn tc = (TableColumn) columns.nextElement();
TableCellRenderer cellRenderer = tc.getCellRenderer();
if (cellRenderer instanceof RNDHTML) {
RNDHTML tar = (RNDHTML) cellRenderer;
maximum_height = Math.max(maximum_height, tar.findMaximumRowSize(table, row));
}
}
return maximum_height;
}
private int findMaximumRowSize(JTable table, int row) {
//OpenCare.logger.debug("HTMLRenderer: findMaximumRowSize()");
Map rows = (Map) cellSizes.get(table);
if (rows == null) {
return 0;
}
Map rowheights = (Map) rows.get(new Integer(row));
if (rowheights == null) {
return 0;
}
int maximum_height = 0;
for (Iterator it = rowheights.entrySet().iterator();
it.hasNext(); ) {
Map.Entry entry = (Map.Entry) it.next();
int cellHeight = ((Integer) entry.getValue()).intValue();
maximum_height = Math.max(maximum_height, cellHeight);
}
return maximum_height;
}
}