restricted:mco-2:correction:tp4.5

TP4.5

Pour aller plus loin.

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<TodoItem> model;
    private UserInterface vue;
 
    public Controller(ArrayList<TodoItem> 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());
        }
 
    }
}

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<TodoItem> model;
    private UserInterface vue;
 
    public Controller(ArrayList<TodoItem> 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);
    }
}
  • restricted/mco-2/correction/tp4.5.txt
  • Dernière modification : 2016/03/30 18:21
  • de cchatel