package org.limewire.ui.swing.table; import java.awt.Component; import java.awt.Dimension; import java.util.List; import javax.swing.JTable; import org.limewire.ui.swing.util.FontUtils; import org.limewire.ui.swing.util.I18n; import org.limewire.util.StringUtils; public class MultilineTooltipRenderer extends DefaultLimeTableCellRenderer { private static final Dimension INFINITE_SIZE = new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE); private static final String AND_MORE_MSG = I18n.tr("...and more..."); @SuppressWarnings("unchecked") @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if (!(value instanceof List)) { setText(""); setToolTipText(""); return this; } List<Object> lines = (List<Object>) value; StringBuilder builder = new StringBuilder("<html>"); builder.append(StringUtils.explode(lines, "<br/>", 14, 60, AND_MORE_MSG)); builder.append("</html>"); setToolTipText(builder.toString()); // Only should show the first line in the table... if (lines.size() > 0) { setText(String.valueOf(lines.get(0))); } if (lines.size() > 1) { // Overriden so these cells always exceed their table's space restrictions and thus // always show tooltips and subsequent lines. setPreferredSize(INFINITE_SIZE); } else { setPreferredSize(new Dimension(FontUtils.getPixelWidth(getText(), getFont()), Integer.MAX_VALUE)); } return this; } }