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