/**
* Copyright 2004 Carlos Silva A.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.csa.lgantt.model;
import java.util.Date;
public class Constraint {
public static final byte MODE_END_BEGIN = 0;
public static final byte MODE_END_END = 1;
public static final byte MODE_BEGIN_BEGIN = 2;
public static final byte MODE_BEGIN_END = 3;
// datos
/**
* Mode
* <ul>
* <li> 1 : EB
* <li> 2 : EE
* <li> 3 : BE
* <li> 4 : BB
* </ul>
*/
protected byte mode;
protected long msDelay;
// asociaciones
protected Task masterTask = null;
protected Task slaveTask = null;
// transientes
// metodos publicos
/**
* Genera un constraint. Ejecuta {@link Task#addConstraint} para terminar de
* anexar
*/
public Constraint(Task master, Task slave) throws GanttException {
masterTask = master;
slaveTask = slave;
slaveTask.addConstraint(this);
}
/**
* Retorna la fecha de partida de la tarea esclava de acuerdo a la
* informacion de la tarea principal.
*
* @return
*/
public Date getStartDate() {
// System.out.println("Constraint.getStartDate() mode="+mode+ " entre
// "+masterTask.getName()+" y "+ slaveTask.getName());
Date start = null;
DateOrganizer dorg = masterTask.project.getDateOrganizer();
switch (mode) {
case MODE_END_BEGIN:
start = masterTask.getFinishDate();
start = dorg.getEndDate(start, msDelay);
break;
case MODE_BEGIN_BEGIN:
start = masterTask.getStartDate();
start = dorg.getEndDate(start, msDelay);
break;
case MODE_END_END:
start = masterTask.getFinishDate();
start = dorg.getEndDate(start, msDelay - slaveTask.getWorkLength());
break;
default: // BEGIN_END
start = masterTask.getStartDate();
start = dorg.getEndDate(start, msDelay - slaveTask.getWorkLength());
}
start = dorg.getNextPossibleStart(start);
// System.out.println(" "+start);
return start;
}
/**
* Remueve el constraint de los hijos y deja este constraint sin uso.
*/
public void remove() {
// Primero se asigna dirty
slaveTask.setDirty();
masterTask.setDirty();
// y luego se remueven sus links
masterTask.childConstraints.remove(this);
slaveTask.constraints.remove(this);
slaveTask.project.sendChange(new ProjectChange(ProjectChange.CONSTRAINT,
slaveTask));
slaveTask = null;
masterTask = null;
}
public Task getMasterTask() {
return masterTask;
}
public Task getSlaveTask() {
return slaveTask;
}
public byte getMode() {
return mode;
}
public void setMode(byte newMode) {
mode = newMode;
slaveTask.setDirty();
slaveTask.project.sendChange(new ProjectChange(ProjectChange.CONSTRAINT,
slaveTask));
}
public long getMsDelay() {
return msDelay;
}
public void setMsDelay(long newDelay) {
msDelay = newDelay;
slaveTask.setDirty();
slaveTask.project.sendChange(new ProjectChange(ProjectChange.CONSTRAINT,
slaveTask));
}
/**
* @return a string using numbers and time units as: 1d 4h 5m
*/
public String getHumanReadableDelay() {
return masterTask.project.getDateOrganizer().getHumanReadableLap(msDelay);
}
/**
* sets the length using abreviations such as: 5w 3d 2h 5m 58s 235S (five
* weeks, 3 days, 2 hours, 5 minutes, fifty eight seconds and two hundred and
* thirty five milliseconds).
*/
public void setHumanReadableDelay(String s) {
setMsDelay(masterTask.project.getDateOrganizer().getLapFromHumanReadable(s));
}
}
|