/*******************************************************************************
* Copyright (c) 2011-2014 Fernando Petrola
*
* This file is part of Dragome SDK.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
******************************************************************************/
package com.dragome.examples.todo.model;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import com.dragome.forms.bindings.builders.LocalStorage;
import com.dragome.forms.bindings.builders.Tester;
public class TodoManager
{
private List<Todo> todos= new ArrayList<Todo>();
private String newTodo= "";
private Todo editedTodo;
private String location= "/";
private Todo originalTodo;
private Tester<Todo> statusFilter;
private boolean allChecked;
private long completedCount;
private long remainingCount;
private LocalStorage localStorage;
public TodoManager()
{
}
public TodoManager(String location, LocalStorage localStorage)
{
this.localStorage= localStorage;
setTodos(localStorage.load("todos-dragome"));
setLocation(location);
}
public void addTodo()
{
String tempNewTodo= getNewTodo().trim();
if (tempNewTodo.length() == 0)
return;
getTodos().add(new Todo(tempNewTodo, false));
setNewTodo("");
update();
}
private void update()
{
calculate();
setTodos(getTodos());
}
private void calculate()
{
if (getTodos() != null)
{
setRemainingCount(getTodos().stream().filter(t -> !t.isCompleted()).count());
setCompletedCount(getTodos().size() - remainingCount);
allChecked= remainingCount == 0;
}
}
public void clearCompletedTodos()
{
setTodos(getTodos().stream().filter(t -> !t.isCompleted()).collect(Collectors.toList()));
update();
}
public void doneEditing(Todo todo, boolean cancel)
{
if (cancel)
{
todo.setCompleted(originalTodo.isCompleted());
todo.setTitle(originalTodo.getTitle());
}
setEditedTodo(null);
todo.setTitle(todo.getTitle().trim());
if (todo.getTitle().length() == 0)
removeTodo(todo);
}
public void editTodo(Todo todo)
{
setEditedTodo(todo);
originalTodo= new Todo(todo);
setTodos(todos);
}
public long getCompletedCount()
{
return completedCount;
}
public Todo getEditedTodo()
{
return editedTodo;
}
public String getLocation()
{
return location;
}
public String getNewTodo()
{
return newTodo;
}
public Todo getOriginalTodo()
{
return originalTodo;
}
public long getRemainingCount()
{
return remainingCount;
}
public Tester<Todo> getStatusFilter()
{
return statusFilter;
}
public List<Todo> getTodos()
{
return todos;
}
public boolean isAllChecked()
{
return allChecked;
}
public void markAll(boolean completed)
{
getTodos().stream().forEach(t -> t.setCompleted(completed));
}
public void removeTodo(Todo todo)
{
getTodos().remove(todo);
update();
}
public void revertEditing(Todo todo)
{
getTodos().set(getTodos().indexOf(todo), originalTodo);
}
public void setAllChecked(boolean allChecked)
{
this.allChecked= allChecked;
update();
}
public void setCompletedCount(long completedCount)
{
this.completedCount= completedCount;
setTodos(todos);
}
public void setEditedTodo(Todo editedTodo)
{
this.editedTodo= editedTodo;
}
public void setLocation(String location)
{
this.location= location != null ? location : "/";
if (this.location.equals("/"))
setStatusFilter(t -> true);
else if (this.location.equals("/active"))
setStatusFilter(t -> !t.isCompleted());
else if (this.location.equals("/completed"))
setStatusFilter(t -> t.isCompleted());
update();
}
public void setNewTodo(String newTodo)
{
this.newTodo= newTodo;
}
public void setOriginalTodo(Todo originalTodo)
{
this.originalTodo= originalTodo;
}
public void setRemainingCount(long remainingCount)
{
this.remainingCount= remainingCount;
}
public void setStatusFilter(Tester<Todo> statusFilter)
{
this.statusFilter= statusFilter;
update();
}
public void setTodos(List<Todo> todos)
{
if (todos == null)
todos= new ArrayList<Todo>();
this.todos= todos;
localStorage.save("todos-dragome", todos);
}
public void todoCompleted(Todo todo)
{
int i= todo.isCompleted() ? -1 : 1;
setRemainingCount(remainingCount + i);
setCompletedCount(completedCount + (i * -1));
}
}