package zander.ui.album; import java.awt.Insets; import java.awt.BorderLayout; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; import java.awt.event.KeyEvent; import java.util.Objects; import java.awt.Window; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import zander.library.state.LibraryState; import zander.ui.UIUtils; import zander.ui.docs.DocumentationViewer; public class LibraryPropertyDialog extends JDialog { private static final long serialVersionUID = -4761044964061547045L; public static final int RESPONSE_CANCEL = 0; public static final int RESPONSE_SAVE = 1; private final LibraryState library; private final JLabel nameLabel; private final JTextField nameField; private final JButton nameReset; private final JLabel licenseLabel; private final JTextField licenseField; private final JButton licenseReset; private final JPanel fieldPanel; private final JButton cancelButton; private final JButton helpButton; private final JButton saveButton; private final JPanel buttonPanel; private final JPanel content; private int response = RESPONSE_CANCEL; public LibraryPropertyDialog(Window parent, LibraryState library) { super(parent, "Library Properties"); this.library = library; nameLabel = new JLabel("Name:"); nameField = new JTextField(20); nameField.getDocument().addDocumentListener(new DocumentListener(){ @Override public void insertUpdate(DocumentEvent e) { update(); } @Override public void removeUpdate(DocumentEvent e) { update(); } @Override public void changedUpdate(DocumentEvent e) { update(); } private void update() { nameReset.setEnabled(!resetStringEquals(nameField.getText(), library.getOriginalName())); } }); nameReset = new JButton("↺"); nameField.setText(library.getName()); nameReset.addActionListener((e) -> nameField.setText(library.getOriginalName())); licenseLabel = new JLabel("License:"); licenseField = new JTextField(20); licenseField.getDocument().addDocumentListener(new DocumentListener(){ @Override public void insertUpdate(DocumentEvent e) { update(); } @Override public void removeUpdate(DocumentEvent e) { update(); } @Override public void changedUpdate(DocumentEvent e) { update(); } private void update() { licenseReset.setEnabled(!resetStringEquals(licenseField.getText(), library.getOriginalLicense())); } }); licenseReset = new JButton("↺"); licenseField.setText(library.getLicense()); licenseReset.addActionListener((e) -> licenseField.setText(library.getOriginalLicense())); fieldPanel = new JPanel(new GridBagLayout()); buildFieldUI(); cancelButton = new JButton("Cancel"); cancelButton.setMnemonic(KeyEvent.VK_C); cancelButton.addActionListener((e) -> dispose()); helpButton = new JButton("?"); helpButton.addActionListener((e) -> DocumentationViewer.show(this, "Albums/Library Settings")); saveButton = new JButton("Save"); saveButton.setMnemonic(KeyEvent.VK_S); saveButton.addActionListener((e) -> { response = RESPONSE_SAVE; dispose(); }); buttonPanel = new JPanel(); buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS)); buttonPanel.add(cancelButton); buttonPanel.add(Box.createHorizontalGlue()); buttonPanel.add(helpButton); buttonPanel.add(saveButton); content = new JPanel(new BorderLayout()); content.add(fieldPanel, BorderLayout.CENTER); content.add(buttonPanel, BorderLayout.PAGE_END); setContentPane(content); pack(); setAlwaysOnTop(true); setResizable(false); setModalityType(JDialog.DEFAULT_MODALITY_TYPE); setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); UIUtils.centerWindow(this, parent); } private void buildFieldUI() { GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = 1; gbc.gridheight = 1; gbc.insets = new Insets(1, 1, 1, 1); gbc.fill = GridBagConstraints.NONE; gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.LINE_END; fieldPanel.add(nameLabel, gbc); gbc.gridx = 1; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.anchor = GridBagConstraints.CENTER; fieldPanel.add(nameField, gbc); gbc.gridx = 2; gbc.fill = GridBagConstraints.NONE; gbc.anchor = GridBagConstraints.LINE_START; fieldPanel.add(nameReset, gbc); gbc.gridy = 1; gbc.gridx = 0; gbc.anchor = GridBagConstraints.LINE_END; fieldPanel.add(licenseLabel, gbc); gbc.gridx = 1; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.anchor = GridBagConstraints.CENTER; fieldPanel.add(licenseField, gbc); gbc.gridx = 2; gbc.fill = GridBagConstraints.NONE; gbc.anchor = GridBagConstraints.LINE_START; fieldPanel.add(licenseReset, gbc); } public LibraryState getLibrary() { return library; } public int getResponse() { return response; } public String getLibraryName() { return nameField.getText(); } public String getLibraryLicense() { return licenseField.getText(); } private static boolean resetStringEquals(String s1, String s2) { if (s1 != null && s1.isEmpty()) { s1 = null; } if (s2 != null && s2.isEmpty()) { s2 = null; } return Objects.equals(s1, s2); } }