/* * This file is part of LibrePlan * * Copyright (C) 2009-2010 Fundación para o Fomento da Calidade Industrial e * Desenvolvemento Tecnolóxico de Galicia * Copyright (C) 2010-2012 Igalia, S.L. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.zkoss.ganttz.timetracker.zoom; import org.joda.time.DateTime; import org.joda.time.Days; /** * One of each of the subintervals a time line is divided into. * * @author Francisco Javier Moran Rúa <jmoran@igalia.com> * @author Lorenzo Tilve Álvaro <ltilve@igalia.com> */ public final class DetailItem { private int size; private String name; private boolean even; private boolean bankHoliday; private String bankHolidayWeek; private boolean currentPeriod; private int currentDayOffset; private boolean projectStart = false; private int projectStartOffset = 0; private boolean deadlinePeriod; private int deadlineOffset; private DateTime startDate; private DateTime endDate; public DetailItem(int size, String name, DateTime startDate, DateTime endDate) { this(size, name, false); this.startDate = startDate; this.endDate = endDate; this.markCurrentDay(); } public DetailItem(int size, String name) { this(size, name, false); } public DetailItem(int size, String name, boolean even) { this.size = size; this.name = name; this.even = even; this.currentPeriod = false; this.currentDayOffset = 0; } public DetailItem(int size, String name, int currentdayoffset) { this.size = size; this.name = name; this.even = false; this.bankHoliday = false; this.currentPeriod = true; this.currentDayOffset = currentdayoffset; } public DetailItem(int size, String name, int currentdayoffset, int deadlineoffset) { this(size, name, currentdayoffset); this.deadlinePeriod = true; this.deadlineOffset = deadlineoffset; } public String getBankHolidayWeek() { return bankHolidayWeek; } public void setBankHolidayWeek(String bankHolidayWeek) { this.bankHolidayWeek = bankHolidayWeek; } public void markCurrentDay() { if (this.startDate.isBeforeNow() && this.endDate.isAfterNow()) { int offsetInPx = Math.round( ( (((float) Days.daysBetween(this.startDate, new DateTime()).getDays()) + (float) 0.5) / ((float) Days.daysBetween(this.startDate, this.endDate).getDays()) ) * this.size ); // 1px per column side, 1px for right border and 1px own bg-width this.markCurrentDay(Math.min(this.size - 4, offsetInPx)); } } public void markProjectStart(DateTime projectStart) { if (!this.startDate.isAfter(projectStart) && projectStart.isBefore(endDate)) { int offsetInPx = Math.round( ( ((float) Days.daysBetween(this.startDate, projectStart).getDays()) / ((float) Days.daysBetween(this.startDate, this.endDate).getDays()) ) * this.size); this.markprojectStart(offsetInPx); } } public void markDeadlineDay(DateTime maxdeadline) { DateTime deadline = maxdeadline.plusDays(1); if (!this.startDate.isAfter(deadline) && deadline.isBefore(endDate)) { int offsetInPx = Math.round( ( ((float) Days.daysBetween(this.startDate, deadline).getDays()) / ((float) Days.daysBetween(this.startDate, this.endDate).getDays()) ) * this.size); // 1px per column side, 1px for right border and 1px own bg-width this.markDeadlineDay(Math.min(this.size - 4, offsetInPx)); } } public int getSize() { return size; } public String getName() { return name; } public DateTime getStartDate() { return startDate; } public DateTime getEndDate() { return endDate; } public void setEven(boolean even) { this.even = even; } public void markCurrentDay(int offset) { this.currentPeriod = true; this.currentDayOffset = offset; } public void markDeadlineDay(int offset) { this.deadlinePeriod = true; this.deadlineOffset = offset; } public void markprojectStart(int offset) { this.projectStart = true; this.projectStartOffset = offset; } public boolean isEven() { return even; } public boolean isBankHoliday() { return bankHoliday; } public void setBankHoliday(boolean bankHoliday) { this.bankHoliday = bankHoliday; } public boolean isCurrentPeriod() { return currentPeriod; } public int getCurrentDayOffset() { return currentDayOffset; } public boolean isProjectStart() { return projectStart; } public int getProjectStartOffset() { return projectStartOffset; } public boolean isDeadlinePeriod() { return deadlinePeriod; } public int getDeadlineOffset() { return deadlineOffset; } public String getBackgroundOffset() { String offset = "0px"; if (getCurrentDayOffset() != 0) { if (getDeadlineOffset() != 0) { offset = getDeadlineOffset() + "px"; } else { offset = getCurrentDayOffset() + "px"; } } else if (getDeadlineOffset() != 0) { offset = getDeadlineOffset() + "px"; } return offset; } public void markBankHolidayWeek(String result) { setBankHolidayWeek(result); } public void markBankHoliday() { setBankHoliday(true); } }