feat(creation): add random fill settings and strategy
This commit is contained in:
@@ -14,6 +14,9 @@ import ru.project.ui.creation.file.FileFillStrategy;
|
|||||||
import ru.project.ui.creation.manual.ManualDataSettingsWindow;
|
import ru.project.ui.creation.manual.ManualDataSettingsWindow;
|
||||||
import ru.project.ui.creation.manual.ManualFillSettings;
|
import ru.project.ui.creation.manual.ManualFillSettings;
|
||||||
import ru.project.ui.creation.manual.ManualFillStrategy;
|
import ru.project.ui.creation.manual.ManualFillStrategy;
|
||||||
|
import ru.project.ui.creation.random.RandomDataSettingsWindow;
|
||||||
|
import ru.project.ui.creation.random.RandomFillSettings;
|
||||||
|
import ru.project.ui.creation.random.RandomFillStrategy;
|
||||||
|
|
||||||
public class CreateCollectionMenu extends BaseModalWindow {
|
public class CreateCollectionMenu extends BaseModalWindow {
|
||||||
|
|
||||||
@@ -26,6 +29,7 @@ public class CreateCollectionMenu extends BaseModalWindow {
|
|||||||
|
|
||||||
private final ManualDataSettingsWindow manualDataSettingsWindow;
|
private final ManualDataSettingsWindow manualDataSettingsWindow;
|
||||||
private final FileDataSettingsWindow fileDataSettingsWindow;
|
private final FileDataSettingsWindow fileDataSettingsWindow;
|
||||||
|
private final RandomDataSettingsWindow randomDataSettingsWindow;
|
||||||
|
|
||||||
public CreateCollectionMenu(WindowBasedTextGUI gui, AppState state) {
|
public CreateCollectionMenu(WindowBasedTextGUI gui, AppState state) {
|
||||||
|
|
||||||
@@ -37,6 +41,7 @@ public class CreateCollectionMenu extends BaseModalWindow {
|
|||||||
|
|
||||||
this.manualDataSettingsWindow = new ManualDataSettingsWindow(gui, this::setManualFillStrategy);
|
this.manualDataSettingsWindow = new ManualDataSettingsWindow(gui, this::setManualFillStrategy);
|
||||||
this.fileDataSettingsWindow = new FileDataSettingsWindow(gui, this::setFileFillStrategy);
|
this.fileDataSettingsWindow = new FileDataSettingsWindow(gui, this::setFileFillStrategy);
|
||||||
|
this.randomDataSettingsWindow = new RandomDataSettingsWindow(gui, this::setRandomFillStrategy);
|
||||||
|
|
||||||
Panel panel = new Panel();
|
Panel panel = new Panel();
|
||||||
panel.setLayoutManager(new LinearLayout());
|
panel.setLayoutManager(new LinearLayout());
|
||||||
@@ -65,9 +70,9 @@ public class CreateCollectionMenu extends BaseModalWindow {
|
|||||||
fillStrategy = new FileFillStrategy(settings);
|
fillStrategy = new FileFillStrategy(settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
// private void setRandomFillStrategy(RandomFillSettings settings) {
|
private void setRandomFillStrategy(RandomFillSettings settings) {
|
||||||
// fillStrategy = new RandomFillStrategy(settings);
|
fillStrategy = new RandomFillStrategy(settings);
|
||||||
// }
|
}
|
||||||
|
|
||||||
private void setupCurrentFillMethod() {
|
private void setupCurrentFillMethod() {
|
||||||
switch (selectedFillMethod) {
|
switch (selectedFillMethod) {
|
||||||
@@ -75,9 +80,7 @@ public class CreateCollectionMenu extends BaseModalWindow {
|
|||||||
|
|
||||||
case FILE -> fileDataSettingsWindow.showModal();
|
case FILE -> fileDataSettingsWindow.showModal();
|
||||||
|
|
||||||
case RANDOM ->
|
case RANDOM -> randomDataSettingsWindow.showModal();
|
||||||
MessageWindow.showModal(
|
|
||||||
gui, "Для случайных данных дополнительные настройки не требуются.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,313 @@
|
|||||||
|
package ru.project.ui.creation.random;
|
||||||
|
|
||||||
|
import com.googlecode.lanterna.gui2.Button;
|
||||||
|
import com.googlecode.lanterna.gui2.Label;
|
||||||
|
import com.googlecode.lanterna.gui2.LinearLayout;
|
||||||
|
import com.googlecode.lanterna.gui2.Panel;
|
||||||
|
import com.googlecode.lanterna.gui2.WindowBasedTextGUI;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import ru.project.ui.base.BaseModalWindow;
|
||||||
|
import ru.project.ui.common.InputValueWindow;
|
||||||
|
import ru.project.ui.common.MessageWindow;
|
||||||
|
|
||||||
|
public class RandomDataSettingsWindow extends BaseModalWindow {
|
||||||
|
|
||||||
|
private final RandomFillSettings settings;
|
||||||
|
private final Consumer<RandomFillSettings> onApply;
|
||||||
|
|
||||||
|
private final Label minGroupNumberLabel;
|
||||||
|
private final Label maxGroupNumberLabel;
|
||||||
|
private final Label minAverageGradeLabel;
|
||||||
|
private final Label maxAverageGradeLabel;
|
||||||
|
private final Label minRecordBookNumberLabel;
|
||||||
|
private final Label maxRecordBookNumberLabel;
|
||||||
|
|
||||||
|
public RandomDataSettingsWindow(WindowBasedTextGUI gui, Consumer<RandomFillSettings> onApply) {
|
||||||
|
|
||||||
|
super("Настройка случайного заполнения", gui);
|
||||||
|
|
||||||
|
this.settings = new RandomFillSettings();
|
||||||
|
this.onApply = onApply;
|
||||||
|
|
||||||
|
Panel panel = new Panel();
|
||||||
|
panel.setLayoutManager(new LinearLayout());
|
||||||
|
|
||||||
|
minGroupNumberLabel =
|
||||||
|
new Label("Минимальный номер группы: " + getValueOrDefault(settings.getMinGroupNumber()));
|
||||||
|
|
||||||
|
maxGroupNumberLabel =
|
||||||
|
new Label("Максимальный номер группы: " + getValueOrDefault(settings.getMaxGroupNumber()));
|
||||||
|
|
||||||
|
minAverageGradeLabel =
|
||||||
|
new Label("Минимальный средний балл: " + getValueOrDefault(settings.getMinAverageGrade()));
|
||||||
|
|
||||||
|
maxAverageGradeLabel =
|
||||||
|
new Label("Максимальный средний балл: " + getValueOrDefault(settings.getMaxAverageGrade()));
|
||||||
|
|
||||||
|
minRecordBookNumberLabel =
|
||||||
|
new Label(
|
||||||
|
"Минимальный номер зачётной книжки: "
|
||||||
|
+ getValueOrDefault(settings.getMinRecordBookNumber()));
|
||||||
|
|
||||||
|
maxRecordBookNumberLabel =
|
||||||
|
new Label(
|
||||||
|
"Максимальный номер зачётной книжки: "
|
||||||
|
+ getValueOrDefault(settings.getMaxRecordBookNumber()));
|
||||||
|
|
||||||
|
panel.addComponent(minGroupNumberLabel);
|
||||||
|
panel.addComponent(maxGroupNumberLabel);
|
||||||
|
panel.addComponent(minAverageGradeLabel);
|
||||||
|
panel.addComponent(maxAverageGradeLabel);
|
||||||
|
panel.addComponent(minRecordBookNumberLabel);
|
||||||
|
panel.addComponent(maxRecordBookNumberLabel);
|
||||||
|
|
||||||
|
panel.addComponent(new Button("Задать минимальный номер группы", this::setMinGroupNumber));
|
||||||
|
|
||||||
|
panel.addComponent(new Button("Задать максимальный номер группы", this::setMaxGroupNumber));
|
||||||
|
|
||||||
|
panel.addComponent(new Button("Задать минимальный средний балл", this::setMinAverageGrade));
|
||||||
|
|
||||||
|
panel.addComponent(new Button("Задать максимальный средний балл", this::setMaxAverageGrade));
|
||||||
|
|
||||||
|
panel.addComponent(
|
||||||
|
new Button("Задать минимальный номер зачётной книжки", this::setMinRecordBookNumber));
|
||||||
|
|
||||||
|
panel.addComponent(
|
||||||
|
new Button("Задать максимальный номер зачётной книжки", this::setMaxRecordBookNumber));
|
||||||
|
|
||||||
|
panel.addComponent(new Button("Применить", this::apply));
|
||||||
|
|
||||||
|
panel.addComponent(new Button("Назад", this::close));
|
||||||
|
|
||||||
|
setComponent(panel);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMinGroupNumber() {
|
||||||
|
showGroupNumberInput(
|
||||||
|
"Минимальный номер группы",
|
||||||
|
settings.getMinGroupNumber(),
|
||||||
|
value -> {
|
||||||
|
if (!value.matches("[A-Z]\\d{2}")) {
|
||||||
|
|
||||||
|
MessageWindow.showModal(gui, "Номер группы должен соответствовать формату A12.");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.getMaxGroupNumber() != null
|
||||||
|
&& value.compareTo(settings.getMaxGroupNumber()) > 0) {
|
||||||
|
|
||||||
|
MessageWindow.showModal(
|
||||||
|
gui, "Минимальный номер группы не может быть больше максимального.");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.setMinGroupNumber(value);
|
||||||
|
|
||||||
|
minGroupNumberLabel.setText("Минимальный номер группы: " + value);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMaxGroupNumber() {
|
||||||
|
showGroupNumberInput(
|
||||||
|
"Максимальный номер группы",
|
||||||
|
settings.getMaxGroupNumber(),
|
||||||
|
value -> {
|
||||||
|
if (!value.matches("[A-Z]\\d{2}")) {
|
||||||
|
|
||||||
|
MessageWindow.showModal(gui, "Номер группы должен соответствовать формату A12.");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.getMinGroupNumber() != null
|
||||||
|
&& value.compareTo(settings.getMinGroupNumber()) < 0) {
|
||||||
|
|
||||||
|
MessageWindow.showModal(
|
||||||
|
gui, "Максимальный номер группы не может быть меньше минимального.");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.setMaxGroupNumber(value);
|
||||||
|
|
||||||
|
maxGroupNumberLabel.setText("Максимальный номер группы: " + value);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showGroupNumberInput(
|
||||||
|
String title, String initialValue, java.util.function.Predicate<String> onSave) {
|
||||||
|
|
||||||
|
InputValueWindow window =
|
||||||
|
new InputValueWindow(
|
||||||
|
gui, title, "Введите номер группы (например, A12):", initialValue, onSave);
|
||||||
|
|
||||||
|
window.showModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMinAverageGrade() {
|
||||||
|
showAverageGradeInput(
|
||||||
|
"Минимальный средний балл",
|
||||||
|
settings.getMinAverageGrade(),
|
||||||
|
value -> {
|
||||||
|
if (settings.getMaxAverageGrade() != null && value > settings.getMaxAverageGrade()) {
|
||||||
|
|
||||||
|
MessageWindow.showModal(
|
||||||
|
gui, "Минимальный средний балл не может быть больше максимального.");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.setMinAverageGrade(value);
|
||||||
|
|
||||||
|
minAverageGradeLabel.setText("Минимальный средний балл: " + value);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMaxAverageGrade() {
|
||||||
|
showAverageGradeInput(
|
||||||
|
"Максимальный средний балл",
|
||||||
|
settings.getMaxAverageGrade(),
|
||||||
|
value -> {
|
||||||
|
if (settings.getMinAverageGrade() != null && value < settings.getMinAverageGrade()) {
|
||||||
|
|
||||||
|
MessageWindow.showModal(
|
||||||
|
gui, "Максимальный средний балл не может быть меньше минимального.");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.setMaxAverageGrade(value);
|
||||||
|
|
||||||
|
maxAverageGradeLabel.setText("Максимальный средний балл: " + value);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showAverageGradeInput(
|
||||||
|
String title, Double initialValue, java.util.function.Predicate<Double> onSave) {
|
||||||
|
|
||||||
|
InputValueWindow window =
|
||||||
|
new InputValueWindow(
|
||||||
|
gui,
|
||||||
|
title,
|
||||||
|
"Введите значение от " + "0.0 до 5.0:",
|
||||||
|
initialValue == null ? null : String.valueOf(initialValue),
|
||||||
|
value -> {
|
||||||
|
try {
|
||||||
|
double parsedValue = Double.parseDouble(value);
|
||||||
|
|
||||||
|
if (parsedValue < ru.project.student.Student.getMinAverageGrade()
|
||||||
|
|| parsedValue > ru.project.student.Student.getMaxAverageGrade()) {
|
||||||
|
|
||||||
|
MessageWindow.showModal(gui, "Средний балл должен быть от 0.0 до 5.0.");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return onSave.test(parsedValue);
|
||||||
|
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
MessageWindow.showModal(gui, "Введите корректное число.");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
window.showModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMinRecordBookNumber() {
|
||||||
|
showRecordBookNumberInput(
|
||||||
|
"Минимальный номер зачётной книжки",
|
||||||
|
settings.getMinRecordBookNumber(),
|
||||||
|
value -> {
|
||||||
|
if (settings.getMaxRecordBookNumber() != null
|
||||||
|
&& value > settings.getMaxRecordBookNumber()) {
|
||||||
|
|
||||||
|
MessageWindow.showModal(
|
||||||
|
gui, "Минимальный номер зачётной книжки не может быть больше максимального.");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.setMinRecordBookNumber(value);
|
||||||
|
|
||||||
|
minRecordBookNumberLabel.setText("Минимальный номер зачётной книжки: " + value);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMaxRecordBookNumber() {
|
||||||
|
showRecordBookNumberInput(
|
||||||
|
"Максимальный номер зачётной книжки",
|
||||||
|
settings.getMaxRecordBookNumber(),
|
||||||
|
value -> {
|
||||||
|
if (settings.getMinRecordBookNumber() != null
|
||||||
|
&& value < settings.getMinRecordBookNumber()) {
|
||||||
|
|
||||||
|
MessageWindow.showModal(
|
||||||
|
gui, "Максимальный номер зачётной книжки не может быть меньше минимального.");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.setMaxRecordBookNumber(value);
|
||||||
|
|
||||||
|
maxRecordBookNumberLabel.setText("Максимальный номер зачётной книжки: " + value);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void showRecordBookNumberInput(
|
||||||
|
String title, Integer initialValue, java.util.function.Predicate<Integer> onSave) {
|
||||||
|
|
||||||
|
InputValueWindow window =
|
||||||
|
new InputValueWindow(
|
||||||
|
gui,
|
||||||
|
title,
|
||||||
|
"Введите номер зачётной книжки:",
|
||||||
|
initialValue == null ? null : String.valueOf(initialValue),
|
||||||
|
value -> {
|
||||||
|
try {
|
||||||
|
int parsedValue = Integer.parseInt(value);
|
||||||
|
|
||||||
|
if (parsedValue < ru.project.student.Student.getMinRecordBookNumber()) {
|
||||||
|
|
||||||
|
MessageWindow.showModal(gui, "Номер зачётной книжки должен быть положительным.");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return onSave.test(parsedValue);
|
||||||
|
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
MessageWindow.showModal(gui, "Введите целое число.");
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
window.showModal();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void apply() {
|
||||||
|
onApply.accept(settings);
|
||||||
|
|
||||||
|
MessageWindow.showModal(gui, "Настройки создания коллекции случайно успешно применены.");
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getValueOrDefault(Object value) {
|
||||||
|
return value == null ? "не задан" : String.valueOf(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
package ru.project.ui.creation.random;
|
||||||
|
|
||||||
|
public class RandomFillSettings {
|
||||||
|
|
||||||
|
private String minGroupNumber;
|
||||||
|
private String maxGroupNumber;
|
||||||
|
|
||||||
|
private Double minAverageGrade;
|
||||||
|
private Double maxAverageGrade;
|
||||||
|
|
||||||
|
private Integer minRecordBookNumber;
|
||||||
|
private Integer maxRecordBookNumber;
|
||||||
|
|
||||||
|
public RandomFillSettings() {
|
||||||
|
this.minGroupNumber = null;
|
||||||
|
this.maxGroupNumber = null;
|
||||||
|
|
||||||
|
this.minAverageGrade = null;
|
||||||
|
this.maxAverageGrade = null;
|
||||||
|
|
||||||
|
this.minRecordBookNumber = null;
|
||||||
|
this.maxRecordBookNumber = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMinGroupNumber() {
|
||||||
|
return minGroupNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMinGroupNumber(String minGroupNumber) {
|
||||||
|
this.minGroupNumber = minGroupNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMaxGroupNumber() {
|
||||||
|
return maxGroupNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxGroupNumber(String maxGroupNumber) {
|
||||||
|
this.maxGroupNumber = maxGroupNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double getMinAverageGrade() {
|
||||||
|
return minAverageGrade;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMinAverageGrade(Double minAverageGrade) {
|
||||||
|
this.minAverageGrade = minAverageGrade;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double getMaxAverageGrade() {
|
||||||
|
return maxAverageGrade;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxAverageGrade(Double maxAverageGrade) {
|
||||||
|
this.maxAverageGrade = maxAverageGrade;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getMinRecordBookNumber() {
|
||||||
|
return minRecordBookNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMinRecordBookNumber(Integer minRecordBookNumber) {
|
||||||
|
this.minRecordBookNumber = minRecordBookNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getMaxRecordBookNumber() {
|
||||||
|
return maxRecordBookNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaxRecordBookNumber(Integer maxRecordBookNumber) {
|
||||||
|
this.maxRecordBookNumber = maxRecordBookNumber;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package ru.project.ui.creation.random;
|
||||||
|
|
||||||
|
import ru.project.collection.MyList;
|
||||||
|
import ru.project.student.Student;
|
||||||
|
import ru.project.ui.creation.FillStrategy;
|
||||||
|
|
||||||
|
public class RandomFillStrategy implements FillStrategy {
|
||||||
|
|
||||||
|
// private final RandomFillSettings settings;
|
||||||
|
|
||||||
|
public RandomFillStrategy(RandomFillSettings settings) {
|
||||||
|
// this.settings = settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MyList<Student> create() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user