ItEr15S12RFComportamentoGraficoPlanificadorItEr14S13: Extracted superclass from DetailThreeTimeTrackerState.

TimeTrackerStateUsingJodaTime contains functionality that can be reused.
This commit is contained in:
Óscar González Fernández 2009-07-01 11:49:48 +02:00 committed by Javier Moran Rua
parent 6f1099836b
commit eb34677ef1
2 changed files with 107 additions and 66 deletions

View file

@ -1,87 +1,49 @@
package org.zkoss.ganttz.util.zoom;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.Months;
import org.joda.time.ReadablePeriod;
import org.zkoss.ganttz.util.Interval;
import org.zkoss.util.Locales;
/**
* Zoom level with semesters in the first level and months in the second level
* @author Óscar González Fernández <ogonzalez@igalia.com>
*/
public class DetailThreeTimeTrackerState extends TimeTrackerState {
public class DetailThreeTimeTrackerState extends TimeTrackerStateUsingJodaTime {
public static final DetailThreeTimeTrackerState INSTANCE = new DetailThreeTimeTrackerState();
private static final int FIRST_LEVEL_SIZE = 300;
protected static final int SECOND_LEVEL_SIZE = 50;
private static LocalDate asLocalDate(Date date) {
return new LocalDate(date);
}
public interface IDetailItemCreator {
DetailItem create(DateTime dateTime);
}
public static Collection<DetailItem> createDetails(Interval interval,
ReadablePeriod period, IDetailItemCreator detailItemCreator) {
DateTime current = asLocalDate(interval.getStart())
.toDateTimeAtStartOfDay();
DateTime end = asLocalDate(interval.getFinish())
.toDateTimeAtStartOfDay();
List<DetailItem> result = new ArrayList<DetailItem>();
while (current.isBefore(end)) {
result.add(detailItemCreator.create(current));
current = current.plus(period);
}
return result;
}
private DetailThreeTimeTrackerState() {
}
@Override
protected Collection<DetailItem> createDetailsForFirstLevel(
Interval interval) {
return createDetails(getRealIntervalFor(interval), Months.months(6),
new IDetailItemCreator() {
@Override
public DetailItem create(DateTime dateTime) {
return new DetailItem(FIRST_LEVEL_SIZE,
getYearWithSemesterString(dateTime));
}
});
}
private String getYearWithSemesterString(DateTime dateTime) {
return dateTime.getYear() + ","
+ (dateTime.getMonthOfYear() < 6 ? "H1" : "H2");
protected ReadablePeriod getPeriodFirstLevel() {
return Months.months(6);
}
@Override
protected Collection<DetailItem> createDetailsForSecondLevel(
Interval interval) {
return createDetails(getRealIntervalFor(interval), Months.months(1),
new IDetailItemCreator() {
@Override
public DetailItem create(DateTime dateTime) {
return new DetailItem(SECOND_LEVEL_SIZE,
getMonthString(dateTime));
}
});
protected ReadablePeriod getPeriodSecondLevel() {
return Months.months(1);
}
public LocalDate round(LocalDate date, boolean down) {
@Override
protected IDetailItemCreator getDetailItemCreatorSecondLevel() {
return new IDetailItemCreator() {
@Override
public DetailItem create(DateTime dateTime) {
return new DetailItem(SECOND_LEVEL_SIZE,
getMonthString(dateTime));
}
};
}
@Override
protected LocalDate round(LocalDate date, boolean down) {
if (date.getMonthOfYear() == 1 && date.getDayOfMonth() == 1)
return date;
if (date.getMonthOfYear() == 7 && date.getDayOfMonth() == 1)
@ -95,15 +57,23 @@ public class DetailThreeTimeTrackerState extends TimeTrackerState {
}
}
@Override
public Interval getRealIntervalFor(Interval testInterval) {
LocalDate start = round(asLocalDate(testInterval.getStart()), true);
LocalDate finish = round(asLocalDate(testInterval.getFinish()), false);
return new Interval(start.toDateTimeAtStartOfDay().toDate(), finish
.toDateTimeAtStartOfDay().toDate());
}
private String getMonthString(DateTime dateTime) {
return dateTime.toString("MMM", Locales.getCurrent());
}
}
private String getYearWithSemesterString(DateTime dateTime) {
return dateTime.getYear() + ","
+ (dateTime.getMonthOfYear() < 6 ? "H1" : "H2");
}
@Override
protected IDetailItemCreator getDetailItemCreatorFirstLevel() {
return new IDetailItemCreator() {
@Override
public DetailItem create(DateTime dateTime) {
return new DetailItem(FIRST_LEVEL_SIZE,
getYearWithSemesterString(dateTime));
}
};
}
}

View file

@ -0,0 +1,71 @@
package org.zkoss.ganttz.util.zoom;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.ReadablePeriod;
import org.zkoss.ganttz.util.Interval;
/**
* @author Óscar González Fernández <ogonzalez@igalia.com>
*/
public abstract class TimeTrackerStateUsingJodaTime extends TimeTrackerState {
protected static LocalDate asLocalDate(Date date) {
return new LocalDate(date);
}
public interface IDetailItemCreator {
DetailItem create(DateTime dateTime);
}
public static Collection<DetailItem> createDetails(Interval interval,
ReadablePeriod period, IDetailItemCreator detailItemCreator) {
DateTime current = asLocalDate(interval.getStart())
.toDateTimeAtStartOfDay();
DateTime end = asLocalDate(interval.getFinish())
.toDateTimeAtStartOfDay();
List<DetailItem> result = new ArrayList<DetailItem>();
while (current.isBefore(end)) {
result.add(detailItemCreator.create(current));
current = current.plus(period);
}
return result;
}
@Override
protected Collection<DetailItem> createDetailsForFirstLevel(
Interval interval) {
return createDetails(getRealIntervalFor(interval),
getPeriodFirstLevel(), getDetailItemCreatorFirstLevel());
}
@Override
protected Collection<DetailItem> createDetailsForSecondLevel(
Interval interval) {
return createDetails(getRealIntervalFor(interval),
getPeriodSecondLevel(), getDetailItemCreatorSecondLevel());
}
protected abstract IDetailItemCreator getDetailItemCreatorFirstLevel();
protected abstract ReadablePeriod getPeriodFirstLevel();
protected abstract IDetailItemCreator getDetailItemCreatorSecondLevel();
protected abstract ReadablePeriod getPeriodSecondLevel();
protected abstract LocalDate round(LocalDate date, boolean down);
@Override
public Interval getRealIntervalFor(Interval testInterval) {
LocalDate start = round(asLocalDate(testInterval.getStart()), true);
LocalDate finish = round(asLocalDate(testInterval.getFinish()), false);
return new Interval(start.toDateTimeAtStartOfDay().toDate(), finish
.toDateTimeAtStartOfDay().toDate());
}
}