View Javadoc

1   // %2601556114:hoplugins.trainingExperience.ui%
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      //~ Static fields/initializers -----------------------------------------------------------------
53  
54      /*** TODO Missing Parameter Documentation */
55      private static final String CMD_SELECT_ALL = "selectAll"; //$NON-NLS-1$
56  
57      //~ Instance fields ----------------------------------------------------------------------------
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      //~ Constructors -------------------------------------------------------------------------------
68  
69      /***
70       * Creates a new AnalyzerPanel object.
71       */
72      public AnalyzerPanel() {
73          super();
74          jbInit();
75          reload();
76      }
77  
78      //~ Methods ------------------------------------------------------------------------------------
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         // Hide column 5
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         // Hide column 6
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         // Set own renderer instance for skillup column.
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"))); //$NON-NLS-1$
292 
293         // Add selection listener.
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")); //$NON-NLS-1$
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")); //$NON-NLS-1$
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         // Add legend panel. 
335         //mainpanel.add(new TrainingLegendPanel(), BorderLayout.SOUTH);
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 }