package ru.khasang.cachoeira.model;
import javafx.beans.Observable;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import java.time.LocalDate;
/**
* Класс описывающий проект.
*/
public class Project implements IProject {
private StringProperty name = new SimpleStringProperty(this, "name");
private ObjectProperty<LocalDate> startDate = new SimpleObjectProperty<>(this, "startDate");
private ObjectProperty<LocalDate> finishDate = new SimpleObjectProperty<>(this, "finishDate");
private StringProperty description = new SimpleStringProperty(this, "description");
private ObservableList<ITask> tasks = FXCollections.observableArrayList(this::setObservableTaskFields);
private ObservableList<IResource> resources = FXCollections.observableArrayList(this::setObservableResourceFields);
public Project() {
}
public Project(String name) {
this.name.set(name);
}
public Project(String name, LocalDate startDate, LocalDate finishDate, String description) {
this.name.setValue(name);
this.startDate.setValue(startDate);
this.finishDate.setValue(finishDate);
this.description.setValue(description);
}
@Override
public final String getName() {
return name.get();
}
@Override
public final void setName(String name) {
this.name.set(name);
}
@Override
public final StringProperty nameProperty() {
return name;
}
@Override
public final LocalDate getStartDate() {
return startDate.get();
}
@Override
public final void setStartDateAndVerify(LocalDate startDate) {
this.startDate.set(startDate);
if (finishDate.getValue() != null) {
if (startDate.isEqual(finishDate.getValue()) || startDate.isAfter(finishDate.getValue())) {
finishDate.setValue(startDate.plusDays(1));
}
}
}
@Override
public final ObjectProperty<LocalDate> startDateProperty() {
return startDate;
}
@Override
public final LocalDate getFinishDate() {
return finishDate.get();
}
@Override
public final void setFinishDateAndVerify(LocalDate finishDate) {
this.finishDate.set(finishDate);
if (startDate.getValue() != null) {
if (finishDate.isEqual(startDate.getValue()) || finishDate.isBefore(startDate.getValue())) {
startDate.setValue(finishDate.minusDays(1));
}
}
}
@Override
public final ObjectProperty<LocalDate> finishDateProperty() {
return finishDate;
}
@Override
public final ObservableList<ITask> getTaskList() {
return tasks;
}
@Override
public final void setTaskList(ObservableList<ITask> tasks) {
this.tasks = tasks;
}
@Override
public final ObservableList<IResource> getResourceList() {
return resources;
}
@Override
public final void setResourceList(ObservableList<IResource> resources) {
this.resources = resources;
}
@Override
public final String getDescription() {
return description.get();
}
@Override
public final void setDescription(String description) {
this.description.set(description);
}
@Override
public final StringProperty descriptionProperty() {
return description;
}
private Observable[] setObservableTaskFields(ITask task) {
return new Observable[]{
task.nameProperty(),
task.startDateProperty(),
task.finishDateProperty(),
task.donePercentProperty(),
task.costProperty(),
task.getParentTasks(),
task.getChildTasks(),
task.groupProperty(),
task.getResourceList(),
task.descriptionProperty()
};
}
private Observable[] setObservableResourceFields(IResource resource) {
return new Observable[]{
resource.nameProperty(),
resource.resourceTypeProperty(),
resource.emailProperty(),
resource.descriptionProperty()
};
}
}