1
2 package hoplugins.trainingExperience.ui;
3
4 import hoplugins.Commons;
5
6 import hoplugins.commons.utils.PluginProperty;
7
8 import hoplugins.trainingExperience.OldTrainingManager;
9 import hoplugins.trainingExperience.constants.Skills;
10 import hoplugins.trainingExperience.ui.model.ChangesTableModel;
11 import hoplugins.trainingExperience.ui.renderer.ChangeTableRenderer;
12 import hoplugins.trainingExperience.ui.renderer.SkillupTypeTableCellRenderer;
13 import hoplugins.trainingExperience.vo.SkillChange;
14
15 import plugins.ISkillup;
16 import plugins.ISpieler;
17
18 import java.awt.BorderLayout;
19 import java.awt.FlowLayout;
20 import java.awt.event.ActionEvent;
21 import java.awt.event.ActionListener;
22
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.Comparator;
26 import java.util.HashMap;
27 import java.util.Iterator;
28 import java.util.List;
29 import java.util.Map;
30 import java.util.Vector;
31
32 import javax.swing.BorderFactory;
33 import javax.swing.Box;
34 import javax.swing.BoxLayout;
35 import javax.swing.ButtonModel;
36 import javax.swing.JButton;
37 import javax.swing.JCheckBox;
38 import javax.swing.JLabel;
39 import javax.swing.JPanel;
40 import javax.swing.JScrollPane;
41 import javax.swing.JTable;
42 import javax.swing.event.ChangeEvent;
43 import javax.swing.event.ChangeListener;
44
45
46 /***
47 * Shows a table of skillups, which can be filtered using the checkboxes on the side.
48 *
49 * @author NetHyperon
50 */
51 public class AnalyzerPanel extends JPanel implements ActionListener, ChangeListener {
52
53
54 /*** TODO Missing Parameter Documentation */
55 private static final String CMD_SELECT_ALL = "selectAll";
56
57
58
59 private ButtonModel oldPlayers;
60 private JButton btAll = new JButton();
61 private JPanel filterPanel = Commons.getModel().getGUI().createImagePanel();
62 private JTable changesTable = new JTable();
63 private Map buttonModels = new HashMap();
64 private Map skillups;
65 private Map skillupsOld;
66
67
68
69 /***
70 * Creates a new AnalyzerPanel object.
71 */
72 public AnalyzerPanel() {
73 super();
74 jbInit();
75 reload();
76 }
77
78
79
80 /***
81 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
82 */
83 public void actionPerformed(ActionEvent e) {
84 if (CMD_SELECT_ALL.equals(e.getActionCommand())) {
85 for (Iterator iter = this.buttonModels.values().iterator(); iter.hasNext();) {
86 ButtonModel bModel = (ButtonModel) iter.next();
87
88 bModel.setSelected(true);
89 }
90
91 this.oldPlayers.setSelected(true);
92 }
93
94 updateTableModel();
95 }
96
97 /***
98 * Reload the data and redraw the panel
99 */
100 public void reload() {
101 this.skillups = getSkillups(Commons.getModel().getAllSpieler());
102 this.skillupsOld = getSkillups(Commons.getModel().getAllOldSpieler());
103 updateFilterPanel();
104 updateTableModel();
105
106 updateUI();
107 }
108
109 /***
110 * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent)
111 */
112 public void stateChanged(ChangeEvent e) {
113 updateFilterPanel();
114 }
115
116 /***
117 * Sets the model for skill changes table.
118 */
119 public void updateTableModel() {
120 List values = new ArrayList();
121
122 for (Iterator iter = this.buttonModels.keySet().iterator(); iter.hasNext();) {
123 Integer skillType = (Integer) iter.next();
124 ButtonModel bModel = (ButtonModel) this.buttonModels.get(skillType);
125
126 if (this.skillups.containsKey(skillType) && bModel.isSelected()) {
127 values.addAll((List) this.skillups.get(skillType));
128 }
129
130 if (this.oldPlayers.isSelected()
131 && bModel.isSelected()
132 && this.skillupsOld.containsKey(skillType)) {
133 values.addAll((List) this.skillupsOld.get(skillType));
134 }
135 }
136
137 Collections.sort(values,
138 new Comparator() {
139 public int compare(Object o1, Object o2) {
140 SkillChange sc1 = (SkillChange) o1;
141 SkillChange sc2 = (SkillChange) o2;
142
143 if (sc1.getSkillup().getHtSeason() > sc2.getSkillup().getHtSeason()) {
144 return -1;
145 } else if (sc1.getSkillup().getHtSeason() < sc2.getSkillup().getHtSeason()) {
146 return 1;
147 } else {
148 if (sc1.getSkillup().getHtWeek() > sc2.getSkillup().getHtWeek()) {
149 return -1;
150 } else if (sc1.getSkillup().getHtWeek() < sc2.getSkillup().getHtWeek()) {
151 return 1;
152 } else {
153 if ((sc1.getPlayer().equals(sc2.getPlayer()))
154 && (sc1.getSkillup().getType() == sc2.getSkillup().getType())) {
155 if (sc1.getSkillup().getValue() > sc2.getSkillup().getValue()) {
156 return -1;
157 } else {
158 return 1;
159 }
160 } else {
161 return sc1.getPlayer().getName().compareTo(sc2.getPlayer().getName());
162 }
163 }
164 }
165 }
166 });
167
168 changesTable.setModel(new ChangesTableModel(values));
169 changesTable.setDefaultRenderer(Object.class, new ChangeTableRenderer());
170 changesTable.getTableHeader().setReorderingAllowed(false);
171 changesTable.getColumnModel().getColumn(0).setPreferredWidth(50);
172 changesTable.getColumnModel().getColumn(1).setPreferredWidth(50);
173 changesTable.getColumnModel().getColumn(2).setPreferredWidth(150);
174 changesTable.getColumnModel().getColumn(3).setPreferredWidth(100);
175 changesTable.getColumnModel().getColumn(4).setPreferredWidth(100);
176
177
178 changesTable.getTableHeader().getColumnModel().getColumn(5).setPreferredWidth(0);
179 changesTable.getTableHeader().getColumnModel().getColumn(5).setMinWidth(0);
180 changesTable.getTableHeader().getColumnModel().getColumn(5).setMaxWidth(0);
181
182
183 changesTable.getTableHeader().getColumnModel().getColumn(6).setPreferredWidth(0);
184 changesTable.getTableHeader().getColumnModel().getColumn(6).setMinWidth(0);
185 changesTable.getTableHeader().getColumnModel().getColumn(6).setMaxWidth(0);
186
187
188 changesTable.getTableHeader().getColumnModel().getColumn(3).setCellRenderer(new SkillupTypeTableCellRenderer());
189 }
190
191 /***
192 * Get map of skillups for a list of players. The map will contain a list of skillups for each
193 * skill, represented as an <code>Integer</code> as key
194 *
195 * @param players List of players to analyze
196 *
197 * @return Map of skillups
198 */
199 private Map getSkillups(List players) {
200 Map skillupsByType = new HashMap();
201
202 for (Iterator iter = players.iterator(); iter.hasNext();) {
203 ISpieler player = (ISpieler) iter.next();
204
205 OldTrainingManager otm = new OldTrainingManager(player);
206
207 List skillups = otm.getAllSkillups();
208
209 for (Iterator iterator = skillups.iterator(); iterator.hasNext();) {
210 ISkillup skillup = (ISkillup) iterator.next();
211 Integer skillType = new Integer(skillup.getType());
212
213 List skillChanges = (List) skillupsByType.get(skillType);
214
215 if (skillChanges == null) {
216 skillChanges = new Vector();
217 skillupsByType.put(skillType, skillChanges);
218 }
219
220 skillChanges.add(new SkillChange(player, skillup));
221 }
222 }
223
224 return skillupsByType;
225 }
226
227 /***
228 * Creates a panel with a skill increases number and a checkbox.
229 *
230 * @param skill skill type
231 *
232 * @return a panel
233 */
234 private JPanel createSkillSelector(int skill) {
235 Integer skillType = new Integer(skill);
236
237 int change = 0;
238
239 if (this.skillups.containsKey(skillType)) {
240 change += ((List) this.skillups.get(skillType)).size();
241 }
242
243 if (this.oldPlayers.isSelected() && this.skillupsOld.containsKey(skillType)) {
244 change += ((List) this.skillupsOld.get(skillType)).size();
245 }
246
247 JCheckBox cBox = new JCheckBox();
248
249 cBox.setOpaque(false);
250 cBox.setFocusable(false);
251
252 if (this.buttonModels.containsKey(skillType)) {
253 cBox.setModel((ButtonModel) this.buttonModels.get(skillType));
254 } else {
255 this.buttonModels.put(skillType, cBox.getModel());
256
257 if (change > 0) {
258 cBox.setSelected(true);
259 } else {
260 cBox.setSelected(false);
261 }
262 }
263
264 cBox.setText(Skills.getSkillDescription(skill));
265 cBox.addActionListener(this);
266
267 JPanel panel = Commons.getModel().getGUI().createImagePanel();
268
269 panel.setLayout(new FlowLayout(FlowLayout.LEFT));
270
271 panel.add(new JLabel(Commons.getModel().getHelper().getImageIcon4Veraenderung(change)));
272 panel.add(cBox);
273
274 return panel;
275 }
276
277 /***
278 * Initialize panel.
279 */
280 private void jbInit() {
281 setOpaque(false);
282 setLayout(new BorderLayout());
283
284 JPanel mainpanel = Commons.getModel().getGUI().createImagePanel();
285
286 mainpanel.setLayout(new BorderLayout());
287
288 JPanel skillPanel = Commons.getModel().getGUI().createImagePanel();
289
290 skillPanel.setLayout(new BorderLayout());
291 skillPanel.setBorder(BorderFactory.createTitledBorder(PluginProperty.getString("TAB_SKILL")));
292
293
294 changesTable.getSelectionModel().addListSelectionListener(new PlayerSelectionListener(changesTable,
295 6));
296
297 JScrollPane changesPane = new JScrollPane(changesTable);
298
299 skillPanel.add(changesPane, BorderLayout.CENTER);
300
301 JCheckBox cbOldPlayers = new JCheckBox();
302
303 cbOldPlayers.setOpaque(false);
304 cbOldPlayers.setText(PluginProperty.getString("IncludeOld"));
305 cbOldPlayers.setFocusable(false);
306 cbOldPlayers.setSelected(false);
307 cbOldPlayers.addChangeListener(this);
308 cbOldPlayers.addActionListener(this);
309 this.oldPlayers = cbOldPlayers.getModel();
310 skillPanel.add(cbOldPlayers, BorderLayout.SOUTH);
311
312 JPanel sidePanel = Commons.getModel().getGUI().createImagePanel();
313
314 sidePanel.setLayout(new BorderLayout());
315 sidePanel.add(filterPanel, BorderLayout.CENTER);
316
317 filterPanel.setLayout(new BoxLayout(filterPanel, BoxLayout.Y_AXIS));
318
319 btAll.setText(PluginProperty.getString("ShowAll"));
320 btAll.setFocusable(false);
321 btAll.addActionListener(this);
322 btAll.setActionCommand(CMD_SELECT_ALL);
323 sidePanel.add(btAll, BorderLayout.SOUTH);
324
325 JScrollPane sidePane = new JScrollPane(sidePanel);
326
327 sidePane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
328 sidePane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
329 sidePane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
330
331 mainpanel.add(sidePane, BorderLayout.WEST);
332 mainpanel.add(skillPanel, BorderLayout.CENTER);
333
334
335
336 add(mainpanel, BorderLayout.CENTER);
337 }
338
339 /***
340 * Redraws the panel with a checkbox for each skill and a number of increases per skill.
341 */
342 private void updateFilterPanel() {
343 filterPanel.removeAll();
344
345 filterPanel.add(Box.createVerticalStrut(20));
346
347 filterPanel.add(createSkillSelector(ISpieler.SKILL_TORWART));
348 filterPanel.add(createSkillSelector(ISpieler.SKILL_SPIELAUFBAU));
349 filterPanel.add(createSkillSelector(ISpieler.SKILL_PASSSPIEL));
350 filterPanel.add(createSkillSelector(ISpieler.SKILL_FLUEGEL));
351 filterPanel.add(createSkillSelector(ISpieler.SKILL_VERTEIDIGUNG));
352 filterPanel.add(createSkillSelector(ISpieler.SKILL_TORSCHUSS));
353 filterPanel.add(createSkillSelector(ISpieler.SKILL_KONDITION));
354 filterPanel.add(createSkillSelector(ISpieler.SKILL_EXPIERIENCE));
355
356 filterPanel.add(Box.createVerticalStrut(20));
357
358 filterPanel.revalidate();
359 }
360 }