blob: 57b990bf80bbee47b46f81abfd957a743a6bc5ae [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package groovy.swing
import groovy.swing.model.DefaultTableColumn
import groovy.swing.model.DefaultTableModel
import groovy.swing.model.PropertyModel
import groovy.swing.model.ValueHolder
import groovy.swing.table.TableSorter
class SwingBuilderTableTest extends GroovySwingTestCase {
void testTableColumn() {
testInEDT {
// TODO is this required?
def swing = new SwingBuilder()
swing.table {
tableColumn()
}
}
}
void testPropertyColumn() {
testInEDT {
def swing = new SwingBuilder()
def msg = shouldFail {
swing.propertyColumn()
}
assert msg.contains('propertyColumn must be a child of a tableModel')
msg = shouldFail {
swing.table {
tableModel {
propertyColumn()
}
}
}
assert msg.contains("Must specify a property for a propertyColumn"): \
"Instead found message: " + msg
swing.table {
tableModel(id: 'model') {
propertyColumn(propertyName: 'p')
propertyColumn(propertyName: 'ph', header: 'header')
propertyColumn(propertyName: 'pt', type: String)
propertyColumn(propertyName: 'pth', type: String, header: 'header')
propertyColumn(propertyName: 'pe', editable: false)
propertyColumn(propertyName: 'peh', editable: false, header: 'header')
propertyColumn(propertyName: 'pet', editable: false, type: String,)
propertyColumn(propertyName: 'peth', editable: false, type: String, header: 'header')
}
}
swing.model.columnList.each { col ->
def propName = col.valueModel.property
assert (col.headerValue == 'header') ^ !propName.contains('h')
assert (col.type == String) ^ !propName.contains('t')
assert col.valueModel.editable ^ propName.contains('e')
}
}
}
void testClosureColumn() {
testInEDT {
def swing = new SwingBuilder()
def msg = shouldFail {
swing.closureColumn()
}
assert msg.contains('closureColumn must be a child of a tableModel')
msg = shouldFail {
swing.table {
tableModel {
closureColumn()
}
}
}
assert msg.contains("Must specify 'read' Closure property for a closureColumn"): \
"Instead found message: " + msg
def closure = { x -> x }
def table = swing.table {
tableModel {
closureColumn(read: closure, write: closure, header: 'header')
}
tableModel(model: new groovy.swing.model.ValueHolder('foo')) {
closureColumn(read: closure, type: String)
}
tableModel(list: ['a', 'b']) {
closureColumn(read: closure, type: String)
}
}
assert table.columnModel.class.name == 'groovy.swing.model.DefaultTableModel$MyTableColumnModel'
}
}
void testTableModelChange() {
testInEDT {
def swing = new SwingBuilder()
def table = swing.table {
tableModel {
propertyColumn(propertyName: 'p')
propertyColumn(propertyName: 'ph', header: 'header')
propertyColumn(propertyName: 'pt', type: String)
}
}
def sorter = new TableSorter(table.model)
table.model = sorter
//GROOVY-2111 - resetting the model w/ a pass-through cleared the columns
assert table.columnModel.columnCount == 3
}
}
void testTableModelChange2() {
testInEDT {
def tableData = [
["ATHLETEID": 1, "FIRSTNAME": "Bob", "LASTNAME": "Jones", "DATEOFBIRTH": '1875-05-20'],
["ATHLETEID": 2, "FIRSTNAME": "Sam", "LASTNAME": "Wilson", "DATEOFBIRTH": '1876-12-15'],
["ATHLETEID": 3, "FIRSTNAME": "Jessie", "LASTNAME": "James", "DATEOFBIRTH": '1877-06-12']
]
SwingBuilder swing = new SwingBuilder()
swing.frame {
scrollPane {
table(id: 'table01') {
tableModel(list: tableData, id: 'tableModel01') {
propertyColumn(header: 'Athlete ID', propertyName: 'ATHLETEID')
propertyColumn(header: 'First Name', propertyName: 'FIRSTNAME')
propertyColumn(header: 'Last Name', propertyName: 'LASTNAME')
propertyColumn(header: 'Date Of Birth', propertyName: 'DATEOFBIRTH')
}
}
}
}
assert swing.table01.columnModel == swing.table01.model.columnModel
def list = [['name': 'Fred', 'location': 'London'], ['name': 'Bob', 'location': 'Atlanta']]
def listModel = new ValueHolder(list)
def model = new DefaultTableModel(listModel)
model.addColumn(new DefaultTableColumn("Name", new PropertyModel(model.rowModel, "name")))
model.addColumn(new DefaultTableColumn("Location", new PropertyModel(model.rowModel, "location")))
swing.table01.setModel(model)
assert swing.table01.columnModel == swing.table01.model.columnModel
// try moiving some columns and verifying values
def value = swing.table01.getValueAt(0, 0)
swing.table01.moveColumn(0, 1)
assert value == swing.table01.getValueAt(0, 1)
swing.table01.removeColumn(swing.table01.columnModel.getColumn(0))
assert value == swing.table01.getValueAt(0, 0)
}
}
void testTableModelValues() {
testInEDT {->
def squares = [
[val: 1, square: 1],
[val: 2, square: 4],
[val: 3, square: 9],
[val: 4, square: 16]
]
def swing = new SwingBuilder()
def frame = swing.frame(title: 'Tabelle',
windowClosing: { System.exit(0) }) {
scrollPane {
table(id: 'table') {
tableModel(list: squares) {
propertyColumn(header: "Wert", propertyName: "val")
closureColumn(header: "Quadrat", read: { it.square })
}
}
}
}
squares.eachWithIndex { it, i ->
assert swing.table.getValueAt(i, 0) == it.val
assert swing.table.getValueAt(i, 1) == it.square
}
}
}
void testTableSyntheticProperties() {
testInEDT {
SwingBuilder swing = new SwingBuilder()
def tableData = [
["ATHLETEID": 1, "FIRSTNAME": "Bob", "LASTNAME": "Jones", "DATEOFBIRTH": '1875-05-20'],
["ATHLETEID": 2, "FIRSTNAME": "Sam", "LASTNAME": "Wilson", "DATEOFBIRTH": '1876-12-15'],
["ATHLETEID": 3, "FIRSTNAME": "Jessie", "LASTNAME": "James", "DATEOFBIRTH": '1877-06-12']
]
def vectorData = [
[1, "Bob", "Jones", '1875-05-20'],
[2, "Sam", "Wilson", '1876-12-15'],
[3, "Jessie", "James", '1877-06-12']
]
swing.frame {
scrollPane {
table(id: 'table01') {
tableModel(list: tableData, id: 'tableModel01') {
propertyColumn(header: 'Athlete ID', propertyName: 'ATHLETEID')
propertyColumn(header: 'First Name', propertyName: 'FIRSTNAME')
propertyColumn(header: 'Last Name', propertyName: 'LASTNAME')
propertyColumn(header: 'Date Of Birth', propertyName: 'DATEOFBIRTH')
}
}
}
scrollPane {
table(id: 'table02', model: new javax.swing.table.DefaultTableModel(
new Vector(vectorData.collect { new Vector(it) }),
new Vector(['Athlete ID', 'First Name', 'Last Name', 'Date Of Birth']))
)
}
}
assert swing.table01.selectedElement == null
assert swing.table01.selectedElements == []
assert swing.table01.elements == tableData
assert swing.table02.selectedElement == null
assert swing.table02.selectedElements == []
assert swing.table02.elements == vectorData
swing.table01.addRowSelectionInterval(0, 0)
assert swing.table01.selectedElement == ["ATHLETEID": 1, "FIRSTNAME": "Bob", "LASTNAME": "Jones", "DATEOFBIRTH": '1875-05-20']
assert swing.table01.selectedElements == [["ATHLETEID": 1, "FIRSTNAME": "Bob", "LASTNAME": "Jones", "DATEOFBIRTH": '1875-05-20']]
swing.table02.addRowSelectionInterval(0, 0)
assert swing.table02.selectedElement == ['Athlete ID': 1, 'First Name': 'Bob', 'Last Name': 'Jones', 'Date Of Birth': '1875-05-20']
assert swing.table02.selectedElements == [['Athlete ID': 1, 'First Name': 'Bob', 'Last Name': 'Jones', 'Date Of Birth': '1875-05-20']]
swing.table01.addRowSelectionInterval(2, 2)
assert swing.table01.selectedElement == ["ATHLETEID": 1, "FIRSTNAME": "Bob", "LASTNAME": "Jones", "DATEOFBIRTH": '1875-05-20']
assert swing.table01.selectedElements == [[ATHLETEID: 1, FIRSTNAME: 'Bob', LASTNAME: 'Jones', DATEOFBIRTH: '1875-05-20'], [ATHLETEID: 3, FIRSTNAME: 'Jessie', LASTNAME: 'James', DATEOFBIRTH: '1877-06-12']]
swing.table02.addRowSelectionInterval(2, 2)
assert swing.table02.selectedElement == ['Athlete ID': 1, 'First Name': 'Bob', 'Last Name': 'Jones', 'Date Of Birth': '1875-05-20']
assert swing.table02.selectedElements == [['Athlete ID': 1, 'First Name': 'Bob', 'Last Name': 'Jones', 'Date Of Birth': '1875-05-20'], ['Athlete ID': 3, 'First Name': 'Jessie', 'Last Name': 'James', 'Date Of Birth': '1877-06-12']]
assert swing.table01.elements[0].ATHLETEID == 1
assert swing.table02.elements[0][0] == 1
swing.table01.model.setValueAt('x', 0, 0,)
swing.table02.model.setValueAt('x', 0, 0)
assert swing.table01.elements[0].ATHLETEID == 'x'
assert swing.table02.elements[0][0] == 'x'
}
}
void testTableBindSyntheticProperties() {
testInEDT {
SwingBuilder swing = new SwingBuilder()
def tableData = [
["ATHLETEID": 1, "FIRSTNAME": "Bob", "LASTNAME": "Jones", "DATEOFBIRTH": '1875-05-20'],
["ATHLETEID": 2, "FIRSTNAME": "Sam", "LASTNAME": "Wilson", "DATEOFBIRTH": '1876-12-15'],
["ATHLETEID": 3, "FIRSTNAME": "Jessie", "LASTNAME": "James", "DATEOFBIRTH": '1877-06-12']
]
def vectorData = [
[1, "Bob", "Jones", '1875-05-20'],
[2, "Sam", "Wilson", '1876-12-15'],
[3, "Jessie", "James", '1877-06-12']
]
swing.frame {
scrollPane {
table(id: 'table01') {
tableModel(list: tableData, id: 'tableModel01') {
propertyColumn(header: 'Athlete ID', propertyName: 'ATHLETEID')
propertyColumn(header: 'First Name', propertyName: 'FIRSTNAME')
propertyColumn(header: 'Last Name', propertyName: 'LASTNAME')
propertyColumn(header: 'Date Of Birth', propertyName: 'DATEOFBIRTH')
}
}
}
scrollPane {
table(id: 'table02', model: new javax.swing.table.DefaultTableModel(
new Vector(vectorData.collect { new Vector(it) }),
new Vector(['Athlete ID', 'First Name', 'Last Name', 'Date Of Birth']))
)
}
t1e = label(text: bind { table01.elements })
t1se = label(text: bind { table01.selectedElement })
t1ses = label(text: bind { table01.selectedElements })
t2e = label(text: bind { table02.elements })
t2se = label(text: bind { table02.selectedElement })
t2ses = label(text: bind { table02.selectedElements })
}
assert swing.t1e.text == '[[ATHLETEID:1, FIRSTNAME:Bob, LASTNAME:Jones, DATEOFBIRTH:1875-05-20], [ATHLETEID:2, FIRSTNAME:Sam, LASTNAME:Wilson, DATEOFBIRTH:1876-12-15], [ATHLETEID:3, FIRSTNAME:Jessie, LASTNAME:James, DATEOFBIRTH:1877-06-12]]'
assert swing.t1se.text == null
assert swing.t1ses.text == '[]'
assert swing.t2e.text == '[[1, Bob, Jones, 1875-05-20], [2, Sam, Wilson, 1876-12-15], [3, Jessie, James, 1877-06-12]]'
assert swing.t2se.text == null
assert swing.t2ses.text == '[]'
swing.table01.addRowSelectionInterval(0, 0)
assert swing.t1se.text == '[ATHLETEID:1, FIRSTNAME:Bob, LASTNAME:Jones, DATEOFBIRTH:1875-05-20]'
assert swing.t1ses.text == '[[ATHLETEID:1, FIRSTNAME:Bob, LASTNAME:Jones, DATEOFBIRTH:1875-05-20]]'
swing.table02.addRowSelectionInterval(0, 0)
assert swing.t2se.text == '[Athlete ID:1, First Name:Bob, Last Name:Jones, Date Of Birth:1875-05-20]'
assert swing.t2ses.text == '[[Athlete ID:1, First Name:Bob, Last Name:Jones, Date Of Birth:1875-05-20]]'
swing.table01.addRowSelectionInterval(2, 2)
assert swing.t1se.text == '[ATHLETEID:1, FIRSTNAME:Bob, LASTNAME:Jones, DATEOFBIRTH:1875-05-20]'
assert swing.t1ses.text == '[[ATHLETEID:1, FIRSTNAME:Bob, LASTNAME:Jones, DATEOFBIRTH:1875-05-20], [ATHLETEID:3, FIRSTNAME:Jessie, LASTNAME:James, DATEOFBIRTH:1877-06-12]]'
swing.table02.addRowSelectionInterval(2, 2)
assert swing.t2se.text == '[Athlete ID:1, First Name:Bob, Last Name:Jones, Date Of Birth:1875-05-20]'
assert swing.t2ses.text == '[[Athlete ID:1, First Name:Bob, Last Name:Jones, Date Of Birth:1875-05-20], [Athlete ID:3, First Name:Jessie, Last Name:James, Date Of Birth:1877-06-12]]'
swing.table01.model.setValueAt('x', 0, 0,)
swing.table02.model.setValueAt('x', 0, 0)
//FIXME groovy default table model does not fire data cahgne events when editing through the model.
//assert swing.t1e.text == '[[ATHLETEID:x, FIRSTNAME:Bob, LASTNAME:Jones, DATEOFBIRTH:1875-05-20], [ATHLETEID:2, FIRSTNAME:Sam, LASTNAME:Wilson, DATEOFBIRTH:1876-12-15], [ATHLETEID:3, FIRSTNAME:Jessie, LASTNAME:James, DATEOFBIRTH:1877-06-12]]'
assert swing.t2e.text == '[[x, Bob, Jones, 1875-05-20], [2, Sam, Wilson, 1876-12-15], [3, Jessie, James, 1877-06-12]]'
}
}
void testColumnModel() {
testInEDT {
def swing = new SwingBuilder()
def table = swing.table {
columnModel(columnMargin: 1, columnSelectionAllowed: true) {}
}
assert table.columnModel.class.name == 'javax.swing.table.DefaultTableColumnModel'
assert table.columnModel.columnSelectionAllowed == true
assert table.columnModel.columnMargin == 1
}
}
void testColumnModelColumns() {
testInEDT {
def swing = new SwingBuilder()
def header
def cell
def prepare
def table = swing.table {
columnModel {
column("col1", width: [100, 150, 250], resizable: true)
column("col2", width: [100, 150]) {
headerRenderer {
onRender {
header = 'text'
}
}
cellRenderer {
label()
onRender {
cell = 'text'
}
}
cellEditor {
textField()
prepareEditor {
prepare = 'text'
}
editorValue { 'text' }
}
}
def obj = new Object()
obj.metaClass.toString = { 'col3' }
column(obj, width: [100]) {
cellRenderer {
onRender {}
}
cellEditor {
prepareEditor {}
editorValue {}
}
}
column('col4', width: 100)
}
}
def columns = table.columnModel.columns.toList()
assert columns.size() == 4
assert columns[0].class.name == 'javax.swing.table.TableColumn'
assert columns[0].identifier == 'col1'
assert columns[0].resizable == true
assert columns[0].minWidth == 100
assert columns[0].preferredWidth == 150
assert columns[0].maxWidth == 250
assert columns[1].identifier == 'col2'
assert columns[1].minWidth == 100
assert columns[1].preferredWidth == 150
assert columns[1].maxWidth == Integer.MAX_VALUE
assert columns[1].headerRenderer.class.name == 'groovy.swing.impl.ClosureRenderer'
columns[1].headerRenderer.getTableCellRendererComponent(table, "-", false, false, 0, 0)
assert columns[1].headerRenderer.children[0] == table.tableHeader.defaultRenderer
columns[1].headerRenderer.update.call()
assert header == 'text'
assert columns[1].cellRenderer.class.name == 'groovy.swing.impl.ClosureRenderer'
columns[1].cellRenderer.getTableCellRendererComponent(table, "-", false, false, 0, 0)
assert columns[1].cellRenderer.children[0].class.name == 'javax.swing.JLabel'
assert cell == 'text'
assert columns[1].cellEditor.class.name == 'groovy.swing.impl.ClosureCellEditor'
columns[1].cellEditor.getTableCellEditorComponent(table, "-", false, 0, 0)
columns[1].cellEditor.prepareEditor.call()
assert prepare == 'text'
assert columns[1].cellEditor.editorValue.call() == 'text'
assert columns[1].cellEditor.children[0].class.name == 'javax.swing.JTextField'
assert columns[2].identifier == 'col3'
assert columns[2].minWidth == 0
assert columns[2].preferredWidth == 100
assert columns[2].maxWidth == Integer.MAX_VALUE
assert columns[2].headerRenderer == null
columns[2].cellRenderer.getTableCellRendererComponent(table, "-", false, false, 0, 0)
assert columns[2].cellRenderer.children[0] == table.getDefaultRenderer(Object).getTableCellRendererComponent(table, "-", false, false, 0, 0)
columns[2].cellEditor.getTableCellEditorComponent(table, "-", false, 0, 0)
assert columns[2].cellEditor.children[0] == table.getDefaultEditor(Object).getTableCellEditorComponent(table, "-", false, 0, 0)
assert columns[3].identifier == 'col4'
assert columns[3].minWidth == 100
assert columns[3].preferredWidth == 100
assert columns[3].maxWidth == 100
}
}
void testColumnModelInNoParent() {
testInEDT {
def swing = new SwingBuilder()
def columnModel = swing.noparent {
columnModel(columnMargin: 1, columnSelectionAllowed: true) {}
}.last()
assert columnModel.class.name == 'javax.swing.table.DefaultTableColumnModel'
assert columnModel.columnSelectionAllowed == true
assert columnModel.columnMargin == 1
}
}
}