diff --git a/editor/build.gradle b/editor/build.gradle index 30b141a6..5b31f36a 100644 --- a/editor/build.gradle +++ b/editor/build.gradle @@ -47,6 +47,7 @@ dependencies { // Spring implementation 'org.springframework.boot:spring-boot-starter' + implementation 'org.springframework.boot:spring-boot-starter-freemarker' } task provideGameEngine(type: Copy) { diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/service/JavaClassService.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/service/JavaClassService.kt new file mode 100644 index 00000000..0398df67 --- /dev/null +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/service/JavaClassService.kt @@ -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()) + } + } +} \ No newline at end of file diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/view/list/ScriptFilesView.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/view/list/ScriptFilesView.kt index 89185673..71f97ca0 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/view/list/ScriptFilesView.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/code/view/list/ScriptFilesView.kt @@ -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.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.FileSystemNode import com.bartlomiejpluta.base.editor.file.model.FileType import com.bartlomiejpluta.base.editor.file.model.PseudoFileNode import com.bartlomiejpluta.base.editor.main.controller.MainController @@ -15,11 +17,11 @@ import tornadofx.View import tornadofx.expandAll import tornadofx.populate import tornadofx.treeview -import java.io.File class ScriptFilesView : View() { private val projectContext: ProjectContext by di() private val mainController: MainController by di() + private val javaClassService: JavaClassService by di() private val apiProvider: APIProvider by di() init { @@ -64,7 +66,11 @@ class ScriptFilesView : View() { title = "New class" } .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) } .ifPresent { mainController.openScript(it) } } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt index 88ee9c30..3a90a272 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/main/controller/MainController.kt @@ -38,8 +38,7 @@ class MainController : Controller() { find().apply { onComplete { openItems.clear() - projectContext.project = it - projectContext.save() + projectContext.createNewProject(it) } openModal(block = true, resizable = false) diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/brush/Brush.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/brush/Brush.kt index cd6994e3..8e928c52 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/brush/Brush.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/map/model/brush/Brush.kt @@ -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.ERASING_MODE -> null } diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt index f16d194f..bfa2e14d 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/DefaultProjectContext.kt @@ -3,6 +3,7 @@ package com.bartlomiejpluta.base.editor.project.context import com.bartlomiejpluta.base.editor.asset.model.Asset import com.bartlomiejpluta.base.editor.code.model.Code 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.image.asset.ImageAsset import com.bartlomiejpluta.base.editor.image.asset.ImageAssetData @@ -45,6 +46,9 @@ class DefaultProjectContext : ProjectContext { @Autowired private lateinit var mapDeserializer: MapDeserializer + @Autowired + private lateinit var javaClassService: JavaClassService + override val projectProperty = SimpleObjectProperty() as ObjectProperty override var project by projectProperty @@ -72,6 +76,13 @@ class DefaultProjectContext : ProjectContext { .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) { project?.let { UID.next(it.maps.map(Asset::uid)).let { uid -> diff --git a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/ProjectContext.kt b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/ProjectContext.kt index 119cbdea..e1b5c375 100644 --- a/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/ProjectContext.kt +++ b/editor/src/main/kotlin/com/bartlomiejpluta/base/editor/project/context/ProjectContext.kt @@ -19,6 +19,7 @@ interface ProjectContext { fun save() fun open(file: File) + fun createNewProject(project: Project) fun importMap(name: String, map: GameMap) fun loadMap(uid: String): GameMap diff --git a/editor/src/main/resources/application.yml b/editor/src/main/resources/application.yml index 9345e5b4..1d6484c5 100644 --- a/editor/src/main/resources/application.yml +++ b/editor/src/main/resources/application.yml @@ -1,3 +1,7 @@ logging: level: - com.bartlomiejpluta.base.editor: DEBUG \ No newline at end of file + com.bartlomiejpluta.base.editor: DEBUG + +spring: + freemarker: + checkTemplateLocation: false \ No newline at end of file diff --git a/editor/src/main/resources/java_templates/empty_class.ftl b/editor/src/main/resources/java_templates/empty_class.ftl new file mode 100644 index 00000000..fb4559db --- /dev/null +++ b/editor/src/main/resources/java_templates/empty_class.ftl @@ -0,0 +1,5 @@ +package ${package}; + +public class ${className} { + +} \ No newline at end of file diff --git a/editor/src/main/resources/java_templates/game_runner.ftl b/editor/src/main/resources/java_templates/game_runner.ftl new file mode 100644 index 00000000..fb4559db --- /dev/null +++ b/editor/src/main/resources/java_templates/game_runner.ftl @@ -0,0 +1,5 @@ +package ${package}; + +public class ${className} { + +} \ No newline at end of file