package net.techreadiness.ui.task;
import java.io.Serializable;
import java.util.List;
import java.util.ListIterator;
import org.apache.commons.collections.PredicateUtils;
import org.apache.commons.collections.list.PredicatedList;
import com.google.common.collect.Lists;
public class TaskFlowState implements Serializable {
private static final long serialVersionUID = 1L;
private List<Task> tasks;
private int index;
private boolean initialized;
public TaskFlowState() {
tasks = PredicatedList.decorate(Lists.newArrayList(), PredicateUtils.notNullPredicate());
}
public void next() {
if (hasNext()) {
ListIterator<Task> currentIterator = getCurrentIterator();
currentIterator.next();
setIndex(currentIterator.nextIndex());
}
}
public void previous() {
if (hasPrevious()) {
setIndex(getCurrentIterator().previousIndex());
}
}
public boolean hasNext() {
if (!isIndexValid()) {
return false;
}
ListIterator<Task> currentIterator = getCurrentIterator();
if (currentIterator.hasNext()) {
currentIterator.next();
}
return currentIterator.hasNext();
}
public boolean hasPrevious() {
if (!isIndexValid()) {
return false;
}
return getCurrentIterator().hasPrevious();
}
public Task getCurrentTask() {
if (!isIndexValid()) {
return null;
}
return getCurrentIterator().next();
}
protected boolean isIndexValid() {
return !(getIndex() < 0 || tasks.isEmpty());
}
protected ListIterator<Task> getCurrentIterator() {
ListIterator<Task> listIterator = getTasks().listIterator(getIndex());
return listIterator;
}
public void setCurrentTask(Task task) {
int newIndex = getTasks().indexOf(task);
if (newIndex == -1) {
return;
}
setIndex(newIndex);
}
public List<Task> getTasks() {
return tasks;
}
public void setTasks(List<Task> tasks) {
this.tasks.clear();
if (tasks != null) {
this.tasks.addAll(tasks);
setIndex(getTasks().listIterator().nextIndex());
}
}
private int getIndex() {
return index;
}
private void setIndex(int index) {
this.index = index;
initialized = false;
}
public boolean isInitialized() {
return initialized;
}
public void initialized() {
initialized = true;
}
}