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