/* * EditSpecialAbilityDialog.java * * Copyright (c) 2009 Jay Lawson <jaylawson39 at yahoo.com>. All rights reserved. * * This file is part of MekHQ. * * MekHQ is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MekHQ 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MekHQ. If not, see <http://www.gnu.org/licenses/>. */ package mekhq.gui.dialog; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.event.ActionListener; import java.util.Hashtable; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.SpinnerNumberModel; import mekhq.campaign.personnel.SkillPrereq; import mekhq.campaign.personnel.SpecialAbility; /** * * @author Taharqa */ public class EditSpecialAbilityDialog extends JDialog { private static final long serialVersionUID = -8038099101234445018L; private SpecialAbility ability; private JButton btnClose; private JButton btnOK; private JSpinner spnXP; private JButton btnEditPrereqAbil; private JButton btnEditInvalid; private JButton btnEditRemove; private JButton btnClearPrereqSkills; private JButton btnAddSkillPrereq; private Vector<String> prereqAbilities; private Vector<SkillPrereq> prereqSkills; private Vector<String> invalidAbilities; private Vector<String> removeAbilities; private Hashtable<String, SpecialAbility> allSPA; private JLabel lblPrereqAbil; private JLabel lblInvalidAbil; private JLabel lblRemoveAbil; private boolean cancelled; private int currentXP; @SuppressWarnings("unchecked") public EditSpecialAbilityDialog(Frame parent, SpecialAbility spa, Hashtable<String, SpecialAbility> hash) { super(parent, true); this.ability = spa; this.allSPA = hash; // FIXME: Java is broken, so we had to supress unchecked warnings for these 4 lines // Basically, Vector<E>.clone() returns an Object instead of a new Vector<E> - DOH! prereqAbilities = (Vector<String>)ability.getPrereqAbilities().clone(); invalidAbilities = (Vector<String>)ability.getInvalidAbilities().clone(); removeAbilities = (Vector<String>)ability.getRemovedAbilities().clone(); prereqSkills = (Vector<SkillPrereq>)ability.getPrereqSkills().clone(); cancelled = false; currentXP = ability.getCost(); initComponents(); setLocationRelativeTo(parent); } private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; btnOK = new javax.swing.JButton(); btnClose = new javax.swing.JButton(); spnXP = new JSpinner(new SpinnerNumberModel(currentXP, -1, 100000, 1)); JPanel panXP = new JPanel(new GridBagLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); panXP.add(new JLabel("XP Cost:"), gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.weightx = 1.0; gridBagConstraints.fill = java.awt.GridBagConstraints.NONE; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); panXP.add(spnXP, gridBagConstraints); JPanel panAbil = new JPanel(new GridBagLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.weighty = 0.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; panAbil.add(new JLabel("<html><b>Prerequisite Abilities</b></html>"), gridBagConstraints); btnEditPrereqAbil = new javax.swing.JButton("Edit Prereq Abilities"); btnEditPrereqAbil.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SelectAbilitiesDialog sad = new SelectAbilitiesDialog(null, prereqAbilities, allSPA); sad.setVisible(true); if(!sad.wasCancelled()) { prereqAbilities = sad.getSelected(); lblPrereqAbil.setText("<html>" + getPrereqAbilDesc() + "</html>"); refreshGUI(); } } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; panAbil.add(btnEditPrereqAbil, gridBagConstraints); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.weighty = 0.0; gridBagConstraints.insets = new java.awt.Insets(1, 10, 1, 1); lblPrereqAbil = new JLabel("<html>" + getPrereqAbilDesc() + "</html>"); panAbil.add(lblPrereqAbil, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.weighty = 0.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; panAbil.add(new JLabel("<html><b>Invalid Abilities</b></html>"), gridBagConstraints); btnEditInvalid = new javax.swing.JButton("Edit Invalid Abilities"); btnEditInvalid.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SelectAbilitiesDialog sad = new SelectAbilitiesDialog(null, invalidAbilities, allSPA); sad.setVisible(true); if(!sad.wasCancelled()) { invalidAbilities = sad.getSelected(); lblInvalidAbil.setText("<html>" + getInvalidDesc() + "</html>"); refreshGUI(); } } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; panAbil.add(btnEditInvalid, gridBagConstraints); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 2; gridBagConstraints.weighty = 0.0; gridBagConstraints.insets = new java.awt.Insets(1, 10, 1, 1); lblInvalidAbil = new JLabel("<html>" + getInvalidDesc() + "</html>"); panAbil.add(lblInvalidAbil, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 4; gridBagConstraints.weighty = 0.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; panAbil.add(new JLabel("<html><b>Removed Abilities</b></html>"), gridBagConstraints); btnEditRemove = new javax.swing.JButton("Edit Removed Abilities"); btnEditRemove.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SelectAbilitiesDialog sad = new SelectAbilitiesDialog(null, removeAbilities, allSPA); sad.setVisible(true); if(!sad.wasCancelled()) { removeAbilities = sad.getSelected(); lblRemoveAbil.setText("<html>" + getRemovedDesc() + "</html>"); refreshGUI(); } } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 4; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; panAbil.add(btnEditRemove, gridBagConstraints); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 5; gridBagConstraints.gridwidth = 2; gridBagConstraints.weighty = 1.0; gridBagConstraints.insets = new java.awt.Insets(1, 10, 1, 1); lblRemoveAbil = new JLabel("<html>" + getRemovedDesc() + "</html>"); panAbil.add(lblRemoveAbil, gridBagConstraints); JPanel panMain = new JPanel(new GridBagLayout()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.weightx = 0.0; gridBagConstraints.weighty = 0.0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); panMain.add(panXP, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.weightx = 0.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); panMain.add(panAbil, gridBagConstraints); JPanel panSkill = createSkillPanel(); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.gridheight = 2; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 1.0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); panMain.add(panSkill, gridBagConstraints); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setTitle("Edit " + ability.getDisplayName()); getContentPane().setLayout(new BorderLayout()); getContentPane().add(panMain, BorderLayout.CENTER); JPanel panButton = new JPanel(new GridLayout(0,2)); btnOK.setText("OK"); // NOI18N btnOK.setName("btnOK"); // NOI18N btnOK.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { edit(); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 6; gridBagConstraints.gridwidth = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); panButton.add(btnOK, gridBagConstraints); btnClose.setText("Cancel"); // NOI18N btnClose.setName("btnClose"); // NOI18N btnClose.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cancel(); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 6; gridBagConstraints.gridwidth = 1; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); panButton.add(btnClose, gridBagConstraints); getContentPane().add(panButton, BorderLayout.SOUTH); pack(); } private JPanel createSkillPanel() { JPanel panSkill = new JPanel(new GridBagLayout()); GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 2; gridBagConstraints.weighty = 0.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.fill = GridBagConstraints.HORIZONTAL; panSkill.add(new JLabel("<html><b>Prerequisite Skillsets</b></html>"), gridBagConstraints); btnAddSkillPrereq = new javax.swing.JButton("Add Skill Prereq"); btnAddSkillPrereq.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { EditSkillPrereqDialog nspd = new EditSkillPrereqDialog(null, new SkillPrereq()); nspd.setVisible(true); if(!nspd.wasCancelled() & !nspd.getPrereq().isEmpty()) { prereqSkills.add(nspd.getPrereq()); refreshGUI(); } } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.weightx = 0.0; gridBagConstraints.weighty = 0.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.fill = GridBagConstraints.NONE; panSkill.add(btnAddSkillPrereq, gridBagConstraints); btnClearPrereqSkills = new javax.swing.JButton("Clear Skill Prereqs"); btnClearPrereqSkills.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { prereqSkills = new Vector<SkillPrereq>(); refreshGUI(); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 0.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.fill = GridBagConstraints.NONE; panSkill.add(btnClearPrereqSkills, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 2; gridBagConstraints.weightx = 1.0; gridBagConstraints.weighty = 0.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); gridBagConstraints.fill = GridBagConstraints.BOTH; JPanel panSkPre; JButton btnRemoveSkill; JButton btnEditSkill; for(int i = 0; i < prereqSkills.size(); i++) { SkillPrereq skpre = prereqSkills.get(i); panSkPre = new JPanel(new GridBagLayout()); GridBagConstraints c = new java.awt.GridBagConstraints(); c.gridx = 0; c.gridy = 0; c.gridheight = 2; c.weightx = 0.0; c.weighty = 1.0; c.anchor = GridBagConstraints.NORTHWEST; c.insets = new java.awt.Insets(2, 2, 2, 2); c.fill = GridBagConstraints.BOTH; panSkPre.add(new JLabel("<html>" + skpre.toString() + "</html>"), c); c.gridx = 1; c.gridy = 0; c.gridheight = 1; c.weightx = 1.0; c.weighty = 0.0; c.insets = new java.awt.Insets(2, 2, 2, 2); c.anchor = GridBagConstraints.NORTHWEST; c.fill = GridBagConstraints.HORIZONTAL; btnEditSkill = new JButton("Edit"); btnEditSkill.setActionCommand(Integer.toString(i)); btnEditSkill.addActionListener(new EditSkillListener()); panSkPre.add(btnEditSkill, c); c.gridx = 1; c.gridy = 1; c.weightx = 1.0; c.weighty = 1.0; c.anchor = GridBagConstraints.NORTHWEST; c.insets = new java.awt.Insets(2, 2, 2, 2); c.fill = GridBagConstraints.HORIZONTAL; btnRemoveSkill = new JButton("Remove"); btnRemoveSkill.setActionCommand(Integer.toString(i)); btnRemoveSkill.addActionListener(new RemoveSkillListener()); panSkPre.add(btnRemoveSkill, c); panSkPre.setBorder(BorderFactory.createLineBorder(Color.BLACK)); if(i >= (prereqSkills.size() - 1)) { gridBagConstraints.weighty = 1.0; } panSkill.add(panSkPre, gridBagConstraints); gridBagConstraints.gridy++; } return panSkill; } private void edit() { ability.setCost((Integer)spnXP.getModel().getValue()); ability.setPrereqAbilities(prereqAbilities); ability.setInvalidAbilities(invalidAbilities); ability.setRemovedAbilities(removeAbilities); ability.setPrereqSkills(prereqSkills); this.setVisible(false); } private void cancel() { cancelled = true; this.setVisible(false); } private String getPrereqAbilDesc() { String toReturn = ""; for(String prereq : prereqAbilities) { toReturn += allSPA.get(prereq).getDisplayName() + "<br>"; } if(toReturn.isEmpty()) { toReturn = "None"; } return toReturn; } private String getInvalidDesc() { String toReturn = ""; for(String invalid : invalidAbilities) { toReturn += allSPA.get(invalid).getDisplayName() + "<br>"; } if(toReturn.isEmpty()) { toReturn = "None"; } return toReturn; } private String getRemovedDesc() { String toReturn = ""; for(String remove : removeAbilities) { toReturn += allSPA.get(remove).getDisplayName() + "<br>"; } if(toReturn.isEmpty()) { toReturn = "None"; } return toReturn; } private void refreshGUI() { currentXP = (Integer)spnXP.getModel().getValue(); getContentPane().removeAll(); initComponents(); getContentPane().revalidate(); getContentPane().repaint(); } private void removeSkillPrereq(int i) { prereqSkills.remove(i); } private void editSkillPrereq(int i) { EditSkillPrereqDialog nspd = new EditSkillPrereqDialog(null, prereqSkills.get(i)); nspd.setVisible(true); if(!nspd.wasCancelled() & !nspd.getPrereq().isEmpty()) { prereqSkills.set(i, nspd.getPrereq()); refreshGUI(); } } public boolean wasCancelled() { return cancelled; } private class RemoveSkillListener implements ActionListener { public RemoveSkillListener() { } @Override public void actionPerformed(java.awt.event.ActionEvent evt) { int id = Integer.parseInt(evt.getActionCommand()); removeSkillPrereq(id); refreshGUI(); } } private class EditSkillListener implements ActionListener { public EditSkillListener() { } @Override public void actionPerformed(java.awt.event.ActionEvent evt) { int id = Integer.parseInt(evt.getActionCommand()); editSkillPrereq(id); refreshGUI(); } } }