196 lines
5.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package ru.kamask.pet;
import java.util.Scanner;
public class TodoApp {
private static TaskManager taskManager;
private static Task[] tasks = new Task[10];
private static int tasksCounter = 0;
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
TodoApp app = new TodoApp();
taskManager = app.new TaskManager();
app.run();
}
private void run() {
while (true) {
Task.printTotalTasksCreated();
String menu = """
┌──────────────────────────┐
| [1] Добавить дело |
| [2] Список дел |
| |
| [0] Выйти из программы |
└──────────────────────────┘
Введите номер пункта меню:""";
switch (requestIntFromInput(menu, new int[] { 0, 1, 2 })) {
case 1 -> displayCreateTask();
case 2 -> displayTasks();
case 0 -> {
scanner.close();
System.exit(0);
}
}
}
}
private static void displayCreateTask() {
if (Task.taskCount >= 9) {
System.out.println("\nОшибка: Достигнут лимит в 10 дел.\n");
return;
}
String title;
String description;
do {
System.out.print("\nНапишите название дела (320 символов): ");
title = scanner.nextLine().trim();
if (title.length() >= 3 && title.length() <= 20)
break;
System.out.print("\nОшибка: Название должно содержать от 3 до 20 символов.\опробуйте снова: ");
} while (true);
System.out.print("\nНaпишите описание дела: ");
description = scanner.nextLine().trim();
taskManager.addTask(new Task(title, description));
}
private static void displayTask(Task task) {
task.printInfo(true);
String firstOption = task.getCompleted() ? "[1]Не выполнено" : "[1]Выполнено";
int input = requestIntFromInput(firstOption + " [0]Главное меню\n\nВвод:",
new int[] { 0, 1 });
if (input == 1) {
task.toggleCompleted();
displayTask(task);
}
}
private static void displayTasks() {
if (tasksCounter == 0) {
int input = requestIntFromInput("""
Список дел пуст.
[1] Добавить дело
[0] Выйти из программы
Введите номер пункта:""", new int[] { 0, 1 });
if (input == 1) {
displayCreateTask();
} else
System.exit(0);
}
System.out.println("""
Список дел:
""");
printAll(tasks);
int[] variantsInput = new int[tasksCounter + 1];
for (int i = 0; i < tasksCounter; i++)
variantsInput[i] = tasks[i].getId();
variantsInput[tasksCounter] = 0;
int input = requestIntFromInput("""
Введите номер дела или 0 для возврата в меню:""", variantsInput);
if (input == 0)
return;
displayTask(getTaskById(input));
}
private static Task getTaskById(int id) {
for (int i = 0; i < Task.taskCount; i++) {
if (tasks[i].getId() == id)
return tasks[i];
}
return null;
}
private static int requestIntFromInput(String template, int[] allowedInts) {
do {
System.out.print(template);
int input;
do {
if (scanner.hasNextInt()) {
input = scanner.nextInt();
scanner.nextLine();
break;
} else {
scanner.next();
System.out.print("Ошибка: используйте цифры.\овторите ввод:");
}
} while (true);
for (int i : allowedInts)
if (i == input)
return input;
System.out.print("Ошибка: укажите номер выбранного пункта.\овторите ввод:");
} while (true);
}
private static void printAll(Task... tasks) {
for (Task t : tasks)
if (t != null)
t.printInfo();
}
private static boolean markTaskCompletedById(Task[] tasks, int id) {
for (Task t : tasks)
if (t != null && t.getId() == id) {
if (!t.getCompleted())
t.toggleCompleted();
return true;
}
return false;
}
private class TaskManager {
void addTask(Task task) {
tasks[tasksCounter++] = task;
}
void markCompleted(int id) {
markTaskCompletedById(tasks, id);
}
void printTasks() {
class ShortTaskPrinter {
void print(Task task) {
System.out.printf("%-3s | %s\n", task.getId(), task.getTitle());
}
}
ShortTaskPrinter p = new ShortTaskPrinter();
for (int i = 0; i < Task.taskCount; i++)
p.print(tasks[i]);
}
}
interface TaskAction {
void execute(Task task);
}
}