====== 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);
}
}