Monitored GregorianCalendar
import java.util.*;
/**
* @author Matthew D. Hicks
*
*/
public class MonitoredGregorianCalendar extends GregorianCalendar {
private ArrayList listeners;
private boolean blocked;
public MonitoredGregorianCalendar() {
super();
listeners = new ArrayList();
}
public MonitoredGregorianCalendar(int year, int month, int dayOfMonth) {
super(year, month, dayOfMonth);
listeners = new ArrayList();
}
public MonitoredGregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute) {
super(year, month, dayOfMonth, hourOfDay, minute);
listeners = new ArrayList();
}
public MonitoredGregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second) {
super(year, month, dayOfMonth, hourOfDay, minute, second);
listeners = new ArrayList();
}
public MonitoredGregorianCalendar(Locale aLocale) {
super(aLocale);
listeners = new ArrayList();
}
public MonitoredGregorianCalendar(TimeZone zone) {
super(zone);
listeners = new ArrayList();
}
public void add(int field, int amount) {
if (!blocked) {
blocked = true;
super.add(field, amount);
blocked = false;
changed(CalendarChangeListener.TYPE_ADD, field, amount);
} else {
super.add(field, amount);
}
}
public void roll(int field, boolean up) {
if (!blocked) {
blocked = true;
super.roll(field, up);
blocked = false;
int amount = 0;
if (up) amount = 1;
changed(CalendarChangeListener.TYPE_ROLL, field, amount);
} else {
super.roll(field, up);
}
}
public void roll(int field, int amount) {
if (!blocked) {
blocked = true;
super.roll(field, amount);
blocked = false;
changed(CalendarChangeListener.TYPE_ROLL, field, amount);
} else {
super.roll(field, amount);
}
}
public void setGregorianChange(Date date) {
if (!blocked) {
blocked = true;
super.setGregorianChange(date);
blocked = false;
changed(CalendarChangeListener.TYPE_SET, CalendarChangeListener.TIME_IN_MILLIS, date.getTime());
} else {
super.setGregorianChange(date);
}
}
public void setTimeZone(TimeZone zone) {
if (!blocked) {
blocked = true;
super.setTimeZone(zone);
blocked = false;
changed(CalendarChangeListener.TYPE_SET, CalendarChangeListener.TIME_ZONE, zone.getRawOffset());
} else {
super.setTimeZone(zone);
}
}
public void set(int field, int value) {
if (!blocked) {
blocked = true;
super.set(field, value);
blocked = false;
changed(CalendarChangeListener.TYPE_SET, field, value);
} else {
super.set(field, value);
}
}
public void setFirstDayOfWeek(int value) {
if (!blocked) {
blocked = true;
super.setFirstDayOfWeek(value);
blocked = false;
changed(CalendarChangeListener.TYPE_SET, CalendarChangeListener.FIRST_DAY_OF_WEEK, value);
} else {
super.setFirstDayOfWeek(value);
}
}
public void setLenient(boolean lenient) {
if (!blocked) {
blocked = true;
super.setLenient(lenient);
blocked = false;
int amount = 0;
if (lenient) amount = 1;
changed(CalendarChangeListener.TYPE_SET, CalendarChangeListener.LENIENT, amount);
} else {
super.setLenient(lenient);
}
}
public void setMinimalDaysInFirstWeek(int value) {
if (!blocked) {
blocked = true;
super.setMinimalDaysInFirstWeek(value);
blocked = false;
changed(CalendarChangeListener.TYPE_SET, CalendarChangeListener.MINIMAL_DAYS_IN_FIRST_WEEK, value);
} else {
super.setMinimalDaysInFirstWeek(value);
}
}
public void setTimeInMillis(long millis) {
if (!blocked) {
blocked = true;
super.setTimeInMillis(millis);
blocked = false;
changed(CalendarChangeListener.TYPE_SET, CalendarChangeListener.TIME_IN_MILLIS, millis);
} else {
super.setTimeInMillis(millis);
}
}
private void changed(int type, int field, long value) {
if ((listeners != null) && (!blocked)) {
for (int i = 0; i < listeners.size(); i++) {
((CalendarChangeListener)listeners.get(i)).changed(this, type, field, value);
}
}
}
public void addListener(CalendarChangeListener listener) {
listeners.add(listener);
}
}
/**
* @author Matthew D. Hicks
*
*/
interface CalendarChangeListener {
public static final int TYPE_ADD = 1;
public static final int TYPE_ROLL = 2;
public static final int TYPE_SET = 3;
public static final int TIME_ZONE = 1;
public static final int FIRST_DAY_OF_WEEK = 2;
public static final int LENIENT = 3;
public static final int MINIMAL_DAYS_IN_FIRST_WEEK = 4;
public static final int TIME_IN_MILLIS = 5;
/**
* This method is called when a MonitoredGregorianCalendar changes.
*
* @param c
* A reference to the MonitoredGregorianCalendar that has been changed.
* @param type
* The type of change that occurred:
* TYPE_ADD, TYPE_ROLL, or TYPE_SET
* @param field
* The field that was changed either a Calendar type or:
* TIME_ZONE, FIRST_DAY_OF_WEEK, LENIENT, MINIMAL_DAYS_IN_FIRST_WEEK, or TIME_IN_MILLIS
* @param value
* The value associated with the change.
*/
public void changed(MonitoredGregorianCalendar c, int type, int field, long value);
}
Related examples in the same category