import java.awt.event.*;
import java.util.Calendar;
import javax.swing.Timer;

public class ClockApplication {
    
    private Calendar cal;
    private Timer ticker;

    public ClockApplication(ActionListener listener) {
        final Calendar finalCal = Calendar.getInstance();
        cal = finalCal;
        cal.setLenient(false);
        ticker = new Timer(1000, listener);  // Ticks every 1000 milliseconds.
        ticker.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    finalCal.add(Calendar.SECOND, 1);
                }
            });
        ticker.start();
    }
    public void addActionListener(ActionListener l) {
        ticker.addActionListener(l);
    }
    public void removeActionListener(ActionListener l) {
        ticker.removeActionListener(l);
    }
    public void setHour(int h) {
        cal.set(Calendar.HOUR, h);
    }
    public void setMinute(int m) {
        cal.set(Calendar.MINUTE, m);
    }
    public void setSecond(int s) {
        cal.set(Calendar.SECOND, s);
    }
    public void incrementHour() {
        cal.add(Calendar.HOUR,1);
    }
    public void incrementMinute() {
        cal.add(Calendar.MINUTE,1);
    }
    public void incrementSecond() {
        cal.add(Calendar.SECOND,1);
    }
    public int getHour() {
        return cal.get(Calendar.HOUR);
    }
    public int getMinute() {
        return cal.get(Calendar.MINUTE);
    }
    public int getSecond() {
        return cal.get(Calendar.SECOND);
    }

    // The functions below are for testing purposes only.

    public void printTime() {
        System.out.println(getHour() + ":" + getMinute() + ":" + getSecond());
    }

    public static void main (String args[]) {
        final ClockApplication myClock = new ClockApplication(null);
        ActionListener ears = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    myClock.printTime();
                }};
        myClock.addActionListener(ears);
        System.out.println("Testing ClockApplication.java...");
        System.out.println("Clock will run for 120 seconds.");
        System.out.println("Send TERM signal (^C) to exit early.");
        try {
            Thread.sleep(120000);
        } catch (InterruptedException e) {};
    }
}
