package chatty.gui.components; import chatty.Addressbook; import chatty.AddressbookEntry; import chatty.gui.RegexDocumentFilter; import chatty.gui.components.settings.ListTableModel; import chatty.gui.components.settings.TableEditor; import chatty.util.StringUtil; import java.awt.Component; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.HashSet; import java.util.Set; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.AbstractDocument; /** * * @author tduva */ public class AddressbookEditor extends TableEditor<AddressbookEntry> { private final MyTableModel data = new MyTableModel(); public AddressbookEditor(JDialog parent, TableEditorListener<AddressbookEntry> listener) { super(SORTING_MODE_SORTED, true); setModel(data); setTableEditorListener(listener); setItemEditor(new MyEditor(parent)); //this.setItemEditor(null); } public void edit(String name) { AddressbookEntry preset = new AddressbookEntry(name, new HashSet<String>()); int index = data.indexOf(preset); if (index == -1) { addItem(preset); } else { editItem(index); } } public void setContextMenu(TableContextMenu menu) { setPopupMenu(menu); } public void setEntry(AddressbookEntry entry) { int index = data.indexOf(entry); if (index != -1) { data.set(index, entry); } } private static class MyTableModel extends ListTableModel<AddressbookEntry> { public MyTableModel() { super(new String[]{"Name", "Categories"}); } @Override public Object getValueAt(int rowIndex, int columnIndex) { if (columnIndex == 0) { return get(rowIndex).getName(); } else { return StringUtil.join(get(rowIndex).getCategories(), ","); } } @Override public Class getColumnClass(int c) { if (c == 0) { return String.class; } else { return String.class; } } } private static class MyEditor extends JDialog implements TableEditor.ItemEditor<AddressbookEntry> { private final JTextField name = new JTextField(15); private final JTextField categories = new JTextField(15); private final JButton ok = new JButton("Done"); private final JButton cancel = new JButton("Cancel"); private boolean save; public MyEditor(JDialog owner) { super(owner); setModal(true); setResizable(false); // Action Listener ActionListener listener = new ButtonListener(); ok.addActionListener(listener); cancel.addActionListener(listener); name.addActionListener(listener); categories.addActionListener(listener); // Document Listener DocumentListener documentListener = new TextFieldListener(); name.getDocument().addDocumentListener(documentListener); categories.getDocument().addDocumentListener(documentListener); // Prevents any whitespace from being entered in the name field ((AbstractDocument)name.getDocument()).setDocumentFilter(new RegexDocumentFilter("\\s+")); // Layout setLayout(new GridBagLayout()); GridBagConstraints gbc; JLabel nameLabel = new JLabel("Name: "); JLabel categoriesLabel = new JLabel("Categories: "); nameLabel.setLabelFor(name); gbc = makeGbc(0, 1, 1, 1, GridBagConstraints.EAST); add(nameLabel, gbc); gbc = makeGbc(1, 1, 2, 1, GridBagConstraints.CENTER); add(name, gbc); gbc = makeGbc(0, 2, 1, 1, GridBagConstraints.EAST); add(categoriesLabel, gbc); gbc = makeGbc(1,2, 2, 1, GridBagConstraints.CENTER); add(categories, gbc); gbc = makeGbc(1, 3, 1, 1, GridBagConstraints.CENTER); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 0.5; add(ok, gbc); gbc = makeGbc(2, 3, 1, 1, GridBagConstraints.CENTER); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.weightx = 0.5; add(cancel, gbc); pack(); } private GridBagConstraints makeGbc(int x, int y, int w, int h, int anchor) { GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = x; gbc.gridy = y; gbc.gridwidth = w; gbc.gridheight = h; gbc.insets = new Insets(5,3,5,3); gbc.anchor = anchor; return gbc; } @Override public AddressbookEntry showEditor(AddressbookEntry preset, Component c, boolean edit) { setLocationRelativeTo(c); updateButtons(); setData(preset); if (edit) { setTitle("Edit entry"); } else { setTitle("Add entry"); } name.requestFocusInWindow(); setVisible(true); if (save && valid()) { return loadData(); } return null; } private void setData(AddressbookEntry preset) { if (preset == null) { name.setText(""); categories.setText(""); } else { name.setText(preset.getName()); categories.setText(StringUtil.join(preset.getCategories(), ",")); } } private AddressbookEntry loadData() { String name = this.name.getText(); Set<String> categories = Addressbook.getCategoriesFromString(this.categories.getText()); return new AddressbookEntry(name, categories); } private void updateButtons() { boolean enabled = valid(); ok.setEnabled(enabled); } private boolean valid() { return !name.getText().isEmpty(); } private class ButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == ok) { save = true; setVisible(false); } else if (e.getSource() == cancel) { save = false; setVisible(false); } if (e.getSource() == name || e.getSource() == categories) { if (valid()) { save = true; setVisible(false); } } } } private class TextFieldListener implements DocumentListener { @Override public void insertUpdate(DocumentEvent e) { updateButtons(); } @Override public void removeUpdate(DocumentEvent e) { updateButtons(); } @Override public void changedUpdate(DocumentEvent e) { updateButtons(); } } } }