aboutsummaryrefslogtreecommitdiff
path: root/src/main/ui/widgets/CertEditDialog.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/ui/widgets/CertEditDialog.java')
-rw-r--r--src/main/ui/widgets/CertEditDialog.java108
1 files changed, 108 insertions, 0 deletions
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<T> 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;
+ }
+}