package vooga.towerdefense.gameeditor.gamemaker.editorscreens; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.MouseEvent; import java.io.IOException; import java.util.List; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import vooga.towerdefense.gameeditor.controller.GameEditorController; /** * RuleEditorScreen is responsible for helping * the game developer add rules to their game. * * @author Angelica Schwartz */ public class RuleEditorScreen extends GameEditorScreen { /** * default serialized id. */ private static final long serialVersionUID = 1L; /** * title for this screen. */ private static final String TITLE = "RULE "; /** * next screen in the game editor. */ private static final String NEXT_SCREEN_NAME = "LevelEditorScreen"; /** * package path for the rules. */ private static final String RULES_PACKAGE_PATH = "vooga.towerdefense.factories.rulefactories"; /** * constant string for adding a new rule. */ private static final String ADD_RULE_TEXT = "Add rule"; /** * constant string for deleting a new rule. */ private static final String DELETE_RULE_TEXT = "Delete selected rule"; /** * constant for width of the JTextArea. */ private static final int TEXT_AREA_WIDTH = 20; /** * constant for height of the JTextArea. */ private static final int TEXT_AREA_HEIGHT = 50; /** * drop down box that will display the rule choices. */ private JComboBox myRules; /** * shows the rules that the game developer has already selected. */ private JTextArea mySelectedRules; /** * button for adding new rules. */ private JButton myAddRuleButton; /** * button for deleting rules. */ private JButton myDeleteRuleButton; /** * constructor. * @param size * @param controller */ public RuleEditorScreen (Dimension size, GameEditorController controller) { super(size, controller, TITLE, NEXT_SCREEN_NAME); mySelectedRules = new JTextArea(TEXT_AREA_WIDTH, TEXT_AREA_HEIGHT); add(new JScrollPane(mySelectedRules), BorderLayout.CENTER); try { addRuleChoices(); addButtons(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * helper method to add the rules to the drop down box. * @throws IOException * @throws ClassNotFoundException */ private void addRuleChoices() throws IOException, ClassNotFoundException { myRules = new JComboBox(); List<String> rules = getController().getClassNamesInPackage(RULES_PACKAGE_PATH); for (String rule: rules) { rule = rule.substring(0, rule.length() - "Factory".length()); myRules.addItem(rule); } add(myRules, BorderLayout.WEST); } /** * helper method to add the buttons to this screen. */ private void addButtons() { myAddRuleButton = new JButton(ADD_RULE_TEXT); myDeleteRuleButton = new JButton(DELETE_RULE_TEXT); myAddRuleButton.addMouseListener(getMouseAdapter()); myDeleteRuleButton.addMouseListener(getMouseAdapter()); JPanel buttonPanel = new JPanel(new BorderLayout()); buttonPanel.add(myAddRuleButton, BorderLayout.NORTH); buttonPanel.add(myDeleteRuleButton, BorderLayout.SOUTH); add(buttonPanel, BorderLayout.WEST); } @Override public void addElementToGame () { // TODO Auto-generated method stub getController().addRulesToGame(mySelectedRules.getText()); } /** * adds additional mouse behavior for the rules editor screen. */ @Override public void addAdditionalMouseBehavior (MouseEvent e) { if (e.getSource().equals(myAddRuleButton)) { mySelectedRules.setText(mySelectedRules.getText() + (String)myRules.getSelectedItem()); try { List<String> parameters = getController().getParametersForAction(RULES_PACKAGE_PATH + "." + myRules.getSelectedItem()); for (String parameter : parameters) { String p = JOptionPane.showInputDialog("Enter a " + parameter + " for this rule"); mySelectedRules.setText(mySelectedRules.getText() + " " + p); } mySelectedRules.setText(mySelectedRules.getText() + "\n"); } catch (ClassNotFoundException e1) { e1.printStackTrace(); } } else if (e.getSource().equals(myDeleteRuleButton)) { mySelectedRules.replaceSelection(""); } } }