2026-08-27 18:03:01 +04:00
|
|
|
package ru.project.ui.menu;
|
|
|
|
|
|
|
|
|
|
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;
|
2026-08-29 18:42:22 +04:00
|
|
|
import ru.project.collection.MyLinkedList;
|
|
|
|
|
import ru.project.collection.MyList;
|
2026-08-27 18:03:01 +04:00
|
|
|
import ru.project.model.AppState;
|
|
|
|
|
import ru.project.model.FillMethod;
|
2026-08-29 18:42:22 +04:00
|
|
|
import ru.project.student.Student;
|
|
|
|
|
import ru.project.ui.base.BaseModalWindow;
|
2026-08-28 19:51:47 +04:00
|
|
|
import ru.project.ui.window.CustomDataSettingsWindow;
|
|
|
|
|
import ru.project.ui.window.InputValueWindow;
|
2026-08-27 18:03:01 +04:00
|
|
|
import ru.project.ui.window.MessageWindow;
|
|
|
|
|
|
2026-08-29 18:42:22 +04:00
|
|
|
public class CreateCollectionMenu extends BaseModalWindow {
|
2026-08-27 18:03:01 +04:00
|
|
|
|
|
|
|
|
private int collectionSize;
|
|
|
|
|
private FillMethod selectedFillMethod;
|
|
|
|
|
|
|
|
|
|
private final Label sizeLabel;
|
|
|
|
|
private final Label fillMethodLabel;
|
|
|
|
|
|
2026-08-29 18:42:22 +04:00
|
|
|
private final CustomDataSettingsWindow customDataSettingsWindow;
|
2026-08-28 19:51:47 +04:00
|
|
|
|
2026-08-27 18:03:01 +04:00
|
|
|
public CreateCollectionMenu(WindowBasedTextGUI gui, AppState state) {
|
|
|
|
|
super("Создание новой коллекции", gui);
|
|
|
|
|
|
|
|
|
|
collectionSize = 0;
|
|
|
|
|
selectedFillMethod = FillMethod.CUSTOM;
|
|
|
|
|
|
2026-08-29 18:42:22 +04:00
|
|
|
customDataSettingsWindow = new CustomDataSettingsWindow(gui, state, () -> collectionSize);
|
|
|
|
|
|
2026-08-27 18:03:01 +04:00
|
|
|
Panel panel = new Panel();
|
|
|
|
|
panel.setLayoutManager(new LinearLayout());
|
|
|
|
|
|
|
|
|
|
sizeLabel = new Label("Размер: не задан");
|
|
|
|
|
|
|
|
|
|
fillMethodLabel = new Label("Способ заполнения: " + getFillMethodName(selectedFillMethod));
|
|
|
|
|
|
|
|
|
|
panel.addComponent(sizeLabel);
|
|
|
|
|
panel.addComponent(fillMethodLabel);
|
|
|
|
|
|
2026-08-29 18:42:22 +04:00
|
|
|
panel.addComponent(new Button("Задать размер", this::showCollectionSizeInputValueWindow));
|
2026-08-27 18:03:01 +04:00
|
|
|
|
2026-08-28 19:51:47 +04:00
|
|
|
panel.addComponent(new Button("Выбрать способ заполнения", this::selectFillMethod));
|
|
|
|
|
|
|
|
|
|
panel.addComponent(
|
|
|
|
|
new Button("Настроить текущий способ заполнения", this::setupCurrentFillMethod));
|
2026-08-27 18:03:01 +04:00
|
|
|
|
2026-08-29 18:42:22 +04:00
|
|
|
panel.addComponent(new Button("Создать новую коллекцию", () -> updateMainCollection(state)));
|
2026-08-27 18:03:01 +04:00
|
|
|
|
|
|
|
|
panel.addComponent(new Button("Выйти", this::close));
|
|
|
|
|
|
|
|
|
|
setComponent(panel);
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-29 18:42:22 +04:00
|
|
|
private void showCollectionSizeInputValueWindow() {
|
2026-08-28 19:51:47 +04:00
|
|
|
InputValueWindow window =
|
|
|
|
|
new InputValueWindow(
|
2026-08-27 18:03:01 +04:00
|
|
|
gui,
|
2026-08-28 19:51:47 +04:00
|
|
|
"Размер коллекции",
|
|
|
|
|
"Введите размер коллекции:",
|
|
|
|
|
collectionSize > 0 ? String.valueOf(collectionSize) : null,
|
|
|
|
|
this::handleSizeEntered);
|
2026-08-27 18:03:01 +04:00
|
|
|
|
2026-08-29 18:42:22 +04:00
|
|
|
window.showModal();
|
2026-08-27 18:03:01 +04:00
|
|
|
}
|
|
|
|
|
|
2026-08-28 19:51:47 +04:00
|
|
|
private boolean handleSizeEntered(String value) {
|
|
|
|
|
try {
|
|
|
|
|
int enteredSize = Integer.parseInt(value);
|
|
|
|
|
if (enteredSize <= 0) {
|
2026-08-29 18:42:22 +04:00
|
|
|
MessageWindow.showModal(gui, "Размер должен быть больше 0.");
|
2026-08-28 19:51:47 +04:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
collectionSize = enteredSize;
|
|
|
|
|
sizeLabel.setText("Размер: " + collectionSize);
|
|
|
|
|
return true;
|
|
|
|
|
} catch (NumberFormatException e) {
|
2026-08-29 18:42:22 +04:00
|
|
|
MessageWindow.showModal(gui, "Введите целое число.");
|
2026-08-28 19:51:47 +04:00
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void setupCurrentFillMethod() {
|
|
|
|
|
switch (selectedFillMethod) {
|
|
|
|
|
case CUSTOM -> {
|
2026-08-29 18:42:22 +04:00
|
|
|
customDataSettingsWindow.showModal();
|
2026-08-28 19:51:47 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case FILE ->
|
|
|
|
|
// TODO
|
2026-08-29 18:42:22 +04:00
|
|
|
MessageWindow.showModal(gui, "Не реализовано.");
|
2026-08-28 19:51:47 +04:00
|
|
|
|
|
|
|
|
case RANDOM ->
|
2026-08-29 18:42:22 +04:00
|
|
|
MessageWindow.showModal(
|
|
|
|
|
gui, "Для случайных данных дополнительные настройки не требуются.");
|
2026-08-28 19:51:47 +04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void selectFillMethod() {
|
2026-08-29 18:42:22 +04:00
|
|
|
BaseModalWindow menu =
|
2026-08-27 18:03:01 +04:00
|
|
|
new FillMethodSelectionWindow(
|
|
|
|
|
gui,
|
|
|
|
|
fillMethod -> {
|
|
|
|
|
selectedFillMethod = fillMethod;
|
|
|
|
|
fillMethodLabel.setText(
|
|
|
|
|
"Способ заполнения: " + getFillMethodName(selectedFillMethod));
|
|
|
|
|
});
|
|
|
|
|
|
2026-08-29 18:42:22 +04:00
|
|
|
menu.showModal();
|
2026-08-27 18:03:01 +04:00
|
|
|
}
|
|
|
|
|
|
2026-08-29 18:42:22 +04:00
|
|
|
private void updateMainCollection(AppState state) {
|
2026-08-27 18:03:01 +04:00
|
|
|
if (collectionSize <= 0) {
|
2026-08-29 18:42:22 +04:00
|
|
|
MessageWindow.showModal(gui, "Сначала задайте размер коллекции.");
|
2026-08-27 18:03:01 +04:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (selectedFillMethod) {
|
|
|
|
|
case CUSTOM:
|
2026-08-29 18:42:22 +04:00
|
|
|
createCollectionFromCustomData(state);
|
2026-08-27 18:03:01 +04:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case RANDOM:
|
2026-08-29 18:42:22 +04:00
|
|
|
createCollectionFromRandomData(state);
|
2026-08-27 18:03:01 +04:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case FILE:
|
2026-08-29 18:42:22 +04:00
|
|
|
createCollectionFromFileData(state);
|
2026-08-27 18:03:01 +04:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-29 18:42:22 +04:00
|
|
|
private void createCollectionFromCustomData(AppState state) {
|
|
|
|
|
MyList<Student> customDataCollection = state.getCustomDataCollection();
|
|
|
|
|
|
|
|
|
|
MyList<Student> mainCollection = new MyLinkedList<>();
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < customDataCollection.size(); i++) {
|
|
|
|
|
mainCollection.add(customDataCollection.get(i));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
state.setMainCollection(mainCollection);
|
|
|
|
|
|
|
|
|
|
MessageWindow.showModal(gui, "Коллекция успешно создана.");
|
2026-08-27 18:03:01 +04:00
|
|
|
}
|
|
|
|
|
|
2026-08-29 18:42:22 +04:00
|
|
|
private void createCollectionFromRandomData(AppState state) {
|
2026-08-27 18:03:01 +04:00
|
|
|
// TODO
|
2026-08-29 18:42:22 +04:00
|
|
|
MessageWindow.showModal(gui, "Не реализовано.");
|
2026-08-27 18:03:01 +04:00
|
|
|
}
|
|
|
|
|
|
2026-08-29 18:42:22 +04:00
|
|
|
private void createCollectionFromFileData(AppState state) {
|
2026-08-27 18:03:01 +04:00
|
|
|
// TODO
|
2026-08-29 18:42:22 +04:00
|
|
|
MessageWindow.showModal(gui, "Не реализовано.");
|
2026-08-27 18:03:01 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String getFillMethodName(FillMethod fillMethod) {
|
|
|
|
|
return switch (fillMethod) {
|
|
|
|
|
case CUSTOM -> "Пользовательские данные";
|
|
|
|
|
|
|
|
|
|
case RANDOM -> "Случайные данные";
|
|
|
|
|
|
|
|
|
|
case FILE -> "Данные из файла";
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|