diff --git a/app/src/main/java/org/cutem/cutecalendar/presenter/NewTodoItemStrategy.java b/app/src/main/java/org/cutem/cutecalendar/presenter/NewTodoItemStrategy.java index deb996e..226576b 100644 --- a/app/src/main/java/org/cutem/cutecalendar/presenter/NewTodoItemStrategy.java +++ b/app/src/main/java/org/cutem/cutecalendar/presenter/NewTodoItemStrategy.java @@ -1,138 +1,192 @@ package org.cutem.cutecalendar.presenter; -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import javafx.fxml.FXMLLoader; -import javafx.scene.Parent; -import javafx.scene.Scene; -import javafx.scene.control.Button; +import javafx.beans.property.StringProperty; import javafx.scene.control.ChoiceBox; -import javafx.scene.control.TextArea; -import javafx.scene.control.TextField; import javafx.stage.Stage; import org.cutem.cutecalendar.model.TodoItem; import org.cutem.cutecalendar.model.TodoItemFactory; +import org.cutem.cutecalendar.model.TodoItemManager; +import org.cutem.cutecalendar.model.TodoItemUtil; import org.cutem.cutecalendar.util.CalendarUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.io.IOException; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collection; +import java.util.HashMap; + +import static org.cutem.cutecalendar.model.TodoItem.*; /** * @author akasakaisami */ public class NewTodoItemStrategy { - private static final String FXML_FILE = "fxml/addTodoItemStage.fxml"; - private Parent root; - private ChoiceBox typeChoicebox; - private TextField titleInput; - private TextField bgnInput; - private TextField endInput; - private TextField locationInput; - private TextField personnelInput; - private TextArea descriptionInput; - private Button finish; - private Button cancel; - private Stage addStage; - private Presenter mPresenter; - private ClassLoader mClassLoader = getClass().getClassLoader(); - public NewTodoItemStrategy() { - initialize(); + + private Presenter mPresenter; + + private TodoItem mNowParent; + + public Stage newItemStage; + public ChoiceBox typeBox; + public HashMap props = new HashMap<>(); + + public void initialize() { } + + private boolean checkFormation(@NotNull String name, @NotNull String value) { + switch (name) { + case "begin": + case "end": + case ALARM_START: { + return CalendarUtil.isValidCalendarString(value); + } + case REPEAT_WEEKS: { + return value.matches("\\d+"); + } + case ALARM_INTERVAL: { + return TodoItemUtil.isValidAlarmIntString(value); + } + case ALARM_METHOD: { + return value.equals("area") || value.equals("dialog") || value.equals("none"); + } + default: { + return true; + } + } + } + + private boolean checkConflict(@Nullable TodoItem parent, @NotNull TodoItem newItem) { + if (parent != null && !TodoItemUtil.canBind(parent, newItem)) { + return false; + } + + Collection items = TodoItemManager.getInstance().getItems(); + + for (TodoItem item : items) { + if (parent != null && !item.equals(parent)) { + if (TodoItemUtil.isIntersectedConflict(item, newItem)) { + return false; + } + } + } + + return true; + } + + + private void onClickClose() { + newItemStage.close(); + } + + private void onClickFinish() { + TodoItemFactory factory = new TodoItemFactory(); + + Calendar c1 = null; + Calendar c2 = null; + String title = ""; + + for (String key : props.keySet()) { + String value = props.get(key).getValue().trim(); + if (key.equals(TITLE)) { + title = value; + } + + if (value.length() <= 0) { + continue; + } + + if (!checkFormation(key, value)) { + mPresenter.showAlert(0, key + " bad formatted"); + return; + } else { + switch (key) { + case "begin": + c1 = CalendarUtil.constructCalendar(value); + break; + case "end": + c2 = CalendarUtil.constructCalendar(value); + break; + case "personnel": + String[] slices = value.split("[;,]"); + factory.personnel(Arrays.asList(slices)); + break; + default: + factory.stringProperties(key, value); + break; + } + } + } + + if (title.length() <= 0) { + mPresenter.showAlert(0, "plz give me a title"); + return; + } + + if ((c1 == null && c2 == null)) { + int type = typeBox.getValue(); + if (type != OTHERS) { + mPresenter.showAlert(0, "plz finish the time blank"); + return; + } else if (mNowParent != null) { + mPresenter.showAlert(0, "cannot add this to-do item without time"); + return; + } else { + mPresenter.addTimelessItem(title); + } + } else if (c1 == null || c2 == null) { + mPresenter.showAlert(0, "plz finish the time blank"); + return; + } else if (c2.before(c1)) { + mPresenter.showAlert(0, "begin time after the end time"); + return; + } else { + int type = typeBox.getValue(); + factory.type(type); + + TodoItem newItem = factory.build(); + + if (!checkConflict(mNowParent, newItem)) { + if (mNowParent != null) { + TodoItem[] tItems = TodoItemUtil.bind(mNowParent, newItem); + mPresenter.addTodoItem(tItems); + } else { + mPresenter.addTodoItem(newItem); + } + } + } + + + onClickClose(); + } + + + private void clear() { + typeBox.setValue(OTHERS); + props.forEach((k, v) -> v.setValue("")); + } + + + // region Presenter new to-do item + public void attachPresenter(@NotNull Presenter presenter) { mPresenter = presenter; } - private void initialize() { - root = null; - try { - root = FXMLLoader.load(mClassLoader.getResource(FXML_FILE)); - } catch (IOException e) { - // impossible - } - Scene scene = new Scene(root, 600, 400); - addStage = new Stage(); - addStage.setScene(scene); - addStage.setTitle("Add a Todo Item"); - - - ObservableList ways = FXCollections.observableArrayList(); - ways.add("Conference"); - ways.add("Dates"); - ways.add("Others"); - - typeChoicebox = (ChoiceBox) root.lookup("#typeChoicebox"); - typeChoicebox.setItems(ways); - typeChoicebox.setValue("Conference"); - - titleInput = (TextField) root.lookup("#titleInput"); - bgnInput = (TextField) root.lookup("#bgnInput"); - endInput = (TextField) root.lookup("#endInput"); - locationInput = (TextField) root.lookup("#locationInput"); - personnelInput = (TextField) root.lookup("#personnelInput"); - descriptionInput = (TextArea) root.lookup("#descriptionInput"); - - finish = (Button) root.lookup("#finish"); - cancel = (Button) root.lookup("#cancel"); - - finish.setOnAction(e -> { - String title = titleInput.getText(); - String bgn = bgnInput.getText(); - String end = endInput.getText(); - String location = locationInput.getText(); - String personnel = personnelInput.getText(); - String description = descriptionInput.getText(); - - // if (title.equals("") || location.equals("") || personnel.equals("") || description.equals("")) { - // // mPresenter.showAlert(0, "Fail:You have some empty inputs."); - // // return; - // } else - if (!CalendarUtil.isValidCalendarString(bgn) || !CalendarUtil.isValidCalendarString(end)) { - mPresenter.showAlert(0, "Fail:Your CalendarString input is invalid."); - return; - } - - TodoItemFactory factory = new TodoItemFactory(); - - int type = typeChoicebox.getValue().equals("Conference") ? 1 : typeChoicebox.getValue().equals("Dates") ? 2 : 3; - String[] persons = personnel.split(","); - for (String p : persons) { - factory.personnel(p); - } - - factory.stringProperties(TodoItem.TITLE, title) - .beginTime(CalendarUtil.constructCalendar(bgn)) - .endTime(CalendarUtil.constructCalendar(end)) - .type(type) - .stringProperties(TodoItem.LOCATION, location) - .stringProperties(TodoItem.DESCRIPTION, description); - - try { - TodoItem newItem = factory.build(); - mPresenter.addTodoItem(newItem); - mPresenter.showAlert(0, "Succeed"); - addStage.close(); - } catch (IllegalStateException ex) { - mPresenter.showAlert(0, "fail"); - } - }); - - cancel.setOnAction(e -> { - addStage.close(); - }); - } - - public void showNewTodoItemStage() { - titleInput.setText(""); - bgnInput.setText(""); - endInput.setText(""); - locationInput.setText(""); - personnelInput.setText(""); - descriptionInput.setText(""); - - addStage.show(); + mNowParent = null; + clear(); + newItemStage.show(); } + public void showNewChildTodoItemStage(@NotNull TodoItem parent) { + mNowParent = parent; + clear(); + newItemStage.show(); + } + + // endregion Presenter new to-do item + } diff --git a/app/src/main/java/org/cutem/cutecalendar/presenter/OldNewTodoItemStrategy.java b/app/src/main/java/org/cutem/cutecalendar/presenter/OldNewTodoItemStrategy.java new file mode 100644 index 0000000..aac92af --- /dev/null +++ b/app/src/main/java/org/cutem/cutecalendar/presenter/OldNewTodoItemStrategy.java @@ -0,0 +1,138 @@ +package org.cutem.cutecalendar.presenter; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.ChoiceBox; +import javafx.scene.control.TextArea; +import javafx.scene.control.TextField; +import javafx.stage.Stage; +import org.cutem.cutecalendar.model.TodoItem; +import org.cutem.cutecalendar.model.TodoItemFactory; +import org.cutem.cutecalendar.util.CalendarUtil; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; + +/** + * @author akasakaisami + */ +public class OldNewTodoItemStrategy { + private static final String FXML_FILE = "fxml/addTodoItemStage.fxml"; + private Parent root; + private ChoiceBox typeChoicebox; + private TextField titleInput; + private TextField bgnInput; + private TextField endInput; + private TextField locationInput; + private TextField personnelInput; + private TextArea descriptionInput; + private Button finish; + private Button cancel; + private Stage addStage; + private Presenter mPresenter; + private ClassLoader mClassLoader = getClass().getClassLoader(); + + public OldNewTodoItemStrategy() { + initialize(); + } + + public void attachPresenter(@NotNull Presenter presenter) { + mPresenter = presenter; + } + + private void initialize() { + root = null; + try { + root = FXMLLoader.load(mClassLoader.getResource(FXML_FILE)); + } catch (IOException e) { + // impossible + } + Scene scene = new Scene(root, 600, 400); + addStage = new Stage(); + addStage.setScene(scene); + addStage.setTitle("Add a Todo Item"); + + + ObservableList ways = FXCollections.observableArrayList(); + ways.add("Conference"); + ways.add("Dates"); + ways.add("Others"); + + typeChoicebox = (ChoiceBox) root.lookup("#typeChoicebox"); + typeChoicebox.setItems(ways); + typeChoicebox.setValue("Conference"); + + titleInput = (TextField) root.lookup("#titleInput"); + bgnInput = (TextField) root.lookup("#bgnInput"); + endInput = (TextField) root.lookup("#endInput"); + locationInput = (TextField) root.lookup("#locationInput"); + personnelInput = (TextField) root.lookup("#personnelInput"); + descriptionInput = (TextArea) root.lookup("#descriptionInput"); + + finish = (Button) root.lookup("#finish"); + cancel = (Button) root.lookup("#cancel"); + + finish.setOnAction(e -> { + String title = titleInput.getText(); + String bgn = bgnInput.getText(); + String end = endInput.getText(); + String location = locationInput.getText(); + String personnel = personnelInput.getText(); + String description = descriptionInput.getText(); + + // if (title.equals("") || location.equals("") || personnel.equals("") || description.equals("")) { + // // mPresenter.showAlert(0, "Fail:You have some empty inputs."); + // // return; + // } else + if (!CalendarUtil.isValidCalendarString(bgn) || !CalendarUtil.isValidCalendarString(end)) { + mPresenter.showAlert(0, "Fail:Your CalendarString input is invalid."); + return; + } + + TodoItemFactory factory = new TodoItemFactory(); + + int type = typeChoicebox.getValue().equals("Conference") ? 1 : typeChoicebox.getValue().equals("Dates") ? 2 : 3; + String[] persons = personnel.split(","); + for (String p : persons) { + factory.personnel(p); + } + + factory.stringProperties(TodoItem.TITLE, title) + .beginTime(CalendarUtil.constructCalendar(bgn)) + .endTime(CalendarUtil.constructCalendar(end)) + .type(type) + .stringProperties(TodoItem.LOCATION, location) + .stringProperties(TodoItem.DESCRIPTION, description); + + try { + TodoItem newItem = factory.build(); + mPresenter.addTodoItem(newItem); + mPresenter.showAlert(0, "Succeed"); + addStage.close(); + } catch (IllegalStateException ex) { + mPresenter.showAlert(0, "fail"); + } + }); + + cancel.setOnAction(e -> { + addStage.close(); + }); + } + + + public void showNewTodoItemStage() { + titleInput.setText(""); + bgnInput.setText(""); + endInput.setText(""); + locationInput.setText(""); + personnelInput.setText(""); + descriptionInput.setText(""); + + addStage.show(); + } + +} diff --git a/app/src/main/java/org/cutem/cutecalendar/presenter/Presenter.java b/app/src/main/java/org/cutem/cutecalendar/presenter/Presenter.java index ec3e589..4477213 100644 --- a/app/src/main/java/org/cutem/cutecalendar/presenter/Presenter.java +++ b/app/src/main/java/org/cutem/cutecalendar/presenter/Presenter.java @@ -200,9 +200,11 @@ public abstract class Presenter { } - protected final void addTodoItem(@NotNull TodoItem item) { - manager.add(item); - addAlarm(item); + protected final void addTodoItem(@NotNull TodoItem... items) { + for (TodoItem item : items) { + manager.add(item); + addAlarm(item); + } save(); repaint(); }