View Javadoc
1   /*******************************************************************************
2    * jhunters: Pool League
3    * Copyright 2015 Tony Washer
4    *
5    * Licensed under the Apache License, Version 2.0 (the "License");
6    * you may not use this file except in compliance with the License.
7    * You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
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   * Player Table.
37   */
38  public class PlayerTable
39          extends FieldTableView<Player, PlayerField> {
40      /**
41       * Players selected text.
42       */
43      private static final String TEXT_SELECTED = GuiResource.LABEL_SELECTED.getValue();
44  
45      /**
46       * Width for player name.
47       */
48      protected static final int WIDTH_NAME = 150;
49  
50      /**
51       * Width for contact detail.
52       */
53      protected static final int WIDTH_CONTACT = 350;
54  
55      /**
56       * Width for selected.
57       */
58      protected static final int WIDTH_SELECTED = 70;
59  
60      /**
61       * The numSelected label.
62       */
63      private final Label theNumSelected;
64  
65      /**
66       * Player Comparator.
67       */
68      private final PlayerComparator theComparator;
69  
70      /**
71       * Current dataSet.
72       */
73      private DataSet theDataSet;
74  
75      /**
76       * Current list.
77       */
78      private ObservableList<Player> theList;
79  
80      /**
81       * Selected list.
82       */
83      private FilteredList<Player> theSelected;
84  
85      /**
86       * Constructor.
87       * @param pNumSelected the selected label
88       */
89      protected PlayerTable(final Label pNumSelected) {
90          /* Store parameters */
91          theNumSelected = pNumSelected;
92  
93          /* Allow editing */
94          setEditable(true);
95  
96          /* Allocate the comparator */
97          theComparator = new PlayerComparator();
98  
99          /* Access column list */
100         ObservableList<TableColumn<Player, ?>> myColumns = getColumns();
101 
102         /* Create the name column */
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         /* Create the contact column */
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         /* Build IconStateMap */
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         /* Create the selected column */
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         /* Build IconStateMap */
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         /* Create the active column */
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      * Set table data.
147      * @param pData the dataSet
148      */
149     protected void setData(final DataSet pData) {
150         /* Store the DataSet */
151         theDataSet = pData;
152 
153         /* Access the player list */
154         PlayerList myPlayers = pData.getPlayers();
155         theList = myPlayers.getPlayers();
156 
157         /* Declare the sorted list */
158         setItems(theList.sorted(theComparator));
159 
160         /* Create the filtered list */
161         theSelected = theList.filtered(p -> p.isSelected());
162         adjustNumSelected();
163     }
164 
165     /**
166      * AdjustNumSelected.
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      * Add New Item.
178      */
179     protected void addNewItem() {
180         /* Create a new player */
181         PlayerList myPlayers = theDataSet.getPlayers();
182         myPlayers.createUniquePlayer();
183 
184         /* Note that the data is updated */
185         theDataSet.setUpdated(Boolean.TRUE);
186 
187         /* Adjust the number of players selected */
188         adjustNumSelected();
189     }
190 
191     @Override
192     public boolean preEditHook(final FieldCell<Player, PlayerField> pCell) {
193         /* Access the details */
194         Player myPlayer = pCell.getTheRow();
195         PlayerField myField = pCell.getTheField();
196 
197         /* Switch on field */
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         /* Access the details */
214         Player myPlayer = pCell.getTheRow();
215         PlayerField myField = pCell.getTheField();
216 
217         /* Switch on field */
218         switch (myField) {
219             case NAME:
220                 return validPlayer(myPlayer.getName(), (String) pValue);
221             default:
222                 return true;
223         }
224     }
225 
226     /**
227      * Is this a valid player name?
228      * @param pCurValue the current value
229      * @param pValue the name
230      * @return true/false
231      */
232     private boolean validPlayer(final String pCurValue,
233                                 final String pValue) {
234         /* Null values are not allowed */
235         if (pValue == null) {
236             return false;
237         }
238 
239         /* Current value is OK */
240         if (pValue.equals(pCurValue)) {
241             return true;
242         }
243 
244         /* Check that player is not already present */
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         /* Access the details */
252         Player myPlayer = pCell.getTheRow();
253         PlayerField myField = pCell.getTheField();
254 
255         /* Access the player list */
256         PlayerList myPlayers = theDataSet.getPlayers();
257 
258         /* If the player is deleted */
259         if (PlayerField.ACTIVE.equals(myField)) {
260             /* Remove player from the list */
261             myPlayers.removePlayer(myPlayer);
262         }
263 
264         /* If the update is not to the selected field */
265         if (!PlayerField.SELECTED.equals(myField)) {
266             /* Note that the data is updated */
267             theDataSet.setUpdated(Boolean.TRUE);
268 
269             /* Adjust players */
270             theDataSet.adjustPlayers();
271 
272             /* else adjust the selected count */
273         } else {
274             adjustNumSelected();
275         }
276     }
277 }