/******************************************************************************* * 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.view; import static com.dragome.guia.events.listeners.interfaces.KeyListener.KEY_ENTER; import static com.dragome.guia.events.listeners.interfaces.KeyListener.KEY_ESC; import java.util.stream.Stream; import com.dragome.examples.todo.model.Todo; import com.dragome.examples.todo.model.TodoManager; import com.dragome.forms.bindings.builders.ComponentBuilder; import com.dragome.forms.bindings.builders.LocalStorage; import com.dragome.guia.GuiaVisualActivity; import com.dragome.guia.components.interfaces.VisualButton; import com.dragome.guia.components.interfaces.VisualCheckbox; import com.dragome.guia.components.interfaces.VisualLabel; import com.dragome.guia.components.interfaces.VisualLink; import com.dragome.guia.components.interfaces.VisualPanel; import com.dragome.guia.components.interfaces.VisualTextField; import com.dragome.services.ServiceLocator; import com.dragome.web.annotations.PageAlias; @PageAlias(alias= "todo-mvc") public class TodosPage extends GuiaVisualActivity { @PageAlias(alias= "todoManager") private TodoManager todoManager; @PageAlias(alias= "build") public void build() { todoManager= new TodoManager(ServiceLocator.getInstance().getParametersHandler().getFragment(), new LocalStorage()); ComponentBuilder componentBuilder= new ComponentBuilder(mainPanel); componentBuilder.bindTemplate("new-todo").as(VisualTextField.class).toProperty(todoManager::getNewTodo, todoManager::setNewTodo).onKeyUp((v, c) -> todoManager.addTodo(), KEY_ENTER).build(); componentBuilder.bindTemplate("main-section").as(VisualPanel.class).buildChildren(this::buildMainSection); componentBuilder.bindTemplate("footer-section").as(VisualPanel.class).buildChildren(this::buildFooter); } private void buildMainSection(@PageAlias(alias= "mainSectionBuilder") ComponentBuilder mainSectionBuilder) { VisualCheckbox allChecked= mainSectionBuilder.bindTemplate("toggle-all").as(VisualCheckbox.class).toProperty(todoManager::isAllChecked, todoManager::setAllChecked).onClick(v -> todoManager.markAll(!todoManager.isAllChecked())).build(); mainSectionBuilder.show(allChecked).when(() -> !todoManager.getTodos().isEmpty()); mainSectionBuilder.showWhen(() -> !todoManager.getTodos().isEmpty()); mainSectionBuilder.bindTemplate("completed-todo").as(VisualPanel.class).toListProperty(todoManager::getTodos).filter(todoManager::getStatusFilter).repeat(this::buildTodo); } private void buildFooter(ComponentBuilder footerBuilder) { footerBuilder.showWhen(() -> !todoManager.getTodos().isEmpty()); footerBuilder.bindTemplate("items-count").as(VisualLabel.class).toProperty(todoManager::getRemainingCount, todoManager::setRemainingCount).build(); footerBuilder.bindTemplate("items-label").as(VisualLabel.class).to(() -> todoManager.getRemainingCount() == 1 ? "item" : "items").build(); Stream.of("/", "/active", "/completed").forEach(location -> { VisualLink link= footerBuilder.bindTemplate("filter:" + location).as(VisualLink.class).onClick(v1 -> todoManager.setLocation(location)).build(); footerBuilder.style(link).with("selected").when(() -> todoManager.getLocation().equals(location)); }); footerBuilder.bindTemplate("clear-completed").as(VisualPanel.class).onClick(v2 -> todoManager.clearCompletedTodos()).buildChildren(clearCompletedBuilder -> { clearCompletedBuilder.bindTemplate("clear-completed-number").as(VisualLabel.class).toProperty(todoManager::getCompletedCount, todoManager::setCompletedCount).build(); clearCompletedBuilder.showWhen(() -> todoManager.getCompletedCount() > 0); }); } private void buildTodo(Todo todo, ComponentBuilder builder) { builder.bindTemplate("todo-input").as(VisualTextField.class).toProperty(todo::getTitle, todo::setTitle).onKeyUp((v, c) -> todoManager.doneEditing(todo, c == KEY_ESC), KEY_ESC, KEY_ENTER).onBlur(v -> todoManager.doneEditing(todo, false)).build(); builder.bindTemplate("title").as(VisualLabel.class).toProperty(todo::getTitle, todo::setTitle).onDoubleClick(v -> todoManager.editTodo(todo)).build(); builder.bindTemplate("completed").as(VisualCheckbox.class).toProperty(todo::isCompleted, todo::setCompleted).onClick(v -> todoManager.todoCompleted(todo)).build(); builder.bindTemplate("destroy").as(VisualButton.class).onClick(v -> todoManager.removeTodo(todo)).build(); builder.styleWith("completed").when(todo::isCompleted); builder.styleWith("editing").when(() -> todo == todoManager.getEditedTodo()); } }