/* * BoxForm.java * * Created on June 18, 2010, 5:45 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.Component; import java.awt.Image; import java.awt.Point; import java.awt.Rectangle; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.dnd.DnDConstants; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.event.MouseAdapter; import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import javax.swing.AbstractListModel; import javax.swing.DefaultListCellRenderer; import javax.swing.DefaultListModel; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.TransferHandler; import javax.swing.event.ListDataEvent; import javax.swing.event.ListDataListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableColumnModel; import shoddybattleclient.GameVisualisation; import shoddybattleclient.Preference; import shoddybattleclient.TeamBuilder; import shoddybattleclient.shoddybattle.Pokemon; import shoddybattleclient.shoddybattle.PokemonBox; import shoddybattleclient.shoddybattle.PokemonBox.PokemonWrapper; /** * * @author Carlos */ public class BoxForm extends javax.swing.JPanel { private class BoxListModel extends AbstractListModel { private List<PokemonBox> m_boxes = new ArrayList<PokemonBox>(); public void addBoxes(List<PokemonBox> boxes) { m_boxes.addAll(boxes); Collections.sort(m_boxes); clearDuplicates(m_boxes); fireListChanged(); } public void addBox(PokemonBox box) { //This is faster for already sorted lists int i = 0; for(i = 0; i < getSize(); i++) { int compare = box.compareTo(m_boxes.get(i)); if(compare < 0) { break; } else if(compare == 0) { m_boxes.set(i, box); fireListChanged(); return; } } m_boxes.add(i, box); fireListChanged(); } public PokemonBox getBox(String name) { for(PokemonBox box : m_boxes) { if(box.getName().equalsIgnoreCase(name)) return box; } return null; } public void removeBox(PokemonBox box) { m_boxes.remove(box); } //Let the list know that we added a box public void fireListChanged() { ListDataEvent evt = new ListDataEvent(listBoxes, ListDataEvent.CONTENTS_CHANGED, 0, m_boxes.size()); for (ListDataListener listener : getListDataListeners()) { listener.contentsChanged(evt); } } @Override public int getSize() { return m_boxes.size(); } @Override public Object getElementAt(int index) { if(getSize() == 0) return null; return m_boxes.get(index); } } private class PokemonTableModel extends AbstractTableModel { private PokemonBox owner; public void setBox(PokemonBox box) { owner = box; fireTableDataChanged(); } @Override public int getColumnCount() { return 5; } @Override public int getRowCount() { return (owner == null) ? 0 : owner.getSize(); } public PokemonWrapper getPokemonAt(int row) { return owner.getPokemonAt(row); } @Override public void fireTableDataChanged() { super.fireTableDataChanged(); } @Override public Object getValueAt(int row, int col) { PokemonWrapper wrapper = getPokemonAt(row); switch (col) { case 0: try { String species = wrapper.pokemon.species; Image img = GameVisualisation.getIcon( m_teamBuilder.getSpecies(species).getId()); return new ImageIcon(img); } catch (Exception ex) { return null; } case 1: return wrapper.name; case 2: return wrapper.pokemon.ability; case 3: return wrapper.pokemon.nature; case 4: return wrapper.pokemon.item; } return null; } } private class BoxListRenderer extends DefaultListCellRenderer { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { boolean focused = (m_focusedBox == index) ? true : cellHasFocus; return super.getListCellRendererComponent(list, value, index, isSelected, focused); } } private class PokemonTableRenderer extends DefaultTableCellRenderer { public PokemonTableRenderer() { setOpaque(true); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); if (column == 0) { this.setText(""); this.setIcon((ImageIcon)value); } else { this.setText(value.toString()); this.setIcon(null); } Pokemon p = m_pokemonModel.getPokemonAt(row).pokemon; setToolTipText("<html>" + p.toTeamText().replace("\n", "<br>")); return this; } } private class TeamRenderer extends DefaultListCellRenderer { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); Pokemon p = m_forms.get(index).getPokemon(); setToolTipText("<html>Index " + (index+1) + ":<br>" + p.toTeamText().replace("\n", "<br>")); return this; } } private static DataFlavor m_wrapperFlavor = new DataFlavor(PokemonWrapper.class, "PokemonWrapper"); private static DataFlavor m_pokemonFlavor = new DataFlavor(Pokemon.class, "Pokemon"); private class PokemonTableTransferHandler extends TransferHandler { private class WrapperTransferable implements Transferable { private PokemonWrapper m_poke; public WrapperTransferable(PokemonWrapper poke) { m_poke = poke; } @Override public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[] {m_wrapperFlavor}; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.match(m_wrapperFlavor); } @Override public Object getTransferData(DataFlavor flavor) { return m_poke; } } @Override public boolean canImport(JComponent c, DataFlavor[] transferFlavors) { // The DropTarget handles importing. Letting the TransferHandler // deal with importing leads to an unintuitive focus behavior return false; } @Override public int getSourceActions(JComponent c) { return TransferHandler.MOVE; } @Override public Transferable createTransferable(JComponent c) { JTable table = (JTable)c; Point p = c.getMousePosition(); int idx = table.rowAtPoint(p); if (idx < 0) return null; return new WrapperTransferable(m_pokemonModel.getPokemonAt(idx)); } } private class TablePokemonDropTarget extends DropTarget { @Override public void dragOver(DropTargetDragEvent dtde) { if (dtde.isDataFlavorSupported(m_pokemonFlavor)) { dtde.acceptDrag(DnDConstants.ACTION_MOVE); } else { dtde.rejectDrag(); } } @Override public void drop(DropTargetDropEvent dtde) { this.dragExit(null); try { Transferable transfer = dtde.getTransferable(); if (transfer.isDataFlavorSupported(m_pokemonFlavor)) { PokemonBox box = (PokemonBox)listBoxes.getSelectedValue(); PokemonWrapper result = m_teamBuilder.addPokemonToBox(box, (Pokemon)transfer.getTransferData(m_pokemonFlavor)); if (result != null) { int row = box.indexOf(result); m_pokemonModel.fireTableDataChanged(); tblPokemon.setRowSelectionInterval(row, row); } } else { dtde.rejectDrop(); return; } } catch (Exception ex) { dtde.rejectDrop(); return; } } } private class ListBoxesDropTarget extends DropTarget { @Override public void dragOver(DropTargetDragEvent dtde) { if (dtde.isDataFlavorSupported(m_wrapperFlavor) || dtde.isDataFlavorSupported(m_pokemonFlavor)) { int idx = listBoxes.locationToIndex(dtde.getLocation()); Rectangle r = listBoxes.getCellBounds(idx, idx); if(idx < 0 || !r.contains(dtde.getLocation())) { dtde.rejectDrag(); return; } m_focusedBox = idx; listBoxes.repaint(); dtde.acceptDrag(DnDConstants.ACTION_MOVE); } else { dtde.rejectDrag(); } } @Override public void dragExit(DropTargetEvent dte) { m_focusedBox = -1; listBoxes.repaint(); } @Override public void drop(DropTargetDropEvent dtde) { this.dragExit(null); try { Transferable transfer = dtde.getTransferable(); if (transfer.isDataFlavorSupported(m_pokemonFlavor)) { int idx = listBoxes.locationToIndex(dtde.getLocation()); listBoxes.setSelectedIndex(idx); PokemonBox box = (PokemonBox)m_boxModel.getElementAt(idx); PokemonWrapper result = m_teamBuilder.addPokemonToBox(box, (Pokemon)transfer.getTransferData(m_pokemonFlavor)); if (result != null) { int row = box.indexOf(result); m_pokemonModel.fireTableDataChanged(); tblPokemon.setRowSelectionInterval(row, row); } } else if (transfer.isDataFlavorSupported(m_wrapperFlavor)) { PokemonWrapper wrapper = (PokemonWrapper)transfer.getTransferData(m_wrapperFlavor); PokemonBox previousBox = (PokemonBox)listBoxes.getSelectedValue(); PokemonBox newBox = (PokemonBox)m_boxModel.getElementAt( listBoxes.locationToIndex(dtde.getLocation())); if (previousBox == newBox) { dtde.rejectDrop(); return; } if (newBox.getPokemon(wrapper.name) != null) { int option = JOptionPane.showConfirmDialog(m_teamBuilder, "This pokemon already exists in this box. Overwrite?", "", JOptionPane.YES_NO_OPTION); if (option != JOptionPane.YES_OPTION) { dtde.rejectDrop(); return; } } previousBox.removePokemon(wrapper.name); newBox.addPokemon(wrapper.name, wrapper.pokemon); m_pokemonModel.fireTableDataChanged(); dtde.acceptDrop(DnDConstants.ACTION_MOVE); } else { dtde.rejectDrop(); return; } } catch (Exception ex) { dtde.rejectDrop(); return; } } } private class ListTeamTransferHandler extends TransferHandler { private class PokemonTransferable implements Transferable { private Pokemon m_poke; public PokemonTransferable(Pokemon poke) { m_poke = poke; } @Override public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[] {m_pokemonFlavor}; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.match(m_pokemonFlavor); } @Override public Object getTransferData(DataFlavor flavor) { return m_poke; } } @Override public boolean canImport(JComponent c, DataFlavor[] transferFlavors) { if (transferFlavors.length != 1) return false; if (!m_wrapperFlavor.equals(transferFlavors[0])) return false; return true; } @Override public int getSourceActions(JComponent c) { return TransferHandler.MOVE; } @Override public Transferable createTransferable(JComponent c) { JList list = (JList)c; Point p = c.getMousePosition(); int idx = list.locationToIndex(p); if (idx < 0) return null; return new PokemonTransferable((Pokemon)list.getSelectedValue()); } @Override public boolean importData(JComponent comp, Transferable transfer) { if (!transfer.isDataFlavorSupported(m_wrapperFlavor)) return false; try { PokemonWrapper wrapper = (PokemonWrapper)transfer.getTransferData(m_wrapperFlavor); int teamIndex = listTeam.locationToIndex(listTeam.getMousePosition()); m_teamBuilder.setPokemonAt(teamIndex, wrapper.pokemon); ((DefaultListModel)listTeam.getModel()).set(teamIndex, wrapper.pokemon); return true; } catch (Exception ex) { return false; } } } private TeamBuilder m_teamBuilder; private BoxListModel m_boxModel; private PokemonTableModel m_pokemonModel; private JTable tblPokemon; private JList listTeam; private List<TeamBuilderForm> m_forms; // Swing doesn't allow us to give a selected look to lists easily, // so we use hacks to do it private int m_focusedBox = -1; /** Creates new form BoxForm */ public BoxForm(TeamBuilder teamBuilder) { initComponents(); m_teamBuilder = teamBuilder; File boxDir = new File(Preference.getBoxLocation()); m_boxModel = new BoxListModel(); ArrayList<PokemonBox> boxes = new ArrayList<PokemonBox>(); if(boxDir.exists()) { for(File boxFile : boxDir.listFiles()) { if(!boxFile.isDirectory()) continue; boxes.add(new PokemonBox(boxFile.getName(), m_teamBuilder.getGeneration())); } } m_boxModel.addBoxes(boxes); listBoxes.setModel(m_boxModel); listBoxes.setCellRenderer(new BoxListRenderer()); listBoxes.setDropTarget(new ListBoxesDropTarget()); listBoxes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); tblPokemon = new JTable(); m_pokemonModel = new PokemonTableModel(); tblPokemon.setModel(m_pokemonModel); tblPokemon.setRowHeight(34); tblPokemon.setRowSelectionAllowed(true); tblPokemon.setColumnSelectionAllowed(false); tblPokemon.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); tblPokemon.setDragEnabled(true); tblPokemon.setTransferHandler(new PokemonTableTransferHandler()); tblPokemon.setDropTarget(new TablePokemonDropTarget()); tblPokemon.addMouseListener(new MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { if (evt.isPopupTrigger()) { int row = tblPokemon.rowAtPoint(evt.getPoint()); if (row >= 0 && row < m_pokemonModel.getRowCount()) { tblPokemon.setRowSelectionInterval(row, row); popupPokemon.show(tblPokemon, evt.getX(), evt.getY()); } } } public void mousePressed(java.awt.event.MouseEvent evt) { mouseClicked(evt); } public void mouseReleased(java.awt.event.MouseEvent evt) { mouseClicked(evt); } }); TableColumnModel model = tblPokemon.getColumnModel(); tblPokemon.setDefaultRenderer(Object.class, new PokemonTableRenderer()); model.getColumn(0).setHeaderValue(""); model.getColumn(0).setMaxWidth(32); model.getColumn(1).setHeaderValue("Name"); model.getColumn(2).setHeaderValue("Ability"); model.getColumn(3).setHeaderValue("Nature"); model.getColumn(4).setHeaderValue("Item"); scrollPokemon.setViewportView(tblPokemon); listTeam = new JList(); listTeam.setDragEnabled(true); listTeam.setTransferHandler(new ListTeamTransferHandler()); listTeam.setCellRenderer(new TeamRenderer()); } public void updateBoxes() { //Hold the current selected value Object selected = listBoxes.getSelectedValue(); File boxDir = new File(Preference.getBoxLocation()); m_boxModel = new BoxListModel(); ArrayList<PokemonBox> boxes = new ArrayList<PokemonBox>(); if (boxDir.exists()) { for (File boxFile : boxDir.listFiles()) { if (!boxFile.isDirectory()) { continue; } boxes.add(new PokemonBox(boxFile.getName(), m_teamBuilder.getGeneration())); } } m_boxModel.addBoxes(boxes); listBoxes.setModel(m_boxModel); if (selected != null) { for (int i = 0; i < m_boxModel.getSize(); i++) { if (m_boxModel.getElementAt(i).equals(selected)) { listBoxes.setSelectedIndex(i); return; } } listBoxes.clearSelection(); m_pokemonModel.setBox(null); } } public PokemonBox getSelectedBox() { Object obj = listBoxes.getSelectedValue(); if (obj == null) return null; return (PokemonBox)obj; } public Pokemon getSelectedPokemon() { int selected = tblPokemon.getSelectedRow(); if (selected < 0 || selected >= tblPokemon.getRowCount()) { return null; } return m_pokemonModel.getPokemonAt(selected).pokemon; } // This is so that we can rig it with drag and drop support beforehand public JList getTeamList(List<TeamBuilderForm> forms) { m_forms = forms; DefaultListModel pModel = new DefaultListModel(); for (int i = 0; i < forms.size(); i++) { pModel.addElement(forms.get(i).getPokemon()); } listTeam.setModel(pModel); return listTeam; } //On *nix systems, both Box and Pokemon loading allow for duplicates on //first load. This clears those duplicates from the list. //This list MUST be sorted before using this method private <T extends Comparable<T>> void clearDuplicates(List<T> list) { //Sorted lists allow us to do this in O(n) Iterator<T> iter = list.iterator(); T previous = null; while (iter.hasNext()) { T current = iter.next(); //this only happens once, but it makes the code cleaner if (previous == null) { previous = current; continue; } if (previous.compareTo(current) == 0) iter.remove(); previous = current; } } /** 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() { popupBoxes = new javax.swing.JPopupMenu(); menuRenameBox = new javax.swing.JMenuItem(); menuDeleteBox = new javax.swing.JMenuItem(); popupPokemon = new javax.swing.JPopupMenu(); menuRenamePokemon = new javax.swing.JMenuItem(); menuDeletePokemon = new javax.swing.JMenuItem(); scrollPokemon = new javax.swing.JScrollPane(); jScrollPane2 = new javax.swing.JScrollPane(); listBoxes = new javax.swing.JList(); btnNewBox = new javax.swing.JButton(); menuRenameBox.setText("Rename"); menuRenameBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { menuRenameBoxActionPerformed(evt); } }); popupBoxes.add(menuRenameBox); menuDeleteBox.setText("Delete"); menuDeleteBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { menuDeleteBoxActionPerformed(evt); } }); popupBoxes.add(menuDeleteBox); menuRenamePokemon.setText("Rename"); menuRenamePokemon.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { menuRenamePokemonActionPerformed(evt); } }); popupPokemon.add(menuRenamePokemon); menuDeletePokemon.setText("Delete"); menuDeletePokemon.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { menuDeletePokemonActionPerformed(evt); } }); popupPokemon.add(menuDeletePokemon); setOpaque(false); setPreferredSize(new java.awt.Dimension(662, 352)); listBoxes.setModel(new javax.swing.AbstractListModel() { String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" }; public int getSize() { return strings.length; } public Object getElementAt(int i) { return strings[i]; } }); listBoxes.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { listBoxesMouseClicked(evt); } public void mousePressed(java.awt.event.MouseEvent evt) { listBoxesMousePressed(evt); } public void mouseReleased(java.awt.event.MouseEvent evt) { listBoxesMouseReleased(evt); } }); listBoxes.addListSelectionListener(new javax.swing.event.ListSelectionListener() { public void valueChanged(javax.swing.event.ListSelectionEvent evt) { listBoxesValueChanged(evt); } }); jScrollPane2.setViewportView(listBoxes); btnNewBox.setText("New Box"); btnNewBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnNewBoxActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 120, Short.MAX_VALUE) .addComponent(btnNewBox, javax.swing.GroupLayout.DEFAULT_SIZE, 120, Short.MAX_VALUE)) .addGap(18, 18, 18) .addComponent(scrollPokemon, javax.swing.GroupLayout.DEFAULT_SIZE, 504, Short.MAX_VALUE) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 301, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnNewBox)) .addComponent(scrollPokemon, javax.swing.GroupLayout.DEFAULT_SIZE, 330, Short.MAX_VALUE)) .addContainerGap()) ); }// </editor-fold>//GEN-END:initComponents private void listBoxesValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_listBoxesValueChanged int index = listBoxes.getSelectedIndex(); if (index < 0 || index >= m_boxModel.getSize()) return; m_pokemonModel.setBox((PokemonBox)m_boxModel.getElementAt(index)); }//GEN-LAST:event_listBoxesValueChanged private void btnNewBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewBoxActionPerformed String boxName = JOptionPane.showInputDialog(this, "New box name:"); if (boxName == null) return; if (m_boxModel.getBox(boxName) != null) { JOptionPane.showMessageDialog(this, "This box already exists", "Error", JOptionPane.ERROR_MESSAGE); return; } try { PokemonBox newBox = new PokemonBox(boxName, m_teamBuilder.getGeneration()); m_boxModel.addBox(newBox); listBoxes.setSelectedValue(newBox, true); } catch (Exception ex) { JOptionPane.showMessageDialog(this, "Error making box", "Error", JOptionPane.ERROR_MESSAGE); } }//GEN-LAST:event_btnNewBoxActionPerformed private void menuDeleteBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuDeleteBoxActionPerformed PokemonBox box = (PokemonBox)listBoxes.getSelectedValue(); int option = JOptionPane.showConfirmDialog(this, "Are you sure you want " + " to delete " + box.getName() + "?", "", JOptionPane.YES_NO_OPTION); if (option != JOptionPane.YES_OPTION) return; while (box.getSize() != 0) { box.removePokemonAt(box.getSize()-1); } //If the user has rigged it with duplicates, files may remain boolean badlyFormatted = true; File boxFile = box.getBoxFolder(); for (File file : boxFile.listFiles()) { if (file.isDirectory() && file.listFiles().length > 0) { badlyFormatted = true; } else { file.delete(); } } if (boxFile.delete()) { m_boxModel.removeBox(box); } else if (!badlyFormatted) { JOptionPane.showMessageDialog(this, "Error deleting box", "Error", JOptionPane.ERROR_MESSAGE); } else { JOptionPane.showMessageDialog(this, "The box is badly formatted, so it couldn't be removed", "Error", JOptionPane.ERROR_MESSAGE); } m_boxModel.fireListChanged(); m_pokemonModel.fireTableDataChanged(); listBoxes.clearSelection(); }//GEN-LAST:event_menuDeleteBoxActionPerformed private void menuRenameBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuRenameBoxActionPerformed PokemonBox box = (PokemonBox)listBoxes.getSelectedValue(); String newName = JOptionPane.showInputDialog(this, "New name for "+box.getName()+":"); if (newName == null || (newName = newName.trim()).equals("")) return; //Check for duplicates. PokemonBox previous = m_boxModel.getBox(newName); if(previous != null && previous != box) { JOptionPane.showMessageDialog(this, "A box with this name already exists", "Error", JOptionPane.ERROR_MESSAGE); return; } File oldFile = box.getBoxFolder(); File newFile = new File(Preference.getBoxLocation() + "/" + newName); try { oldFile.renameTo(newFile); PokemonBox newBox = new PokemonBox(newName, m_teamBuilder.getGeneration()); m_boxModel.removeBox(box); m_boxModel.addBox(newBox); listBoxes.setSelectedValue(newBox, true); } catch (Exception ex) { JOptionPane.showMessageDialog(this, "Error renaming box", "Error", JOptionPane.ERROR_MESSAGE); } }//GEN-LAST:event_menuRenameBoxActionPerformed private void listBoxesMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_listBoxesMouseReleased listBoxesMouseClicked(evt); }//GEN-LAST:event_listBoxesMouseReleased private void listBoxesMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_listBoxesMouseClicked if (evt.isPopupTrigger()) { int index = listBoxes.locationToIndex(evt.getPoint()); if (index >= 0 && index < m_boxModel.getSize()) { listBoxes.setSelectedIndex(index); popupBoxes.show(listBoxes, evt.getX(), evt.getY()); } } }//GEN-LAST:event_listBoxesMouseClicked private void listBoxesMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_listBoxesMousePressed listBoxesMouseClicked(evt); }//GEN-LAST:event_listBoxesMousePressed private void menuRenamePokemonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuRenamePokemonActionPerformed PokemonWrapper current = (PokemonWrapper)m_pokemonModel.getPokemonAt( tblPokemon.getSelectedRow()); String newName = JOptionPane.showInputDialog(this, "New name for "+current.name+":"); if (newName == null || (newName = newName.trim()).equals("")) return; PokemonBox box = (PokemonBox)listBoxes.getSelectedValue(); //Duplicates are fine if we're merely changing the case PokemonWrapper previous = box.getPokemon(newName); if (previous != null && previous.pokemon != current.pokemon) { JOptionPane.showMessageDialog(this, "A pokemon with this name already exists", "Error", JOptionPane.ERROR_MESSAGE); return; } try { box.removePokemon(current.name); box.addPokemon(newName, current.pokemon); } catch (Exception ex) { JOptionPane.showMessageDialog(this, "Error renaming pokemon", "Error", JOptionPane.ERROR_MESSAGE); } int row = box.indexOf(newName); m_pokemonModel.fireTableDataChanged(); tblPokemon.setRowSelectionInterval(row, row); }//GEN-LAST:event_menuRenamePokemonActionPerformed private void menuDeletePokemonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_menuDeletePokemonActionPerformed PokemonWrapper wrapper = (PokemonWrapper)m_pokemonModel.getPokemonAt( tblPokemon.getSelectedRow()); int option = JOptionPane.showConfirmDialog(this, "Are you sure you want " + " to delete " + wrapper.name + "?", "", JOptionPane.YES_NO_OPTION); if (option != JOptionPane.YES_OPTION) return; PokemonBox box = (PokemonBox)listBoxes.getSelectedValue(); try { box.removePokemon(wrapper.name); } catch (Exception ex) { JOptionPane.showMessageDialog(this, "Error deleting pokemon", "Error", JOptionPane.ERROR_MESSAGE); } m_pokemonModel.fireTableDataChanged(); tblPokemon.clearSelection(); }//GEN-LAST:event_menuDeletePokemonActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnNewBox; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JList listBoxes; private javax.swing.JMenuItem menuDeleteBox; private javax.swing.JMenuItem menuDeletePokemon; private javax.swing.JMenuItem menuRenameBox; private javax.swing.JMenuItem menuRenamePokemon; private javax.swing.JPopupMenu popupBoxes; private javax.swing.JPopupMenu popupPokemon; private javax.swing.JScrollPane scrollPokemon; // End of variables declaration//GEN-END:variables }