
import java.beans.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

public class JCalendarFrame extends JInternalFrame implements PropertyChangeListener {

    static int openFrameCount = 0;
    static final int offset = 10;

	public JCalendarFrame() {

		super("", true, true, true, true);
		setResizable( false );
		openFrameCount++;
		setTitle("JCalendar" + openFrameCount);

		dayChooser = null;
		monthChooser = null;
		yearChooser = null;
		locale = Locale.getDefault();
		calendar = Calendar.getInstance();

		JPanel myPanel = new JPanel();
		myPanel.setLayout( new BorderLayout() );

		monthChooser = new JMonthChooser();
		myPanel.add( monthChooser, BorderLayout.WEST );

		yearChooser = new JYearChooser();
		myPanel.add( yearChooser, BorderLayout.EAST );

		dayChooser = new JDayChooser();
		myPanel.add( dayChooser, BorderLayout.SOUTH );
		dayChooser.addPropertyChangeListener( this );

		monthChooser.setDayChooser( dayChooser );
		monthChooser.addPropertyChangeListener( this );

		yearChooser.setDayChooser( dayChooser );
		yearChooser.addPropertyChangeListener( this );

		setContentPane(myPanel);
		pack();
		setLocation( offset * openFrameCount, offset * openFrameCount);
	}

	private void setCalendar( Calendar c, boolean update ) {
		Calendar oldCalendar = calendar;
		calendar = c;
		if( update ) {
			dayChooser.setDay( c.get( Calendar.DATE ) );
			monthChooser.setMonth( c.get( Calendar.MONTH ) );
			yearChooser.setYear( c.get( Calendar.YEAR ) );
		}
		firePropertyChange( "calendar", oldCalendar, calendar );
	}

	public void setCalendar( Calendar c ) {
		setCalendar( c, true );
	}

	public Calendar getCalendar() {
		return calendar;
	}

	public void setLocale( Locale l ) {
		Locale oldLocale = locale;
		locale = l;
		dayChooser.setLocale( locale );
		monthChooser.setLocale( locale );
		firePropertyChange( "locale", oldLocale, locale );
	}

	public Locale getLocale() {
		return locale;
	}

	public void setFont( Font font ) {
		super.setFont( font );
		if( dayChooser != null ) {
			dayChooser.setFont( font );
			monthChooser.setFont( font );
			yearChooser.setFont( font );
		}
	}

	public void setForeground( Color fg ) {
		super.setForeground( fg );
		if( dayChooser != null ) {
			dayChooser.setForeground( fg );
			monthChooser.setForeground( fg );
			yearChooser.setForeground( fg );
		}
	}

	public void setBackground( Color bg) {
		super.setBackground( bg);
		if( dayChooser != null )
			dayChooser.setBackground( bg);
	}

	public void propertyChange( PropertyChangeEvent evt ) {
		if( calendar != null ) {
			Calendar c = (Calendar) calendar.clone();
			if( evt.getPropertyName().equals( "day" ) ) {
				c.set( Calendar.DAY_OF_MONTH, ((Integer)evt.getNewValue()).intValue() );
				setCalendar( c, false );
			}
			else if( evt.getPropertyName().equals( "month" ) ) {
				c.set( Calendar.MONTH, ((Integer)evt.getNewValue()).intValue() );
				setCalendar( c, false );
			}
			else if( evt.getPropertyName().equals( "year" ) ) {
				c.set( Calendar.YEAR, ((Integer)evt.getNewValue()).intValue() );
				setCalendar( c, false );
			}
		}
	}

	public String getName() {
		return "JCalendarFrame";
	}

	private JYearChooser  yearChooser;
	private JMonthChooser monthChooser;
	private JDayChooser   dayChooser;
	private Calendar      calendar;
	private Locale        locale;
}
