@@ -38,52 +38,64 @@ object ITSFRankingApp {
38
38
39
39
val version = getVersionFromJarFile()
40
40
41
-
42
41
private val playerNameField = JTextField (50 )
43
42
private val itsfNoField = JTextField (50 )
44
43
45
- private val jTable = JTable (emptyModel ()).apply {
44
+ private val searchResultTable = JTable (emptySearchResultModel ()).apply {
46
45
cellSelectionEnabled = true
46
+ autoCreateRowSorter = true
47
47
}
48
48
49
- private val jTableList = JTable (emptyListResultModelSingles ()).apply {
49
+ private val csvListTable = JTable (emptyCsvListModelSingles ()).apply {
50
50
cellSelectionEnabled = true
51
+ autoCreateRowSorter = true
51
52
}
52
53
53
- private val jTableRanking = JTable (emptyRankingModel()).apply {
54
+ private val rankingTable = JTable (emptyRankingModel()).apply {
54
55
cellSelectionEnabled = true
56
+ autoCreateRowSorter = true
55
57
}
56
58
57
59
private val tabbedPane = JTabbedPane ()
58
-
59
-
60
- private fun emptyModel () = ResultTableModel (listOf (" itsf no." , " name" , " country" ) + Categories .all.map { it.targetAudience })
61
-
62
- private fun emptyRankingModel () = ResultTableModel (listOf (" itsf no." , " name" , " country" , " rank" , " points" ))
63
-
64
- private fun emptyListResultModelSingles () = ResultTableModel (listOf (" player" , " itsf name" , " country" , " points" , " rank" , " status" ), true )
65
- private fun emptyListResultModelDoubles () =
66
- ResultTableModel (
67
- listOf (" player1" , " itsf name 1" , " player2" , " itsf name 2" , " combined" , " p1 country" , " p1 points" , " p1 rank" , " p1 status" , " p2 country" , " p2 points" , " p2 rank" , " p2 status" ),
68
- true
60
+ private fun emptySearchResultModel () = ResultTableModel (listOf (" itsf no." , " name" , " country" ) + Categories .all.map { it.targetAudience })
61
+ private fun emptyRankingModel () = ResultTableModel (listOf (" rank" , " name" , " country" , " itsf no." , " points" ))
62
+ private fun emptyCsvListModelSingles () = ResultTableModel (listOf (" player" , " itsf name" , " country" , " points" , " rank" , " status" ), true )
63
+ private fun emptyCsvListModelDoubles () = DoublesListModel (
64
+ listOf (
65
+ " player1" ,
66
+ " itsf name 1" ,
67
+ " player2" ,
68
+ " itsf name 2" ,
69
+ " combined" ,
70
+ " p1 country" ,
71
+ " p1 points" ,
72
+ " p1 rank" ,
73
+ " p1 status" ,
74
+ " p2 country" ,
75
+ " p2 points" ,
76
+ " p2 rank" ,
77
+ " p2 status"
69
78
)
79
+ )
70
80
71
81
private fun showRanking (category : String ) {
72
- if (checkRankingLoaded ()) {
82
+ if (checkITSFDataLoaded ()) {
73
83
val cat = Categories .all.single { it.targetAudience == category }
74
84
val players = itsfPlayers.getSortedRanking(cat)
75
85
val m = emptyRankingModel()
76
86
players.forEach {
77
87
val itsfRank = it.rankings.getValue(cat)
78
- val props = listOf (it.licenseNumber, it.name, it.country, itsfRank.rank.toString(), itsfRank.points.toString())
88
+ listOf (" rank" , " name" , " country" , " itsf no." , " points" )
89
+ val props = listOf (itsfRank.rank, it.name, it.country, it.licenseNumber, itsfRank.points)
79
90
m.addRow(props)
80
91
}
81
- jTableRanking.model = m
92
+ rankingTable.rowSorter = null
93
+ rankingTable.model = m
82
94
tabbedPane.selectedIndex = 2
83
95
}
84
96
}
85
97
86
- private fun checkRankingLoaded (): Boolean {
98
+ private fun checkITSFDataLoaded (): Boolean {
87
99
if (! this ::itsfPlayers.isInitialized) {
88
100
JOptionPane .showMessageDialog(jFrame, " Load rankings first!" , " Info" , JOptionPane .INFORMATION_MESSAGE )
89
101
return false
@@ -92,61 +104,62 @@ object ITSFRankingApp {
92
104
}
93
105
94
106
private fun modelWithPlayers (players : Collection <ITSFPlayer >): ResultTableModel {
95
- val model = emptyModel ()
96
- players.forEach { addPlayerToModel (model, it) }
107
+ val model = emptySearchResultModel ()
108
+ players.forEach { addPlayerToSearchResultModel (model, it) }
97
109
return model
98
110
}
99
111
100
- private suspend fun loadRanking (s : String ) {
112
+ private suspend fun loadITSFDATA (s : String ) {
101
113
// val rankings = ITSFPlayerDatabaseReader(topXPlayers = 2000).readTestRankings()
102
114
val rankings = ITSFPlayerDatabaseReader (topXPlayers = 2000 , tour = s).readRankings()
103
115
itsfPlayers = ITSFPlayers (rankings)
104
116
}
105
117
106
- private fun searchLicenseNumber () {
107
- if (checkRankingLoaded ()) {
118
+ private fun searchForLicenseNumber () {
119
+ if (checkITSFDataLoaded ()) {
108
120
val text = itsfNoField.text
109
121
if (! text.isNullOrBlank()) {
110
122
val player = itsfPlayers.getPlayer(text)
123
+ searchResultTable.rowSorter = null
111
124
if (player == null )
112
- jTable .model = emptyModel ()
125
+ searchResultTable .model = emptySearchResultModel ()
113
126
else
114
- jTable .model = modelWithPlayers(listOf (player))
127
+ searchResultTable .model = modelWithPlayers(listOf (player))
115
128
tabbedPane.selectedIndex = 0
116
129
}
117
130
}
118
131
}
119
132
120
- private fun searchByName () {
121
- if (checkRankingLoaded ()) {
133
+ private fun searchForName () {
134
+ if (checkITSFDataLoaded ()) {
122
135
val text = playerNameField.text
123
136
if (! text.isNullOrBlank()) {
124
137
val player = itsfPlayers.find(text, true )
125
- jTable.model = modelWithPlayers(player)
138
+ searchResultTable.rowSorter = null
139
+ searchResultTable.model = modelWithPlayers(player)
126
140
tabbedPane.selectedIndex = 0
127
141
}
128
142
}
129
143
}
130
144
131
145
132
- private fun loadFile (file : File , charset : Charset , category : Category ) {
146
+ private fun loadCsvFile (file : File , charset : Charset , category : Category ) {
133
147
val listMatcher = ListMatcher (itsfPlayers)
134
148
val model = if (category.type == CompetitionType .SINGLES ) {
135
- val model = emptyListResultModelSingles ()
149
+ val model = emptyCsvListModelSingles ()
136
150
listMatcher.matchPlayer(file, charset, category).forEach {
137
151
when (it.results.size) {
138
152
0 -> model.addRow(listOf (it.playerName, null , null , null , null , " NOT_FOUND" ))
139
153
1 -> {
140
154
val player = it.results.single()
141
155
model.addRow(listOf (it.playerName, player.name, player.country, player.rankings[category]?.points ? : 0 , player.rankings[category]?.rank, " OK" ))
142
156
}
143
-
144
157
else -> model.addRow(listOf (it.playerName, null , null , null , null , " MULTIPLE_MATCHES" ))
145
158
}
146
159
}
147
160
model
148
161
} else {
149
- val model = emptyListResultModelDoubles ()
162
+ val model = emptyCsvListModelDoubles ()
150
163
listMatcher.matchTeam(file, charset, category).forEach { pwr ->
151
164
val list = mutableListOf<Any ?>(pwr.player1.playerName, pwr.player2.playerName)
152
165
val p1 = addPlayerToRow(list, category, pwr.player1)
@@ -160,7 +173,8 @@ object ITSFRankingApp {
160
173
}
161
174
model
162
175
}
163
- jTableList.model = model
176
+ csvListTable.rowSorter = null
177
+ csvListTable.model = model
164
178
tabbedPane.selectedIndex = 1
165
179
}
166
180
@@ -170,21 +184,19 @@ object ITSFRankingApp {
170
184
list.addAll(listOf (null , null , null , " NOT_FOUND" ))
171
185
null
172
186
}
173
-
174
187
1 -> {
175
188
val player = playerNameWithResults.results.single()
176
189
list.addAll(listOf (player.country, player.rankings[category]?.points ? : 0 , player.rankings[category]?.rank, " OK" ))
177
190
player
178
191
}
179
-
180
192
else -> {
181
193
list.addAll(listOf (null , null , null , " MULTIPLE_MATCHES" ))
182
194
null
183
195
}
184
196
}
185
197
}
186
198
187
- private fun addPlayerToModel (model : ResultTableModel , it : ITSFPlayer ) {
199
+ private fun addPlayerToSearchResultModel (model : ResultTableModel , it : ITSFPlayer ) {
188
200
val ranks = Categories .all.map { c ->
189
201
val r = it.rankings[c]
190
202
if (r == null )
@@ -197,22 +209,22 @@ object ITSFRankingApp {
197
209
}
198
210
199
211
200
- private fun createPanel (frame : JFrame ): JPanel {
212
+ private fun createMainPanel (frame : JFrame ): JPanel {
201
213
jFrame = frame
202
214
val panel = JPanel (MigLayout (" wrap 2" ))
203
215
204
216
panel.add(JLabel (" Load ITSF Rankings" ))
205
- panel.add(LoadITSFDataPanel { loadRanking (it) }, " growx" )
217
+ panel.add(LoadITSFDataPanel { loadITSFDATA (it) }, " growx" )
206
218
207
219
val searchAction: Action = object : AbstractAction () {
208
220
override fun actionPerformed (e : ActionEvent ) {
209
- searchByName ()
221
+ searchForName ()
210
222
}
211
223
}
212
224
213
225
val searchLicenseAction: Action = object : AbstractAction () {
214
226
override fun actionPerformed (e : ActionEvent ) {
215
- searchLicenseNumber ()
227
+ searchForLicenseNumber ()
216
228
}
217
229
}
218
230
@@ -232,13 +244,13 @@ object ITSFRankingApp {
232
244
panel.add(JButton (" Search" ).apply { addActionListener(searchLicenseAction) }, " growx" )
233
245
234
246
panel.add(JLabel (" Upload player list" ))
235
- panel.add(LoadCsvPanel (::loadFile , ::checkRankingLoaded ), " growx" )
247
+ panel.add(LoadCsvPanel (::loadCsvFile , ::checkITSFDataLoaded ), " growx" )
236
248
237
- panel.add(JLabel (" Results " ))
249
+ panel.add(JLabel (" Data " ))
238
250
239
- tabbedPane.addTab(" Search results" , JScrollPane (jTable ))
240
- tabbedPane.addTab(" Player list" , JScrollPane (jTableList ))
241
- tabbedPane.addTab(" Rankings" , JScrollPane (jTableRanking ))
251
+ tabbedPane.addTab(" Search results" , JScrollPane (searchResultTable ))
252
+ tabbedPane.addTab(" Player list" , JScrollPane (csvListTable ))
253
+ tabbedPane.addTab(" Rankings" , JScrollPane (rankingTable ))
242
254
panel.add(tabbedPane, " growx, height :400:" )
243
255
244
256
return panel
@@ -253,7 +265,7 @@ object ITSFRankingApp {
253
265
ex.printStackTrace()
254
266
}
255
267
val frame = JFrame (" ITSF Rankings ($version )" )
256
- frame.contentPane.add(createPanel (frame))
268
+ frame.contentPane.add(createMainPanel (frame))
257
269
frame.pack()
258
270
frame.isResizable = false
259
271
frame.defaultCloseOperation = WindowConstants .EXIT_ON_CLOSE
0 commit comments