package nota.oxygen.epub; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Rectangle; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.JToggleButton; import javax.swing.border.EmptyBorder; @SuppressWarnings("serial") public class AttributeEditorDialog extends JDialog { private final JPanel contentPanel = new JPanel(); private String[] possibleValues = new String[0]; private boolean allowMultipleValues; private String value; public void setValue(String val) { if (value == null) { if (val == null) { return; } } else if (value.equals(val)) { return; } value = val; valueTextField.setText(value); updateCheckBoxes(); } private void updateCheckBoxes() { List<String> values = new ArrayList<String>(Arrays.asList(possibleValues)); List<String> selectedValues = new ArrayList<String>(); if (!("".equals(getValue().trim()))) { if (allowMultipleValues) { selectedValues.addAll(Arrays.asList(getValue().split("\\s+"))); } else { selectedValues.add(getValue()); } } for (int i = 0; i < selectedValues.size(); i++) { if (!values.contains(selectedValues.get(i))) { values.add(selectedValues.get(i)); } } toggleButtonPanel.invalidate(); toggleButtonPanel.removeAll(); for (int i = 0; i < values.size(); i++) { JToggleButton toggleButton = allowMultipleValues ? new JCheckBox(values.get(i)) : new JRadioButton(values.get(i)); toggleButton.setSelected(selectedValues.contains(values.get(i))); toggleButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (e.getSource() instanceof JRadioButton) { JRadioButton button = (JRadioButton)e.getSource(); for (Component c : button.getParent().getComponents()) { if (c == button) { continue; } else if (c instanceof JRadioButton) { ((JRadioButton)c).setSelected(false); } } } setValue(getValueFromCheckBoxes()); } }); toggleButtonPanel.add(toggleButton); } toggleButtonPanel.validate(); toggleButtonPanel.repaint(); } private String getValueFromCheckBoxes() { String result = ""; for (Component c : toggleButtonPanel.getComponents()) { if (c instanceof JToggleButton) { JToggleButton box = (JToggleButton)c; if (box.isSelected()) { result += box.getText() + " "; } } } return result.trim(); } public String getValue() { return valueTextField.getText(); } private JTextField valueTextField; private JPanel toggleButtonPanel; public static String showAttributeDialog( Object owner, String[] valueList, String initialValue, boolean allowEdit, boolean allowMultipleValues, String title) { AttributeEditorDialog dialog = new AttributeEditorDialog(owner); dialog.setTitle(title); dialog.possibleValues = valueList; dialog.valueTextField.setEditable(allowEdit); dialog.allowMultipleValues = allowMultipleValues; dialog.setValue(initialValue); dialog.setModal(true); dialog.setVisible(true); if (dialog.okPressed) { return dialog.getValue(); } return null; } private boolean okPressed = false; private static Window getAncestralWindow(Object obj) { if (obj instanceof Window) { return (Window)obj; } else if (obj instanceof Component) { return getAncestralWindow(((Component)obj).getParent()); } return null; } private static JScrollPane getAncestralJScrollPane(Object obj) { if (obj instanceof JScrollPane) { return (JScrollPane)obj; } else if (obj instanceof Component) { return getAncestralJScrollPane(((Component)obj).getParent()); } return null; } private Rectangle getOptimalBounds(Object parent) { Rectangle result = new Rectangle(getPreferredSize()); Rectangle parentBounds = null; JScrollPane parentScrollPane = getAncestralJScrollPane(parent); if (parentScrollPane != null) { parentBounds = parentScrollPane.getBounds(); parentBounds.setLocation(parentScrollPane.getLocationOnScreen()); if (parentBounds.width>=getPreferredSize().width && parentBounds.height>=getPreferredSize().height) { result.x = parentBounds.x; result.y = parentBounds.y; } else if (getOwner() != null) { parentBounds = getOwner().getBounds(); if (parentBounds.width>=getPreferredSize().width && parentBounds.height>=getPreferredSize().height) { result.x = parentBounds.x + (parentBounds.width-getPreferredSize().width)/2; result.y = parentBounds.y + (parentBounds.height-getPreferredSize().height)/2; } } } return result; } /** * Create the dialog. */ private AttributeEditorDialog(Object owner) { super(getAncestralWindow(owner)); setPreferredSize(new Dimension(300, 400)); setBounds(getOptimalBounds(owner)); getContentPane().setLayout(new BorderLayout()); contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); getContentPane().add(contentPanel, BorderLayout.CENTER); contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS)); { valueTextField = new JTextField(); valueTextField.addFocusListener(new FocusAdapter() { @Override public void focusLost(FocusEvent event) { setValue(valueTextField.getText()); } }); valueTextField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setValue(valueTextField.getText()); } }); valueTextField.setMaximumSize(new Dimension(2147483647, 20)); contentPanel.add(valueTextField); valueTextField.setColumns(10); } { JScrollPane scrollPane = new JScrollPane(); contentPanel.add(scrollPane); { toggleButtonPanel = new JPanel(); scrollPane.setViewportView(toggleButtonPanel); toggleButtonPanel.setLayout(new BoxLayout(toggleButtonPanel, BoxLayout.PAGE_AXIS)); } } { JPanel buttonPane = new JPanel(); buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); getContentPane().add(buttonPane, BorderLayout.SOUTH); { JButton okButton = new JButton("OK"); okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { okPressed = true; setVisible(false); dispose(); } }); okButton.setActionCommand("OK"); buttonPane.add(okButton); getRootPane().setDefaultButton(okButton); } { JButton cancelButton = new JButton("Cancel"); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setVisible(false); dispose(); } }); cancelButton.setActionCommand("Cancel"); buttonPane.add(cancelButton); } } } }