diff --git a/todolist/core/src/main/java/todolist/core/TodoList.java b/todolist/core/src/main/java/todolist/core/TodoList.java index 84e783d09adb8115961c60b70bef220866807b03..405d438c30f6fb055f737020b484c48463031a87 100644 --- a/todolist/core/src/main/java/todolist/core/TodoList.java +++ b/todolist/core/src/main/java/todolist/core/TodoList.java @@ -119,6 +119,12 @@ public class TodoList extends AbstractTodoList { private class TodoListItem extends TodoItem { + @Override + public String toString() { + return String.format("[TodoItem text=%s checked=%s deadline=%s @ %s]", getText(), isChecked(), + getDeadline(), items.indexOf(this)); + } + TodoList getTodoList() { return TodoList.this; } diff --git a/todolist/core/src/main/java/todolist/core/TodoModel.java b/todolist/core/src/main/java/todolist/core/TodoModel.java index 03dc70ba9eb29b1ed0429825424daef7c768a962..7ed212ce15ba965fb87b5406fd543dc4a26b581c 100644 --- a/todolist/core/src/main/java/todolist/core/TodoModel.java +++ b/todolist/core/src/main/java/todolist/core/TodoModel.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.function.Function; import todolist.core.TodoSettings.TodoItemsSortOrder; @@ -23,13 +24,28 @@ public class TodoModel implements Iterable<AbstractTodoList> { this.settings = settings; } - private Map<String, AbstractTodoList> todoLists = new LinkedHashMap<>(); + private List<AbstractTodoList> todoLists = new ArrayList<>(); @Override public String toString() { return String.format("[TodoModel #todoLists=%s]", todoLists.size()); } + /** + * Find the position of a TodoList with the provided name. + * + * @param name the name + * @return the index of the TodoList with the provided name, or -1 + */ + private int indexOfTodoList(String name) { + for (int i = 0; i < todoLists.size(); i++) { + if (name.equals(todoLists.get(i).getName())) { + return i; + } + } + return -1; + } + /** * Checks if this TodoModel already has a TodoList with the provided name. * @@ -37,7 +53,7 @@ public class TodoModel implements Iterable<AbstractTodoList> { * @return true if a TodoList with the provided name exists, false otherwise */ public boolean hasTodoList(String name) { - return todoLists.containsKey(name); + return indexOfTodoList(name) < 0; } /** @@ -60,16 +76,18 @@ public class TodoModel implements Iterable<AbstractTodoList> { if (! isValidTodoListName(list.getName())) { throw new IllegalArgumentException(list.getName() + " is not a legal name for a new list"); } - todoLists.put(list.getName(), list); + if (! todoLists.contains(list)) { + todoLists.add(list); + } } public void removeTodoList(AbstractTodoList list) { - todoLists.remove(list.getName()); + todoLists.remove(list); } @Override public Iterator<AbstractTodoList> iterator() { - return todoLists.values().iterator(); + return todoLists.iterator(); } /** @@ -79,7 +97,12 @@ public class TodoModel implements Iterable<AbstractTodoList> { * @return the TodoList with the provided name */ public AbstractTodoList getTodoList(String name) { - return todoLists.get(name); + for (var list : todoLists) { + if (name.equals(list.getName())) { + return list; + } + } + return null; } /** @@ -89,7 +112,15 @@ public class TodoModel implements Iterable<AbstractTodoList> { * @return the replaced TodoList, or null */ public AbstractTodoList putTodoList(AbstractTodoList todoList) { - return todoLists.put(todoList.getName(), todoList); + int pos = indexOfTodoList(todoList.getName()); + if (pos >= 0) { + var oldTodoList = todoLists.get(pos); + todoLists.set(pos, todoList); + return oldTodoList; + } else { + todoLists.add(todoList); + return null; + } } private static Collection<TodoItem> todoItemsProviderHelper(TodoList todoList, diff --git a/todolist/fxui/src/main/java/todolist/ui/TodoListController.java b/todolist/fxui/src/main/java/todolist/ui/TodoListController.java index 61a0ae42acbe1084466b89b4648f1ab7b73052a1..0c6890b36f82b7bf2e92dca1aba4d28c13738531 100644 --- a/todolist/fxui/src/main/java/todolist/ui/TodoListController.java +++ b/todolist/fxui/src/main/java/todolist/ui/TodoListController.java @@ -8,7 +8,6 @@ import java.util.function.Predicate; import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.control.Button; -import javafx.scene.control.ContextMenu; import javafx.scene.control.ListCell; import javafx.scene.control.ListView; import javafx.scene.control.MenuItem; diff --git a/todolist/fxui/src/main/java/todolist/ui/TodoModelController.java b/todolist/fxui/src/main/java/todolist/ui/TodoModelController.java index 87b5658683ca951109eab97a0e55d7016f4d83a4..596972fa597d9ac45465a0bb28e3096e68ac147a 100644 --- a/todolist/fxui/src/main/java/todolist/ui/TodoModelController.java +++ b/todolist/fxui/src/main/java/todolist/ui/TodoModelController.java @@ -81,7 +81,7 @@ public class TodoModelController implements TodoSettingsListener { todoListsView.setEditable(true); todoListsView.valueProperty().addListener((prop, oldName, newName) -> { // System.out.println("valueProperty: -> " - // + todoListsView.getSelectionModel().getSelectedIndex() + " -> " + // + todoListsView.getSelectionModel().getSelectedItem() + " @ " + todoListsView.getSelectionModel().getSelectedIndex() + " -> " // + (oldName != null ? ("\"" + oldName + "\"") : null) + " -> " // + (newName != null ? ("\"" + newName + "\"") : null)); if (newName != null && (! todoModelAccess.isValidTodoListName(newName))) {