import java.util.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JComponent;
import javax.swing.BoxLayout;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.TableColumn;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Insets;
public class DebugTable extends JPanel {
private static int ITEMS_PER_ROW = 3;
private boolean ALLOW_COLUMN_SELECTION = false;
private boolean ALLOW_ROW_SELECTION = true;
static String[] columnNames = null;
static String[][] data = null;
static String[] sortedVtable = null;
static DebugTable contentPane;
static JFrame frame;
public DebugTable()
{
super( new GridLayout( 0, 1 ) );
columnNames = new String[ITEMS_PER_ROW];
columnNames[0] = "Variable";
columnNames[1] = "Value";
columnNames[2] = "User Set";
data = new String[variable.Vtable.size()][ITEMS_PER_ROW];
sortedVtable = new String[variable.Vtable.size()];
Iterator vars = ( variable.Vtable.values() ).iterator();
for( int i = 0; i < sortedVtable.length; i++ )
{
variable v = ( variable ) ( vars.next() );
sortedVtable[i] = v.name;
}
Arrays.sort( sortedVtable );
int row = 0;
for( int i = 0; i < sortedVtable.length; i++ )
{
variable v = ( variable ) ( variable.Vtable.get( sortedVtable[i] ) );
data[row][0] = v.name;
if( v.value == variable.T )
{
DebugTable.data[row][1] = "True";
}
else
if( v.value == variable.F )
{
DebugTable.data[row][1] = "False";
}
else // v.value == variable.U
{
DebugTable.data[row][1] = "Unknown";
}
if( v.userSet )
{
data[row][2] = "True";
}
else
{
data[row][2] = "False";
}
row++;
}
final JTable table = new JTable( data, columnNames );
// Adjust widths of Value and User Set columns
TableColumn column = table.getColumnModel().getColumn( 1 );
column.setPreferredWidth( 30 );
column = table.getColumnModel().getColumn( 2 );
column.setPreferredWidth( 30 );
table.setPreferredScrollableViewportSize( new Dimension( 500, 250 ) );
table.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
if ( ALLOW_ROW_SELECTION ) // true by default
{
ListSelectionModel rowSM = table.getSelectionModel();
rowSM.addListSelectionListener( new ListSelectionListener() {
public void valueChanged( ListSelectionEvent e )
{}
} );
}
else
{
table.setRowSelectionAllowed( false );
}
if ( ALLOW_COLUMN_SELECTION ) // false by default
{
table.setColumnSelectionAllowed( true );
ListSelectionModel colSM = table.getColumnModel().getSelectionModel();
colSM.addListSelectionListener( new ListSelectionListener() {
public void valueChanged( ListSelectionEvent e )
{}
} );
}
// Display explanation when user clicks a row
final JTextArea expl = new JTextArea();
expl.setRows( 3 );
expl.setMargin( new Insets( 5, 5, 5, 5 ) );
expl.setEditable( false );
expl.setLineWrap( true );
expl.setWrapStyleWord( true );
ListSelectionModel rowSM = table.getSelectionModel();
rowSM.addListSelectionListener( new ListSelectionListener() {
public void valueChanged( ListSelectionEvent e )
{
ListSelectionModel lsm = ( ListSelectionModel ) e.getSource();
if( !lsm.isSelectionEmpty() )
{
int r = lsm.getMinSelectionIndex();
variable v = ( variable ) ( variable.Vtable.get( sortedVtable[r] ) );
expl.setText( v.explainValue() );
}
}
} );
// Create the scroll panes and add the table and explanation to it
JScrollPane scrollPane = new JScrollPane( table,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER );
JScrollPane scrollPane2 = new JScrollPane( expl,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER );
// Add the scroll panes to this panel
add( scrollPane );
add( scrollPane2 );
}
public static void update()
{
contentPane.updateUI();
}
public static void createAndShowGUI()
{
// Create and set up the window
frame = new JFrame( "Variable Table" );
frame.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
// Create and set up the content pane
contentPane = new DebugTable();
contentPane.setLayout( new BoxLayout( contentPane, BoxLayout.Y_AXIS ) );
contentPane.setOpaque( true ); // content panes must be opaque
frame.setContentPane( contentPane );
// Display the window
frame.pack();
frame.setVisible( true );
}
}