package me.teridax.jcash.gui.takeoff; import me.teridax.jcash.Logging; import me.teridax.jcash.decode.StringDecoder; import me.teridax.jcash.gui.IconProvider; import me.teridax.jcash.gui.InvalidInputException; import javax.swing.*; import java.awt.*; import java.text.ParseException; import static me.teridax.jcash.lang.Translator.translate; /** * Dialog for taking off money of an account. */ public class TakeoffView { private JDialog dialog; private JButton cancel; private JButton takeoff; private JLabel enteredValue; private JLabel balanceAfterDeposit; private JFormattedTextField value; public TakeoffView(double maxValue) { createComponents(maxValue); layoutComponents(); } /** * Makes this dialog visible. */ public void showDialog() { dialog.setIconImage(IconProvider.getWindowIcon()); dialog.setModalityType(Dialog.ModalityType.APPLICATION_MODAL); dialog.setTitle(translate("Takeoff money")); dialog.pack(); dialog.setSize(dialog.getWidth() * 2, dialog.getHeight()); dialog.setResizable(false); dialog.setLocationRelativeTo(null); dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); dialog.setVisible(true); } private void layoutComponents() { var c = new GridBagConstraints(); c.gridx = 0; c.gridy = 0; c.gridwidth = 1; c.fill = GridBagConstraints.NONE; c.anchor = GridBagConstraints.LAST_LINE_END; c.weightx = 0; c.insets = new Insets(6,6,6,6); dialog.getContentPane().add(new JLabel(translate("Value"), SwingConstants.RIGHT), c); c.gridx = 1; c.gridy = 0; c.fill = GridBagConstraints.HORIZONTAL; c.anchor = GridBagConstraints.LAST_LINE_END; c.weightx = 0.5; dialog.getContentPane().add(value, c); c.gridx = 2; c.gridy = 0; c.fill = GridBagConstraints.NONE; c.anchor = GridBagConstraints.LINE_START; c.weightx = 0; dialog.getContentPane().add(new JLabel("€"), c); c.gridx = 0; c.gridy = 1; c.gridwidth = 1; c.fill = GridBagConstraints.HORIZONTAL; c.anchor = GridBagConstraints.LAST_LINE_END; dialog.getContentPane().add(new JLabel(translate("Value to takeoff:"), SwingConstants.RIGHT), c); c.gridx = 1; c.gridy = 1; c.gridwidth = 2; c.fill = GridBagConstraints.HORIZONTAL; c.anchor = GridBagConstraints.LAST_LINE_END; dialog.getContentPane().add(enteredValue, c); c.gridx = 0; c.gridy = 2; c.gridwidth = 1; c.fill = GridBagConstraints.HORIZONTAL; c.anchor = GridBagConstraints.LAST_LINE_END; dialog.getContentPane().add(new JLabel(translate("Balance after takeoff:"), SwingConstants.RIGHT), c); c.gridx = 1; c.gridy = 2; c.gridwidth = 2; c.fill = GridBagConstraints.HORIZONTAL; c.anchor = GridBagConstraints.LAST_LINE_END; dialog.getContentPane().add(balanceAfterDeposit, c); var buttonPanel = new JPanel(new FlowLayout(FlowLayout.TRAILING)); buttonPanel.add(cancel); buttonPanel.add(takeoff); c.gridx = 0; c.gridy = 3; c.gridwidth = 3; c.fill = GridBagConstraints.HORIZONTAL; c.anchor = GridBagConstraints.LAST_LINE_END; c.insets = new Insets(10, 10, 10, 10); dialog.getContentPane().add(buttonPanel, c); } /** * The createComponents function creates the components of the dialog. * @param maxValue Set the maximum value of the jformattedtextfield */ private void createComponents(double maxValue) { this.dialog = new JDialog(); this.cancel = new JButton(translate("Cancel")); this.takeoff = new JButton(translate("Takeoff")); this.value = new JFormattedTextField(StringDecoder.getNumberFormatter(maxValue)); this.enteredValue = new JLabel(); this.balanceAfterDeposit = new JLabel(StringDecoder.getNumberFormat().format(maxValue)); this.dialog.setContentPane(new JPanel(new GridBagLayout())); } /** * The getAmount function is used to get the amount of currency that has been entered into the text field. * @return A double value, which is the parsed amount from the text field */ public double getAmount() throws InvalidInputException { if (value.getText().isBlank()) throw new InvalidInputException("currency value is blank or has been invalid whilst entered"); try { return StringDecoder.getNumberFormat().parse(value.getText()).doubleValue(); } catch (ParseException e) { Logging.LOGGER.severe("Amount text field contains invalid value: " + value); throw new InvalidInputException(e); } } /** * The setCommittedValue function sets the text of the enteredValue and balanceAfterDeposit TextFields to * a String representation of amount and after, respectively. * @param amount Set the text of enteredvalue * @param after Set the balance after deposit */ public void setCommittedValue(double amount, double after) { enteredValue.setText(StringDecoder.getNumberFormat().format(amount)); balanceAfterDeposit.setText(StringDecoder.getNumberFormat().format(after)); } public JButton getCancel() { return cancel; } public JButton getTakeoff() { return takeoff; } public JFormattedTextField getValue() { return value; } public void dispose() { this.dialog.dispose(); } }