/*
* DisplayModesJPanel.java
*
* Created on 31. Juli 2007, 16:23
*/
package net.java.nboglpack.glcapabilities;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicLabelUI;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
import javax.swing.table.DefaultTableCellRenderer;
import sun.swing.SwingUtilities2;
/**
* Lists OpenGL display modes.
* @author Michael Bien
*/
public class DisplayModesPanel extends JPanel {
/** Creates new form DisplayModesJPanel */
public DisplayModesPanel() {
initComponents();
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(displayModesTable.getModel());
displayModesTable.setRowSorter(sorter);
displayModesTable.getTableHeader().setDefaultRenderer(new VerticalTableHeaderRenderer());
}
private class VerticalTableHeaderRenderer extends DefaultTableCellRenderer {
private boolean rotated = false;
public VerticalTableHeaderRenderer() {
setUI(new VerticalLabelUI());
setBorder(UIManager.getBorder("TableHeader.cellBorder"));
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (table != null) {
JTableHeader header = table.getTableHeader();
if (header != null) {
setForeground(header.getForeground());
setBackground(header.getBackground());
setFont(header.getFont());
}
Dimension dim = new Dimension();
for (int i = 0; i < table.getColumnCount(); i++) {
String text = table.getColumnName(i);
Rectangle2D bounds = SwingUtilities2.getFontMetrics(this, getFont()).getStringBounds(text, getGraphics());
dim.setSize( Math.max(dim.width, bounds.getHeight()),
Math.max(dim.height, bounds.getWidth()+10));
}
setPreferredSize(dim);
}
setText(value.toString());
return this;
}
@Override
public int getWidth() {
if(rotated)
return super.getHeight();
return super.getWidth();
}
@Override
public int getHeight() {
if(rotated)
return super.getWidth();
return super.getHeight();
}
private class VerticalLabelUI extends BasicLabelUI {
@Override
public void paint(Graphics g, JComponent c) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
VerticalTableHeaderRenderer renderer = (DisplayModesPanel.VerticalTableHeaderRenderer)c;
g2d.rotate(-Math.PI/2);
g2d.translate(-renderer.getHeight()+3, 0);
renderer.rotated = true;
super.paint(g2d, renderer);
renderer.rotated = false;
}
}
}
public JTable getTable() {
return displayModesTable;
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
JScrollPane displayModesScrollPane = new JScrollPane();
displayModesTable = new JTable();
displayModesTable.setModel(new DefaultTableModel(
new Object [][] {
},
new String [] {
}
));
displayModesTable.setFillsViewportHeight(true);
displayModesScrollPane.setViewportView(displayModesTable);
GroupLayout layout = new GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(displayModesScrollPane, GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(displayModesScrollPane, GroupLayout.DEFAULT_SIZE, 379, Short.MAX_VALUE)
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private JTable displayModesTable;
// End of variables declaration//GEN-END:variables
}