class DragFile : View("drag and drop") {
val dragFileModel = DragFileModel(this)
lateinit var ap: FlowPane
override val root = vbox {
label("drop txt file to the left and image file to the right and View") {
addClass(DragStyles.heading)
}
label(dragFileModel.lineCountProperty)
scrollpane {
minHeight = 320.0
hbox {
textarea(dragFileModel.fileLinesProperty) {
minHeight = 320.0
promptText = "Drop file here"
setOnDragOver { event -> dragFileModel.handleDragOver(event) }
setOnDragEntered { event -> dragFileModel.handleDragEntered(event) }
setOnDragExited { event -> dragFileModel.handleDragExited(event) }
setOnDragDropped { event -> dragFileModel.handleDragDropped(event) }
}
scrollpane {
ap = flowpane {
vgap = 10.0
hgap = 10.0
prefHeight = 600.0
prefWidth = 800.0
setOnDragOver { event -> dragFileModel.handleDragOver(event) }
setOnDragEntered { event -> dragFileModel.handleDragEntered(event) }
setOnDragExited { event -> dragFileModel.handleDragExited(event) }
setOnDragDropped { event -> dragFileModel.handleImgDropped(event) }
}
}
}
}
}
}
class DragFileModel(dragView: DragFile) {
val dragView=dragView
var lineList: List<String> = emptyList()
val fileLinesProperty = SimpleStringProperty(this, "leftLines", "initial")
var lines by fileLinesProperty
val lineCountProperty = SimpleIntegerProperty(this, "leftLineCount", 0)
var lineCount by lineCountProperty
fun handleDragOver(event: DragEvent) {
event.acceptTransferModes(TransferMode.MOVE)
event.consume()
}
fun handleDragEntered(event: DragEvent) {
println("Entered ${event.source}")
event.consume()
}
fun handleDragExited(event: DragEvent) {
println("Exited ${event.source}")
event.consume()
}
fun handleDragDropped(event: DragEvent) {
println("Dropped ${event.source}")
val db = event.dragboard
if (db.hasFiles()) {
db.files.map { processFile(it.absolutePath) }
}
event.consume()
}
fun handleImgDropped(event: DragEvent) {
println("Dropped ${event.source}")
val db = event.dragboard
if (db.hasFiles()) {
dragView.ap.add(ImageView(Image(File(db.files.first().toString()).inputStream())))
}
event.consume()
}
private fun processFile(filename: String) {
lineList = FileService.getFileLines(filename)
lines = lineList.joinToString(separator = "\n")
lineCount = lineList.count()
}
}
class FileService {
companion object {
fun getFileLines(filename: String): List<String> {
val lineList = mutableListOf<String>()
File(filename).useLines { lines -> lines.forEach { lineList.add(it) } }
return lineList
}
}
}
class DragStyles : Stylesheet() {
companion object {
val heading by cssclass()
val dropzone by cssclass()
}
init {
label and heading {
padding = box(10.px)
fontSize = 20.px
fontWeight = FontWeight.BOLD
}
dropzone {
borderColor += box(
top = Color.RED,
right = Color.DARKGREEN,
left = Color.ORANGE,
bottom = Color.RED
)
padding = box(40.px)
}
}
}