package script_editor; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.SwingUtilities; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; import editor.Trigger; public class ScriptChanger extends JPanel implements ActionListener, DocumentListener { private static final long serialVersionUID = 1L; private final ScriptEditor editor; //TODO (6/25/2015): ID Field needs to default to a number > 0. New triggers currently does not auto-set itself. private JTextField nameField, idField; private JButton upButton, downButton, leftButton, rightButton; private JButton questionDialogue, affirmativeDialogue, negativeDialogue, speechDialogue; private JTextArea scriptArea; private boolean allowUpdate; private boolean isEnabled; private int movementCounter = 0; private static final String UP = "UP"; private static final String DOWN = "DOWN"; private static final String LEFT = "LEFT"; private static final String RIGHT = "RIGHT"; private ActionListener dialogueActions = new ActionListener() { @Override public void actionPerformed(ActionEvent event) { JTextArea area = editor.scriptChanger.getScriptArea(); PlainDocument doc = (PlainDocument) area.getDocument(); switch (event.getActionCommand()) { case "#": { if (doc.getLength() > 0) area.append("\n#"); else area.append("#"); break; } case "?": { if (doc.getLength() > 0) area.append("\n?"); else area.append("?"); break; } case "+": { if (doc.getLength() > 0) area.append("\n+"); else area.append("+"); break; } case "-": { if (doc.getLength() > 0) area.append("\n-"); else area.append("-"); break; } } } }; public ScriptChanger(ScriptEditor editor) { super(); this.editor = editor; this.setLayout(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); // First row c.gridx = 0; c.gridy = 0; c.gridwidth = 1; c.weightx = 0.5; c.weighty = 0.1; c.fill = GridBagConstraints.NONE; this.add(new JLabel("Name: "), c); c.gridx = 1; c.gridy = 0; c.gridwidth = 1; c.weightx = 3.5; c.weighty = 0.1; c.fill = GridBagConstraints.HORIZONTAL; this.add((nameField = new JTextField()), c); nameField.getDocument().addDocumentListener(this); // // Second row // c.gridx = 0; // c.gridy = 1; // c.gridwidth = 1; // c.weightx = 0.5; // c.weighty = 0.1; // c.fill = GridBagConstraints.NONE; // this.add(new JLabel("X Position: "), c); // // c.gridx = 1; // c.gridy = 1; // c.gridwidth = 1; // c.weightx = 3.5; // c.weighty = 0.1; // c.fill = GridBagConstraints.HORIZONTAL; // this.add((xField = new JTextField()), c); // xField.getDocument().addDocumentListener(this); // // // Third row // c.gridx = 0; // c.gridy = 2; // c.gridwidth = 1; // c.weightx = 0.5; // c.weighty = 0.1; // c.fill = GridBagConstraints.NONE; // this.add(new JLabel("Y Position: "), c); // // c.gridx = 1; // c.gridy = 2; // c.gridwidth = 1; // c.weightx = 3.5; // c.weighty = 0.1; // c.fill = GridBagConstraints.HORIZONTAL; // this.add((yField = new JTextField()), c); // yField.getDocument().addDocumentListener(this); // Fourth row c.gridx = 0; c.gridy = 3; c.gridwidth = 1; c.weightx = 0.5; c.weighty = 0.1; c.fill = GridBagConstraints.NONE; this.add(new JLabel("ID Value: "), c); c.gridx = 1; c.gridy = 3; c.gridwidth = 1; c.weightx = 3.5; c.weighty = 0.1; c.fill = GridBagConstraints.HORIZONTAL; this.add((idField = new JTextField()), c); idField.getDocument().addDocumentListener(this); // Empty panel for adding spaces only. c.gridx = 0; c.gridy = 4; c.gridwidth = 2; c.weightx = 0; c.weighty = 10; c.fill = GridBagConstraints.BOTH; c.anchor = GridBagConstraints.CENTER; this.add(constructScripts(), c); // Fifth row (panel) c.gridx = 0; c.gridy = 5; c.gridwidth = 1; c.weightx = 0.5; c.weighty = 0.5; c.anchor = GridBagConstraints.CENTER; this.add(constructDirections(), c); c.gridx = 1; c.gridy = 5; c.gridwidth = 1; c.weightx = 3.5; c.weighty = 0.5; c.anchor = GridBagConstraints.CENTER; this.add(constructDialogues(), c); this.setBorder(BorderFactory.createTitledBorder("Trigger:")); this.validate(); this.disable(); } private JPanel constructDirections() { JPanel panel = new JPanel(); panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); final Dimension size = new Dimension(30, 10); final Insets inset = new Insets(0, 1, 0, 1); JPanel top = new JPanel(); top.setLayout(new BoxLayout(top, BoxLayout.X_AXIS)); upButton = new JButton("Up"); upButton.setMargin(inset); upButton.setSize(size); upButton.addActionListener(this); upButton.setActionCommand(UP); top.add(upButton); JPanel across = new JPanel(); across.setLayout(new BoxLayout(across, BoxLayout.X_AXIS)); leftButton = new JButton("Left"); leftButton.setMargin(inset); leftButton.setSize(size); leftButton.addActionListener(this); leftButton.setActionCommand(LEFT); downButton = new JButton("Down"); downButton.setMargin(inset); downButton.setSize(size); downButton.addActionListener(this); downButton.setActionCommand(DOWN); rightButton = new JButton("Right"); rightButton.setMargin(inset); rightButton.setSize(size); rightButton.addActionListener(this); rightButton.setActionCommand(RIGHT); across.add(leftButton); across.add(downButton); across.add(rightButton); panel.add(top); panel.add(across); panel.setBorder(BorderFactory.createTitledBorder("Movements:")); return panel; } private JPanel constructDialogues() { final Insets inset = new Insets(0, 1, 0, 1); JPanel panel = new JPanel(); panel.setLayout(new FlowLayout(FlowLayout.LEADING)); speechDialogue = new JButton("#"); speechDialogue.setMargin(inset); speechDialogue.setToolTipText("<html><b>Speech Dialogue:</b><br/> A normal dialogue the player is to trigger. <br/><br/><b>Usage:</b><br/> #[One-line-only Sentence]<br/><br/><b>Example:</b><br/>#Hello World.</html>"); speechDialogue.setActionCommand("#"); speechDialogue.addActionListener(dialogueActions); panel.add(speechDialogue); questionDialogue = new JButton("?"); questionDialogue.setMargin(inset); questionDialogue.setToolTipText("<html><b>Question Dialogue:</b><br/> A question dialogue asking for the player's response to YES or NO.<br/><br/><b>WARNING:</b><br/>A single question must be followed by an Affirmative and a Negative Dialogue.<br/><br/><b>Usage:</b><br/>?[One-line-only Question] <br/><br/><b>Example:</b><br/>?Do you want to trade your Bulbasaur for my Pikachu?<br/>+Great! Let's trade!<br/>-Aw... I thought you had one.</html>"); questionDialogue.setActionCommand("?"); questionDialogue.addActionListener(dialogueActions); panel.add(questionDialogue); affirmativeDialogue = new JButton("+"); affirmativeDialogue.setMargin(inset); affirmativeDialogue .setToolTipText("<html><b>Affirmative Dialogue:</b><br/> If a question dialogue has been asked, and the player reponded to YES, this and similar consecutive dialogues will be shown. <br/><br/><b>Usage:</b><br/>+[One-line-only Sentence]<br/><br/><b>Example:</b><br/>+Great! Let's trade!</html>"); affirmativeDialogue.setActionCommand("+"); affirmativeDialogue.addActionListener(dialogueActions); panel.add(affirmativeDialogue); negativeDialogue = new JButton("-"); negativeDialogue.setMargin(inset); negativeDialogue .setToolTipText("<html><b>Negative Dialogue:</b><br/> If a question dialogue has been asked, and the player reponded to NO, this and similar consecutive dialogues will be shown. <br/><br/><b>Usage:</b><br/>-[One-line-only Sentence]<br/><br/><b>Example:</b><br/>-Aw... I thought you had one.</html>"); negativeDialogue.setActionCommand("-"); negativeDialogue.addActionListener(dialogueActions); panel.add(negativeDialogue); panel.validate(); panel.setBorder(BorderFactory.createTitledBorder("Dialogues (Hover for hints):")); return panel; } private JPanel constructScripts() { JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); this.scriptArea = new JTextArea(); this.scriptArea.setLineWrap(true); this.scriptArea.getDocument().addDocumentListener(this); panel.add(new JScrollPane(this.scriptArea), BorderLayout.CENTER); panel.validate(); panel.setBorder(BorderFactory.createTitledBorder("Script:")); return panel; } public JTextField getNameField() { return this.nameField; } // public JTextField getXField() { // return this.xField; // } // public JTextField getYField() { // return this.yField; // } public JTextField getIDField() { return this.idField; } public JTextArea getScriptArea() { return this.scriptArea; } public void allowFieldsToUpdate() { this.allowUpdate = true; } public void disallowFieldsToUpdate() { this.allowUpdate = false; } public void clear() { nameField.setText(""); // xField.setText(""); // yField.setText(""); idField.setText(""); scriptArea.setText(""); } @Override public void disable() { this.nameField.setEnabled(false); this.idField.setEnabled(false); this.upButton.setEnabled(false); this.downButton.setEnabled(false); this.leftButton.setEnabled(false); this.rightButton.setEnabled(false); this.questionDialogue.setEnabled(false); this.affirmativeDialogue.setEnabled(false); this.negativeDialogue.setEnabled(false); this.speechDialogue.setEnabled(false); this.scriptArea.setEnabled(false); this.isEnabled = false; } @Override public void enable() { this.nameField.setEnabled(true); this.idField.setEnabled(true); this.upButton.setEnabled(true); this.downButton.setEnabled(true); this.leftButton.setEnabled(true); this.rightButton.setEnabled(true); this.questionDialogue.setEnabled(true); this.affirmativeDialogue.setEnabled(true); this.negativeDialogue.setEnabled(true); this.speechDialogue.setEnabled(true); this.scriptArea.setEnabled(true); this.isEnabled = true; } @Override public boolean isEnabled() { return this.isEnabled; } // ActionListener @Override public void actionPerformed(ActionEvent event) { JTextArea area = editor.scriptChanger.getScriptArea(); PlainDocument doc = (PlainDocument) area.getDocument(); String lastCharacter = ""; String lastDirection = ""; try { lastDirection = doc.getText(area.getCaretPosition() - 2, 1); lastCharacter = doc.getText(area.getCaretPosition() - 1, 1); if (lastDirection.equals("\n")) { System.out.println("__" + lastCharacter + "__LINEBREAK__"); } else { System.out.println("__" + lastCharacter + "__" + lastDirection + "__"); } } catch (BadLocationException e) { lastCharacter = ""; } if (lastDirection.equals("U") || lastDirection.equals("D") || lastDirection.equals("L") || lastDirection.equals("R")) { switch (event.getActionCommand()) { case UP: { inputChange(doc, area, "U"); break; } case DOWN: { inputChange(doc, area, "D"); break; } case LEFT: { inputChange(doc, area, "L"); break; } case RIGHT: { inputChange(doc, area, "R"); break; } } } else if (lastCharacter.equals("^")) { switch (event.getActionCommand()) { case UP: { defaultInputChange(doc, area, "U"); break; } case DOWN: { defaultInputChange(doc, area, "D"); break; } case LEFT: { defaultInputChange(doc, area, "L"); break; } case RIGHT: { defaultInputChange(doc, area, "R"); break; } } } else if (lastCharacter.equals("\n") || lastCharacter.equals("")) { area.append("^"); switch (event.getActionCommand()) { case UP: { defaultInputChange(doc, area, "U"); break; } case DOWN: { defaultInputChange(doc, area, "D"); break; } case LEFT: { defaultInputChange(doc, area, "L"); break; } case RIGHT: { defaultInputChange(doc, area, "R"); break; } } } else { area.append("\n^"); switch (event.getActionCommand()) { case UP: { defaultInputChange(doc, area, "U"); break; } case DOWN: { defaultInputChange(doc, area, "D"); break; } case LEFT: { defaultInputChange(doc, area, "L"); break; } case RIGHT: { defaultInputChange(doc, area, "R"); break; } } } } private void inputChange(PlainDocument doc, JTextArea area, String directionToCompare) { try { String str = doc.getText(doc.getLength() - 2, 1); if (str.equals(directionToCompare)) { if (movementCounter < 9) { movementCounter++; doc.remove(doc.getLength() - 1, 1); area.append(Integer.toString(movementCounter)); } else { movementCounter = 0; area.append(directionToCompare + Integer.toString(movementCounter)); } } else { movementCounter = 0; area.append(directionToCompare + Integer.toString(movementCounter)); } } catch (BadLocationException e) { e.printStackTrace(); } } private void defaultInputChange(PlainDocument doc, JTextArea area, String directionToCompare) { movementCounter = 0; area.append(directionToCompare + Integer.toString(movementCounter)); } // DocumentListener @Override public void changedUpdate(DocumentEvent event) { } // DocumentListener @Override public void insertUpdate(DocumentEvent event) { if (this.allowUpdate) { Trigger selectedTrigger = editor.scriptViewer.getSelectedTrigger(); if (selectedTrigger != null) { String test = ""; try { test = editor.scriptChanger.getNameField().getText(); if (!test.isEmpty() || !test.equals("")) selectedTrigger.setName(test); } catch (Exception e) { } // try { // test = editor.scriptChanger.getXField().getText(); // if (!test.isEmpty() || !test.equals("")) { // int n = Integer.valueOf(test); // if (n > 0x0FF) // throw new NumberFormatException(); // selectedTrigger.setTriggerPositionX((byte) (n & 0xFF)); // } // } // catch (NumberFormatException e) { // JOptionPane.showMessageDialog(null, "Please input numbers in range 0 ~ 255."); // SwingUtilities.invokeLater(new Runnable() { // @Override // public void run() { // editor.scriptChanger.getXField().setText(""); // } // }); // } // try { // test = editor.scriptChanger.getYField().getText(); // if (!test.isEmpty() || !test.equals("")) { // int n = Integer.valueOf(test); // if (n > 0x0FF) // throw new NumberFormatException(); // selectedTrigger.setTriggerPositionY((byte) (n & 0xFF)); // } // } // catch (NumberFormatException e) { // JOptionPane.showMessageDialog(null, "Please input numbers in range 0 ~ 255."); // SwingUtilities.invokeLater(new Runnable() { // @Override // public void run() { // editor.scriptChanger.getYField().setText(""); // } // }); // } try { test = editor.scriptChanger.getIDField().getText(); if (!test.isEmpty() || !test.equals("")) { int n = Integer.valueOf(test); if (n > 0x0FFFF) throw new NumberFormatException(); selectedTrigger.setTriggerID((short) (n & 0xFFFF)); } } catch (NumberFormatException e) { JOptionPane.showMessageDialog(null, "Please input numbers in range 0 ~ 65535.\n\n0 is reserved for \"Eraser\", which is used to erase triggers from the map."); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { editor.scriptChanger.getIDField().setText(""); } }); } try { test = editor.scriptChanger.getScriptArea().getText(); if (!test.isEmpty() || !test.equals("")) selectedTrigger.setScript(test); } catch (Exception e) { } JList<Trigger> list = editor.scriptViewer.getTriggerList(); DefaultListModel<Trigger> model = (DefaultListModel<Trigger>) list.getModel(); model.setElementAt(selectedTrigger, list.getSelectedIndex()); } if (!editor.isBeingModified()) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { String str = editor.getTitle(); if (!str.endsWith("*")) editor.setTitle(str + "*"); editor.setModifiedFlag(true); } }); } } } // DocumentListener @Override public void removeUpdate(DocumentEvent event) { if (this.allowUpdate) { Trigger selectedTrigger = editor.scriptViewer.getSelectedTrigger(); if (selectedTrigger != null) { String test = editor.scriptChanger.getNameField().getText(); if (!test.isEmpty() || !test.equals("")) selectedTrigger.setName(test); // test = editor.scriptChanger.getXField().getText(); // if (!test.isEmpty() || !test.equals("")) // selectedTrigger.setTriggerPositionX((byte) (Integer.valueOf(test) & 0xFF)); // test = editor.scriptChanger.getYField().getText(); // if (!test.isEmpty() || !test.equals("")) // selectedTrigger.setTriggerPositionY((byte) (Integer.valueOf(test) & 0xFF)); test = editor.scriptChanger.getIDField().getText(); if (!test.isEmpty() || !test.equals("")) selectedTrigger.setTriggerID((short) (Integer.valueOf(test) & 0xFFFF)); test = editor.scriptChanger.getScriptArea().getText(); if (!test.isEmpty() || !test.equals("")) selectedTrigger.setScript(test); JList<Trigger> list = editor.scriptViewer.getTriggerList(); DefaultListModel<Trigger> model = (DefaultListModel<Trigger>) list.getModel(); model.setElementAt(selectedTrigger, list.getSelectedIndex()); } if (!editor.isBeingModified()) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { String str = editor.getTitle(); if (!str.endsWith("*")) editor.setTitle(str + "*"); editor.setModifiedFlag(true); } }); } } } }