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