====== TP4.5 ====== Pour aller plus loin. ===== Gestion des checkBox ===== Manque le changement de UserInterface et TodoListUI pour renvoyer l'objet TodoItemUI quand on ajoute un élément non ? === TodoItem.java ==== package com.mco; import java.util.Date; public class TodoItem { private String name; private Date creation; private Date doneDate; public TodoItem(String name) { this.name = name; creation = new Date(); doneDate = null; } public String getName() { return name; } public Date getCreation() { return creation; } public Date getDoneDate() { return doneDate; } public void done(boolean ok) { if (ok) { doneDate = new Date(); } else { doneDate = null; } } public boolean isDone() { return doneDate != null; } } === TodoItemUI.java ==== package com.mco; import javafx.scene.Group; import javafx.scene.control.CheckBox; import javafx.scene.layout.HBox; import javafx.scene.text.Text; import java.util.Date; public class TodoItemUI { private Group root; private CheckBox checkBox; private Text isDone; public TodoItemUI(TodoItem item) { root = new Group(); checkBox = new CheckBox(); isDone = new Text("TBD"); if (item.isDone()) { isDone.setText(item.getDoneDate().toString()); } HBox hBox = new HBox(20); hBox.getChildren().addAll( new Text(item.getName()), new Text(item.getCreation().toString()), checkBox, isDone ); root.getChildren().add(hBox); } public void setDoneDate(Date doneDate) { if (doneDate == null) { isDone.setText("TBD"); } else { isDone.setText(doneDate.toString()); } } public Group getRoot() { return root; } public CheckBox getCheckBox() { return checkBox; } } === ControllerLine.java ==== package com.mco; import javafx.event.ActionEvent; public class ControllerLine { private TodoItem todoItem; private TodoItemUI todoItemUI; public ControllerLine(TodoItem todoItem, TodoItemUI todoItemUI) { this.todoItem = todoItem; this.todoItemUI = todoItemUI; todoItemUI.getCheckBox().setOnAction(this::handleCheck); } public void handleCheck(ActionEvent actionEvent) { todoItem.done(todoItemUI.getCheckBox().isSelected()); todoItemUI.setDoneDate(todoItem.getDoneDate()); } } === Controller.java ==== package com.mco; import javafx.event.ActionEvent; import javafx.scene.control.Button; import java.util.ArrayList; public class Controller { private ArrayList model; private UserInterface vue; public Controller(ArrayList model, UserInterface vue) { this.model = model; this.vue = vue; Button button = vue.getAddButton(); button.setOnAction(this::handleButtonAdd); } private void handleButtonAdd(ActionEvent actionEvent) { String todoItemText = vue.getTodoItemInput().getText(); if (!todoItemText.equals("")) { TodoItem item = new TodoItem(todoItemText); model.add(item); TodoItemUI itemUI = vue.addTodoItem(item); new ControllerLine(item, itemUI); vue.setNumberTotalItem(model.size()); } } } ===== Summary ===== === SummaryUI.java === package com.mco; import javafx.scene.Group; import javafx.scene.layout.HBox; import javafx.scene.text.Text; public class SummaryUI { private Group root; private Text totalItem; private Text doneItem; private int numberTotalItem; private int numberDoneItem; public SummaryUI() { root = new Group(); numberTotalItem = 0; numberDoneItem = 0; totalItem = new Text(); Text text = new Text("Total item:"); HBox hBoxNumberItem = new HBox(10); hBoxNumberItem.getChildren().addAll(text, totalItem); totalItem.setText(String.valueOf(numberTotalItem)); doneItem = new Text(); text = new Text("Done item:"); hBoxNumberItem.getChildren().addAll(text, doneItem); doneItem.setText(String.valueOf(numberDoneItem)); root.getChildren().add(hBoxNumberItem); } public Group getRoot() { return root; } public void setNumberTotalItem(int numberTotalItem) { this.numberTotalItem = numberTotalItem; totalItem.setText(String.valueOf(numberTotalItem)); } public void setNumberDoneItem(int numberDoneItem) { this.numberDoneItem = numberDoneItem; doneItem.setText(String.valueOf(numberDoneItem)); } } === UserInterface.java === On a juste ajouté une méthode permettant d'accéder à ''setNumberDoneItem'' de ''SummaryUI'' public void setNumberDoneItem(int numberTotalItem) { summaryUI.setNumberDoneItem(numberTotalItem); } === ControllerLine.java === Ajout d'une référence au controller qui possède maintenant une méthode update. package com.mco; import javafx.event.ActionEvent; public class ControllerLine { private TodoItem todoItem; private TodoItemUI todoItemUI; private Controller controller; public ControllerLine(TodoItem todoItem, TodoItemUI todoItemUI, Controller controller) { this.todoItem = todoItem; this.todoItemUI = todoItemUI; this.controller = controller; todoItemUI.getCheckBox().setOnAction(this::handleCheck); } public void handleCheck(ActionEvent actionEvent) { todoItem.done(todoItemUI.getCheckBox().isSelected()); todoItemUI.setDoneDate(todoItem.getDoneDate()); controller.update(); } } === Controller.java === Ajout d'une méthode update qui pourra être utilisé à chaque fois que le modèle change. package com.mco; import javafx.event.ActionEvent; import javafx.scene.control.Button; import java.util.ArrayList; public class Controller { private ArrayList model; private UserInterface vue; public Controller(ArrayList model, UserInterface vue) { this.model = model; this.vue = vue; Button button = vue.getAddButton(); button.setOnAction(this::handleButtonAdd); } private void handleButtonAdd(ActionEvent actionEvent) { String todoItemText = vue.getTodoItemInput().getText(); if (!todoItemText.equals("")) { TodoItem item = new TodoItem(todoItemText); model.add(item); TodoItemUI itemUI = vue.addTodoItem(item); new ControllerLine(item, itemUI, this); update(); } } public void update() { vue.setNumberTotalItem(model.size()); int count = 0; for (TodoItem item: model) { if (item.isDone()) { count += 1; } } vue.setNumberDoneItem(count); } }