[Editor] Enable creating and filling class with predefined FTL templates on project and class creation

This commit is contained in:
2021-03-01 15:48:33 +01:00
parent efc614939c
commit c20bf208ac
10 changed files with 87 additions and 6 deletions

View File

@@ -47,6 +47,7 @@ dependencies {
// Spring // Spring
implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-freemarker'
} }
task provideGameEngine(type: Copy) { task provideGameEngine(type: Copy) {

View File

@@ -0,0 +1,49 @@
package com.bartlomiejpluta.base.editor.code.service
import com.bartlomiejpluta.base.editor.file.model.FileSystemNode
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import freemarker.template.Configuration
import freemarker.template.TemplateExceptionHandler
import freemarker.template.Version
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
import java.io.File
import java.nio.file.Path
import java.util.*
@Component
class JavaClassService {
@Autowired
private lateinit var projectContext: ProjectContext
private val config = Configuration(Version(2, 3, 20)).apply {
defaultEncoding = "UTF-8"
locale = Locale.US
templateExceptionHandler = TemplateExceptionHandler.RETHROW_HANDLER
setClassForTemplateLoading(this.javaClass, "/java_templates/")
}
fun toPathString(className: String) = toPath(className).toString() + ".java"
fun toPath(className: String) = Path.of("", *className.split(".").toTypedArray())
fun ofPath(path: String): String = ofPath(Path.of(path))
fun ofPath(path: Path): String = path.joinToString(".")
fun createClassFile(name: String, directory: FileSystemNode, classTemplate: String) {
projectContext.project?.let { project ->
val template = config.getTemplate(classTemplate)
val className = name.substringAfterLast(".")
val classFile = File(directory.file, toPath(name).toString() + ".java")
val classPackage = ofPath(
File(directory.file, toPath(name).toString()).parentFile.relativeTo(project.codeFSNode.file).toPath()
)
project.codeFSNode.createNode(classFile.toRelativeString(project.codeFSNode.file))
val model = mapOf("className" to className, "package" to classPackage)
template.process(model, classFile.writer())
}
}
}

View File

@@ -2,7 +2,9 @@ package com.bartlomiejpluta.base.editor.code.view.list
import com.bartlomiejpluta.base.editor.code.api.APIProvider import com.bartlomiejpluta.base.editor.code.api.APIProvider
import com.bartlomiejpluta.base.editor.code.component.ScriptFileTreeCell import com.bartlomiejpluta.base.editor.code.component.ScriptFileTreeCell
import com.bartlomiejpluta.base.editor.code.service.JavaClassService
import com.bartlomiejpluta.base.editor.file.model.FileNode import com.bartlomiejpluta.base.editor.file.model.FileNode
import com.bartlomiejpluta.base.editor.file.model.FileSystemNode
import com.bartlomiejpluta.base.editor.file.model.FileType import com.bartlomiejpluta.base.editor.file.model.FileType
import com.bartlomiejpluta.base.editor.file.model.PseudoFileNode import com.bartlomiejpluta.base.editor.file.model.PseudoFileNode
import com.bartlomiejpluta.base.editor.main.controller.MainController import com.bartlomiejpluta.base.editor.main.controller.MainController
@@ -15,11 +17,11 @@ import tornadofx.View
import tornadofx.expandAll import tornadofx.expandAll
import tornadofx.populate import tornadofx.populate
import tornadofx.treeview import tornadofx.treeview
import java.io.File
class ScriptFilesView : View() { class ScriptFilesView : View() {
private val projectContext: ProjectContext by di() private val projectContext: ProjectContext by di()
private val mainController: MainController by di() private val mainController: MainController by di()
private val javaClassService: JavaClassService by di()
private val apiProvider: APIProvider by di() private val apiProvider: APIProvider by di()
init { init {
@@ -64,7 +66,11 @@ class ScriptFilesView : View() {
title = "New class" title = "New class"
} }
.showAndWait() .showAndWait()
.map { it.replace(".", File.separator) + ".java" } .map {
javaClassService.createClassFile(it, fsNode as FileSystemNode, "empty_class.ftl")
it
}
.map(javaClassService::toPathString)
.map { fsNode.createNode(it) } .map { fsNode.createNode(it) }
.ifPresent { mainController.openScript(it) } .ifPresent { mainController.openScript(it) }
} }

View File

@@ -38,8 +38,7 @@ class MainController : Controller() {
find<ProjectSettingsFragment>().apply { find<ProjectSettingsFragment>().apply {
onComplete { onComplete {
openItems.clear() openItems.clear()
projectContext.project = it projectContext.createNewProject(it)
projectContext.save()
} }
openModal(block = true, resizable = false) openModal(block = true, resizable = false)

View File

@@ -64,7 +64,7 @@ class Brush {
} }
} }
private fun getTileByMode(tile: Tile) = when (mode) { private fun getTileByMode(tile: Tile) = when (mode!!) {
BrushMode.PAINTING_MODE -> tile BrushMode.PAINTING_MODE -> tile
BrushMode.ERASING_MODE -> null BrushMode.ERASING_MODE -> null
} }

View File

@@ -3,6 +3,7 @@ package com.bartlomiejpluta.base.editor.project.context
import com.bartlomiejpluta.base.editor.asset.model.Asset import com.bartlomiejpluta.base.editor.asset.model.Asset
import com.bartlomiejpluta.base.editor.code.model.Code import com.bartlomiejpluta.base.editor.code.model.Code
import com.bartlomiejpluta.base.editor.code.model.CodeType import com.bartlomiejpluta.base.editor.code.model.CodeType
import com.bartlomiejpluta.base.editor.code.service.JavaClassService
import com.bartlomiejpluta.base.editor.file.model.FileNode import com.bartlomiejpluta.base.editor.file.model.FileNode
import com.bartlomiejpluta.base.editor.image.asset.ImageAsset import com.bartlomiejpluta.base.editor.image.asset.ImageAsset
import com.bartlomiejpluta.base.editor.image.asset.ImageAssetData import com.bartlomiejpluta.base.editor.image.asset.ImageAssetData
@@ -45,6 +46,9 @@ class DefaultProjectContext : ProjectContext {
@Autowired @Autowired
private lateinit var mapDeserializer: MapDeserializer private lateinit var mapDeserializer: MapDeserializer
@Autowired
private lateinit var javaClassService: JavaClassService
override val projectProperty = SimpleObjectProperty<Project?>() as ObjectProperty<Project?> override val projectProperty = SimpleObjectProperty<Project?>() as ObjectProperty<Project?>
override var project by projectProperty override var project by projectProperty
@@ -72,6 +76,13 @@ class DefaultProjectContext : ProjectContext {
.let { project = it } .let { project = it }
} }
override fun createNewProject(project: Project) {
this.project = project
save()
javaClassService.createClassFile(project.runner, project.codeFSNode, "game_runner.ftl")
}
override fun importMap(name: String, map: GameMap) { override fun importMap(name: String, map: GameMap) {
project?.let { project?.let {
UID.next(it.maps.map(Asset::uid)).let { uid -> UID.next(it.maps.map(Asset::uid)).let { uid ->

View File

@@ -19,6 +19,7 @@ interface ProjectContext {
fun save() fun save()
fun open(file: File) fun open(file: File)
fun createNewProject(project: Project)
fun importMap(name: String, map: GameMap) fun importMap(name: String, map: GameMap)
fun loadMap(uid: String): GameMap fun loadMap(uid: String): GameMap

View File

@@ -1,3 +1,7 @@
logging: logging:
level: level:
com.bartlomiejpluta.base.editor: DEBUG com.bartlomiejpluta.base.editor: DEBUG
spring:
freemarker:
checkTemplateLocation: false

View File

@@ -0,0 +1,5 @@
package ${package};
public class ${className} {
}

View File

@@ -0,0 +1,5 @@
package ${package};
public class ${className} {
}