aboutsummaryrefslogtreecommitdiff
path: root/src/main/ui/widgets/CertEditDialog.java
blob: bad5a4fe7c2ab91ac8915b7b8c7566953df308a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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 ||  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<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;
    }
}