From 66c7c59b281a321a0e9841966da6e339f0f85b3d Mon Sep 17 00:00:00 2001 From: myk Date: Fri, 25 Jan 2013 21:15:30 +0000 Subject: [PATCH] show tooltips in the deck editor when narrow cells truncate their contents --- .../deckeditor/tables/EditorTableView.java | 63 ++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/src/main/java/forge/gui/deckeditor/tables/EditorTableView.java b/src/main/java/forge/gui/deckeditor/tables/EditorTableView.java index d3ceb1ba531..7f23f1d7e7d 100644 --- a/src/main/java/forge/gui/deckeditor/tables/EditorTableView.java +++ b/src/main/java/forge/gui/deckeditor/tables/EditorTableView.java @@ -18,6 +18,9 @@ package forge.gui.deckeditor.tables; import java.awt.Color; +import java.awt.Component; +import java.awt.Point; +import java.awt.event.MouseEvent; import java.util.List; import java.util.Map.Entry; @@ -25,6 +28,9 @@ import javax.swing.JTable; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableColumnModel; +import javax.swing.table.JTableHeader; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumn; import com.google.common.base.Predicate; import com.google.common.base.Predicates; @@ -49,7 +55,7 @@ import forge.util.Aggregates; public final class EditorTableView { private ItemPool pool; private EditorTableModel model; - private final JTable table = new JTable(); + private final JTable table; private Predicate filter = null; private boolean wantUnique = false; private boolean alwaysNonUnique = false; @@ -83,14 +89,69 @@ public final class EditorTableView { * a boolean * @param type0 the cls */ + @SuppressWarnings("serial") public EditorTableView(final boolean forceUnique, final Class type0) { this.genericType = type0; this.wantUnique = forceUnique; + // subclass JTable to show tooltips when hovering over column headers + // and cell data that are truncated due to too-small column widths + table = new JTable() { + private String _getCellTooltip( + TableCellRenderer renderer, int row, int col, Object val) { + Component headerComp = + renderer.getTableCellRendererComponent( + table, val, false, false, row, col); + int requiredWidth = headerComp.getPreferredSize().width; + + // if there's enough room (or there's no value), no tooltip + // we use '>' here instead of '>=' since that seems to be the + // threshold for where the ellipses appear for the default + // JTable renderer + TableColumn tableColumn = columnModel.getColumn(col); + if (null == val || tableColumn.getWidth() > requiredWidth) { + return null; + } + + // otherwise, show the full text in the tooltip + return String.valueOf(val); + } + + // column headers + @Override + protected JTableHeader createDefaultTableHeader() { + return new JTableHeader(columnModel) { + public String getToolTipText(MouseEvent e) { + int col = columnModel.getColumnIndexAtX(e.getPoint().x); + TableColumn tableColumn = columnModel.getColumn(col); + TableCellRenderer headerRenderer = tableColumn.getHeaderRenderer(); + if (null == headerRenderer) { + headerRenderer = getDefaultRenderer(); + } + + return _getCellTooltip( + headerRenderer, -1, col, tableColumn.getHeaderValue()); + } + }; + } + + // cell data + @Override + public String getToolTipText(MouseEvent e) { + Point p = e.getPoint(); + int row = rowAtPoint(p); + int col = columnAtPoint(p); + Object val = table.getValueAt(row, col); + + return _getCellTooltip(getCellRenderer(row, col), row, col, val); + } + }; + table.setFont(FSkin.getFont(12)); table.setBorder(null); table.getTableHeader().setBorder(null); table.setRowHeight(18); + table.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN); } /**