package de.muntjak.tinylookandfeel.controlpanel;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.Icon;
import javax.swing.table.AbstractTableModel;
@SuppressWarnings (
{ "all" } )
public class NonSortableTableModel extends AbstractTableModel
{
public NonSortableTableModel ()
{
this ( false );
}
// data holds a vector of Record objects where
// one Record represents one row of data
protected Vector data;
private Record template;
private Vector columnNames;
private boolean sortable;
protected NonSortableTableModel ( boolean sortable )
{
super ();
this.sortable = sortable;
createData ();
}
private void createData ()
{
columnNames = new Vector ();
columnNames.add ( "C1" );
columnNames.add ( "C2" );
columnNames.add ( "C3" );
columnNames.add ( "C4" );
TableColorIcon.reset ();
template = null;
data = new Vector ();
for ( int i = 0 ; i < 50 ; i++ )
{
Record rec = new Record ( i + 1 );
data.add ( rec );
if ( template == null )
{
template = rec;
}
}
}
// AbstractTableModel implementation
public int getColumnCount ()
{
if ( template == null )
return 0;
return template.getColumnCount ();
}
public int getRowCount ()
{
return data.size ();
}
public Object getValueAt ( int row, int column )
{
Record rec = ( Record ) data.get ( row );
return rec.getValueAt ( column );
}
public Class getColumnClass ( int column )
{
if ( template == null )
return Object.class;
return template.getColumnClass ( column );
}
public String getColumnName ( int column )
{
return ( String ) columnNames.get ( column );
}
// Some methods for testing
public void addColumn ( Class cl, int column )
{
columnNames.add ( column, "N" + ( column + 1 ) );
Iterator ii = data.iterator ();
while ( ii.hasNext () )
{
Record rec = ( Record ) ii.next ();
rec.addColumn ( cl, column );
}
fireTableStructureChanged ();
}
public void removeColumn ( int column )
{
columnNames.remove ( column );
Iterator ii = data.iterator ();
while ( ii.hasNext () )
{
Record rec = ( Record ) ii.next ();
rec.removeColumn ( column );
}
fireTableStructureChanged ();
}
public void removeAllRows ()
{
data.clear ();
fireTableDataChanged ();
}
public void createNewData ()
{
createData ();
// might be that number of columns changed
fireTableStructureChanged ();
}
/**
* A Record represents one row of data. By default a Record consists of 4
* values but columns can be added and can be removed.
*
* @author Hans Bickel
*/
protected class Record
{
private Vector values;
private int oldRow, newRow;
protected Record ( int index )
{
values = new Vector ();
Object v1 = new Integer ( index );
Object v2 = createRandomIcon ();
Object v3 = null;
if ( sortable )
{
if ( index == 1 )
{
v3 = "Sortable";
}
else if ( index == 2 )
{
v3 = "Table";
}
else if ( index == 3 )
{
v3 = "Data";
}
else
{
v3 = createRandomString ();
}
}
else
{
if ( index == 1 )
{
v3 = "Non-";
}
else if ( index == 2 )
{
v3 = "sortable";
}
else if ( index == 3 )
{
v3 = "Table";
}
else if ( index == 4 )
{
v3 = "Data";
}
else
{
v3 = createRandomString ();
}
}
Object v4 = createRandomInteger ();
values.add ( v1 );
values.add ( v2 );
values.add ( v3 );
values.add ( v4 );
}
public Object getValueAt ( int column )
{
if ( column < 0 || column >= values.size () )
return null;
return values.get ( column );
}
public Class getColumnClass ( int column )
{
if ( column < 0 || column >= values.size () )
return Object.class;
return values.get ( column ).getClass ();
}
public void addColumn ( Class cl, int column )
{
if ( Double.class.equals ( cl ) )
{
values.add ( column, createRandomDouble () );
}
else if ( Icon.class.equals ( cl ) )
{
values.add ( column, createRandomIcon () );
}
else if ( Integer.class.equals ( cl ) )
{
values.add ( column, createRandomInteger () );
}
else if ( String.class.equals ( cl ) )
{
values.add ( column, createRandomString () );
}
}
public void removeColumn ( int column )
{
values.remove ( column );
}
public int getColumnCount ()
{
return values.size ();
}
private String createRandomString ()
{
// return a string of 3 random characters
char [] a = new char [ 3 ];
for ( int i = 0 ; i < a.length ; i++ )
{
a [ i ] = createRandomChar ();
}
return new String ( a );
}
private char createRandomChar ()
{
// return one uppercase letter
return ( char ) ( 'A' + ( char ) ( Math.random () * 3 ) );
}
private Double createRandomDouble ()
{
// return a Double between 0.00 and 99.00
int x = ( int ) ( Math.random () * 10000 );
return new Double ( x / 100.0 );
}
private Integer createRandomInteger ()
{
// return an Integer between 1 and 20
return new Integer ( ( int ) ( Math.random () * 20 ) + 1 );
}
private Icon createRandomIcon ()
{
return new TableColorIcon ();
}
public int getNewRow ()
{
return newRow;
}
public void setNewRow ( int newRow )
{
this.newRow = newRow;
}
public int getOldRow ()
{
return oldRow;
}
public void setOldRow ( int oldRow )
{
this.oldRow = oldRow;
}
}
/**
* A 24x12 sized icon of random color.
*/
public static final class TableColorIcon implements Icon
{
private Color color;
private static int hue = 0;
TableColorIcon ()
{
color = Color.getHSBColor ( ( float ) ( hue / 360.0 ), 0.5f, 0.9f );
hue += 360 / 20;
}
static void reset ()
{
hue = 0;
}
public void paintIcon ( Component c, Graphics g, int x, int y )
{
g.setColor ( Color.DARK_GRAY );
g.drawRect ( x, y, getIconWidth () - 1, getIconHeight () - 1 );
g.setColor ( color );
g.fillRect ( x + 1, y + 1, getIconWidth () - 2, getIconHeight () - 2 );
}
public int getIconWidth ()
{
return 24;
}
public int getIconHeight ()
{
return 12;
}
public int compareTo ( Object o )
{
if ( o == null )
return 1;
if ( ! ( o instanceof TableColorIcon ) )
return 1;
Color c2 = ( ( TableColorIcon ) o ).color;
if ( color.getRGB () == c2.getRGB () )
{
return 0;
}
else if ( color.getRGB () > c2.getRGB () )
{
return 1;
}
return -1;
}
}
}