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

View File

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

View File

@@ -6,7 +6,10 @@ import tornadofx.getValue
import tornadofx.setValue import tornadofx.setValue
import tornadofx.toProperty 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 type by typeProperty
val codeProperty = code.toProperty() 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.CodeScope
import com.bartlomiejpluta.base.editor.code.model.CodeType import com.bartlomiejpluta.base.editor.code.model.CodeType
import com.bartlomiejpluta.base.editor.code.viewmodel.CodeVM 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 com.bartlomiejpluta.base.editor.project.context.ProjectContext
import javafx.beans.binding.Bindings import javafx.beans.binding.Bindings
import org.kordamp.ikonli.javafx.FontIcon import org.kordamp.ikonli.javafx.FontIcon
@@ -25,7 +26,9 @@ class CodeEditorView : View() {
} }
}, codeVM.typeProperty) }, 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 { init {
scope.caretDisplacementRequestListener = { line, column -> scope.caretDisplacementRequestListener = { line, column ->
@@ -41,7 +44,7 @@ class CodeEditorView : View() {
top = toolbar { top = toolbar {
button(graphic = FontIcon("fa-floppy-o")) { button(graphic = FontIcon("fa-floppy-o")) {
shortcut("Ctrl+S") shortcut("Ctrl+S")
enableWhen(codeVM.dirty) enableWhen(codeVM.dirty.and(editable))
action { action {
codeVM.item?.let { codeVM.item?.let {
@@ -53,6 +56,7 @@ class CodeEditorView : View() {
button(graphic = FontIcon("fa-undo")) { button(graphic = FontIcon("fa-undo")) {
shortcut("Ctrl+Z") shortcut("Ctrl+Z")
enableWhen(editable)
action { action {
editor.undo() editor.undo()
@@ -61,6 +65,7 @@ class CodeEditorView : View() {
button(graphic = FontIcon("fa-repeat")) { button(graphic = FontIcon("fa-repeat")) {
shortcut("Ctrl+Shift+Z") shortcut("Ctrl+Shift+Z")
enableWhen(editable)
action { action {
editor.redo() editor.redo()

View File

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

View File

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