[Editor] Add api files to script list view and enable user to open them in readonly mode in the editor tabs

This commit is contained in:
2021-03-01 12:23:20 +01:00
parent c4ca4dc266
commit 9284b9a895
6 changed files with 34 additions and 6 deletions

View File

@@ -16,8 +16,11 @@ import java.util.*
import java.util.concurrent.Executors
class CodeEditor(private val highlighter: ObservableValue<out SyntaxHighlighter>, codeProperty: Property<String>) :
StackPane() {
class CodeEditor(
private val highlighter: ObservableValue<out SyntaxHighlighter>,
codeProperty: Property<String>,
readonly: Boolean = false
) : StackPane() {
private val editor = CodeArea()
private val executor = Executors.newSingleThreadExecutor()
@@ -39,6 +42,8 @@ class CodeEditor(private val highlighter: ObservableValue<out SyntaxHighlighter>
editor.paragraphGraphicFactory = LineNumberFactory.get(editor)
applyHighlighting(highlighter.value.highlight(editor.text))
editor.isEditable = !readonly
initAutoIndents()
children += VirtualizedScrollPane(editor)

View File

@@ -1,6 +1,7 @@
package com.bartlomiejpluta.base.editor.code.component
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 javafx.scene.control.ContextMenu
import javafx.scene.control.cell.TextFieldTreeCell
@@ -89,6 +90,7 @@ class ScriptFileTreeCell(onCreate: (FileNode) -> Unit, onDelete: (FileNode) -> U
contextMenu = when {
isEditing -> null
item !is FileSystemNode -> null
item.type == FileType.FILE -> fileMenu
item.type == FileType.DIRECTORY -> directoryMenu
else -> null

View File

@@ -6,7 +6,10 @@ import tornadofx.getValue
import tornadofx.setValue
import tornadofx.toProperty
class Code(val fileNode: FileNode, val typeProperty: Property<CodeType>, code: String) {
class Code(fileNode: FileNode, val typeProperty: Property<CodeType>, code: String) {
val fileNodeProperty = fileNode.toProperty()
val fileNode by fileNodeProperty
val type by typeProperty
val codeProperty = code.toProperty()

View File

@@ -5,6 +5,7 @@ import com.bartlomiejpluta.base.editor.code.highlighting.JavaSyntaxHighlighter
import com.bartlomiejpluta.base.editor.code.model.CodeScope
import com.bartlomiejpluta.base.editor.code.model.CodeType
import com.bartlomiejpluta.base.editor.code.viewmodel.CodeVM
import com.bartlomiejpluta.base.editor.file.model.FileSystemNode
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import javafx.beans.binding.Bindings
import org.kordamp.ikonli.javafx.FontIcon
@@ -25,7 +26,9 @@ class CodeEditorView : View() {
}
}, codeVM.typeProperty)
private val editor = CodeEditor(highlighter, codeVM.codeProperty)
private val editable = Bindings.createBooleanBinding({ codeVM.fileNode is FileSystemNode }, codeVM.itemProperty)
private val editor = CodeEditor(highlighter, codeVM.codeProperty, !editable.value)
init {
scope.caretDisplacementRequestListener = { line, column ->
@@ -41,7 +44,7 @@ class CodeEditorView : View() {
top = toolbar {
button(graphic = FontIcon("fa-floppy-o")) {
shortcut("Ctrl+S")
enableWhen(codeVM.dirty)
enableWhen(codeVM.dirty.and(editable))
action {
codeVM.item?.let {
@@ -53,6 +56,7 @@ class CodeEditorView : View() {
button(graphic = FontIcon("fa-undo")) {
shortcut("Ctrl+Z")
enableWhen(editable)
action {
editor.undo()
@@ -61,6 +65,7 @@ class CodeEditorView : View() {
button(graphic = FontIcon("fa-repeat")) {
shortcut("Ctrl+Shift+Z")
enableWhen(editable)
action {
editor.redo()

View File

@@ -1,8 +1,10 @@
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.file.model.FileNode
import com.bartlomiejpluta.base.editor.file.model.FileType
import com.bartlomiejpluta.base.editor.file.model.PseudoFileNode
import com.bartlomiejpluta.base.editor.main.controller.MainController
import com.bartlomiejpluta.base.editor.project.context.ProjectContext
import javafx.scene.control.TextInputDialog
@@ -18,11 +20,17 @@ import java.io.File
class ScriptFilesView : View() {
private val projectContext: ProjectContext by di()
private val mainController: MainController by di()
private val apiProvider: APIProvider by di()
init {
projectContext.projectProperty.addListener { _, _, project ->
project?.let {
treeView.root = TreeItem(it.codeFSNode)
val rootNode = PseudoFileNode.emptyRoot().apply {
children += apiProvider.apiNode
children += it.codeFSNode
}
treeView.root = TreeItem(rootNode)
treeView.populate { item -> item.value?.children }
root.root.expandAll()
}
@@ -30,6 +38,8 @@ class ScriptFilesView : View() {
}
private val treeView: TreeView<FileNode> = treeview {
isShowRoot = false
setCellFactory {
ScriptFileTreeCell(this@ScriptFilesView::onCreate, mainController::closeScript)
}

View File

@@ -6,6 +6,9 @@ import tornadofx.getValue
import tornadofx.setValue
class CodeVM(code: Code) : ItemViewModel<Code>(code) {
val fileNodeProperty = bind(Code::fileNodeProperty)
val fileNode by fileNodeProperty
val typeProperty = bind(Code::typeProperty)
val type by typeProperty