1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package net.sourceforge.jhunters.pool.ui;
18
19 import javafx.collections.ObservableList;
20 import javafx.collections.transformation.FilteredList;
21 import javafx.geometry.Pos;
22 import javafx.scene.control.Label;
23 import javafx.scene.control.TableColumn;
24 import net.sourceforge.jhunters.pool.data.DataSet;
25 import net.sourceforge.jhunters.pool.data.Player;
26 import net.sourceforge.jhunters.pool.data.Player.PlayerComparator;
27 import net.sourceforge.jhunters.pool.data.Player.PlayerField;
28 import net.sourceforge.jhunters.pool.data.PlayerList;
29 import net.sourceforge.jhunters.pool.ui.GuiIcons.IconId;
30 import net.sourceforge.jhunters.pool.ui.TableUtils.FieldCell;
31 import net.sourceforge.jhunters.pool.ui.TableUtils.FieldTableColumn;
32 import net.sourceforge.jhunters.pool.ui.TableUtils.FieldTableView;
33 import net.sourceforge.jhunters.pool.ui.TableUtils.IconFieldMap;
34
35
36
37
38 public class PlayerTable
39 extends FieldTableView<Player, PlayerField> {
40
41
42
43 private static final String TEXT_SELECTED = GuiResource.LABEL_SELECTED.getValue();
44
45
46
47
48 protected static final int WIDTH_NAME = 150;
49
50
51
52
53 protected static final int WIDTH_CONTACT = 350;
54
55
56
57
58 protected static final int WIDTH_SELECTED = 70;
59
60
61
62
63 private final Label theNumSelected;
64
65
66
67
68 private final PlayerComparator theComparator;
69
70
71
72
73 private DataSet theDataSet;
74
75
76
77
78 private ObservableList<Player> theList;
79
80
81
82
83 private FilteredList<Player> theSelected;
84
85
86
87
88
89 protected PlayerTable(final Label pNumSelected) {
90
91 theNumSelected = pNumSelected;
92
93
94 setEditable(true);
95
96
97 theComparator = new PlayerComparator();
98
99
100 ObservableList<TableColumn<Player, ?>> myColumns = getColumns();
101
102
103 TableColumn<Player, String> myNameCol = new FieldTableColumn<Player, PlayerField, String>(PlayerField.NAME);
104 myNameCol.setCellValueFactory(p -> p.getValue().nameProperty());
105 myNameCol.setCellFactory(TableUtils.stringCellFactory(Pos.CENTER_RIGHT));
106 myNameCol.setMinWidth(WIDTH_NAME);
107 myNameCol.setSortable(false);
108 myColumns.add(myNameCol);
109
110
111 TableColumn<Player, String> myContactCol = new FieldTableColumn<Player, PlayerField, String>(PlayerField.CONTACT);
112 myContactCol.setCellValueFactory(p -> p.getValue().contactProperty());
113 myContactCol.setCellFactory(TableUtils.stringCellFactory(Pos.CENTER));
114 myContactCol.setSortable(false);
115 myContactCol.setMinWidth(WIDTH_CONTACT);
116 myColumns.add(myContactCol);
117
118
119 IconFieldMap<Boolean> mySelectedMap = new IconFieldMap<Boolean>();
120 mySelectedMap.declareIconState(Boolean.TRUE, IconId.SELECTED, Boolean.FALSE);
121 mySelectedMap.declareIconState(Boolean.FALSE, null, Boolean.TRUE);
122
123
124 TableColumn<Player, Boolean> mySelectCol = new FieldTableColumn<Player, PlayerField, Boolean>(PlayerField.SELECTED);
125 mySelectCol.setCellValueFactory(p -> p.getValue().selectedProperty());
126 mySelectCol.setCellFactory(TableUtils.iconCellFactory(mySelectedMap));
127 mySelectCol.setSortable(false);
128 mySelectCol.setMinWidth(WIDTH_SELECTED);
129 myColumns.add(mySelectCol);
130
131
132 IconFieldMap<Boolean> myActiveMap = new IconFieldMap<Boolean>();
133 myActiveMap.declareIconState(Boolean.TRUE, IconId.ACTIVE, null);
134 myActiveMap.declareIconState(Boolean.FALSE, IconId.DELETE, Boolean.TRUE);
135
136
137 TableColumn<Player, Boolean> myActiveCol = new FieldTableColumn<Player, PlayerField, Boolean>(PlayerField.ACTIVE);
138 myActiveCol.setCellValueFactory(p -> p.getValue().activeProperty());
139 myActiveCol.setCellFactory(TableUtils.iconCellFactory(myActiveMap));
140 myActiveCol.setSortable(false);
141 myActiveCol.setMinWidth(WIDTH_SELECTED);
142 myColumns.add(myActiveCol);
143 }
144
145
146
147
148
149 protected void setData(final DataSet pData) {
150
151 theDataSet = pData;
152
153
154 PlayerList myPlayers = pData.getPlayers();
155 theList = myPlayers.getPlayers();
156
157
158 setItems(theList.sorted(theComparator));
159
160
161 theSelected = theList.filtered(p -> p.isSelected());
162 adjustNumSelected();
163 }
164
165
166
167
168 private void adjustNumSelected() {
169 StringBuilder myBuilder = new StringBuilder();
170 myBuilder.append(theSelected.size());
171 myBuilder.append(' ');
172 myBuilder.append(TEXT_SELECTED);
173 theNumSelected.setText(myBuilder.toString());
174 }
175
176
177
178
179 protected void addNewItem() {
180
181 PlayerList myPlayers = theDataSet.getPlayers();
182 myPlayers.createUniquePlayer();
183
184
185 theDataSet.setUpdated(Boolean.TRUE);
186
187
188 adjustNumSelected();
189 }
190
191 @Override
192 public boolean preEditHook(final FieldCell<Player, PlayerField> pCell) {
193
194 Player myPlayer = pCell.getTheRow();
195 PlayerField myField = pCell.getTheField();
196
197
198 switch (myField) {
199 case NAME:
200 case CONTACT:
201 case SELECTED:
202 return true;
203 case ACTIVE:
204 return !myPlayer.isActive();
205 default:
206 return false;
207 }
208 }
209
210 @Override
211 public boolean preCommitHook(final FieldCell<Player, PlayerField> pCell,
212 final Object pValue) {
213
214 Player myPlayer = pCell.getTheRow();
215 PlayerField myField = pCell.getTheField();
216
217
218 switch (myField) {
219 case NAME:
220 return validPlayer(myPlayer.getName(), (String) pValue);
221 default:
222 return true;
223 }
224 }
225
226
227
228
229
230
231
232 private boolean validPlayer(final String pCurValue,
233 final String pValue) {
234
235 if (pValue == null) {
236 return false;
237 }
238
239
240 if (pValue.equals(pCurValue)) {
241 return true;
242 }
243
244
245 PlayerList myPlayers = theDataSet.getPlayers();
246 return myPlayers.getNamedPlayer((String) pValue) == null;
247 }
248
249 @Override
250 public void postCommitHook(final FieldCell<Player, PlayerField> pCell) {
251
252 Player myPlayer = pCell.getTheRow();
253 PlayerField myField = pCell.getTheField();
254
255
256 PlayerList myPlayers = theDataSet.getPlayers();
257
258
259 if (PlayerField.ACTIVE.equals(myField)) {
260
261 myPlayers.removePlayer(myPlayer);
262 }
263
264
265 if (!PlayerField.SELECTED.equals(myField)) {
266
267 theDataSet.setUpdated(Boolean.TRUE);
268
269
270 theDataSet.adjustPlayers();
271
272
273 } else {
274 adjustNumSelected();
275 }
276 }
277 }