/*
* KAM Navigator Plugin
*
* URLs: http://openbel.org/
* Copyright (C) 2012, Selventa
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.openbel.cytoscape.navigator;
import java.awt.Component;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
/**
* {@link TextAreaCellRenderer} defines a
* {@link TableCellRenderer table cell renderer} that determines row height of
* a {@link TableColumn table column} suitable for wrapping text.
*
* @author Anthony Bargnesi <abargnesi@selventa.com>
*/
public class TextAreaCellRenderer extends JTextArea implements TableCellRenderer {
private static final long serialVersionUID = -7417398212391533532L;
private final DefaultTableCellRenderer renderer = new DefaultTableCellRenderer();
private final Map<JTable, Map<Object, Map<Object, Integer>>> tablecellSizes =
new HashMap<JTable, Map<Object, Map<Object, Integer>>>();
public TextAreaCellRenderer() {
setLineWrap(true);
setWrapStyleWord(true);
}
@Override
public Component getTableCellRendererComponent(JTable t, Object v,
boolean selected,
boolean hasFocus, int row, int column) {
// set the Font, Color, etc.
renderer.getTableCellRendererComponent(t, v,
selected, hasFocus, row, column);
setForeground(renderer.getForeground());
setBackground(renderer.getBackground());
setBorder(renderer.getBorder());
setFont(renderer.getFont());
setText(renderer.getText());
TableColumnModel columnModel = t.getColumnModel();
setSize(columnModel.getColumn(column).getWidth(), 0);
int height_wanted = (int) getPreferredSize().getHeight();
addSize(t, row, column, height_wanted);
height_wanted = findTotalMaximumRowSize(t, row);
if (height_wanted != t.getRowHeight(row)) {
t.setRowHeight(row, height_wanted);
}
return this;
}
private void addSize(JTable t, int row, int column, int height) {
Map<Object, Map<Object, Integer>> rowsMap = tablecellSizes.get(t);
if (rowsMap == null) {
tablecellSizes.put(t, rowsMap = new HashMap<Object, Map<Object, Integer>>());
}
Map<Object, Integer> rowheightsMap = rowsMap.get(row);
if (rowheightsMap == null) {
rowsMap.put(row, rowheightsMap = new HashMap<Object, Integer>());
}
rowheightsMap.put(column, height);
}
private int findTotalMaximumRowSize(JTable t, int row) {
int maximum_height = 0;
Enumeration<TableColumn> columns = t.getColumnModel().getColumns();
while (columns.hasMoreElements()) {
TableColumn tc = columns.nextElement();
TableCellRenderer cellRenderer = tc.getCellRenderer();
if (cellRenderer instanceof TextAreaCellRenderer) {
TextAreaCellRenderer tar = (TextAreaCellRenderer) cellRenderer;
maximum_height = Math.max(maximum_height,
tar.findMaximumRowSize(t, row));
}
}
return maximum_height;
}
private int findMaximumRowSize(JTable t, int row) {
Map<Object, Map<Object, Integer>> rows = tablecellSizes.get(t);
if (rows == null) return 0;
Map<Object, Integer> rowheights = rows.get(row);
if (rowheights == null) return 0;
int maximum_height = 0;
for (Map.Entry<Object, Integer> entry : rowheights.entrySet()) {
int cellHeight = entry.getValue();
maximum_height = Math.max(maximum_height, cellHeight);
}
return maximum_height;
}
}