refactor heavily
This commit is contained in:
parent
6ac0bec9b8
commit
c7a8d43aa8
|
@ -63,12 +63,7 @@ public class NewTodoItemStrategy extends VBox {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
typeBox.setOnAction(e -> {
|
typeBox.setOnAction(e -> onClickTypeBox());
|
||||||
NewItemBuilder.IFactory fac = typeBox.getValue();
|
|
||||||
NewItemBuilder b = fac.construct(mNowParent);
|
|
||||||
setBuilder(b);
|
|
||||||
});
|
|
||||||
|
|
||||||
closeBtn.setOnAction(e -> onClickClose());
|
closeBtn.setOnAction(e -> onClickClose());
|
||||||
finishBtn.setOnAction(e -> onClickFinish());
|
finishBtn.setOnAction(e -> onClickFinish());
|
||||||
}
|
}
|
||||||
|
@ -92,9 +87,11 @@ public class NewTodoItemStrategy extends VBox {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setBuilder(@NotNull NewItemBuilder builder) {
|
private void setBuilder(@Nullable NewItemBuilder builder) {
|
||||||
builderBox.getChildren().clear();
|
builderBox.getChildren().clear();
|
||||||
builderBox.getChildren().add(builder);
|
if (builder != null) {
|
||||||
|
builderBox.getChildren().add(builder);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -111,7 +108,7 @@ public class NewTodoItemStrategy extends VBox {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Object[] newItems = b.buildItem();
|
Object[] newItems = b.buildItems();
|
||||||
if (newItems.length <= 0) { // fail
|
if (newItems.length <= 0) { // fail
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -135,6 +132,26 @@ public class NewTodoItemStrategy extends VBox {
|
||||||
onClickClose();
|
onClickClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onClickTypeBox() {
|
||||||
|
if (typeBox.getSelectionModel().isEmpty()) {
|
||||||
|
setBuilder(null);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NewItemBuilder.IFactory fac = typeBox.getValue();
|
||||||
|
if (mNowParent == null) {
|
||||||
|
NewItemBuilder b = fac.construct();
|
||||||
|
setBuilder(b);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fac.supportedConstructWithParent()) {
|
||||||
|
NewItemBuilder b = fac.constructWithParent(mNowParent);
|
||||||
|
setBuilder(b);
|
||||||
|
} else {
|
||||||
|
mPresenter.showAlert(0, "不支持添加子任务");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// region Presenter new to-do item
|
// region Presenter new to-do item
|
||||||
|
|
||||||
|
@ -148,9 +165,7 @@ public class NewTodoItemStrategy extends VBox {
|
||||||
|
|
||||||
public void showNewChildTodoItemStage(@Nullable TodoItem parent) {
|
public void showNewChildTodoItemStage(@Nullable TodoItem parent) {
|
||||||
mNowParent = parent;
|
mNowParent = parent;
|
||||||
if (!typeBox.getItems().isEmpty()) {
|
typeBox.getSelectionModel().clearSelection();
|
||||||
typeBox.getSelectionModel().selectFirst();
|
|
||||||
}
|
|
||||||
mNewItemStage.show();
|
mNewItemStage.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
package org.cutem.cutecalendar.presenter.autoset;
|
||||||
|
|
||||||
|
import javafx.beans.property.StringProperty;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItemFactory;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public interface AutoSet {
|
||||||
|
|
||||||
|
void wholeDay(@NotNull StringProperty text);
|
||||||
|
|
||||||
|
void timeSegment(@NotNull StringProperty bgn, @NotNull StringProperty end);
|
||||||
|
|
||||||
|
void personnel(@NotNull StringProperty text);
|
||||||
|
|
||||||
|
void stringProperty(@NotNull String key, @NotNull StringProperty value, @NotNull String alertInfo);
|
||||||
|
|
||||||
|
void autoApply(@NotNull TodoItem item);
|
||||||
|
|
||||||
|
boolean autoCheck();
|
||||||
|
|
||||||
|
TodoItemFactory autoBuild();
|
||||||
|
}
|
|
@ -0,0 +1,189 @@
|
||||||
|
package org.cutem.cutecalendar.presenter.autoset;
|
||||||
|
|
||||||
|
import javafx.beans.property.StringProperty;
|
||||||
|
import javafx.scene.control.Alert;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItemFactory;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItemUtil;
|
||||||
|
import org.cutem.cutecalendar.util.CalendarUtil;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import static org.cutem.cutecalendar.model.TodoItem.*;
|
||||||
|
|
||||||
|
public class AutoSetImpl implements AutoSet {
|
||||||
|
|
||||||
|
private static final int NOT_SET = 1;
|
||||||
|
private static final int WHOLE_DAY_SET = 2;
|
||||||
|
private static final int TIME_SEG_SET = 3;
|
||||||
|
|
||||||
|
private int lastSet = NOT_SET;
|
||||||
|
private StringProperty mWholeDay;
|
||||||
|
private StringProperty mBgnTime;
|
||||||
|
private StringProperty mEndTime;
|
||||||
|
|
||||||
|
private StringProperty mPersonnel;
|
||||||
|
|
||||||
|
private HashMap<String, StringProperty> mProps = new HashMap<>();
|
||||||
|
private HashMap<String, String> mAlertInfo = new HashMap<>();
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void wholeDay(@NotNull StringProperty text) {
|
||||||
|
mWholeDay = text;
|
||||||
|
lastSet = WHOLE_DAY_SET;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void timeSegment(@NotNull StringProperty bgn, @NotNull StringProperty end) {
|
||||||
|
mBgnTime = bgn;
|
||||||
|
mEndTime = end;
|
||||||
|
lastSet = TIME_SEG_SET;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void personnel(@NotNull StringProperty text) {
|
||||||
|
mPersonnel = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stringProperty(@NotNull String key, @NotNull StringProperty value, @NotNull String alertInfo) {
|
||||||
|
mProps.put(key, value);
|
||||||
|
mAlertInfo.put(key, alertInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void autoApply(@NotNull TodoItem item) {
|
||||||
|
throw new UnsupportedOperationException("autoApply not supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private boolean checkTimeSegment() {
|
||||||
|
String b = mBgnTime.getValue();
|
||||||
|
String e = mEndTime.getValue();
|
||||||
|
|
||||||
|
if (!CalendarUtil.isValidCalendarString(b) || !CalendarUtil.isValidCalendarString(e)) {
|
||||||
|
showAlert("开始或是结束时间不合法");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Calendar c1 = CalendarUtil.constructCalendar(b);
|
||||||
|
Calendar c2 = CalendarUtil.constructCalendar(e);
|
||||||
|
|
||||||
|
if (c2.before(c1)) {
|
||||||
|
showAlert("开始时间在结束时间后");
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkWholeDay() {
|
||||||
|
String t = mWholeDay.getValue() + "/0:0";
|
||||||
|
if (!CalendarUtil.isValidCalendarString(t)) {
|
||||||
|
showAlert("时间格式不合法");
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkTime() {
|
||||||
|
if (lastSet == TIME_SEG_SET) {
|
||||||
|
return checkTimeSegment();
|
||||||
|
} else if (lastSet == WHOLE_DAY_SET) {
|
||||||
|
return checkWholeDay();
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkPersonnel() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkFormation(@NotNull String key, @NotNull String value) {
|
||||||
|
switch (key) {
|
||||||
|
case ALARM_METHOD:
|
||||||
|
return Objects.equals(value, "area")
|
||||||
|
|| Objects.equals(value, "dialog")
|
||||||
|
|| Objects.equals(value, "none");
|
||||||
|
case ALARM_INTERVAL:
|
||||||
|
return TodoItemUtil.isValidAlarmIntString(value);
|
||||||
|
case ALARM_START:
|
||||||
|
return CalendarUtil.isValidCalendarString(value);
|
||||||
|
case REPEAT_WEEKS:
|
||||||
|
return value.matches("\\d+");
|
||||||
|
default:
|
||||||
|
return !value.isEmpty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkProps() {
|
||||||
|
for (Map.Entry<String, StringProperty> e : mProps.entrySet()) {
|
||||||
|
String key = e.getKey();
|
||||||
|
String val = e.getValue().getValue();
|
||||||
|
if (!checkFormation(key, val)) {
|
||||||
|
String info = mAlertInfo.get(key);
|
||||||
|
|
||||||
|
showAlert(info);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean autoCheck() {
|
||||||
|
return checkTime() && checkPersonnel() && checkProps();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void buildTime(TodoItemFactory factory) {
|
||||||
|
if (lastSet == WHOLE_DAY_SET) {
|
||||||
|
String t = mWholeDay.getValue() + "/0:0";
|
||||||
|
Calendar c = CalendarUtil.constructCalendar(t);
|
||||||
|
factory.wholeDay(c);
|
||||||
|
} else if (lastSet == TIME_SEG_SET) {
|
||||||
|
String b = mBgnTime.getValue();
|
||||||
|
String e = mEndTime.getValue();
|
||||||
|
Calendar c1 = CalendarUtil.constructCalendar(b);
|
||||||
|
Calendar c2 = CalendarUtil.constructCalendar(e);
|
||||||
|
factory.beginTime(c1).endTime(c2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buildPersonnel(TodoItemFactory factory) {
|
||||||
|
if (mPersonnel != null && !mPersonnel.getValue().isEmpty()) {
|
||||||
|
String[] ps = mPersonnel.getValue().split("[;,]");
|
||||||
|
factory.personnel(Arrays.asList(ps));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void buildProps(TodoItemFactory factory) {
|
||||||
|
for (Map.Entry<String, StringProperty> e : mProps.entrySet()) {
|
||||||
|
String key = e.getKey();
|
||||||
|
String val = e.getValue().getValue();
|
||||||
|
factory.stringProperties(key, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TodoItemFactory autoBuild() {
|
||||||
|
TodoItemFactory fac = new TodoItemFactory();
|
||||||
|
buildTime(fac);
|
||||||
|
buildPersonnel(fac);
|
||||||
|
buildProps(fac);
|
||||||
|
return fac;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void showAlert(String text) {
|
||||||
|
Alert alert = new Alert(Alert.AlertType.WARNING);
|
||||||
|
alert.setContentText(text);
|
||||||
|
alert.show();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,107 +0,0 @@
|
||||||
package org.cutem.cutecalendar.presenter.newitems;
|
|
||||||
|
|
||||||
import javafx.fxml.FXML;
|
|
||||||
import javafx.scene.control.ChoiceBox;
|
|
||||||
import javafx.scene.control.TextField;
|
|
||||||
import org.cutem.cutecalendar.model.TodoItem;
|
|
||||||
import org.cutem.cutecalendar.model.TodoItemFactory;
|
|
||||||
import org.cutem.cutecalendar.util.CalendarUtil;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.Calendar;
|
|
||||||
|
|
||||||
public class AnniversaryTypeNewItemBuilder extends NewItemBuilder {
|
|
||||||
public static class Factory implements IFactory {
|
|
||||||
@Override
|
|
||||||
public String getTypeName() {
|
|
||||||
return TYPE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NewItemBuilder construct(@Nullable TodoItem parent) {
|
|
||||||
return new AnniversaryTypeNewItemBuilder(parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String ANNI_TYPE_LAYOUT = "fxml/newitem_layouts/anniversary_type_layout.fxml";
|
|
||||||
|
|
||||||
private static final int TYPE = TodoItem.ANNIVERSARY;
|
|
||||||
|
|
||||||
private static final String TYPE_NAME = TodoItem.typeName(TYPE);
|
|
||||||
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private TextField dateTimeText;
|
|
||||||
@FXML
|
|
||||||
private TextField titleText;
|
|
||||||
@FXML
|
|
||||||
private TextField typeText;
|
|
||||||
@FXML
|
|
||||||
private TextField descriptionText;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> priorityBox;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> importanceBox;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> alarmMethodBox;
|
|
||||||
@FXML
|
|
||||||
private TextField alarmStartText;
|
|
||||||
@FXML
|
|
||||||
private TextField alarmIntervalText;
|
|
||||||
|
|
||||||
|
|
||||||
protected AnniversaryTypeNewItemBuilder(TodoItem parent) {
|
|
||||||
super(parent);
|
|
||||||
loadLayout(ANNI_TYPE_LAYOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private void initialize() {
|
|
||||||
|
|
||||||
addAutoSet(TodoItem.TITLE, titleText.textProperty(), "请填写描述");
|
|
||||||
addAutoSet("type", typeText.textProperty(), "请填写纪念日类型");
|
|
||||||
addAutoSet(TodoItem.DESCRIPTION, descriptionText.textProperty(), "请填写描述");
|
|
||||||
|
|
||||||
addAutoSet(TodoItem.ALARM_START, alarmStartText.textProperty(), "提醒的开始时间不合法");
|
|
||||||
addAutoSet(TodoItem.ALARM_INTERVAL, alarmIntervalText.textProperty(), "提醒的间隔时间不合法");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTypeName() {
|
|
||||||
return TYPE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean check() {
|
|
||||||
if (!autoCheck()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
String date = dateTimeText.getText() + "/0:0";
|
|
||||||
if (!CalendarUtil.isValidCalendarString(date)) {
|
|
||||||
showAlert("时间不合法");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Object make() {
|
|
||||||
TodoItemFactory fac = autoBuild();
|
|
||||||
|
|
||||||
String date = dateTimeText.getText() + "/0:0";
|
|
||||||
Calendar c = CalendarUtil.constructCalendar(date);
|
|
||||||
String priority = priorityBox.getValue();
|
|
||||||
String importance = importanceBox.getValue();
|
|
||||||
String alarmMethod = alarmMethodBox.getValue();
|
|
||||||
|
|
||||||
return fac.type(TYPE)
|
|
||||||
.wholeDay(c)
|
|
||||||
.stringProperties(TodoItem.PRIORITY, priority)
|
|
||||||
.stringProperties(TodoItem.IMPORTANCE, importance)
|
|
||||||
.stringProperties(TodoItem.ALARM_METHOD, alarmMethod)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,93 +0,0 @@
|
||||||
package org.cutem.cutecalendar.presenter.newitems;
|
|
||||||
|
|
||||||
import javafx.fxml.FXML;
|
|
||||||
import javafx.scene.control.ChoiceBox;
|
|
||||||
import javafx.scene.control.TextField;
|
|
||||||
import org.cutem.cutecalendar.model.TodoItem;
|
|
||||||
import org.cutem.cutecalendar.model.TodoItemFactory;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
public class ConferenceTypeNewItemBuilder extends NewItemBuilder {
|
|
||||||
public static class Factory implements IFactory {
|
|
||||||
@Override
|
|
||||||
public String getTypeName() {
|
|
||||||
return TYPE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NewItemBuilder construct(@Nullable TodoItem parent) {
|
|
||||||
return new ConferenceTypeNewItemBuilder(parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String CONFERENCE_TYPE_LAYOUT = "fxml/newitem_layouts/conference_type_layout.fxml";
|
|
||||||
|
|
||||||
private static final int TYPE = TodoItem.CONFERENCE;
|
|
||||||
|
|
||||||
private static final String TYPE_NAME = TodoItem.typeName(TYPE);
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private TextField titleText;
|
|
||||||
@FXML
|
|
||||||
private TextField bgnTimeText;
|
|
||||||
@FXML
|
|
||||||
private TextField endTimeText;
|
|
||||||
@FXML
|
|
||||||
private TextField locationText;
|
|
||||||
@FXML
|
|
||||||
private TextField descriptionText;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> priorityBox;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> importanceBox;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> alarmMethodBox;
|
|
||||||
@FXML
|
|
||||||
private TextField alarmStartText;
|
|
||||||
@FXML
|
|
||||||
private TextField alarmIntervalText;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected ConferenceTypeNewItemBuilder(TodoItem parent) {
|
|
||||||
super(parent);
|
|
||||||
loadLayout(CONFERENCE_TYPE_LAYOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private void initialize() {
|
|
||||||
addAutoCheckTime(bgnTimeText.textProperty(), endTimeText.textProperty());
|
|
||||||
|
|
||||||
addAutoSet(TodoItem.TITLE, titleText.textProperty(), "请填写议题");
|
|
||||||
addAutoSet(TodoItem.LOCATION, locationText.textProperty(), "请填写地点");
|
|
||||||
addAutoSet(TodoItem.DESCRIPTION, descriptionText.textProperty(), "请填写会议内容");
|
|
||||||
addAutoSet(TodoItem.ALARM_START, alarmStartText.textProperty(), "提醒的开始时间不合法");
|
|
||||||
addAutoSet(TodoItem.ALARM_INTERVAL, alarmIntervalText.textProperty(), "提醒的间隔时间不合法");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean check() {
|
|
||||||
return autoCheck();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected TodoItem make() {
|
|
||||||
TodoItemFactory fac = autoBuild();
|
|
||||||
|
|
||||||
String priority = priorityBox.getValue();
|
|
||||||
String importance = importanceBox.getValue();
|
|
||||||
String alarmMethod = alarmMethodBox.getValue();
|
|
||||||
|
|
||||||
return fac.type(TYPE)
|
|
||||||
.stringProperties(TodoItem.PRIORITY, priority)
|
|
||||||
.stringProperties(TodoItem.IMPORTANCE, importance)
|
|
||||||
.stringProperties(TodoItem.ALARM_METHOD, alarmMethod)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTypeName() {
|
|
||||||
return TYPE_NAME;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,102 +0,0 @@
|
||||||
package org.cutem.cutecalendar.presenter.newitems;
|
|
||||||
|
|
||||||
import javafx.fxml.FXML;
|
|
||||||
import javafx.scene.control.ChoiceBox;
|
|
||||||
import javafx.scene.control.TextField;
|
|
||||||
import org.cutem.cutecalendar.model.TodoItem;
|
|
||||||
import org.cutem.cutecalendar.model.TodoItemFactory;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
public class CourseTypeBuilder extends NewItemBuilder {
|
|
||||||
|
|
||||||
public static class Factory implements IFactory {
|
|
||||||
@Override
|
|
||||||
public String getTypeName() {
|
|
||||||
return TYPE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NewItemBuilder construct(@Nullable TodoItem parent) {
|
|
||||||
return new CourseTypeBuilder(parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String COURSE_TYPE_LAYOUT = "fxml/newitem_layouts/course_type_layout.fxml";
|
|
||||||
|
|
||||||
private static final int TYPE = TodoItem.COURSE;
|
|
||||||
|
|
||||||
private static final String TYPE_NAME = TodoItem.typeName(TYPE);
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private TextField bgnTimeText;
|
|
||||||
@FXML
|
|
||||||
private TextField endTimeText;
|
|
||||||
@FXML
|
|
||||||
private TextField repeatText;
|
|
||||||
@FXML
|
|
||||||
private TextField titleText;
|
|
||||||
@FXML
|
|
||||||
private TextField contentText;
|
|
||||||
@FXML
|
|
||||||
private TextField locationText;
|
|
||||||
@FXML
|
|
||||||
private TextField descriptionText;
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> priorityBox;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> importanceBox;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> alarmMethodBox;
|
|
||||||
@FXML
|
|
||||||
private TextField alarmStartText;
|
|
||||||
@FXML
|
|
||||||
private TextField alarmIntervalText;
|
|
||||||
|
|
||||||
|
|
||||||
protected CourseTypeBuilder(TodoItem parent) {
|
|
||||||
super(parent);
|
|
||||||
loadLayout(COURSE_TYPE_LAYOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private void initialize() {
|
|
||||||
addAutoCheckTime(bgnTimeText.textProperty(), endTimeText.textProperty());
|
|
||||||
|
|
||||||
addAutoSet(TodoItem.REPEAT_WEEKS, repeatText.textProperty(), "重复的周数不合法");
|
|
||||||
addAutoSet(TodoItem.TITLE, titleText.textProperty(), "请填写课程名");
|
|
||||||
addAutoSet("content", contentText.textProperty(), "请填写上课内容");
|
|
||||||
addAutoSet(TodoItem.LOCATION, locationText.textProperty(), "请填写地点");
|
|
||||||
addAutoSet(TodoItem.DESCRIPTION, descriptionText.textProperty(), "请填写备注");
|
|
||||||
addAutoSet(TodoItem.ALARM_START, alarmStartText.textProperty(), "提醒的开始时间不合法");
|
|
||||||
addAutoSet(TodoItem.ALARM_INTERVAL, alarmIntervalText.textProperty(), "提醒的间隔时间不合法");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTypeName() {
|
|
||||||
return TYPE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean check() {
|
|
||||||
return autoCheck();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Object make() {
|
|
||||||
TodoItemFactory fac = autoBuild();
|
|
||||||
|
|
||||||
String priority = priorityBox.getValue();
|
|
||||||
String importance = importanceBox.getValue();
|
|
||||||
String alarmMethod = alarmMethodBox.getValue();
|
|
||||||
|
|
||||||
return fac.type(TYPE)
|
|
||||||
.stringProperties(TodoItem.PRIORITY, priority)
|
|
||||||
.stringProperties(TodoItem.IMPORTANCE, importance)
|
|
||||||
.stringProperties(TodoItem.ALARM_METHOD, alarmMethod)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,101 +0,0 @@
|
||||||
package org.cutem.cutecalendar.presenter.newitems;
|
|
||||||
|
|
||||||
import javafx.fxml.FXML;
|
|
||||||
import javafx.scene.control.ChoiceBox;
|
|
||||||
import javafx.scene.control.TextField;
|
|
||||||
import org.cutem.cutecalendar.model.TodoItem;
|
|
||||||
import org.cutem.cutecalendar.model.TodoItemFactory;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
public class DateTypeBuilder extends NewItemBuilder {
|
|
||||||
|
|
||||||
public static class Factory implements IFactory {
|
|
||||||
@Override
|
|
||||||
public String getTypeName() {
|
|
||||||
return TYPE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NewItemBuilder construct(@Nullable TodoItem parent) {
|
|
||||||
return new DateTypeBuilder(parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String DATE_TYPE_LAYOUT = "fxml/newitem_layouts/date_type_layout.fxml";
|
|
||||||
|
|
||||||
private static final int TYPE = TodoItem.DATE;
|
|
||||||
|
|
||||||
private static final String TYPE_NAME = TodoItem.typeName(TYPE);
|
|
||||||
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private TextField bgnTimeText;
|
|
||||||
@FXML
|
|
||||||
private TextField endTimeText;
|
|
||||||
@FXML
|
|
||||||
private TextField titleText;
|
|
||||||
@FXML
|
|
||||||
private TextField locationText;
|
|
||||||
@FXML
|
|
||||||
private TextField personnelText;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> priorityBox;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> importanceBox;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> alarmMethodBox;
|
|
||||||
@FXML
|
|
||||||
private TextField alarmStartText;
|
|
||||||
@FXML
|
|
||||||
private TextField alarmIntervalText;
|
|
||||||
|
|
||||||
|
|
||||||
protected DateTypeBuilder(TodoItem parent) {
|
|
||||||
super(parent);
|
|
||||||
loadLayout(DATE_TYPE_LAYOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private void initialize() {
|
|
||||||
addAutoCheckTime(bgnTimeText.textProperty(), endTimeText.textProperty());
|
|
||||||
|
|
||||||
addAutoSet(TodoItem.TITLE, titleText.textProperty(), "请填写内容");
|
|
||||||
addAutoSet(TodoItem.LOCATION, locationText.textProperty(), "请填写地点");
|
|
||||||
addAutoSet(TodoItem.ALARM_START, alarmStartText.textProperty(), "提醒的开始时间不合法");
|
|
||||||
addAutoSet(TodoItem.ALARM_INTERVAL, alarmIntervalText.textProperty(), "提醒的间隔时间不合法");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTypeName() {
|
|
||||||
return TYPE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean check() {
|
|
||||||
return autoCheck();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Object make() {
|
|
||||||
TodoItemFactory fac = autoBuild();
|
|
||||||
|
|
||||||
String personnel = personnelText.getText();
|
|
||||||
String[] pSlices = personnel.split("[;,]");
|
|
||||||
|
|
||||||
String priority = priorityBox.getValue();
|
|
||||||
String importance = importanceBox.getValue();
|
|
||||||
String alarmMethod = alarmMethodBox.getValue();
|
|
||||||
|
|
||||||
return fac.type(TYPE)
|
|
||||||
.personnel(Arrays.asList(pSlices))
|
|
||||||
.stringProperties(TodoItem.PRIORITY, priority)
|
|
||||||
.stringProperties(TodoItem.IMPORTANCE, importance)
|
|
||||||
.stringProperties(TodoItem.ALARM_METHOD, alarmMethod)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
package org.cutem.cutecalendar.presenter.newitems;
|
||||||
|
|
||||||
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItemManager;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItemUtil;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public abstract class GeneralBuilder extends NewItemBuilder {
|
||||||
|
|
||||||
|
private TodoItem mParent;
|
||||||
|
|
||||||
|
protected GeneralBuilder() {
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
|
||||||
|
protected GeneralBuilder(@Nullable TodoItem parent) {
|
||||||
|
mParent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected abstract boolean check();
|
||||||
|
|
||||||
|
protected abstract TodoItem make();
|
||||||
|
|
||||||
|
private boolean checkConflict(@NotNull TodoItem newItem) {
|
||||||
|
if (mParent != null && !TodoItemUtil.canBind(mParent, newItem)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Collection<TodoItem> items = TodoItemManager.getInstance().getItems();
|
||||||
|
|
||||||
|
for (TodoItem item : items) {
|
||||||
|
if (!Objects.equals(item, mParent) &&
|
||||||
|
TodoItemUtil.isIntersectedConflict(item, newItem)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object[] buildFinal(@NotNull TodoItem item) {
|
||||||
|
if (mParent != null) {
|
||||||
|
TodoItem[] items = TodoItemUtil.bind(mParent, item);
|
||||||
|
return new Object[]{items[0], items[1]};
|
||||||
|
} else {
|
||||||
|
return new Object[]{item};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public final Object[] buildItems() {
|
||||||
|
if (!check()) {
|
||||||
|
return new Object[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
TodoItem o = make();
|
||||||
|
if (!checkConflict(o)) {
|
||||||
|
showAlert("有冲突");
|
||||||
|
return new Object[0];
|
||||||
|
} else {
|
||||||
|
return buildFinal(o);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,87 +0,0 @@
|
||||||
package org.cutem.cutecalendar.presenter.newitems;
|
|
||||||
|
|
||||||
import javafx.fxml.FXML;
|
|
||||||
import javafx.scene.control.ChoiceBox;
|
|
||||||
import javafx.scene.control.TextField;
|
|
||||||
import org.cutem.cutecalendar.model.TodoItem;
|
|
||||||
import org.cutem.cutecalendar.model.TodoItemFactory;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
public class InterviewTypeNewItemBuilder extends NewItemBuilder {
|
|
||||||
|
|
||||||
public static class Factory implements IFactory {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTypeName() {
|
|
||||||
return TYPE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NewItemBuilder construct(@Nullable TodoItem parent) {
|
|
||||||
return new InterviewTypeNewItemBuilder(parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final int TYPE = TodoItem.INTERVIEW;
|
|
||||||
private static final String TYPE_NAME = TodoItem.typeName(TYPE);
|
|
||||||
private static final String INTERVIEW_TYPE_LAYOUT = "fxml/newitem_layouts/interview_type_layout.fxml";
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private TextField bgnTimeText;
|
|
||||||
@FXML
|
|
||||||
private TextField endTimeText;
|
|
||||||
@FXML
|
|
||||||
private TextField locationText;
|
|
||||||
@FXML
|
|
||||||
private TextField companyText;
|
|
||||||
@FXML
|
|
||||||
private TextField jobText;
|
|
||||||
@FXML
|
|
||||||
private TextField remarkText;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> priorityBox;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> importanceBox;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> alarmMethodBox;
|
|
||||||
@FXML
|
|
||||||
private TextField alarmStartText;
|
|
||||||
@FXML
|
|
||||||
private TextField alarmIntervalText;
|
|
||||||
|
|
||||||
protected InterviewTypeNewItemBuilder(TodoItem parent) {
|
|
||||||
super(parent);
|
|
||||||
loadLayout(INTERVIEW_TYPE_LAYOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private void initialize() {
|
|
||||||
addAutoCheckTime(bgnTimeText.textProperty(), endTimeText.textProperty());
|
|
||||||
addAutoSet(TodoItem.LOCATION, locationText.textProperty(), "请添加地点");
|
|
||||||
addAutoSet(TodoItem.TITLE, remarkText.textProperty(), "请填写备注");
|
|
||||||
addAutoSet("company", companyText.textProperty(), "请填写公司");
|
|
||||||
addAutoSet("岗位", companyText.textProperty(), "请填写岗位");
|
|
||||||
addAutoSet(TodoItem.ALARM_START, alarmStartText.textProperty(), "提醒的开始时间不合法");
|
|
||||||
addAutoSet(TodoItem.ALARM_INTERVAL, alarmIntervalText.textProperty(), "提醒的间隔时间不合法");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean check() {
|
|
||||||
return autoCheck();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Object make() {
|
|
||||||
TodoItemFactory fac = autoBuild();
|
|
||||||
|
|
||||||
String priority = priorityBox.getValue();
|
|
||||||
String importance = importanceBox.getValue();
|
|
||||||
String alarmMethod = alarmMethodBox.getValue();
|
|
||||||
|
|
||||||
return fac.type(TYPE)
|
|
||||||
.stringProperties(TodoItem.PRIORITY, priority)
|
|
||||||
.stringProperties(TodoItem.IMPORTANCE, importance)
|
|
||||||
.stringProperties(TodoItem.ALARM_METHOD, alarmMethod)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,186 +1,49 @@
|
||||||
package org.cutem.cutecalendar.presenter.newitems;
|
package org.cutem.cutecalendar.presenter.newitems;
|
||||||
|
|
||||||
import javafx.beans.property.ReadOnlyStringProperty;
|
|
||||||
import javafx.fxml.FXMLLoader;
|
import javafx.fxml.FXMLLoader;
|
||||||
import javafx.scene.control.Alert;
|
import javafx.scene.control.Alert;
|
||||||
import javafx.scene.layout.VBox;
|
import javafx.scene.layout.VBox;
|
||||||
import org.cutem.cutecalendar.model.TodoItem;
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
import org.cutem.cutecalendar.model.TodoItemFactory;
|
import org.cutem.cutecalendar.presenter.autoset.AutoSet;
|
||||||
import org.cutem.cutecalendar.model.TodoItemManager;
|
import org.cutem.cutecalendar.presenter.autoset.AutoSetImpl;
|
||||||
import org.cutem.cutecalendar.model.TodoItemUtil;
|
|
||||||
import org.cutem.cutecalendar.util.CalendarUtil;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import static org.cutem.cutecalendar.model.TodoItem.*;
|
|
||||||
|
|
||||||
public abstract class NewItemBuilder extends VBox {
|
public abstract class NewItemBuilder extends VBox {
|
||||||
|
|
||||||
public interface IFactory {
|
public interface IFactory {
|
||||||
|
|
||||||
|
int getType();
|
||||||
String getTypeName();
|
String getTypeName();
|
||||||
|
|
||||||
NewItemBuilder construct(@Nullable TodoItem parent);
|
boolean supportedConstruct();
|
||||||
}
|
|
||||||
|
|
||||||
private ClassLoader mClassLoader = getClass().getClassLoader();
|
NewItemBuilder construct();
|
||||||
|
|
||||||
private TodoItem mParent;
|
boolean supportedConstructWithParent();
|
||||||
|
|
||||||
private HashMap<String, ReadOnlyStringProperty> mAutoSet = new HashMap<>();
|
NewItemBuilder constructWithParent(@NotNull TodoItem parent);
|
||||||
private HashMap<String, String> mAutoAlertInfo = new HashMap<>();
|
|
||||||
private ReadOnlyStringProperty mBgnTime;
|
|
||||||
private ReadOnlyStringProperty mEndTime;
|
|
||||||
|
|
||||||
|
boolean supportedConstructWithOldItem();
|
||||||
|
|
||||||
|
NewItemBuilder constructWithOldItem(@NotNull TodoItem oldItem);
|
||||||
protected NewItemBuilder(TodoItem parent) {
|
|
||||||
mParent = parent;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public String getTypeName() {
|
|
||||||
throw new UnsupportedOperationException("not supported");
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public final Object[] buildItem() {
|
|
||||||
if (!check()) {
|
|
||||||
return new Object[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
Object o = make();
|
|
||||||
if (o instanceof TodoItem) {
|
|
||||||
TodoItem item = (TodoItem) o;
|
|
||||||
if (!checkConflict(item)) {
|
|
||||||
showAlert("有冲突");
|
|
||||||
return new Object[0];
|
|
||||||
}
|
|
||||||
return buildFinal(item);
|
|
||||||
} else {
|
|
||||||
return new Object[]{o};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract boolean check();
|
private AutoSetImpl mAutoSet;
|
||||||
|
|
||||||
protected abstract Object make();
|
|
||||||
|
|
||||||
private boolean checkConflict(@NotNull TodoItem newItem) {
|
// region tools part for subclasses
|
||||||
if (mParent != null && !TodoItemUtil.canBind(mParent, newItem)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Collection<TodoItem> items = TodoItemManager.getInstance().getItems();
|
|
||||||
|
|
||||||
for (TodoItem item : items) {
|
protected final AutoSet getAutoSet() {
|
||||||
if (!Objects.equals(item, mParent) &&
|
if (mAutoSet == null) {
|
||||||
TodoItemUtil.isIntersectedConflict(item, newItem)) {
|
mAutoSet = new AutoSetImpl();
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return mAutoSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object[] buildFinal(@NotNull TodoItem item) {
|
|
||||||
if (mParent != null) {
|
|
||||||
TodoItem[] items = TodoItemUtil.bind(mParent, item);
|
|
||||||
return new Object[]{items[0], items[1]};
|
|
||||||
} else {
|
|
||||||
return new Object[]{item};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// region tools part
|
|
||||||
|
|
||||||
protected void addAutoCheckTime(@NotNull ReadOnlyStringProperty bgn, @NotNull ReadOnlyStringProperty end) {
|
|
||||||
mBgnTime = bgn;
|
|
||||||
mEndTime = end;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void addAutoSet(@NotNull String key, @NotNull ReadOnlyStringProperty prop, @Nullable String alertInfo) {
|
|
||||||
mAutoSet.put(key, prop);
|
|
||||||
|
|
||||||
if (alertInfo != null) {
|
|
||||||
mAutoAlertInfo.put(key, alertInfo);
|
|
||||||
} else {
|
|
||||||
mAutoAlertInfo.put(key, "there is something wrong");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected boolean autoCheck() {
|
|
||||||
for (Map.Entry<String, ReadOnlyStringProperty> e : mAutoSet.entrySet()) {
|
|
||||||
String key = e.getKey();
|
|
||||||
String val = e.getValue().getValue();
|
|
||||||
if (!checkFormation(key, val)) {
|
|
||||||
String info = mAutoAlertInfo.get(key);
|
|
||||||
showAlert(info);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mBgnTime != null && mEndTime != null) {
|
|
||||||
String b = mBgnTime.getValue();
|
|
||||||
String e = mEndTime.getValue();
|
|
||||||
|
|
||||||
if (!CalendarUtil.isValidCalendarString(b) || !CalendarUtil.isValidCalendarString(e)) {
|
|
||||||
showAlert("开始或是结束时间不合法");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
Calendar c1 = CalendarUtil.constructCalendar(b);
|
|
||||||
Calendar c2 = CalendarUtil.constructCalendar(e);
|
|
||||||
if (c2.before(c1)) {
|
|
||||||
showAlert("开始时间在结束时间后");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected TodoItemFactory autoBuild() {
|
|
||||||
TodoItemFactory factory = new TodoItemFactory();
|
|
||||||
|
|
||||||
for (Map.Entry<String, ReadOnlyStringProperty> e : mAutoSet.entrySet()) {
|
|
||||||
String key = e.getKey();
|
|
||||||
String val = e.getValue().getValue();
|
|
||||||
factory.stringProperties(key, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mBgnTime != null && mEndTime != null) {
|
|
||||||
String b = mBgnTime.getValue();
|
|
||||||
String e = mEndTime.getValue();
|
|
||||||
Calendar c1 = CalendarUtil.constructCalendar(b);
|
|
||||||
Calendar c2 = CalendarUtil.constructCalendar(e);
|
|
||||||
factory.beginTime(c1).endTime(c2);
|
|
||||||
}
|
|
||||||
|
|
||||||
return factory;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean checkFormation(@NotNull String key, @NotNull String value) {
|
|
||||||
switch (key) {
|
|
||||||
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 Objects.equals(value, "area")
|
|
||||||
|| Objects.equals(value, "dialog")
|
|
||||||
|| Objects.equals(value, "none");
|
|
||||||
default:
|
|
||||||
return !value.isEmpty();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected final void showAlert(@NotNull String text) {
|
protected final void showAlert(@NotNull String text) {
|
||||||
Alert alert = new Alert(Alert.AlertType.WARNING);
|
Alert alert = new Alert(Alert.AlertType.WARNING);
|
||||||
alert.setContentText(text);
|
alert.setContentText(text);
|
||||||
|
@ -188,18 +51,22 @@ public abstract class NewItemBuilder extends VBox {
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void loadLayout(@NotNull String location) {
|
protected final void loadLayout(@NotNull String location) {
|
||||||
|
ClassLoader classLoader = getClass().getClassLoader();
|
||||||
FXMLLoader loader = new FXMLLoader();
|
FXMLLoader loader = new FXMLLoader();
|
||||||
loader.setLocation(mClassLoader.getResource(location));
|
loader.setLocation(classLoader.getResource(location));
|
||||||
loader.setRoot(this);
|
loader.setRoot(this);
|
||||||
loader.setController(this);
|
loader.setController(this);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
loader.load();
|
loader.load();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new IllegalStateException("cannot load: " + location);
|
throw new IllegalStateException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// endregion tools part
|
// endregion tools part for subclasses
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public abstract Object[] buildItems();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,90 +0,0 @@
|
||||||
package org.cutem.cutecalendar.presenter.newitems;
|
|
||||||
|
|
||||||
import javafx.fxml.FXML;
|
|
||||||
import javafx.scene.control.ChoiceBox;
|
|
||||||
import javafx.scene.control.TextField;
|
|
||||||
import org.cutem.cutecalendar.model.TodoItem;
|
|
||||||
import org.cutem.cutecalendar.model.TodoItemFactory;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
public class OtherTypeNewItemBuilder extends NewItemBuilder {
|
|
||||||
|
|
||||||
public static class Factory implements IFactory {
|
|
||||||
@Override
|
|
||||||
public String getTypeName() {
|
|
||||||
return TYPE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NewItemBuilder construct(@Nullable TodoItem parent) {
|
|
||||||
return new OtherTypeNewItemBuilder(parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String OTHER_TYPE_LAYOUT = "fxml/newitem_layouts/other_type_layout.fxml";
|
|
||||||
|
|
||||||
private static final int TYPE = TodoItem.OTHERS;
|
|
||||||
|
|
||||||
private static final String TYPE_NAME = TodoItem.typeName(TYPE);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private TextField bgnTimeText;
|
|
||||||
@FXML
|
|
||||||
private TextField endTimeText;
|
|
||||||
@FXML
|
|
||||||
private TextField titleText;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> priorityBox;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> importanceBox;
|
|
||||||
@FXML
|
|
||||||
private ChoiceBox<String> alarmMethodBox;
|
|
||||||
@FXML
|
|
||||||
private TextField alarmStartText;
|
|
||||||
@FXML
|
|
||||||
private TextField alarmIntervalText;
|
|
||||||
|
|
||||||
|
|
||||||
protected OtherTypeNewItemBuilder(TodoItem parent) {
|
|
||||||
super(parent);
|
|
||||||
loadLayout(OTHER_TYPE_LAYOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private void initialize() {
|
|
||||||
addAutoCheckTime(bgnTimeText.textProperty(), endTimeText.textProperty());
|
|
||||||
|
|
||||||
addAutoSet(TodoItem.TITLE, titleText.textProperty(), "请填写描述");
|
|
||||||
addAutoSet(TodoItem.ALARM_START, alarmStartText.textProperty(), "提醒的开始时间不合法");
|
|
||||||
addAutoSet(TodoItem.ALARM_INTERVAL, alarmIntervalText.textProperty(), "提醒的间隔时间不合法");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTypeName() {
|
|
||||||
return TYPE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean check() {
|
|
||||||
return autoCheck();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected TodoItem make() {
|
|
||||||
TodoItemFactory fac = autoBuild();
|
|
||||||
|
|
||||||
String priority = priorityBox.getValue();
|
|
||||||
String importance = importanceBox.getValue();
|
|
||||||
String alarmMethod = alarmMethodBox.getValue();
|
|
||||||
|
|
||||||
return fac.type(TYPE)
|
|
||||||
.stringProperties(TodoItem.PRIORITY, priority)
|
|
||||||
.stringProperties(TodoItem.IMPORTANCE, importance)
|
|
||||||
.stringProperties(TodoItem.ALARM_METHOD, alarmMethod)
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,70 +0,0 @@
|
||||||
package org.cutem.cutecalendar.presenter.newitems;
|
|
||||||
|
|
||||||
import javafx.fxml.FXML;
|
|
||||||
import javafx.scene.control.TextField;
|
|
||||||
import org.cutem.cutecalendar.model.TodoItem;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
public class TimelessTypeBuilder extends NewItemBuilder {
|
|
||||||
|
|
||||||
|
|
||||||
public static class Factory implements IFactory {
|
|
||||||
@Override
|
|
||||||
public String getTypeName() {
|
|
||||||
return TYPE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public NewItemBuilder construct(@Nullable TodoItem parent) {
|
|
||||||
return new TimelessTypeBuilder(parent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final String TIMELESS_LAYOUT = "fxml/newitem_layouts/timeless_type_layout.fxml";
|
|
||||||
|
|
||||||
private static final int TYPE = TodoItem.OTHERS;
|
|
||||||
|
|
||||||
private static final String TYPE_NAME = "others without time";
|
|
||||||
|
|
||||||
private boolean mHaveParent;
|
|
||||||
|
|
||||||
@FXML
|
|
||||||
private TextField titleText;
|
|
||||||
|
|
||||||
|
|
||||||
protected TimelessTypeBuilder(TodoItem parent) {
|
|
||||||
super(parent);
|
|
||||||
mHaveParent = parent != null;
|
|
||||||
loadLayout(TIMELESS_LAYOUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getTypeName() {
|
|
||||||
return TYPE_NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean check() {
|
|
||||||
|
|
||||||
if (mHaveParent) {
|
|
||||||
showAlert("不能添加子事件");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
String title = titleText.getText().trim();
|
|
||||||
|
|
||||||
if (title.isEmpty()) {
|
|
||||||
showAlert("描述还没有填");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String make() {
|
|
||||||
return titleText.getText().trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
package org.cutem.cutecalendar.presenter.newitems.lab5;
|
||||||
|
|
||||||
|
import javafx.fxml.FXML;
|
||||||
|
import javafx.scene.control.TextField;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
|
import org.cutem.cutecalendar.presenter.autoset.AutoSet;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public final class AnniversaryTypeBuilder extends BaseTodoItemBuilder {
|
||||||
|
|
||||||
|
public static class Factory extends BaseFactory<AnniversaryTypeBuilder> {
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTypeName() {
|
||||||
|
return TYPE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AnniversaryTypeBuilder construct() {
|
||||||
|
return new AnniversaryTypeBuilder(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AnniversaryTypeBuilder constructWithParent(@NotNull TodoItem parent) {
|
||||||
|
return new AnniversaryTypeBuilder(parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String ANNI_TYPE_LAYOUT = "fxml/newitem_layouts/anniversary_type_layout.fxml";
|
||||||
|
|
||||||
|
private static final int TYPE = TodoItem.ANNIVERSARY;
|
||||||
|
|
||||||
|
private static final String TYPE_NAME = TodoItem.typeName(TYPE);
|
||||||
|
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private TextField wholeDayText;
|
||||||
|
@FXML
|
||||||
|
private TextField titleText;
|
||||||
|
@FXML
|
||||||
|
private TextField typeText;
|
||||||
|
@FXML
|
||||||
|
private TextField descriptionText;
|
||||||
|
|
||||||
|
private AnniversaryTypeBuilder(TodoItem parent) {
|
||||||
|
super(parent);
|
||||||
|
loadLayout(ANNI_TYPE_LAYOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
@Override
|
||||||
|
protected void initialize() {
|
||||||
|
super.initialize();
|
||||||
|
|
||||||
|
AutoSet a = getAutoSet();
|
||||||
|
a.wholeDay(wholeDayText.textProperty());
|
||||||
|
a.stringProperty(TodoItem.TITLE, titleText.textProperty(), "请填写纪念日名字");
|
||||||
|
a.stringProperty("类型", typeText.textProperty(), "请填写类型");
|
||||||
|
a.stringProperty(TodoItem.DESCRIPTION, descriptionText.textProperty(), "请填写描述");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,97 @@
|
||||||
|
package org.cutem.cutecalendar.presenter.newitems.lab5;
|
||||||
|
|
||||||
|
import javafx.beans.property.SimpleStringProperty;
|
||||||
|
import javafx.beans.property.StringProperty;
|
||||||
|
import javafx.fxml.FXML;
|
||||||
|
import javafx.scene.control.ChoiceBox;
|
||||||
|
import javafx.scene.control.TextField;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItemFactory;
|
||||||
|
import org.cutem.cutecalendar.presenter.autoset.AutoSet;
|
||||||
|
import org.cutem.cutecalendar.presenter.newitems.GeneralBuilder;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
abstract class BaseTodoItemBuilder extends GeneralBuilder {
|
||||||
|
|
||||||
|
protected static abstract class BaseFactory<T extends BaseTodoItemBuilder> implements IFactory {
|
||||||
|
@Override
|
||||||
|
public boolean supportedConstruct() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract T construct();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportedConstructWithParent() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract T constructWithParent(@NotNull TodoItem parent);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportedConstructWithOldItem() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T constructWithOldItem(@NotNull TodoItem oldItem) {
|
||||||
|
throw new UnsupportedOperationException("constructWithOldItem not supported");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
protected ChoiceBox<String> priorityBox;
|
||||||
|
@FXML
|
||||||
|
protected ChoiceBox<String> importanceBox;
|
||||||
|
@FXML
|
||||||
|
protected ChoiceBox<String> alarmMethodBox;
|
||||||
|
@FXML
|
||||||
|
protected TextField alarmStartText;
|
||||||
|
@FXML
|
||||||
|
protected TextField alarmIntervalText;
|
||||||
|
|
||||||
|
|
||||||
|
protected BaseTodoItemBuilder(@Nullable TodoItem parent) {
|
||||||
|
super(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected abstract int getType();
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
protected void initialize() {
|
||||||
|
|
||||||
|
StringProperty p = new SimpleStringProperty();
|
||||||
|
p.bind(priorityBox.valueProperty());
|
||||||
|
|
||||||
|
StringProperty i = new SimpleStringProperty();
|
||||||
|
i.bind(importanceBox.valueProperty());
|
||||||
|
|
||||||
|
StringProperty m = new SimpleStringProperty();
|
||||||
|
m.bind(alarmMethodBox.valueProperty());
|
||||||
|
|
||||||
|
AutoSet s = getAutoSet();
|
||||||
|
|
||||||
|
s.stringProperty(TodoItem.PRIORITY, p, "优先级不合法");
|
||||||
|
s.stringProperty(TodoItem.IMPORTANCE, i, "重要度不合法");
|
||||||
|
s.stringProperty(TodoItem.ALARM_METHOD, m, "提醒方式不合法");
|
||||||
|
s.stringProperty(TodoItem.ALARM_START, alarmStartText.textProperty(), "提醒时间不合法");
|
||||||
|
s.stringProperty(TodoItem.ALARM_INTERVAL, alarmIntervalText.textProperty(), "提醒间隔不合法");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean check() {
|
||||||
|
return getAutoSet().autoCheck();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected TodoItem make() {
|
||||||
|
TodoItemFactory fac = getAutoSet().autoBuild();
|
||||||
|
return fac.type(getType()).build();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
package org.cutem.cutecalendar.presenter.newitems.lab5;
|
||||||
|
|
||||||
|
import javafx.fxml.FXML;
|
||||||
|
import javafx.scene.control.TextField;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
|
import org.cutem.cutecalendar.presenter.autoset.AutoSet;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public final class ConferenceTypeBuilder extends BaseTodoItemBuilder {
|
||||||
|
|
||||||
|
public static class Factory extends BaseFactory<ConferenceTypeBuilder> {
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTypeName() {
|
||||||
|
return TYPE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConferenceTypeBuilder construct() {
|
||||||
|
return new ConferenceTypeBuilder(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ConferenceTypeBuilder constructWithParent(@NotNull TodoItem parent) {
|
||||||
|
return new ConferenceTypeBuilder(parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String CONFERENCE_TYPE_LAYOUT = "fxml/newitem_layouts/conference_type_layout.fxml";
|
||||||
|
|
||||||
|
private static final int TYPE = TodoItem.CONFERENCE;
|
||||||
|
|
||||||
|
private static final String TYPE_NAME = TodoItem.typeName(TYPE);
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private TextField titleText;
|
||||||
|
@FXML
|
||||||
|
private TextField bgnTimeText;
|
||||||
|
@FXML
|
||||||
|
private TextField endTimeText;
|
||||||
|
@FXML
|
||||||
|
private TextField locationText;
|
||||||
|
@FXML
|
||||||
|
private TextField descriptionText;
|
||||||
|
|
||||||
|
private ConferenceTypeBuilder(TodoItem parent) {
|
||||||
|
super(parent);
|
||||||
|
loadLayout(CONFERENCE_TYPE_LAYOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
@Override
|
||||||
|
protected void initialize() {
|
||||||
|
super.initialize();
|
||||||
|
AutoSet a = getAutoSet();
|
||||||
|
a.timeSegment(bgnTimeText.textProperty(), endTimeText.textProperty());
|
||||||
|
a.stringProperty(TodoItem.TITLE, titleText.textProperty(), "请填写议题");
|
||||||
|
a.stringProperty(TodoItem.LOCATION, locationText.textProperty(), "请填写地点");
|
||||||
|
a.stringProperty(TodoItem.DESCRIPTION, descriptionText.textProperty(), "请填写会议内容");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,82 @@
|
||||||
|
package org.cutem.cutecalendar.presenter.newitems.lab5;
|
||||||
|
|
||||||
|
import javafx.fxml.FXML;
|
||||||
|
import javafx.scene.control.TextField;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
|
import org.cutem.cutecalendar.presenter.autoset.AutoSet;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public final class CourseTypeBuilder extends BaseTodoItemBuilder {
|
||||||
|
|
||||||
|
public static class Factory extends BaseFactory<CourseTypeBuilder> {
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTypeName() {
|
||||||
|
return TYPE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CourseTypeBuilder construct() {
|
||||||
|
return new CourseTypeBuilder(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CourseTypeBuilder constructWithParent(@NotNull TodoItem parent) {
|
||||||
|
return new CourseTypeBuilder(parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String COURSE_TYPE_LAYOUT = "fxml/newitem_layouts/course_type_layout.fxml";
|
||||||
|
|
||||||
|
private static final int TYPE = TodoItem.OTHERS;
|
||||||
|
|
||||||
|
private static final String TYPE_NAME = TodoItem.typeName(TYPE);
|
||||||
|
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private TextField bgnTimeText;
|
||||||
|
@FXML
|
||||||
|
private TextField endTimeText;
|
||||||
|
@FXML
|
||||||
|
private TextField titleText;
|
||||||
|
@FXML
|
||||||
|
private TextField repeatText;
|
||||||
|
@FXML
|
||||||
|
private TextField contentText;
|
||||||
|
@FXML
|
||||||
|
private TextField locationText;
|
||||||
|
@FXML
|
||||||
|
private TextField teacherText;
|
||||||
|
@FXML
|
||||||
|
private TextField descriptionText;
|
||||||
|
|
||||||
|
private CourseTypeBuilder(TodoItem parent) {
|
||||||
|
super(parent);
|
||||||
|
loadLayout(COURSE_TYPE_LAYOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
@Override
|
||||||
|
protected void initialize() {
|
||||||
|
super.initialize();
|
||||||
|
|
||||||
|
AutoSet a = getAutoSet();
|
||||||
|
a.timeSegment(bgnTimeText.textProperty(), endTimeText.textProperty());
|
||||||
|
a.stringProperty(TodoItem.TITLE, titleText.textProperty(), "请填写课程名字");
|
||||||
|
a.stringProperty(TodoItem.REPEAT_WEEKS, repeatText.textProperty(), "请填写重复周数");
|
||||||
|
a.stringProperty("课程内容", contentText.textProperty(), "请填写课程内容");
|
||||||
|
a.stringProperty(TodoItem.LOCATION, locationText.textProperty(), "请填写地点");
|
||||||
|
a.stringProperty("老师", teacherText.textProperty(), "请填写老师");
|
||||||
|
a.stringProperty(TodoItem.DESCRIPTION, descriptionText.textProperty(), "请填写备注");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
package org.cutem.cutecalendar.presenter.newitems.lab5;
|
||||||
|
|
||||||
|
import javafx.fxml.FXML;
|
||||||
|
import javafx.scene.control.TextField;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
|
import org.cutem.cutecalendar.presenter.autoset.AutoSet;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public final class DateTypeBuilder extends BaseTodoItemBuilder {
|
||||||
|
|
||||||
|
public static class Factory extends BaseFactory<DateTypeBuilder> {
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTypeName() {
|
||||||
|
return TYPE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DateTypeBuilder construct() {
|
||||||
|
return new DateTypeBuilder(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public DateTypeBuilder constructWithParent(@NotNull TodoItem parent) {
|
||||||
|
return new DateTypeBuilder(parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String DATE_TYPE_LAYOUT = "fxml/newitem_layouts/date_type_layout.fxml";
|
||||||
|
|
||||||
|
private static final int TYPE = TodoItem.DATE;
|
||||||
|
|
||||||
|
private static final String TYPE_NAME = TodoItem.typeName(TYPE);
|
||||||
|
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private TextField bgnTimeText;
|
||||||
|
@FXML
|
||||||
|
private TextField endTimeText;
|
||||||
|
@FXML
|
||||||
|
private TextField titleText;
|
||||||
|
@FXML
|
||||||
|
private TextField locationText;
|
||||||
|
@FXML
|
||||||
|
private TextField personnelText;
|
||||||
|
|
||||||
|
private DateTypeBuilder(TodoItem parent) {
|
||||||
|
super(parent);
|
||||||
|
loadLayout(DATE_TYPE_LAYOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
@Override
|
||||||
|
protected void initialize() {
|
||||||
|
super.initialize();
|
||||||
|
AutoSet a = getAutoSet();
|
||||||
|
a.timeSegment(bgnTimeText.textProperty(), endTimeText.textProperty());
|
||||||
|
a.stringProperty(TodoItem.TITLE, titleText.textProperty(), "请填写内容");
|
||||||
|
a.stringProperty(TodoItem.LOCATION, locationText.textProperty(), "请填写地点");
|
||||||
|
a.personnel(personnelText.textProperty());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
package org.cutem.cutecalendar.presenter.newitems.lab5;
|
||||||
|
|
||||||
|
import javafx.fxml.FXML;
|
||||||
|
import javafx.scene.control.TextField;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
|
import org.cutem.cutecalendar.presenter.autoset.AutoSet;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public final class InterviewTypeBuilder extends BaseTodoItemBuilder {
|
||||||
|
|
||||||
|
public static class Factory extends BaseFactory<InterviewTypeBuilder> {
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTypeName() {
|
||||||
|
return TYPE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InterviewTypeBuilder construct() {
|
||||||
|
return new InterviewTypeBuilder(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public InterviewTypeBuilder constructWithParent(@NotNull TodoItem parent) {
|
||||||
|
return new InterviewTypeBuilder(parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String INTERVIEW_TYPE_LAYOUT = "fxml/newitem_layouts/interview_type_layout.fxml";
|
||||||
|
|
||||||
|
private static final int TYPE = TodoItem.OTHERS;
|
||||||
|
|
||||||
|
private static final String TYPE_NAME = TodoItem.typeName(TYPE);
|
||||||
|
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private TextField bgnTimeText;
|
||||||
|
@FXML
|
||||||
|
private TextField endTimeText;
|
||||||
|
@FXML
|
||||||
|
private TextField titleText;
|
||||||
|
@FXML
|
||||||
|
private TextField locationText;
|
||||||
|
@FXML
|
||||||
|
private TextField companyText;
|
||||||
|
@FXML
|
||||||
|
private TextField jobText;
|
||||||
|
|
||||||
|
private InterviewTypeBuilder(TodoItem parent) {
|
||||||
|
super(parent);
|
||||||
|
loadLayout(INTERVIEW_TYPE_LAYOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
@Override
|
||||||
|
protected void initialize() {
|
||||||
|
super.initialize();
|
||||||
|
|
||||||
|
AutoSet a = getAutoSet();
|
||||||
|
a.timeSegment(bgnTimeText.textProperty(), endTimeText.textProperty());
|
||||||
|
a.stringProperty(TodoItem.TITLE, titleText.textProperty(), "请填写备注");
|
||||||
|
a.stringProperty(TodoItem.LOCATION, locationText.textProperty(), "请填写地点");
|
||||||
|
a.stringProperty("公司", companyText.textProperty(), "请填写公司");
|
||||||
|
a.stringProperty("岗位", jobText.textProperty(), "请填写岗位");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
package org.cutem.cutecalendar.presenter.newitems.lab5;
|
||||||
|
|
||||||
|
import javafx.fxml.FXML;
|
||||||
|
import javafx.scene.control.TextField;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public final class OtherTypeBuilder extends BaseTodoItemBuilder {
|
||||||
|
|
||||||
|
public static class Factory extends BaseFactory<OtherTypeBuilder> {
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTypeName() {
|
||||||
|
return TYPE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OtherTypeBuilder construct() {
|
||||||
|
return new OtherTypeBuilder(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public OtherTypeBuilder constructWithParent(@NotNull TodoItem parent) {
|
||||||
|
return new OtherTypeBuilder(parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String OTHER_TYPE_LAYOUT = "fxml/newitem_layouts/other_type_layout.fxml";
|
||||||
|
|
||||||
|
private static final int TYPE = TodoItem.OTHERS;
|
||||||
|
|
||||||
|
private static final String TYPE_NAME = TodoItem.typeName(TYPE);
|
||||||
|
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private TextField bgnTimeText;
|
||||||
|
@FXML
|
||||||
|
private TextField endTimeText;
|
||||||
|
@FXML
|
||||||
|
private TextField titleText;
|
||||||
|
|
||||||
|
private OtherTypeBuilder(TodoItem parent) {
|
||||||
|
super(parent);
|
||||||
|
loadLayout(OTHER_TYPE_LAYOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
@Override
|
||||||
|
protected void initialize() {
|
||||||
|
super.initialize();
|
||||||
|
|
||||||
|
getAutoSet().timeSegment(bgnTimeText.textProperty(), endTimeText.textProperty());
|
||||||
|
getAutoSet().stringProperty(TodoItem.TITLE, titleText.textProperty(), "请填写描述");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
package org.cutem.cutecalendar.presenter.newitems.lab5;
|
||||||
|
|
||||||
|
import javafx.fxml.FXML;
|
||||||
|
import javafx.scene.control.TextField;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
|
import org.cutem.cutecalendar.presenter.newitems.NewItemBuilder;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public final class TimelessTypeBuilder extends NewItemBuilder {
|
||||||
|
|
||||||
|
public static class Factory implements IFactory {
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTypeName() {
|
||||||
|
return TYPE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportedConstruct() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NewItemBuilder construct() {
|
||||||
|
return new TimelessTypeBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportedConstructWithParent() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NewItemBuilder constructWithParent(@NotNull TodoItem parent) {
|
||||||
|
throw new UnsupportedOperationException("connstructWithParent not supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportedConstructWithOldItem() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NewItemBuilder constructWithOldItem(@NotNull TodoItem oldItem) {
|
||||||
|
throw new UnsupportedOperationException("connstructWithOldItem not supported");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String TIMELESS_LAYOUT = "fxml/newitem_layouts/timeless_type_layout.fxml";
|
||||||
|
|
||||||
|
private static final int TYPE = TodoItem.OTHERS;
|
||||||
|
private static final String TYPE_NAME = "others without time";
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private TextField titleText;
|
||||||
|
|
||||||
|
private TimelessTypeBuilder() {
|
||||||
|
loadLayout(TIMELESS_LAYOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Object[] buildItems() {
|
||||||
|
String title = titleText.getText().trim();
|
||||||
|
|
||||||
|
if (title.isEmpty()) {
|
||||||
|
showAlert("描述还没有填");
|
||||||
|
return new Object[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Object[]{title};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
package org.cutem.cutecalendar.presenter.newitems.lab5;
|
||||||
|
|
||||||
|
import javafx.fxml.FXML;
|
||||||
|
import javafx.scene.control.TextField;
|
||||||
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
|
import org.cutem.cutecalendar.presenter.autoset.AutoSet;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public final class TripTypeBuilder extends BaseTodoItemBuilder {
|
||||||
|
|
||||||
|
public static class Factory extends BaseFactory<TripTypeBuilder> {
|
||||||
|
@Override
|
||||||
|
public int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getTypeName() {
|
||||||
|
return TYPE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TripTypeBuilder construct() {
|
||||||
|
return new TripTypeBuilder(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TripTypeBuilder constructWithParent(@NotNull TodoItem parent) {
|
||||||
|
return new TripTypeBuilder(parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String TRIP_TYPE_LAYOUT = "fxml/newitem_layouts/trip_type_layout.fxml";
|
||||||
|
|
||||||
|
private static final int TYPE = TodoItem.TRIP;
|
||||||
|
|
||||||
|
private static final String TYPE_NAME = TodoItem.typeName(TYPE);
|
||||||
|
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private TextField bgnTimeText;
|
||||||
|
@FXML
|
||||||
|
private TextField endTimeText;
|
||||||
|
@FXML
|
||||||
|
private TextField titleText;
|
||||||
|
@FXML
|
||||||
|
private TextField locationText;
|
||||||
|
@FXML
|
||||||
|
private TextField transportationText;
|
||||||
|
@FXML
|
||||||
|
private TextField transportationNumberText;
|
||||||
|
|
||||||
|
private TripTypeBuilder(TodoItem parent) {
|
||||||
|
super(parent);
|
||||||
|
loadLayout(TRIP_TYPE_LAYOUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
@Override
|
||||||
|
protected void initialize() {
|
||||||
|
super.initialize();
|
||||||
|
|
||||||
|
AutoSet a = getAutoSet();
|
||||||
|
a.timeSegment(bgnTimeText.textProperty(), endTimeText.textProperty());
|
||||||
|
a.stringProperty(TodoItem.TITLE, titleText.textProperty(), "请填写备注");
|
||||||
|
a.stringProperty(TodoItem.LOCATION, locationText.textProperty(), "请填写地点");
|
||||||
|
a.stringProperty("交通方式", transportationText.textProperty(), "请填写交通方式");
|
||||||
|
a.stringProperty("航班号/车次/其他", transportationNumberText.textProperty(), "请填写航班号/车次/其他");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,7 +9,8 @@ import javafx.scene.Scene;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
import org.cutem.cutecalendar.model.TodoItem;
|
import org.cutem.cutecalendar.model.TodoItem;
|
||||||
import org.cutem.cutecalendar.presenter.*;
|
import org.cutem.cutecalendar.presenter.*;
|
||||||
import org.cutem.cutecalendar.presenter.newitems.*;
|
import org.cutem.cutecalendar.presenter.newitems.lab5.OtherTypeBuilder;
|
||||||
|
import org.cutem.cutecalendar.presenter.newitems.lab5.TimelessTypeBuilder;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -59,12 +60,12 @@ public class MainTest extends Application {
|
||||||
|
|
||||||
// add IoC
|
// add IoC
|
||||||
newItemStrategy.addFactory(new TimelessTypeBuilder.Factory());
|
newItemStrategy.addFactory(new TimelessTypeBuilder.Factory());
|
||||||
newItemStrategy.addFactory(new OtherTypeNewItemBuilder.Factory());
|
newItemStrategy.addFactory(new OtherTypeBuilder.Factory());
|
||||||
newItemStrategy.addFactory(new ConferenceTypeNewItemBuilder.Factory());
|
// newItemStrategy.addFactory(new ConferenceTypeBuilder.Factory());
|
||||||
newItemStrategy.addFactory(new InterviewTypeNewItemBuilder.Factory());
|
// newItemStrategy.addFactory(new InterviewTypeBuilder.Factory());
|
||||||
newItemStrategy.addFactory(new AnniversaryTypeNewItemBuilder.Factory());
|
// newItemStrategy.addFactory(new AnniversaryTypeBuilder.Factory());
|
||||||
newItemStrategy.addFactory(new CourseTypeBuilder.Factory());
|
// newItemStrategy.addFactory(new CourseTypeBuilder.Factory());
|
||||||
newItemStrategy.addFactory(new DateTypeBuilder.Factory());
|
// newItemStrategy.addFactory(new DateTypeBuilder.Factory());
|
||||||
|
|
||||||
mPresenter.goWork();
|
mPresenter.goWork();
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
[]
|
|
@ -0,0 +1,14 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 0,
|
||||||
|
"bgn": "2018-5-29/0:0",
|
||||||
|
"end": "2018-5-29/23:59",
|
||||||
|
"type": 1,
|
||||||
|
"personnel": [],
|
||||||
|
"props": {
|
||||||
|
"alarm_method": "none",
|
||||||
|
"finish": "finish",
|
||||||
|
"title": "gg"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
Loading…
Reference in New Issue