/*
* TeamBuilderForm.java
*
* Created on Apr 4, 2009, 4:35:47 PM
*
* This file is a part of Shoddy Battle.
* Copyright (C) 2009 Catherine Fitzpatrick and Benjamin Gwin
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, visit the Free Software Foundation, Inc.
* online at http://gnu.org.
*/
package shoddybattleclient.forms;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.Timer;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import shoddybattleclient.TeamBuilder;
import shoddybattleclient.shoddybattle.*;
import shoddybattleclient.shoddybattle.Pokemon.Gender;
import shoddybattleclient.shoddybattle.PokemonSpecies.IllegalCombo;
import shoddybattleclient.utils.FilteredDocument;
import shoddybattleclient.utils.IntegerDocument;
import shoddybattleclient.utils.MoveTableModel;
import shoddybattleclient.utils.MoveTableModel.SelectedMoveModel;
import shoddybattleclient.utils.MoveTableModel.TableRow;
import shoddybattleclient.utils.JButtonTable;
/**
*
* @author ben
*/
public class TeamBuilderForm extends javax.swing.JPanel {
private class IllegalCheckRenderer extends DefaultListCellRenderer {
boolean m_illegal[];
public IllegalCheckRenderer (int nItems) {
m_illegal = new boolean[nItems];
}
public void setIllegal(int index) {
if (index >= 0) {
m_illegal[index] = true;
}
}
public void clear() {
for (int i = 0; i < m_illegal.length; i++) {
m_illegal[i] = false;
}
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(list, value,
index, isSelected, cellHasFocus);
if ((index < 0) || !m_illegal[index]) {
c.setForeground(defaultForeground);
} else {
c.setForeground(Color.RED);
}
return c;
}
}
private TeamBuilder m_parent;
//The generation the team builder represents
private Generation m_generation;
//The current species
private PokemonSpecies m_species = null;
//pokemon represented by this form
private Pokemon m_pokemon = null;
private JTextField[] m_ivs;
private JTextField[] m_evs;
private JLabel[] m_bases;
private JLabel[] m_totals;
private JLabel[] m_natures;
private JLabel m_evHeader;
private JButtonTable tblMoves;
private JTable tblSelected;
private Color defaultForeground;
private IllegalCheckRenderer genderRenderer;
private IllegalCheckRenderer natureRenderer;
private IllegalCheckRenderer abilityRenderer;
//hacky solution to hacky problem
//changing the IVs changes the hiddenpower (itemStateChanged) which changes the IVs
//use a flag so cmbNatureItemStateChanged knows we don't want it changed
private boolean hpProgramSelect = false;
private static final Map<String, int[]> m_hiddenPowers = new HashMap<String, int[]>();
static {
m_hiddenPowers.put("Dark", new int[] { 31, 31, 31, 31, 31, 31 });
m_hiddenPowers.put("Fire", new int[] { 31, 30, 31, 30, 30, 31 });
m_hiddenPowers.put("Water", new int[] { 31, 31, 31, 30, 30, 31 });
m_hiddenPowers.put("Grass", new int[] { 31, 30, 31, 31, 30, 31 });
m_hiddenPowers.put("Electric", new int[] { 31, 31, 31, 31, 30, 31 });
m_hiddenPowers.put("Ice", new int[] { 31, 30, 30, 31, 31, 31 });
m_hiddenPowers.put("Fighting", new int[] { 31, 31, 30, 30, 30, 30 });
m_hiddenPowers.put("Poison", new int[] { 31, 31, 30, 31, 30, 30 });
m_hiddenPowers.put("Ground", new int[] { 31, 31, 31, 31, 30, 30 });
m_hiddenPowers.put("Flying", new int[] { 31, 31, 31, 30, 30, 30 });
m_hiddenPowers.put("Psychic", new int[] { 31, 30, 31, 30, 31, 31 });
m_hiddenPowers.put("Bug", new int[] { 31, 31, 31, 30, 31, 30 });
m_hiddenPowers.put("Rock", new int[] { 31, 31, 30, 30, 31, 30 });
m_hiddenPowers.put("Ghost", new int[] { 31, 31, 30, 31, 31, 30 });
m_hiddenPowers.put("Dragon", new int[] { 31, 30, 31, 31, 31, 31 });
m_hiddenPowers.put("Steel", new int[] { 31, 31, 31, 31, 31, 30 });
}
/** Creates new form TeamBuilderForm */
public TeamBuilderForm(TeamBuilder parent) {
initComponents();
m_parent = parent;
m_generation = parent.getGeneration();
tblMoves = new JButtonTable();
tblMoves.setModel(new MoveTableModel(null, new String[0], this));
tblMoves.setRowSelectionAllowed(false);
tblMoves.setColumnSelectionAllowed(false);
scrollMoves.add(tblMoves);
scrollMoves.setViewportView(tblMoves);
tblSelected = new JButtonTable();
tblSelected.setModel(new SelectedMoveModel(this));
tblSelected.getColumnModel().getColumn(0).setPreferredWidth(80);
tblSelected.getColumnModel().getColumn(1).setPreferredWidth(100);
tblSelected.getColumnModel().getColumn(2).setPreferredWidth(170);
tblSelected.setRowSelectionAllowed(false);
tblSelected.setColumnSelectionAllowed(false);
scrollSelected.add(tblSelected);
scrollSelected.setViewportView(tblSelected);
Insets insets = scrollSelected.getInsets();
splitPane.setDividerLocation(
tblSelected.getTableHeader().getPreferredSize().height
+ (tblSelected.getRowHeight() * 4)
+ insets.top + insets.bottom + 1);
String[] items = new String[m_generation.getItems().size() + 1];
items[0] = "No Item";
for (int i = 0; i < m_generation.getItems().size(); i++)
items[i+1] = m_generation.getItems().get(i);
cmbNature.setModel(new DefaultComboBoxModel(PokemonNature.getNatures()));
natureRenderer =
new IllegalCheckRenderer(PokemonNature.getNatures().length);
cmbNature.setRenderer(natureRenderer);
cmbItem.setModel(new DefaultComboBoxModel(items));
genderRenderer = new IllegalCheckRenderer(2);
cmbGender.setRenderer(genderRenderer);
setupStats();
cmbNatureItemStateChanged(null);
// Illegal move checking
defaultForeground = tblSelected.getForeground();
tblSelected.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
checkIllegalMovesets();
}
});
}
private void setupStats() {
m_ivs = new JTextField[6];
m_evs = new JTextField[6];
m_bases = new JLabel[6];
m_totals = new JLabel[6];
m_natures = new JLabel[6];
JLabel stat = new JLabel("Stat");
Font f = stat.getFont().deriveFont(11.0f).deriveFont(Font.BOLD);
stat.setFont(f);
JLabel baseHeader = new JLabel("Base");
baseHeader.setFont(f);
JLabel totalHeader = new JLabel("Total");
totalHeader.setFont(f);
JLabel ivHeader = new JLabel("IVs");
ivHeader.setFont(f);
m_evHeader = new JLabel("EVs");
m_evHeader.setFont(f);
panelStats.add(stat); panelStats.add(totalHeader); panelStats.add(baseHeader);
panelStats.add(ivHeader); panelStats.add(m_evHeader);
for (int i = 0; i < m_ivs.length; i++) {
JTextField iv = new JTextField(""+31);
iv.setFont(iv.getFont().deriveFont(11.0f));
iv.setSize(new Dimension(0, 0));
iv.setPreferredSize(new Dimension(0, 0));
iv.setMaximumSize(new Dimension(0, 0));
iv.setDocument(new IntegerDocument(31, iv));
m_ivs[i] = iv;
JTextField ev = new JTextField("0");
ev.setFont(iv.getFont());
ev.setSize(new Dimension(0, 0));
ev.setPreferredSize(new Dimension(0, 0));
ev.setMaximumSize(new Dimension(0, 0));
ev.setDocument(new IntegerDocument(0, 255, 0, ev));
m_evs[i] = ev;
JLabel base = new JLabel("000");
base.setFont(iv.getFont());
m_bases[i] = base;
JLabel total = new JLabel("000");
total.setFont(iv.getFont());
m_totals[i] = total;
JLabel name = new JLabel(Pokemon.getStatName(i));
name.setFont(iv.getFont());
JLabel nature = new JLabel();
nature.setFont(iv.getFont());
m_natures[i] = nature;
panelStats.add(name);
panelStats.add(m_totals[i]);
panelStats.add(m_bases[i]);
panelStats.add(m_ivs[i]);
panelStats.add(m_evs[i]);
//panelStats.add(nature);
}
for (int i = 0; i < m_evs.length; i++) {
final int index = i;
KeyListener evListener = new KeyListener() {
//Linux has a "bug" where holding down a key fires many keyReleased
//This attempts to soften that bug, and shouldn't affect Mac/Windows
//Stopping it at actionPerformed gives keyPressed some time to save itself
private boolean m_increasing = false;
private JTextField m_caller = null;
boolean stopped = false;
private Timer m_timer = new Timer(200, new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(stopped) {
m_timer.stop();
return;
}
updateNumber();
}
});
public void keyTyped(KeyEvent e) {}
public void keyPressed(KeyEvent e) {
m_caller = (JTextField)e.getSource();
if (e.getKeyCode() == KeyEvent.VK_UP) {
m_increasing = true;
if (stopped) updateNumber();
m_timer.start();
stopped = false;
} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
m_increasing = false;
if (stopped) updateNumber();
m_timer.start();
stopped = false;
}
}
public void keyReleased(KeyEvent e) {
stopped = true;
updateStat(index);
}
private void updateNumber() {
try {
int current = Integer.parseInt(m_caller.getText());
current += m_increasing ? 4 : -4;
if (current < 0) current = 0;
else if (current > 255) current = 255;
m_caller.setText(String.valueOf(current));
updateStat(index);
} catch (NumberFormatException ex) { }
}
};
KeyListener ivListener = new KeyListener() {
public void keyTyped(KeyEvent e) { }
public void keyPressed(KeyEvent e) { }
public void keyReleased(KeyEvent e) {
updateStat(index);
updateHiddenPower();
}
};
FocusListener releaseListener = new FocusListener() {
public void focusLost(FocusEvent evt) {
Component c = (Component)evt.getSource();
for (KeyListener listener : c.getKeyListeners()) {
listener.keyReleased(null);
}
}
public void focusGained(FocusEvent evt) {}
};
m_ivs[i].addKeyListener(ivListener);
m_evs[i].addKeyListener(evListener);
m_ivs[i].addFocusListener(releaseListener);
m_evs[i].addFocusListener(releaseListener);
}
}
/**
* Set the Pokemon shown by this form
* @param p The pokemon to set
* @param loading whether we are loading from a team or selected from the list
*/
public void setPokemon(Pokemon p, boolean loading) {
m_pokemon = p;
m_species = m_parent.getSpecies(p.species);
// Changing the gender/abilities/items will cause an unwanted
// side effect if the there are any selected moves.
((SelectedMoveModel)tblSelected.getModel()).clear();
Gender g = m_species.getGenders();
if (g.equals(Gender.GENDER_MALE)) {
cmbGender.setModel(new DefaultComboBoxModel(new Gender[] {Gender.GENDER_MALE}));
cmbGender.setSelectedIndex(0);
} else if (g.equals(Gender.GENDER_FEMALE)) {
cmbGender.setModel(new DefaultComboBoxModel(new Gender[] {Gender.GENDER_FEMALE}));
} else if (g.equals(Gender.GENDER_BOTH)) {
cmbGender.setModel(new DefaultComboBoxModel(new Gender[] {
Gender.GENDER_MALE,
Gender.GENDER_FEMALE
}));
cmbGender.setSelectedIndex(0);
} else {
cmbGender.setModel(new DefaultComboBoxModel(new Gender[] {Gender.GENDER_NONE}));
cmbGender.setSelectedIndex(0);
}
cmbGender.setEnabled(!g.equals(Gender.GENDER_NONE));
txtNickname.setText(p.nickname);
txtLevel.setText(String.valueOf(p.level));
chkShiny.setSelected(p.shiny);
cmbAbility.setModel(new DefaultComboBoxModel(m_species.getAbilities()));
abilityRenderer =
new IllegalCheckRenderer(m_species.getAbilities().length);
cmbAbility.setRenderer(abilityRenderer);
cmbAbility.setSelectedItem(p.ability);
if (g.equals(Gender.GENDER_BOTH)) {
cmbGender.setSelectedIndex(p.gender.ordinal());
}
for (int i = 0; i < Pokemon.STAT_COUNT; i++) {
m_ivs[i].setText(String.valueOf(p.ivs[i]));
m_evs[i].setText(String.valueOf(p.evs[i]));
}
for (int i = 0; i < Pokemon.STAT_COUNT; i++) {
m_bases[i].setText(String.valueOf(m_species.getBase(i)));
m_totals[i].setText(String.valueOf(calculateStat(i)));
}
if (loading) {
cmbItem.setSelectedItem(p.item);
cmbNature.setSelectedItem(PokemonNature.getNature(p.nature));
if ("".equals(p.nature)) {
cmbNature.setSelectedIndex(0);
}
}
MoveTableModel mtm = new MoveTableModel(m_generation.getMoves(),
m_species.getMoves(), this);
mtm.selectMoves(p.moves, p.ppUps);
tblMoves.setModel(mtm);
//name column should be wider
tblMoves.getColumnModel().getColumn(0).setPreferredWidth(80);
tblMoves.getColumnModel().getColumn(1).setPreferredWidth(160);
updateEvs();
updateHiddenPower();
}
public int calculateStat(int i) {
PokemonNature n = (PokemonNature)cmbNature.getSelectedItem();
return Pokemon.calculateStat(m_pokemon, i, m_species, n);
}
private void updateEvs() {
int left = 510;
for (int i = 0; i < m_evs.length; i++) {
left -= m_pokemon.evs[i];
}
Color c = null;
if (left < 0) {
m_evHeader.setToolTipText("<html>Pokemon have a limit of 510 total "
+ "EVs,<br>this pokemon has too many.");
c = Color.RED;
} else {
m_evHeader.setToolTipText(null);
c = Color.BLACK;
}
m_evHeader.setText(String.valueOf(left));
m_evHeader.setForeground(c);
}
private void updateStat(int idx) {
if (m_pokemon == null) return;
if ((idx < 0) || (idx > m_totals.length)) return;
try {
m_pokemon.ivs[idx] = Integer.parseInt(m_ivs[idx].getText());
} catch (NumberFormatException e) {
m_pokemon.ivs[idx] = 0;
}
try {
m_pokemon.evs[idx] = Integer.parseInt(m_evs[idx].getText());
} catch (NumberFormatException e) {
m_pokemon.evs[idx] = 0;
}
m_totals[idx].setText(String.valueOf(calculateStat(idx)));
updateEvs();
}
private void updateHiddenPower() {
hpProgramSelect = true;
txtHiddenPower.setText(String.valueOf(
PokemonMove.calculateHiddenPowerPower(m_pokemon.ivs)));
cmbHiddenPower.setSelectedItem(
PokemonMove.getHiddenPowerType(m_pokemon.ivs));
hpProgramSelect = false;
}
public Pokemon getPokemon() {
if (m_pokemon == null) return null;
m_pokemon.nickname = txtNickname.getText();
try {
m_pokemon.level = Integer.parseInt(txtLevel.getText());
} catch (NumberFormatException e) {
m_pokemon.level = 100;
}
m_pokemon.shiny = chkShiny.isSelected();
m_pokemon.gender = (Gender)cmbGender.getSelectedItem();
m_pokemon.nature = ((PokemonNature)cmbNature.getSelectedItem()).getName();
m_pokemon.item = (String)cmbItem.getSelectedItem();
m_pokemon.ability = (String)cmbAbility.getSelectedItem();
SelectedMoveModel m = (SelectedMoveModel)tblSelected.getModel();
m_pokemon.moves = m.getMoves();
m_pokemon.ppUps = m.getPpUps();
return m_pokemon;
}
public void setHappiness(int happy) {
m_pokemon.happiness = happy;
}
public int getHappiness() {
return m_pokemon.happiness;
}
// returns if the move was successfully added
public boolean moveSelected(TableRow row) {
boolean success;
if (row.isSelected()) {
success = ((MoveTableModel)tblMoves.getModel()).addMove(row);
} else {
success = ((SelectedMoveModel)tblSelected.getModel()).addMove(row);
if (success) {
//Set the happiness to the max value if return or frustration is picked
//todo: translation?
String move = row.getMove();
if (move.equalsIgnoreCase("Return")) {
m_pokemon.happiness = 255;
} else if (move.equalsIgnoreCase("Frustration")) {
m_pokemon.happiness = 0;
}
}
}
return success;
}
private void checkIllegalMovesets() {
if (tblSelected.getRowCount() == 0) {
// This is necessary or the below call to getPokemon()
// will wipe out moves midloading
return;
}
natureRenderer.clear();
abilityRenderer.clear();
cmbNature.setForeground(defaultForeground);
cmbAbility.setForeground(defaultForeground);
cmbGender.setForeground(defaultForeground);
Pokemon p = getPokemon();
List<IllegalCombo> illegalMovesets =
p.getViolatedMovesets(m_generation);
List<IllegalCombo> illegal = new ArrayList<IllegalCombo>();
for (IllegalCombo combo : illegalMovesets) {
if (combo.getAbility() != null) {
abilityRenderer.setIllegal(Arrays.asList(
m_species.getAbilities()).indexOf(combo.getAbility()));
}
if (combo.getNature() != null) {
natureRenderer.setIllegal(
Arrays.asList(PokemonNature.getNatureNames()).indexOf(
combo.getNature()));
}
if (combo.getGender() != null) {
genderRenderer.setIllegal(combo.getGender().getValue() - 1);
}
// Now check if we actually violated this combination
if ((combo.getNature() != null) &&
!combo.getNature().equals(p.nature)) {
continue;
}
if ((combo.getAbility() != null) &&
!combo.getAbility().equals(p.ability)) {
continue;
}
if ((combo.getGender() != null) &&
(p.gender != combo.getGender())) {
continue;
}
illegal.add(combo);
}
cmbNature.repaint();
cmbAbility.repaint();
cmbGender.repaint();
if (!illegal.isEmpty()) {
StringBuilder buf = new StringBuilder();
buf.append("<html>Illegal combinations:<br>");
for (IllegalCombo combo : illegal) {
buf.append("- ");
buf.append(combo);
buf.append("<br>");
if (combo.getNature() != null) {
cmbNature.setForeground(Color.RED);
}
if (combo.getAbility() != null) {
cmbAbility.setForeground(Color.RED);
}
if (combo.getGender() != null) {
cmbGender.setForeground(Color.RED);
}
}
tblSelected.setToolTipText(buf.toString());
tblSelected.setForeground(Color.RED);
} else if (illegal.isEmpty()) {
tblSelected.setToolTipText(null);
tblSelected.setForeground(defaultForeground);
}
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
txtNickname = new javax.swing.JTextField();
jLabel24 = new javax.swing.JLabel();
txtLevel = new javax.swing.JTextField();
cmbGender = new javax.swing.JComboBox();
chkShiny = new javax.swing.JCheckBox();
panelStats = new javax.swing.JPanel();
cmbItem = new javax.swing.JComboBox();
jLabel5 = new javax.swing.JLabel();
jLabel26 = new javax.swing.JLabel();
jLabel27 = new javax.swing.JLabel();
cmbNature = new javax.swing.JComboBox();
cmbAbility = new javax.swing.JComboBox();
jLabel25 = new javax.swing.JLabel();
txtHiddenPower = new javax.swing.JTextField();
cmbHiddenPower = new javax.swing.JComboBox();
splitPane = new javax.swing.JSplitPane();
scrollSelected = new javax.swing.JScrollPane();
scrollMoves = new javax.swing.JScrollPane();
setOpaque(false);
txtNickname.setDocument(new FilteredDocument(15, "[<>]+"));
jLabel24.setText("Level:");
txtLevel.setDocument(new IntegerDocument(1, 100, txtLevel));
txtLevel.setText("100");
txtLevel.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyReleased(java.awt.event.KeyEvent evt) {
txtLevelKeyReleased(evt);
}
});
cmbGender.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cmbGenderItemStateChanged(evt);
}
});
chkShiny.setText("Shiny?");
chkShiny.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
chkShiny.setOpaque(false);
chkShiny.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
chkShinyActionPerformed(evt);
}
});
panelStats.setOpaque(false);
panelStats.setLayout(new java.awt.GridLayout(7, 5));
cmbItem.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "No Item", "Leftovers" }));
jLabel5.setText("Nickname:");
jLabel26.setFont(new java.awt.Font("Lucida Grande", 0, 11));
jLabel26.setText("Nature:");
jLabel27.setFont(new java.awt.Font("Lucida Grande", 0, 11));
jLabel27.setText("Ability:");
cmbNature.setFont(new java.awt.Font("Lucida Grande", 0, 11));
cmbNature.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Jolly", "Hasty" }));
cmbNature.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cmbNatureItemStateChanged(evt);
}
});
cmbAbility.setFont(new java.awt.Font("Lucida Grande", 0, 11));
cmbAbility.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Overgrow", "Truant" }));
cmbAbility.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cmbAbilityItemStateChanged(evt);
}
});
jLabel25.setFont(new java.awt.Font("Lucida Grande", 0, 11));
jLabel25.setText("Hidden Power:");
txtHiddenPower.setEditable(false);
txtHiddenPower.setFont(new java.awt.Font("Lucida Grande", 0, 11));
txtHiddenPower.setText("70");
cmbHiddenPower.setFont(new java.awt.Font("Lucida Grande", 0, 11));
cmbHiddenPower.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Bug", "Dark", "Dragon", "Electric", "Fighting", "Fire", "Flying", "Ghost", "Grass", "Ground", "Ice", "Poison", "Psychic", "Rock", "Steel", "Water" }));
cmbHiddenPower.setSelectedIndex(1);
cmbHiddenPower.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
cmbHiddenPowerItemStateChanged(evt);
}
});
splitPane.setBorder(null);
splitPane.setDividerLocation(100);
splitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
splitPane.setEnabled(false);
splitPane.setLeftComponent(scrollSelected);
splitPane.setRightComponent(scrollMoves);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(jLabel5)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(txtNickname, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 131, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(jLabel24)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(txtLevel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 35, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(cmbItem, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(cmbGender, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 128, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(chkShiny))
.add(layout.createSequentialGroup()
.add(7, 7, 7)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(panelStats, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 216, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
.add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
.add(jLabel25)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(cmbHiddenPower, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 91, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(txtHiddenPower, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 30, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(jLabel27)
.add(jLabel26))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(cmbNature, 0, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(cmbAbility, 0, 162, Short.MAX_VALUE)))))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(splitPane, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 404, Short.MAX_VALUE)))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(jLabel5)
.add(txtNickname, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jLabel24)
.add(txtLevel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(cmbItem, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(cmbGender, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(chkShiny))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.add(panelStats, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 190, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(jLabel25)
.add(cmbHiddenPower, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(txtHiddenPower, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(jLabel26)
.add(cmbNature, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(cmbAbility, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(jLabel27)))
.add(splitPane, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 295, Short.MAX_VALUE))
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
private void cmbNatureItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cmbNatureItemStateChanged
if ((evt != null) && (evt.getStateChange() != ItemEvent.SELECTED)) return;
PokemonNature n = (PokemonNature)cmbNature.getSelectedItem();
for (int i = 0; i < m_totals.length; i++) {
updateStat(i);
if (i == n.getBenefits()) {
m_totals[i].setForeground(new Color(0, 150, 0));
} else if (i == n.getHarms()) {
m_totals[i].setForeground(new Color(180, 0, 0));
} else {
m_totals[i].setForeground(Color.BLACK);
}
}
checkIllegalMovesets();
}//GEN-LAST:event_cmbNatureItemStateChanged
private void chkShinyActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkShinyActionPerformed
m_parent.setSpriteShiny(chkShiny.isSelected());
}//GEN-LAST:event_chkShinyActionPerformed
private void cmbHiddenPowerItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cmbHiddenPowerItemStateChanged
if (evt.getStateChange() != ItemEvent.SELECTED) return;
if (hpProgramSelect) return;
String type = (String)cmbHiddenPower.getSelectedItem();
int[] ivs = m_hiddenPowers.get(type);
for (int i = 0; i < m_ivs.length; i++) {
m_ivs[i].setText(String.valueOf(ivs[i]));
updateStat(i);
}
updateHiddenPower();
}//GEN-LAST:event_cmbHiddenPowerItemStateChanged
private void txtLevelKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtLevelKeyReleased
try {
m_pokemon.level = Integer.parseInt(txtLevel.getText());
} catch (NumberFormatException e) {
// Integer document should prevent this
}
for (int i = 0; i < Pokemon.STAT_COUNT; i++) {
updateStat(i);
}
}//GEN-LAST:event_txtLevelKeyReleased
private void cmbAbilityItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cmbAbilityItemStateChanged
checkIllegalMovesets();
}//GEN-LAST:event_cmbAbilityItemStateChanged
private void cmbGenderItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cmbGenderItemStateChanged
checkIllegalMovesets();
}//GEN-LAST:event_cmbGenderItemStateChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JCheckBox chkShiny;
private javax.swing.JComboBox cmbAbility;
private javax.swing.JComboBox cmbGender;
private javax.swing.JComboBox cmbHiddenPower;
private javax.swing.JComboBox cmbItem;
private javax.swing.JComboBox cmbNature;
private javax.swing.JLabel jLabel24;
private javax.swing.JLabel jLabel25;
private javax.swing.JLabel jLabel26;
private javax.swing.JLabel jLabel27;
private javax.swing.JLabel jLabel5;
private javax.swing.JPanel panelStats;
private javax.swing.JScrollPane scrollMoves;
private javax.swing.JScrollPane scrollSelected;
private javax.swing.JSplitPane splitPane;
private javax.swing.JTextField txtHiddenPower;
private javax.swing.JTextField txtLevel;
private javax.swing.JTextField txtNickname;
// End of variables declaration//GEN-END:variables
public static void main(String[] args) {
TeamBuilder.main(args);
}
}