*/
private CalendarServerRpcImpl rpc = new CalendarServerRpcImpl();
+ /**
+ * The cached minimum minute shown when using
+ * {@link #autoScaleVisibleHoursOfDay()}.
+ */
+ private Integer minTimeInMinutes;
+
+ /**
+ * The cached maximum minute shown when using
+ * {@link #autoScaleVisibleHoursOfDay()}.
+ */
+ private Integer maxTimeInMinutes;
+
private Integer customFirstDayOfWeek;
/**
currentCalendar.setTime(firstDateToShow);
events = getEventProvider().getEvents(firstDateToShow, lastDateToShow);
+ cacheMinMaxTimeOfDay(events);
List<CalendarState.Event> calendarStateEvents = new ArrayList<>();
if (events != null) {
getState().events = calendarStateEvents;
}
+ /**
+ * Stores the minimum and maximum time-of-day in minutes for the events.
+ *
+ * @param events
+ * A list of calendar events. Can be <code>null</code>.
+ */
+ private void cacheMinMaxTimeOfDay(List<CalendarEvent> events) {
+ minTimeInMinutes = null;
+ maxTimeInMinutes = null;
+ if (events != null) {
+ for (CalendarEvent event : events) {
+ int minuteOfDayStart = getMinuteOfDay(event.getStart());
+ int minuteOfDayEnd = getMinuteOfDay(event.getEnd());
+ if (minTimeInMinutes == null) {
+ minTimeInMinutes = minuteOfDayStart;
+ maxTimeInMinutes = minuteOfDayEnd;
+ } else {
+ if (minuteOfDayStart < minTimeInMinutes) {
+ minTimeInMinutes = minuteOfDayStart;
+ }
+ if (minuteOfDayEnd > maxTimeInMinutes) {
+ maxTimeInMinutes = minuteOfDayEnd;
+ }
+ }
+ }
+ }
+ }
+
+ private static int getMinuteOfDay(Date date) {
+ java.util.Calendar calendar = java.util.Calendar.getInstance();
+ calendar.setTime(date);
+ return calendar.get(java.util.Calendar.HOUR_OF_DAY) * 60
+ + calendar.get(java.util.Calendar.MINUTE);
+ }
+
+ /**
+ * Sets the displayed start and end time to fit all current events that were
+ * retrieved from the last call to getEvents().
+ * <p>
+ * If no events exist, nothing happens.
+ * <p>
+ * <b>NOTE: triggering this method only does this once for the current
+ * events - events that are not in the current visible range, are
+ * ignored!</b>
+ *
+ * @see #setFirstVisibleHourOfDay(int)
+ * @see #setLastVisibleHourOfDay(int)
+ */
+ public void autoScaleVisibleHoursOfDay() {
+ if (minTimeInMinutes != null) {
+ setFirstVisibleHourOfDay(minTimeInMinutes / 60);
+ // Do not show the final hour if last minute ends on it
+ setLastVisibleHourOfDay((maxTimeInMinutes - 1) / 60);
+ }
+ }
+
+ /**
+ * Resets the {@link #setFirstVisibleHourOfDay(int)} and
+ * {@link #setLastVisibleHourOfDay(int)} to the default values, 0 and 23
+ * respectively.
+ *
+ * @see #autoScaleVisibleHoursOfDay()
+ * @see #setFirstVisibleHourOfDay(int)
+ * @see #setLastVisibleHourOfDay(int)
+ */
+ public void resetVisibleHoursOfDay() {
+ setFirstVisibleHourOfDay(0);
+ setLastVisibleHourOfDay(23);
+ }
+
private void setupDaysAndActions() {
// Make sure we have a up-to-date locale
initCalendarWithLocale();
* requested by the dates set by {@link #setStartDate(Date)} and
* {@link #setEndDate(Date)}.
* </p>
+ * You can use {@link #autoScaleVisibleHoursOfDay()} for automatic scaling
+ * of the visible hours based on current events.
*
* @param firstHour
* the first hour of the day to show, between 0 and 23
+ * @see #autoScaleVisibleHoursOfDay()
*/
public void setFirstVisibleHourOfDay(int firstHour) {
if (this.firstHour != firstHour && firstHour >= 0 && firstHour <= 23
* requested by the dates set by {@link #setStartDate(Date)} and
* {@link #setEndDate(Date)}.
* </p>
+ * You can use {@link #autoScaleVisibleHoursOfDay()} for automatic scaling
+ * of the visible hours based on current events.
*
* @param lastHour
* the first hour of the day to show, between 0 and 23
+ * @see #autoScaleVisibleHoursOfDay()
*/
public void setLastVisibleHourOfDay(int lastHour) {
if (this.lastHour != lastHour && lastHour >= 0 && lastHour <= 23
*/
@Override
public List<CalendarEvent> getEvents(Date startDate, Date endDate) {
- return getEventProvider().getEvents(startDate, endDate);
+ List<CalendarEvent> events = getEventProvider().getEvents(startDate,
+ endDate);
+ cacheMinMaxTimeOfDay(events);
+ return events;
}
/*
import java.util.Date;
import java.util.List;
+import java.util.Locale;
+import java.util.TimeZone;
+import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
// Use a container data source
calendar.setEventProvider(new ContainerEventProvider(
- new BeanItemContainer<BasicEvent>(BasicEvent.class)));
+ new BeanItemContainer<>(BasicEvent.class)));
// Start and end dates to query for
java.util.Calendar cal = java.util.Calendar.getInstance();
// Use a container data source
calendar.setEventProvider(new ContainerEventProvider(
- new BeanItemContainer<BasicEvent>(BasicEvent.class)));
+ new BeanItemContainer<>(BasicEvent.class)));
// Start and end dates to query for
java.util.Calendar cal = java.util.Calendar.getInstance();
}
}
+ @Test
+ public void testAutomaticScaleVisibleHoursOfDay() {
+ BeanItemContainer<CalendarEvent> container = new BeanItemContainer<>(
+ CalendarEvent.class);
+ java.util.Calendar start = java.util.Calendar.getInstance();
+ java.util.Calendar end = java.util.Calendar.getInstance();
+
+ start.set(java.util.Calendar.HOUR_OF_DAY, 8);
+ start.set(java.util.Calendar.MINUTE, 10);
+ // same start and end time
+ container.addBean(
+ new BasicEvent("8:00", "Description 1", start.getTime()));
+
+ start.set(java.util.Calendar.HOUR_OF_DAY, 16);
+ end.set(java.util.Calendar.HOUR_OF_DAY, 18);
+ end.set(java.util.Calendar.MINUTE, 10);
+
+ container.addBean(new BasicEvent("16-18", "Description 2",
+ start.getTime(), end.getTime())); // 16-18
+
+ calendar.setContainerDataSource(container);
+ calendar.setTimeZone(TimeZone.getDefault());
+ calendar.setLocale(Locale.getDefault());
+ calendar.beforeClientResponse(true); // simulate adding to UI
+
+ Assert.assertEquals(0, calendar.getFirstVisibleHourOfDay());
+ Assert.assertEquals(23, calendar.getLastVisibleHourOfDay());
+
+ calendar.autoScaleVisibleHoursOfDay();
+ Assert.assertEquals(8, calendar.getFirstVisibleHourOfDay());
+ Assert.assertEquals(18, calendar.getLastVisibleHourOfDay());
+
+ // reset visible timing to something else, so that the added event is
+ // not filtered out
+ calendar.resetVisibleHoursOfDay();
+ calendar.beforeClientResponse(false); // simulate being attached
+
+ Assert.assertEquals(0, calendar.getFirstVisibleHourOfDay());
+ Assert.assertEquals(23, calendar.getLastVisibleHourOfDay());
+
+ start.set(java.util.Calendar.HOUR_OF_DAY, 5);
+ end.set(java.util.Calendar.HOUR_OF_DAY, 21);
+ container.addBean(new BasicEvent("05-21", "Description 3",
+ start.getTime(), end.getTime())); // 05-21
+
+ calendar.beforeClientResponse(false); // simulate being attached
+ calendar.autoScaleVisibleHoursOfDay();
+ Assert.assertEquals(5, calendar.getFirstVisibleHourOfDay());
+ Assert.assertEquals(21, calendar.getLastVisibleHourOfDay());
+ }
+
private static Indexed createTestBeanItemContainer() {
- BeanItemContainer<CalendarEvent> eventContainer = new BeanItemContainer<CalendarEvent>(
+ BeanItemContainer<CalendarEvent> eventContainer = new BeanItemContainer<>(
CalendarEvent.class);
java.util.Calendar cal = java.util.Calendar.getInstance();
for (int i = 1; i <= 10; i++) {