/* * 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 }