Skip to content

Commit

Permalink
Refined TableViewDirtyTest test app
Browse files Browse the repository at this point in the history
  • Loading branch information
Edvin Syse committed Jan 17, 2017
1 parent f58cfad commit 1c74031
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 7 deletions.
28 changes: 25 additions & 3 deletions src/main/java/tornadofx/ItemControls.kt
@@ -1,3 +1,5 @@
@file:Suppress("UNCHECKED_CAST")

package tornadofx

import com.sun.javafx.scene.control.skin.TableRowSkin
Expand Down Expand Up @@ -971,7 +973,7 @@ fun <T> TableView<T>.enableCellEditing() {
isEditable = true
}

fun <S> TableView<S>.enableDirtyTracking() = editModel
fun <S> TableView<S>.enableDirtyTracking() = editModel.enableDirtyTracking()

@Suppress("UNCHECKED_CAST")
val <S> TableView<S>.editModel: TableViewEditModel<S> get() = properties.getOrPut("tornadofx.editModel") { TableViewEditModel(this) } as TableViewEditModel<S>
Expand All @@ -995,7 +997,7 @@ class TableViewEditModel<S>(val tableView: TableView<S>) {

fun getDirtyState(item: S): TableColumnDirtyState<S> = items.getOrPut(item) { TableColumnDirtyState(this, item) }

init {
fun enableDirtyTracking() {
tableView.setRowFactory {
object : TableRow<S>() {
override fun createDefaultSkin() = DirtyDecoratingTableRowSkin(this, this@TableViewEditModel)
Expand Down Expand Up @@ -1096,8 +1098,11 @@ class TableColumnDirtyState<S>(val editModel: TableViewEditModel<S>, val item: S
_dirty = booleanBinding(dirtyColumns) { isNotEmpty() }
return _dirty!!
}
val isDirty: Boolean get() = dirty.value

fun getDirtyColumnProperty(column: TableColumn<Any?, Any?>) = booleanBinding(dirtyColumns) { containsKey(column as TableColumn<S, Any?>) }

fun getDirtyColumnProperty(column: TableColumn<S, Any?>) = booleanBinding(dirtyColumns) { containsKey(column) }
fun isDirtyColumn(column: TableColumn<Any?, Any?>) = dirtyColumns.containsKey(column as TableColumn<S, Any?>)

init {
dirtyColumns.addListener(InvalidationListener {
Expand All @@ -1116,6 +1121,23 @@ class TableColumnDirtyState<S>(val editModel: TableViewEditModel<S>, val item: S
override fun equals(other: Any?) = other is TableColumnDirtyState<*> && other.item == item
override fun hashCode() = item?.hashCode() ?: throw IllegalStateException("Item must be present")

fun rollback(column : TableColumn<Any?, Any?>) {
val initialValue = dirtyColumns[column as TableColumn<S, Any?>]
if (initialValue != null) {
column.setValue(item, initialValue)
dirtyColumns.remove(column)
}
editModel.tableView.refresh()
}

fun commit(column : TableColumn<Any?, Any?>) {
val initialValue = dirtyColumns[column as TableColumn<S, Any?>]
if (initialValue != null) {
dirtyColumns.remove(column)
}
editModel.tableView.refresh()
}

fun rollback() {
dirtyColumns.forEach {
it.key.setValue(item, it.value)
Expand Down
62 changes: 58 additions & 4 deletions src/test/kotlin/tornadofx/testapps/TableViewDirtyTest.kt
Expand Up @@ -3,6 +3,7 @@ package tornadofx.testapps
import javafx.beans.property.SimpleObjectProperty
import javafx.beans.property.SimpleStringProperty
import javafx.collections.FXCollections
import javafx.scene.control.TableColumn
import javafx.scene.control.TableView
import tornadofx.*
import java.util.*
Expand All @@ -17,25 +18,78 @@ class TableViewDirtyTest : View("TableView Dirty Test") {
center {
tableview(customers) {
table = this
enableDirtyTracking()
prefHeight = 200.0
column("First Name", Customer::firstNameProperty).makeEditable()
column("Last Name", Customer::lastNameProperty).makeEditable()
enableCellEditing()
regainFocusAfterEdit()
enableDirtyTracking()
contextmenu {
menuitem("Rollback").properties["name"] = "rollback"
menuitem("Commit").properties["name"] = "commit"
}
setOnContextMenuRequested { event ->
val dirtyState = editModel.getDirtyState(selectedItem)
val selectedCell = selectionModel.selectedCells.firstOrNull()
val rollbackItem = contextMenu.items.find { it.properties["name"] == "rollback" }!!
val commitItem = contextMenu.items.find { it.properties["name"] == "commit" }!!

if (selectedCell != null && dirtyState.isDirtyColumn(selectedCell.tableColumn)) {
with (contextMenu) {
with (rollbackItem) {
isDisable = false
text = "Rollback ${selectedCell.tableColumn.text}"
setOnAction {
dirtyState.rollback(selectedCell.tableColumn)
}
}
with (commitItem) {
isDisable = false
text = "Commit ${selectedCell.tableColumn.text}"
setOnAction {
dirtyState.commit(selectedCell.tableColumn)
}
}
}
} else {
with (rollbackItem) {
isDisable = true
text = "Rollback column"
}
with (commitItem) {
isDisable = true
text = "Commit column"
}
}
}
columnResizePolicy = TableView.CONSTRAINED_RESIZE_POLICY
}
}
bottom {
buttonbar {
button("Commit") {
hbox(10) {
paddingAll = 4
button("Commit row") {
disableWhen { table.editModel.selectedItemDirty.not() }
setOnAction {
table.editModel.commitSelected()
}
}
button("Rollback") {
button("Rollback row") {
disableWhen { table.editModel.selectedItemDirty.not() }
setOnAction {
table.editModel.rollbackSelected()
}
}
button("Rollback all") {
setOnAction {
table.editModel.rollback()
}
}
button("Commit all") {
setOnAction {
table.editModel.rollback()
}
}
}
}
}
Expand Down

0 comments on commit 1c74031

Please sign in to comment.