From 65ea6c17a0c1348aa9ef4e158102ddf173936882 Mon Sep 17 00:00:00 2001 From: Yuuta Liang Date: Thu, 23 Nov 2023 08:09:01 +0800 Subject: Add GUI Signed-off-by: Yuuta Liang --- src/main/ui/widgets/CertEditDialog.java | 108 ++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 src/main/ui/widgets/CertEditDialog.java (limited to 'src/main/ui/widgets/CertEditDialog.java') diff --git a/src/main/ui/widgets/CertEditDialog.java b/src/main/ui/widgets/CertEditDialog.java new file mode 100644 index 0000000..ea16b19 --- /dev/null +++ b/src/main/ui/widgets/CertEditDialog.java @@ -0,0 +1,108 @@ +package ui.widgets; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import static java.awt.GridBagConstraints.HORIZONTAL; +import static java.awt.GridBagConstraints.WEST; +import static ui.widgets.UIUtils.btn; + +/** + * A common dialog for cert / template editing. It will close upon Esc or Cancel. + * ┌───────────────────────────┐ + * │ Dialog X │ + * │ │ + * │Template: (TBD) │ + * │Subject: _________ │ + * │Validity (Days): (Spinner)│ + * │ │ + * │ Button Cancel│ + * └───────────────────────────┘ + */ +public abstract class CertEditDialog extends JDialog { + /** + * The result. + */ + protected T res; + + /** + * Root pane. + */ + protected JPanel contentPane = new JPanel(); + protected JButton buttonOK = btn("", this::onOK); + protected JTextField textFieldSubject = new JTextField(); + protected JSpinner spinnerValidity = + new JSpinner(new SpinnerNumberModel(60, 1, null, 0)); + + /** + * EFFECTS: Render the dialog, leaving title and OK button text blank. + */ + public CertEditDialog() { + contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS)); + contentPane.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); + contentPane.add(renderForm()); + + contentPane.add(UIUtils.createActionsPane(buttonOK, btn("Cancel", this::onCancel))); + + setContentPane(contentPane); + setModal(true); + getRootPane().setDefaultButton(buttonOK); + setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); + + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + onCancel(null); + } + }); + + contentPane.registerKeyboardAction(this::onCancel, + KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), + JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + } + + /** + * EFFECTS: Render the form. + */ + private JPanel renderForm() { + final JPanel panelForm = new JPanel(new GridBagLayout()); + panelForm.add(new JLabel("Template: "), new GCBuilder().anchor(WEST).build()); + panelForm.add(new JLabel("Subject: "), new GCBuilder().gridY(1).anchor(WEST).build()); + panelForm.add(new JLabel("Validity (Days): "), new GCBuilder().gridY(2).anchor(WEST).build()); + panelForm.add(createTemplateComponent(), new GCBuilder().gridXY(1, 0).anchor(WEST) + .fill(HORIZONTAL).build()); + panelForm.add(textFieldSubject, new GCBuilder().gridXY(1, 1).anchor(WEST).fill(HORIZONTAL).build()); + panelForm.add(spinnerValidity, new GCBuilder().gridXY(1, 2).anchor(WEST).fill(HORIZONTAL).build()); + panelForm.add(new JPanel(), new GCBuilder().gridXY(1, 3).expandXY().fill(HORIZONTAL).build()); + return panelForm; + } + + /** + * EFFECTS: Create the component for subject. + */ + protected abstract JComponent createTemplateComponent(); + + /** + * EFFECTS: Handle OK. + */ + protected abstract void onOK(ActionEvent ev); + + /** + * EFFECTS: Handle cancel: clear result and close dialog. + * MODIFIES: this + */ + private void onCancel(ActionEvent ev) { + res = null; + dispose(); + } + + /** + * EFFECTS: Get the result. + */ + public T getRes() { + return res; + } +} -- cgit v1.2.3