Skip to content

generics lab2 #228

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
395 changes: 395 additions & 0 deletions .idea/caches/deviceStreaming.xml

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions .idea/runConfigurations.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions src/main/kotlin/BaseCreator.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import Item.Archive
import Item.Note

class BaseCreator {
fun createArchive(): Archive {
println("Введите название архива больше 3-х символов:")
var name = inputString()
return Archive(name.toString(), mutableListOf<Note>())
}

fun createNote(): Note {
println("Введите название заметки:")
var name = inputString()
println("Введите текст заметки:")
var text = inputString()
return Note(name,text)
}

fun inputString(): String {
var input = readlnOrNull() ?: ""
while (input.length < 3) {
println("Введите больше 3-х символов:")
input = readlnOrNull() ?: ""
}
return input
}
}
10 changes: 10 additions & 0 deletions src/main/kotlin/Item/Archive.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package Item

interface Item {
val name: String
}

class Archive(
override val name: String,
val notes: MutableList<Note>
): Item
6 changes: 6 additions & 0 deletions src/main/kotlin/Item/Note.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package Item

class Note(
override val name: String,
val content: String
): Item
24 changes: 23 additions & 1 deletion src/main/kotlin/Main.kt
Original file line number Diff line number Diff line change
@@ -1,3 +1,25 @@
import Item.Archive
import Item.Note
import Menu.ArchiveMenu
import Menu.BaseMenu

fun main(args: Array<String>) {
println("Hello World!")
val archives = mutableListOf(
Archive(
"Первый Архив",
mutableListOf(
Note("Первая заметка","Первая Её содержание"),
Note("Вторая заметка"," Вторая Её содержание"),
Note("Третья заметка"," Третья Её содержание")
)),
Archive(
"Второй Архив",
mutableListOf(
Note("Первая второго заметка","Первая Её содержание"),
Note("Вторая второго заметка"," Вторая Её содержание"),
Note("Третья второго заметка"," Третья Её содержание")
))
)
//BaseMenu(archives,"Список архивов:", "Создать Архив").start()
ArchiveMenu(archives, "Список архивов:", "Создать Архив").start()
}
22 changes: 22 additions & 0 deletions src/main/kotlin/Menu/ArchiveMenu.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package Menu

import BaseCreator
import Item.Archive

class ArchiveMenu (
override val items: MutableList<Archive>,
override val greeting: String,
override val createActionName: String
): BaseMenu<Archive>(items, greeting, createActionName) {
override fun createItem(): Archive {
return BaseCreator().createArchive()
}

override fun actionForSelectedItem(item: Archive) {
NoteMenu(
item.notes,
"Список заметок",
"Создать заметку"
).start()
}
}
81 changes: 81 additions & 0 deletions src/main/kotlin/Menu/BaseMenu.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package Menu

import java.util.Scanner
import Item.Item

class BaseMenuItem(
val name: String,
val action: ()-> Unit
)

abstract class BaseMenu<T: Item> (
open val items: MutableList<T>,
open val greeting: String,
open val createActionName: String
) {
private val scan = Scanner(System.`in`)
private var getInputValue = false

fun start() {
greeting()
while (!getInputValue) {
val menuItems = menuItems()
printMenu(menuItems)
correctRange()

if (scan.hasNextInt()) {
val index = scan.nextInt()
if (index > menuItems.lastIndex) {
println("Такого варианта нет. Выбирете из вариантов ниже:")
} else {
menuItems[index].action()
}
} else {
println("Неверный ввод!")
scan.next()
}
}
}

private fun greeting() {
println(greeting)
}

private fun correctRange() {
println("Введите цифру от 0 до " + (items.lastIndex + 2).toString())
}

private fun printMenu(menuItems: List<BaseMenuItem>) {
menuItems.forEach {
println(menuItems.indexOf(it).toString() + ". " + it.name)
}
}

abstract fun createItem(): T

abstract fun actionForSelectedItem(item: T)

private fun menuItems(): List<BaseMenuItem> {
val menuItems:MutableList<BaseMenuItem> = mutableListOf(
BaseMenuItem(createActionName, {
var item = createItem()
this.items.add(item)
})
)

items.forEach {it
menuItems.add(
BaseMenuItem(it.name, {
actionForSelectedItem(it)
})
)
}

menuItems.add(
BaseMenuItem("Выйти", {
this.getInputValue = true
})
)
return menuItems
}
}
19 changes: 19 additions & 0 deletions src/main/kotlin/Menu/NoteMenu.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package Menu

import BaseCreator
import Item.Note

class NoteMenu (
override val items: MutableList<Note>,
override val greeting: String,
override val createActionName: String
): BaseMenu<Note>(items, greeting, createActionName) {
override fun createItem(): Note {
return BaseCreator().createNote()
}

override fun actionForSelectedItem(item: Note) {
println("\n" + item.name)
println(item.content + "\n")
}
}