diff --git a/app/src/main/java/ru/project/ui/creation/CreateCollectionMenu.java b/app/src/main/java/ru/project/ui/creation/CreateCollectionMenu.java index e56c4aa..da542b9 100644 --- a/app/src/main/java/ru/project/ui/creation/CreateCollectionMenu.java +++ b/app/src/main/java/ru/project/ui/creation/CreateCollectionMenu.java @@ -14,6 +14,9 @@ import ru.project.ui.creation.file.FileFillStrategy; import ru.project.ui.creation.manual.ManualDataSettingsWindow; import ru.project.ui.creation.manual.ManualFillSettings; 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 { @@ -26,6 +29,7 @@ public class CreateCollectionMenu extends BaseModalWindow { private final ManualDataSettingsWindow manualDataSettingsWindow; private final FileDataSettingsWindow fileDataSettingsWindow; + private final RandomDataSettingsWindow randomDataSettingsWindow; public CreateCollectionMenu(WindowBasedTextGUI gui, AppState state) { @@ -37,6 +41,7 @@ public class CreateCollectionMenu extends BaseModalWindow { this.manualDataSettingsWindow = new ManualDataSettingsWindow(gui, this::setManualFillStrategy); this.fileDataSettingsWindow = new FileDataSettingsWindow(gui, this::setFileFillStrategy); + this.randomDataSettingsWindow = new RandomDataSettingsWindow(gui, this::setRandomFillStrategy); Panel panel = new Panel(); panel.setLayoutManager(new LinearLayout()); @@ -65,9 +70,9 @@ public class CreateCollectionMenu extends BaseModalWindow { fillStrategy = new FileFillStrategy(settings); } - // private void setRandomFillStrategy(RandomFillSettings settings) { - // fillStrategy = new RandomFillStrategy(settings); - // } + private void setRandomFillStrategy(RandomFillSettings settings) { + fillStrategy = new RandomFillStrategy(settings); + } private void setupCurrentFillMethod() { switch (selectedFillMethod) { @@ -75,9 +80,7 @@ public class CreateCollectionMenu extends BaseModalWindow { case FILE -> fileDataSettingsWindow.showModal(); - case RANDOM -> - MessageWindow.showModal( - gui, "Для случайных данных дополнительные настройки не требуются."); + case RANDOM -> randomDataSettingsWindow.showModal(); } } diff --git a/app/src/main/java/ru/project/ui/creation/random/RandomDataSettingsWindow.java b/app/src/main/java/ru/project/ui/creation/random/RandomDataSettingsWindow.java new file mode 100644 index 0000000..fcba4e1 --- /dev/null +++ b/app/src/main/java/ru/project/ui/creation/random/RandomDataSettingsWindow.java @@ -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 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 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 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 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 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); + } +} diff --git a/app/src/main/java/ru/project/ui/creation/random/RandomFillSettings.java b/app/src/main/java/ru/project/ui/creation/random/RandomFillSettings.java new file mode 100644 index 0000000..eab4334 --- /dev/null +++ b/app/src/main/java/ru/project/ui/creation/random/RandomFillSettings.java @@ -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; + } +} diff --git a/app/src/main/java/ru/project/ui/creation/random/RandomFillStrategy.java b/app/src/main/java/ru/project/ui/creation/random/RandomFillStrategy.java new file mode 100644 index 0000000..bbebc93 --- /dev/null +++ b/app/src/main/java/ru/project/ui/creation/random/RandomFillStrategy.java @@ -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 create() { + return null; + } +}