package ui.gui.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.gui.widgets.UIUtils.btn; /** * A common dialog for cert / template editing. It will close upon Esc or Cancel. * +---------------------------++---------------------------++---------------------------+ * | Dialog X || New Template X || Issue new certificate X | * | || || | * |Template: (TBD) ||Template: _________||Template: (Drop down)| * |Subject: _________||Subject: _________||Subject: _________ | * |Validity (Days): (Spinner)||Validity (Days): (Spinner)||Validity (Days): (Spinner)| * | || || | * | Button Cancel|| Add Cancel|| Issue Cancel| * +---------------------------++---------------------------++---------------------------+ */ public abstract class CertEditDialog extends JDialog { /** * The result. */ protected T res; /** * Root pane. */ protected JPanel contentPane = new JPanel(); protected JButton buttonOK = UIUtils.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, UIUtils.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; } }