diff --git a/app/src/main/java/ru/project/App.java b/app/src/main/java/ru/project/App.java index 1e1d933..fa4ee64 100644 --- a/app/src/main/java/ru/project/App.java +++ b/app/src/main/java/ru/project/App.java @@ -25,7 +25,7 @@ public final class App { MainMenu mainMenu = new MainMenu(gui, state); - mainMenu.show(); + mainMenu.showModal(); } catch (Exception e) { System.err.println("Произошла ошибка при выполнении программы:"); diff --git a/app/src/main/java/ru/project/ui/menu/CreateCollectionMenu.java b/app/src/main/java/ru/project/ui/menu/CreateCollectionMenu.java index 48d2f0c..dd9785a 100644 --- a/app/src/main/java/ru/project/ui/menu/CreateCollectionMenu.java +++ b/app/src/main/java/ru/project/ui/menu/CreateCollectionMenu.java @@ -5,14 +5,17 @@ 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 ru.project.collection.MyLinkedList; +import ru.project.collection.MyList; import ru.project.model.AppState; import ru.project.model.FillMethod; -import ru.project.ui.base.BaseWindow; +import ru.project.student.Student; +import ru.project.ui.base.BaseModalWindow; import ru.project.ui.window.CustomDataSettingsWindow; import ru.project.ui.window.InputValueWindow; import ru.project.ui.window.MessageWindow; -public class CreateCollectionMenu extends BaseWindow { +public class CreateCollectionMenu extends BaseModalWindow { private int collectionSize; private FillMethod selectedFillMethod; @@ -20,16 +23,16 @@ public class CreateCollectionMenu extends BaseWindow { private final Label sizeLabel; private final Label fillMethodLabel; - private final AppState state; + private final CustomDataSettingsWindow customDataSettingsWindow; public CreateCollectionMenu(WindowBasedTextGUI gui, AppState state) { super("Создание новой коллекции", gui); - this.state = state; - collectionSize = 0; selectedFillMethod = FillMethod.CUSTOM; + customDataSettingsWindow = new CustomDataSettingsWindow(gui, state, () -> collectionSize); + Panel panel = new Panel(); panel.setLayoutManager(new LinearLayout()); @@ -40,21 +43,21 @@ public class CreateCollectionMenu extends BaseWindow { panel.addComponent(sizeLabel); panel.addComponent(fillMethodLabel); - panel.addComponent(new Button("Задать размер", this::openCollectionSizeInputValueWindow)); + panel.addComponent(new Button("Задать размер", this::showCollectionSizeInputValueWindow)); panel.addComponent(new Button("Выбрать способ заполнения", this::selectFillMethod)); panel.addComponent( new Button("Настроить текущий способ заполнения", this::setupCurrentFillMethod)); - panel.addComponent(new Button("Создать новую коллекцию", this::createCollection)); + panel.addComponent(new Button("Создать новую коллекцию", () -> updateMainCollection(state))); panel.addComponent(new Button("Выйти", this::close)); setComponent(panel); } - private void openCollectionSizeInputValueWindow() { + private void showCollectionSizeInputValueWindow() { InputValueWindow window = new InputValueWindow( gui, @@ -63,21 +66,21 @@ public class CreateCollectionMenu extends BaseWindow { collectionSize > 0 ? String.valueOf(collectionSize) : null, this::handleSizeEntered); - window.show(); + window.showModal(); } private boolean handleSizeEntered(String value) { try { int enteredSize = Integer.parseInt(value); if (enteredSize <= 0) { - MessageWindow.show(gui, "Размер должен быть больше 0."); + MessageWindow.showModal(gui, "Размер должен быть больше 0."); return false; } collectionSize = enteredSize; sizeLabel.setText("Размер: " + collectionSize); return true; } catch (NumberFormatException e) { - MessageWindow.show(gui, "Введите целое число."); + MessageWindow.showModal(gui, "Введите целое число."); return false; } } @@ -85,22 +88,21 @@ public class CreateCollectionMenu extends BaseWindow { private void setupCurrentFillMethod() { switch (selectedFillMethod) { case CUSTOM -> { - BaseWindow window = new CustomDataSettingsWindow(gui, state, collectionSize); - - window.show(); + customDataSettingsWindow.showModal(); } case FILE -> // TODO - MessageWindow.show(gui, "Не реализовано."); + MessageWindow.showModal(gui, "Не реализовано."); case RANDOM -> - MessageWindow.show(gui, "Для случайных данных дополнительные настройки не требуются."); + MessageWindow.showModal( + gui, "Для случайных данных дополнительные настройки не требуются."); } } private void selectFillMethod() { - BaseWindow menu = + BaseModalWindow menu = new FillMethodSelectionWindow( gui, fillMethod -> { @@ -109,43 +111,52 @@ public class CreateCollectionMenu extends BaseWindow { "Способ заполнения: " + getFillMethodName(selectedFillMethod)); }); - menu.show(); + menu.showModal(); } - private void createCollection() { + private void updateMainCollection(AppState state) { if (collectionSize <= 0) { - MessageWindow.show(gui, "Сначала задайте размер коллекции."); + MessageWindow.showModal(gui, "Сначала задайте размер коллекции."); return; } switch (selectedFillMethod) { case CUSTOM: - createCollectionFromCustomData(); + createCollectionFromCustomData(state); break; case RANDOM: - createCollectionFromRandomData(); + createCollectionFromRandomData(state); break; case FILE: - createCollectionFromFileData(); + createCollectionFromFileData(state); break; } } - private void createCollectionFromCustomData() { - // TODO - MessageWindow.show(gui, "Не реализовано."); + private void createCollectionFromCustomData(AppState state) { + MyList customDataCollection = state.getCustomDataCollection(); + + MyList mainCollection = new MyLinkedList<>(); + + for (int i = 0; i < customDataCollection.size(); i++) { + mainCollection.add(customDataCollection.get(i)); + } + + state.setMainCollection(mainCollection); + + MessageWindow.showModal(gui, "Коллекция успешно создана."); } - private void createCollectionFromRandomData() { + private void createCollectionFromRandomData(AppState state) { // TODO - MessageWindow.show(gui, "Не реализовано."); + MessageWindow.showModal(gui, "Не реализовано."); } - private void createCollectionFromFileData() { + private void createCollectionFromFileData(AppState state) { // TODO - MessageWindow.show(gui, "Не реализовано."); + MessageWindow.showModal(gui, "Не реализовано."); } private String getFillMethodName(FillMethod fillMethod) { diff --git a/app/src/main/java/ru/project/ui/menu/FillMethodSelectionWindow.java b/app/src/main/java/ru/project/ui/menu/FillMethodSelectionWindow.java index 245fd06..f408210 100644 --- a/app/src/main/java/ru/project/ui/menu/FillMethodSelectionWindow.java +++ b/app/src/main/java/ru/project/ui/menu/FillMethodSelectionWindow.java @@ -4,9 +4,9 @@ import com.googlecode.lanterna.gui2.ActionListBox; import com.googlecode.lanterna.gui2.WindowBasedTextGUI; import java.util.function.Consumer; import ru.project.model.FillMethod; -import ru.project.ui.base.BaseWindow; +import ru.project.ui.base.BaseModalWindow; -public class FillMethodSelectionWindow extends BaseWindow { +public class FillMethodSelectionWindow extends BaseModalWindow { private final Consumer onFillMethodSelected; diff --git a/app/src/main/java/ru/project/ui/menu/MainMenu.java b/app/src/main/java/ru/project/ui/menu/MainMenu.java index 308277e..93cef48 100644 --- a/app/src/main/java/ru/project/ui/menu/MainMenu.java +++ b/app/src/main/java/ru/project/ui/menu/MainMenu.java @@ -5,25 +5,26 @@ import com.googlecode.lanterna.gui2.WindowBasedTextGUI; import ru.project.collection.MyList; import ru.project.model.AppState; import ru.project.student.Student; -import ru.project.ui.base.BaseWindow; +import ru.project.ui.base.BaseModalWindow; import ru.project.ui.window.CollectionDisplayWindow; import ru.project.ui.window.MessageWindow; -public class MainMenu extends BaseWindow { +public class MainMenu extends BaseModalWindow { private final ActionListBox menu; - private final AppState state; + + private final BaseModalWindow createCollectionMenu; public MainMenu(WindowBasedTextGUI gui, AppState state) { super("Главное меню", gui); - this.state = state; + this.createCollectionMenu = new CreateCollectionMenu(gui, state); menu = new ActionListBox(); - menu.addItem("Показать текущую коллекцию", this::showCurrentCollection); + menu.addItem("Показать текущую коллекцию", () -> showMainCollection(state)); - menu.addItem("Меню создания новой коллекции", this::createCollection); + menu.addItem("Меню создания новой коллекции", this::showCreateCollectionMenu); menu.addItem("Меню сохранения текущей коллекции в файл", this::saveCollection); @@ -38,38 +39,36 @@ public class MainMenu extends BaseWindow { setComponent(menu); } - private void showCurrentCollection() { - MyList currentCollection = state.getCurrentCollection(); + private void showMainCollection(AppState state) { + MyList mainCollection = state.getMainCollection(); - BaseWindow window = new CollectionDisplayWindow(gui, currentCollection); + BaseModalWindow window = new CollectionDisplayWindow(gui, mainCollection); - window.show(); + window.showModal(); } - private void createCollection() { - BaseWindow window = new CreateCollectionMenu(gui, state); - - window.show(); + private void showCreateCollectionMenu() { + createCollectionMenu.showModal(); } private void saveCollection() { // TODO - MessageWindow.show(gui, "Не реализовано."); + MessageWindow.showModal(gui, "Не реализовано."); } private void sortCollection() { // TODO - MessageWindow.show(gui, "Не реализовано."); + MessageWindow.showModal(gui, "Не реализовано."); } private void searchCollection() { // TODO - MessageWindow.show(gui, "Не реализовано."); + MessageWindow.showModal(gui, "Не реализовано."); } private void countOccurrences() { // TODO - MessageWindow.show(gui, "Не реализовано."); + MessageWindow.showModal(gui, "Не реализовано."); } private void exit() { diff --git a/app/src/main/java/ru/project/ui/window/CollectionDisplayWindow.java b/app/src/main/java/ru/project/ui/window/CollectionDisplayWindow.java index 4ca3c5e..f5da901 100644 --- a/app/src/main/java/ru/project/ui/window/CollectionDisplayWindow.java +++ b/app/src/main/java/ru/project/ui/window/CollectionDisplayWindow.java @@ -12,9 +12,9 @@ import com.googlecode.lanterna.input.KeyStroke; import com.googlecode.lanterna.input.KeyType; import ru.project.collection.MyList; import ru.project.student.Student; -import ru.project.ui.base.BaseWindow; +import ru.project.ui.base.BaseModalWindow; -public class CollectionDisplayWindow extends BaseWindow { +public class CollectionDisplayWindow extends BaseModalWindow { private final MyList collection; diff --git a/app/src/main/java/ru/project/ui/window/CustomDataSettingsWindow.java b/app/src/main/java/ru/project/ui/window/CustomDataSettingsWindow.java index b59f805..377b417 100644 --- a/app/src/main/java/ru/project/ui/window/CustomDataSettingsWindow.java +++ b/app/src/main/java/ru/project/ui/window/CustomDataSettingsWindow.java @@ -5,17 +5,18 @@ 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.Supplier; import ru.project.collection.MyLinkedList; import ru.project.collection.MyList; import ru.project.model.AppState; import ru.project.student.Student; import ru.project.student.StudentBuilder; -import ru.project.ui.base.BaseWindow; +import ru.project.ui.base.BaseModalWindow; -public class CustomDataSettingsWindow extends BaseWindow { +public class CustomDataSettingsWindow extends BaseModalWindow { private final AppState state; - private final int collectionSize; + private final Supplier requestedCollectionSize; private final StudentBuilder studentBuilder; private String groupNumber; @@ -28,28 +29,17 @@ public class CustomDataSettingsWindow extends BaseWindow { private final Label recordBookNumberLabel; private final Label indexLabel; - private final MyList preparedCustomDataCollection; + private MyList preparedCustomDataCollection; - public CustomDataSettingsWindow(WindowBasedTextGUI gui, AppState state, int collectionSize) { + public CustomDataSettingsWindow( + WindowBasedTextGUI gui, AppState state, Supplier collectionSize) { super("Настройка пользовательских данных", gui); this.state = state; - this.collectionSize = collectionSize; + this.requestedCollectionSize = collectionSize; + this.studentBuilder = new StudentBuilder(); - this.preparedCustomDataCollection = new MyLinkedList<>(); - - MyList customDataCollection = state.getCustomDataCollection(); - - int elementsToCopy = Math.min(customDataCollection.size(), collectionSize); - - for (int i = 0; i < elementsToCopy; i++) { - preparedCustomDataCollection.add(customDataCollection.get(i)); - } - - for (int i = elementsToCopy; i < collectionSize; i++) { - preparedCustomDataCollection.add(null); - } Panel panel = new Panel(); panel.setLayoutManager(new LinearLayout()); @@ -86,6 +76,29 @@ public class CustomDataSettingsWindow extends BaseWindow { setComponent(panel); } + @Override + public void showModal() { + prepareCustomDataCollection(); + super.showModal(); + } + + private void prepareCustomDataCollection() { + preparedCustomDataCollection = new MyLinkedList<>(); + + int targetCollectionSize = requestedCollectionSize.get(); + int currentCustomDataCollectionSize = state.getCustomDataCollection().size(); + + int elementsToCopy = Math.min(currentCustomDataCollectionSize, targetCollectionSize); + + for (int i = 0; i < elementsToCopy; i++) { + preparedCustomDataCollection.add(state.getCustomDataCollection().get(i)); + } + + for (int i = elementsToCopy; i < targetCollectionSize; i++) { + preparedCustomDataCollection.add(null); + } + } + private void setGroupNumber() { InputValueWindow window = new InputValueWindow( @@ -95,7 +108,7 @@ public class CustomDataSettingsWindow extends BaseWindow { groupNumber, value -> { if (!value.matches(Student.getGroupNumberPattern())) { - MessageWindow.show(gui, "Номер группы должен соответствовать формату A12."); + MessageWindow.showModal(gui, "Номер группы должен соответствовать формату A12."); return false; } @@ -107,7 +120,7 @@ public class CustomDataSettingsWindow extends BaseWindow { return true; }); - window.show(); + window.showModal(); } private void setAverageGrade() { @@ -124,24 +137,27 @@ public class CustomDataSettingsWindow extends BaseWindow { if (parsedValue < Student.getMinAverageGrade() || parsedValue > Student.getMaxAverageGrade()) { - MessageWindow.show(gui, "Средний балл должен быть от 0.0 до 5.0."); + MessageWindow.showModal(gui, "Средний балл должен быть от 0.0 до 5.0."); + return false; } averageGrade = parsedValue; + studentBuilder.setAverageGrade(parsedValue); averageGradeLabel.setText("Средний балл: " + averageGrade); + return true; + } catch (NumberFormatException e) { - MessageWindow.show(gui, "Введите корректное число."); + MessageWindow.showModal(gui, "Введите корректное число."); + return false; } - - return true; }); - window.show(); + window.showModal(); } private void setRecordBookNumber() { @@ -156,24 +172,28 @@ public class CustomDataSettingsWindow extends BaseWindow { int parsedValue = Integer.parseInt(value); if (parsedValue < Student.getMinRecordBookNumber()) { - MessageWindow.show(gui, "Номер зачётной книжки должен быть положительным."); + + MessageWindow.showModal(gui, "Номер зачётной книжки должен быть положительным."); + return false; } recordBookNumber = parsedValue; + studentBuilder.setRecordBookNumber(parsedValue); recordBookNumberLabel.setText("Номер зачётной книжки: " + recordBookNumber); + return true; + } catch (NumberFormatException e) { - MessageWindow.show(gui, "Введите целое число."); + MessageWindow.showModal(gui, "Введите целое число."); + return false; } - - return true; }); - window.show(); + window.showModal(); } private void setObjectIndex() { @@ -188,12 +208,16 @@ public class CustomDataSettingsWindow extends BaseWindow { int index = Integer.parseInt(value); if (index < 0) { - MessageWindow.show(gui, "Индекс объекта не может быть отрицательным."); + MessageWindow.showModal(gui, "Индекс объекта не может быть отрицательным."); + return false; } - if (index >= collectionSize) { - MessageWindow.show(gui, "Индекс должен быть меньше размера коллекции."); + int size = requestedCollectionSize.get(); + + if (index >= size) { + MessageWindow.showModal(gui, "Индекс должен быть меньше размера коллекции."); + return false; } @@ -204,27 +228,28 @@ public class CustomDataSettingsWindow extends BaseWindow { return true; } catch (NumberFormatException e) { - MessageWindow.show(gui, "Введите целое число."); + MessageWindow.showModal(gui, "Введите целое число."); + return false; } }); - window.show(); + window.showModal(); } private void editObject() { if (!hasStudentData()) { - MessageWindow.show(gui, "Сначала задайте все поля студента."); + MessageWindow.showModal(gui, "Сначала задайте все поля студента."); return; } if (selectedObjectIndex == null) { - MessageWindow.show(gui, "Сначала задайте индекс объекта."); + MessageWindow.showModal(gui, "Сначала задайте индекс объекта."); return; } if (selectedObjectIndex >= preparedCustomDataCollection.size()) { - MessageWindow.show(gui, "Индекс объекта выходит за границы подготовленной коллекции."); + MessageWindow.showModal(gui, "Индекс объекта выходит за границы подготовленной коллекции."); return; } @@ -232,31 +257,27 @@ public class CustomDataSettingsWindow extends BaseWindow { preparedCustomDataCollection.set(selectedObjectIndex, student); - MessageWindow.show(gui, "Данные объекта успешно заданы."); + MessageWindow.showModal(gui, "Данные объекта успешно заданы."); } private void apply() { - MyList currentCollection = new MyLinkedList<>(); - - for (int i = 0; i < preparedCustomDataCollection.size(); i++) { - currentCollection.add(preparedCustomDataCollection.get(i)); - } - state.setCustomDataCollection(preparedCustomDataCollection); - state.setCurrentCollection(currentCollection); + prepareCustomDataCollection(); - close(); + MessageWindow.showModal(gui, "Пользовательские данные успешно применены."); } private void preview() { - if (!hasStudentData()) { - MessageWindow.show(gui, "Для предпросмотра сначала задайте все поля студента."); + if (preparedCustomDataCollection == null || preparedCustomDataCollection.isEmpty()) { + + MessageWindow.showModal(gui, "Подготовленная коллекция пуста."); + return; } - Student student = studentBuilder.build(); + CollectionDisplayWindow window = new CollectionDisplayWindow(gui, preparedCustomDataCollection); - MessageWindow.show(gui, student.toString()); + window.showModal(); } private boolean hasStudentData() { diff --git a/app/src/main/java/ru/project/ui/window/InputValueWindow.java b/app/src/main/java/ru/project/ui/window/InputValueWindow.java index d21a79b..dc16dbb 100644 --- a/app/src/main/java/ru/project/ui/window/InputValueWindow.java +++ b/app/src/main/java/ru/project/ui/window/InputValueWindow.java @@ -7,9 +7,9 @@ import com.googlecode.lanterna.gui2.Panel; import com.googlecode.lanterna.gui2.TextBox; import com.googlecode.lanterna.gui2.WindowBasedTextGUI; import java.util.function.Predicate; -import ru.project.ui.base.BaseWindow; +import ru.project.ui.base.BaseModalWindow; -public class InputValueWindow extends BaseWindow { +public class InputValueWindow extends BaseModalWindow { private final TextBox textBox; private final Predicate onSave; @@ -45,7 +45,7 @@ public class InputValueWindow extends BaseWindow { String value = textBox.getText().trim(); if (value.isEmpty()) { - MessageWindow.show(gui, "Значение не может быть пустым."); + MessageWindow.showModal(gui, "Значение не может быть пустым."); return; }