[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:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user