/*
GanttProject is an opensource project management tool. License: GPL3
Copyright (C) 2010 Dmitry Barashev
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package biz.ganttproject.core.chart.grid;
import java.util.Date;
import java.util.List;
import com.google.common.base.Function;
import biz.ganttproject.core.calendar.GPCalendar;
import biz.ganttproject.core.time.TimeUnit;
import biz.ganttproject.core.time.TimeUnitStack;
public interface OffsetBuilder {
public static abstract class Factory {
protected TimeUnit myTopUnit;
protected TimeUnit myBottomUnit;
protected TimeUnit myBaseUnit;
protected Date myStartDate;
protected Date myEndDate;
protected int myEndOffset;
protected int myAtomicUnitWidth;
protected float myWeekendDecreaseFactor;
protected GPCalendar myCalendar;
protected int myRightMarginTimeUnits;
protected Date myViewportStartDate;
protected Function<TimeUnit, Float> myOffsetStepFn;
protected Factory() {
}
public Factory withTopUnit(TimeUnit topUnit) {
myTopUnit = topUnit;
return this;
}
public Factory withBottomUnit(TimeUnit bottomUnit) {
myBottomUnit = bottomUnit;
return this;
}
public Factory withStartDate(Date startDate) {
myStartDate = startDate;
return this;
}
public Factory withViewportStartDate(Date viewportStartDate) {
myViewportStartDate = viewportStartDate;
return this;
}
public Factory withEndDate(Date endDate) {
myEndDate = endDate;
return this;
}
public Factory withEndOffset(int endOffset) {
myEndOffset = endOffset;
return this;
}
public Factory withAtomicUnitWidth(int atomicUnitWidth) {
myAtomicUnitWidth = atomicUnitWidth;
return this;
}
public Factory withWeekendDecreaseFactor(float weekendDecreaseFactor) {
myWeekendDecreaseFactor = weekendDecreaseFactor;
return this;
}
public Factory withCalendar(GPCalendar calendar) {
myCalendar = calendar;
return this;
}
public Factory withRightMargin(int rightMarginTimeUnits) {
myRightMarginTimeUnits = rightMarginTimeUnits;
return this;
}
public Factory withOffsetStepFunction(Function<TimeUnit, Float> offsetStepFn) {
myOffsetStepFn = offsetStepFn;
return this;
}
protected void preBuild() {
myBaseUnit = TimeUnitStack.Util.findCommonUnit(myBottomUnit, myTopUnit);
if (myOffsetStepFn == null) {
myOffsetStepFn = new Function<TimeUnit, Float>() {
@Override
public Float apply(TimeUnit value) {
return Float.valueOf(value.getAtomCount(myBaseUnit));
}
};
}
}
public abstract OffsetBuilder build();
}
void constructOffsets(List<Offset> topUnitOffsets, OffsetList bottomUnitOffsets);
}