class DayTable extends Component implements MouseListener
{
Date CurDate;
int[][] DayArray;
FontMetrics Fm;
DatePane Master;
static int[] MonthLen = { 31,28,31,30,31,30,31,31,30,31,30,31 };
static String[] DayShorts = {"Mo","Tu","We","Th","Fr","Sa","Su" };
public DayTable ( DatePane master ) {
Font font = new Font( "Helvetica", Font.BOLD, 12);
setFont( font);
Fm = getToolkit().getFontMetrics( font);
Master = master;
addMouseListener( this);
}
public void mousePressed ( MouseEvent e ) {
Dimension size = getSize();
int x = e.getX();
int y = e.getY();
int cw = 2*Fm.charWidth( '0');
int cd = (size.width-7*cw)/8;
int rh = Fm.getHeight();
int rd = (size.height-7*rh)/8;
int xIdx = Math.min( x / (cw+cd), 6);
int yIdx = Math.min( (y-rh-rd) / (rh+rd), 5 );
int dn;
Graphics g;
if ( (dn=DayArray[xIdx][yIdx]) != 0) {
CurDate.setDate( dn);
if ( (g = getGraphics()) != null ) {
redraw( g);
g.dispose();
}
}
Master.notifyClients();
}
public void redraw ( Graphics g) {
if ( CurDate == null ) return;
Dimension size = getSize();
int zw = Fm.charWidth( '0');
int cw = 2*zw;
int cd = (size.width-7*cw)/8;
int dc = Fm.getDescent();
int rh = Fm.getHeight();
int rd = (size.height-7*rh)/8;
int dn, dof, dim = CurDate.getDate();
g.setColor( Color.blue);
g.setFont( getFont() );
for ( int dy=0; dy<7; dy++)
g.drawString( DayShorts[dy], cd+dy*(cw+cd), rd+rh-dc);
for ( int dy=0; dy<7; dy++) {
for ( int wk=0; wk<6; wk++) {
if ( (dn=DayArray[dy][wk]) != 0 ){
if ( dn<10) dof=zw;
else dof = 0;
if (dn==dim) g.setColor( Color.green);
else if ( dy==6) g.setColor( Color.red);
else g.setColor( Color.black);
g.drawString( Integer.toString(dn),
dof+cd+dy*(cd+cw), (wk+2)*(rd+rh)-dc );
}
}
}
}
public void paint ( Graphics g ) {
Dimension size = getSize();
g.setColor( getBackground());
g.fillRect( 0, 0, size.width, size.height);
redraw( g);
}
public static int[][] getDayArray ( int mn, int ye) {
int[][] darr = new int[7][6];
int sd = (new Date( ye, mn-1, 1)).getDay();
int maxd = MonthLen[mn-1];
if ( (mn==2) && (isLeapYear( ye)) ) maxd++;
if ( sd == 0) sd = 7;
for( int day=sd-1; day < maxd+sd-1; day++)
darr[day%7][day/7] = day-sd+2;
return darr;
}
public Date getDate () {
return CurDate;
}
void setDate ( Date dt ) {
CurDate = dt;
DayArray = getDayArray( dt.getMonth()+1, dt.getYear() );
repaint();
}
public void mouseClicked ( MouseEvent e ) {}
public void mouseReleased ( MouseEvent e ) {}
public void mouseEntered ( MouseEvent e ) {}
public void mouseExited ( MouseEvent e ) {}
public static boolean isLeapYear ( int year) {
if ( year % 400 == 0 ) return true;
if ( year % 100 == 0 ) return false;
return (year % 4) == 0;
}
}