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 java.time.LocalDate;
20 import java.util.Iterator;
21
22 import org.w3c.dom.Element;
23
24 import javafx.beans.property.SimpleStringProperty;
25 import javafx.beans.property.StringProperty;
26 import javafx.beans.value.ObservableValue;
27 import javafx.collections.FXCollections;
28 import javafx.collections.ObservableList;
29 import javafx.geometry.Pos;
30 import javafx.scene.control.TableColumn;
31 import javafx.scene.control.TableColumn.CellDataFeatures;
32 import javafx.util.Callback;
33 import net.sourceforge.jhunters.pool.data.Competition;
34 import net.sourceforge.jhunters.pool.data.DataSet;
35 import net.sourceforge.jhunters.pool.data.Fixture;
36 import net.sourceforge.jhunters.pool.data.Fixture.FixtureField;
37 import net.sourceforge.jhunters.pool.data.FixtureSet;
38 import net.sourceforge.jhunters.pool.data.Player;
39 import net.sourceforge.jhunters.pool.data.Result;
40 import net.sourceforge.jhunters.pool.ui.ReportPanel.TableSource;
41 import net.sourceforge.jhunters.pool.ui.TableUtils.FieldCell;
42 import net.sourceforge.jhunters.pool.ui.TableUtils.FieldTableColumn;
43 import net.sourceforge.jhunters.pool.ui.TableUtils.FieldTableView;
44
45
46
47
48 public class FixtureSetTable
49 extends FieldTableView<Fixture, FixtureField>
50 implements TableSource {
51
52
53
54 private static final int WIDTH_PLAYER = 150;
55
56
57
58
59 private static final int WIDTH_RESULT = 60;
60
61
62
63
64 protected static final int WIDTH_DATE = 100;
65
66
67
68
69 private static final StringProperty BYE_PROPERTY = new SimpleStringProperty(Player.PLAYER_BYE);
70
71
72
73
74 private static final String WEEK_FORMAT = GuiResource.REPORT_FIXTURES_TITLE.getValue();
75
76
77
78
79 private DataSet theDataSet;
80
81
82
83
84 private Competition theCompetition;
85
86
87
88
89 private ObservableList<Fixture> theList;
90
91
92
93
94 protected FixtureSetTable() {
95
96 setEditable(true);
97
98
99 ObservableList<TableColumn<Fixture, ?>> myColumns = getColumns();
100
101
102 TableColumn<Fixture, LocalDate> myDateCol = new FieldTableColumn<Fixture, FixtureField, LocalDate>(FixtureField.DATE);
103 myDateCol.setCellValueFactory(p -> p.getValue().dateProperty());
104 myDateCol.setCellFactory(TableUtils.dateCellFactory());
105 myDateCol.setSortable(false);
106 myDateCol.setEditable(false);
107 myDateCol.setMinWidth(WIDTH_DATE);
108 myColumns.add(myDateCol);
109
110
111 TableColumn<Fixture, String> myHomeCol = new FieldTableColumn<Fixture, FixtureField, String>(FixtureField.HOME);
112 myHomeCol.setCellValueFactory(new PlayerCellValueFactory(true));
113 myHomeCol.setCellFactory(TableUtils.itemCellFactory(Pos.CENTER_RIGHT));
114 myHomeCol.setMinWidth(WIDTH_PLAYER);
115 myHomeCol.setSortable(false);
116 myHomeCol.setEditable(false);
117 myColumns.add(myHomeCol);
118
119
120 TableColumn<Fixture, Result> myResultCol = new FieldTableColumn<Fixture, FixtureField, Result>(FixtureField.RESULT);
121 myResultCol.setCellValueFactory(p -> p.getValue().resultProperty());
122 myResultCol.setCellFactory(TableUtils.enumCellFactory(Result.class));
123 myResultCol.setSortable(false);
124 myResultCol.setMinWidth(WIDTH_RESULT);
125 myColumns.add(myResultCol);
126
127
128 TableColumn<Fixture, String> myAwayCol = new FieldTableColumn<Fixture, FixtureField, String>(FixtureField.AWAY);
129 myAwayCol.setCellValueFactory(new PlayerCellValueFactory(false));
130 myAwayCol.setCellFactory(TableUtils.itemCellFactory(Pos.CENTER_LEFT));
131 myAwayCol.setMinWidth(WIDTH_PLAYER);
132 myAwayCol.setSortable(false);
133 myAwayCol.setEditable(false);
134 myColumns.add(myAwayCol);
135 }
136
137
138
139
140
141 protected void setData(final DataSet pData) {
142
143 theDataSet = pData;
144 }
145
146
147
148
149
150 protected void setCompetition(final Competition pCompetition) {
151
152 theCompetition = pCompetition;
153 }
154
155
156
157
158
159 protected void setFixtureSet(final FixtureSet pFixtureSet) {
160
161 theList = pFixtureSet != null
162 ? FXCollections.observableList(pFixtureSet.getFixtures())
163 : FXCollections.observableArrayList();
164
165
166 setItems(theList);
167 }
168
169 @Override
170 public void buildReport(final ReportBuilder pBuilder) {
171
172 buildMainReport(pBuilder);
173 }
174
175 @Override
176 public void createWeb(final ReportBuilder pBuilder) {
177
178 buildMainReport(pBuilder);
179 }
180
181
182
183
184
185 private void buildMainReport(final ReportBuilder pBuilder) {
186
187 Iterator<FixtureSet> myIterator = theCompetition.getFixtureList().fixtureIterator();
188 while (myIterator.hasNext()) {
189 FixtureSet myFixtureSet = myIterator.next();
190
191
192 buildSubReport(pBuilder, myFixtureSet);
193 }
194 }
195
196
197
198
199
200
201 private void buildSubReport(final ReportBuilder pBuilder,
202 final FixtureSet pFixtureSet) {
203
204 int myWeek = pFixtureSet.getWeekNo();
205 pBuilder.setHeading(WEEK_FORMAT, myWeek);
206
207
208 int myBreak = theCompetition.getPlayerCount() >> 2;
209
210
211 pBuilder.newTable();
212
213
214 pBuilder.setColumnHeading(FixtureField.DATE.toString());
215 pBuilder.setColumnHeading(FixtureField.HOME.toString());
216 pBuilder.setColumnHeading(FixtureField.RESULT.toString());
217 pBuilder.setColumnHeading(FixtureField.AWAY.toString());
218
219
220 int i = 0;
221 Iterator<Fixture> myIterator = pFixtureSet.fixtureIterator();
222 while (myIterator.hasNext()) {
223 Fixture myFixture = myIterator.next();
224
225
226 boolean bSeparator = (i++ % myBreak) == 0;
227 if (bSeparator) {
228
229 Element myRow = pBuilder.newRow();
230 pBuilder.addClassAttribute(myRow, ReportBuilder.CLASS_SEPARATOR);
231
232
233 Element myCell = pBuilder.setCellDate(myFixture.dateProperty().getValue());
234 myCell.setAttribute(ReportBuilder.ATTR_ROWSPAN, Integer.toString(myBreak));
235 } else {
236
237 pBuilder.newRow();
238 }
239
240
241 pBuilder.setCellPlayerRight(myFixture.homePlayerProperty().getValue());
242 pBuilder.setCellResult(myFixture.resultProperty().getValue());
243 pBuilder.setCellPlayerLeft(myFixture.awayPlayerProperty().getValue());
244 }
245
246
247 if ((myWeek & 1) == 0) {
248
249 pBuilder.setPageBreak();
250
251
252 } else {
253 pBuilder.setLineSpace();
254 }
255 }
256
257 @Override
258 public boolean preEditHook(final FieldCell<Fixture, FixtureField> pCell) {
259
260 Fixture myFixture = pCell.getTheRow();
261 FixtureField myField = pCell.getTheField();
262
263
264 switch (myField) {
265 case NEWDATE:
266 return myFixture.getResult() == null;
267 case RESULT:
268 return true;
269 default:
270 return false;
271 }
272 }
273
274 @Override
275 public void postCommitHook(final FieldCell<Fixture, FixtureField> pCell) {
276
277 theDataSet.setUpdated(Boolean.TRUE);
278
279
280 theCompetition.processFixtures();
281 }
282
283
284
285
286 protected static final class PlayerCellValueFactory
287 implements Callback<CellDataFeatures<Fixture, String>, ObservableValue<String>> {
288
289
290
291 private final boolean isHome;
292
293
294
295
296
297 protected PlayerCellValueFactory(final boolean pHome) {
298 isHome = pHome;
299 }
300
301 @Override
302 public ObservableValue<String> call(final CellDataFeatures<Fixture, String> p) {
303 Player myPlayer = isHome
304 ? p.getValue().getHomePlayer()
305 : p.getValue().getAwayPlayer();
306 return myPlayer == null
307 ? BYE_PROPERTY
308 : myPlayer.nameProperty();
309 }
310 }
311 }