001 package nl.cwi.sen1.visplugin.table.model;
002
003 import java.awt.Color;
004 import java.awt.Component;
005 import java.awt.Graphics;
006 import java.awt.geom.Rectangle2D;
007
008 import javax.swing.JLabel;
009 import javax.swing.JTable;
010 import javax.swing.table.TableCellRenderer;
011
012 /**
013 * Location button renderer. Class responisible for creating the buttons which
014 * are rendered when a location is specified in an Rtuple.
015 *
016 * @author Anton Lycklama a Nijeholt
017 * @author Bas Basten
018 * @author Anton Gerdessen (Javadoc + review)
019 * @date 13-03-2007
020 */
021 public class LocationButtonRenderer extends JLabel implements TableCellRenderer {
022
023 private static final long serialVersionUID = 1L;
024
025 private int m_lineWidth = 0;
026
027 private int m_lineHeight = 0;
028
029 /**
030 * Constructor.
031 *
032 * @author Anton Lycklama a Nijeholt
033 * @author Bas Basten
034 * @author Anton Gerdessen (Javadoc + review)
035 * @date 13-03-2007
036 */
037 public LocationButtonRenderer() {
038 initialize();
039 }
040
041 /**
042 * Set the visible parameters for this label.
043 *
044 * @author Anton Lycklama a Nijeholt
045 * @author Bas Basten
046 * @author Anton Gerdessen (Javadoc + review)
047 * @date 13-03-2007
048 */
049 public void initialize() {
050 setOpaque(true);
051 setText("<b>Location</b>");
052 setForeground(Color.blue);
053 }
054
055 /**
056 * Make the label invisible when its not selected.
057 *
058 * @author Anton Lycklama a Nijeholt
059 * @author Bas Basten
060 * @author Anton Gerdessen (Javadoc + review)
061 * @date 13-03-2007
062 * @see javax.swing.table.TableCellRenderer#getTableCellRendererComponent(javax.swing.JTable,
063 * java.lang.Object, boolean, boolean, int, int)
064 */
065 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
066
067 if (isSelected) {
068 setBackground(table.getSelectionBackground());
069 } else {
070 setBackground(table.getBackground());
071 }
072
073 setText((value == null) ? "" : value.toString());
074 return this;
075 }
076
077 /**
078 * Calculate the bounds of the underline. This method will be called one for
079 * each label. This method cannot be called in the initialize because the
080 * graphics bounds are not set at that time.
081 *
082 * @author Anton Gerdessen
083 * @date 14-03-2007
084 */
085 public void calculateUnderLineBounds() {
086 // Calculate the lineSize for the underline once and store it.
087 Rectangle2D textBounds = getFontMetrics(getFont()).getStringBounds(
088 getText(), getGraphics());
089
090 int textWidth = (int) textBounds.getWidth();
091 int iconWidth = (getIcon() == null ? 0 : getIcon().getIconWidth()
092 + getIconTextGap());
093
094 m_lineWidth = iconWidth + textWidth;
095 m_lineHeight = getHeight() / 2 + (int) (textBounds.getHeight() / 2);
096
097 }
098
099 /**
100 * Overwrite the paint method, call super to paint the label itself. Draw
101 * the underline afterwards.
102 *
103 * @author Anton Lycklama a Nijeholt
104 * @author Bas Basten
105 * @author Anton Gerdessen (Javadoc + review)
106 * @date 13-03-2
107 */
108 public void paint(Graphics g) {
109 super.paint(g);
110
111 // If the bounds have not yet been calculated, calculate them.
112 if (m_lineWidth == 0 || m_lineWidth != 0) {
113 calculateUnderLineBounds();
114 }
115
116 g.setColor(getForeground());
117 g.drawLine(0, m_lineHeight, m_lineWidth, m_lineHeight);
118 }
119
120 }