package chatty.gui.components;
import chatty.Addressbook;
import chatty.AddressbookEntry;
import chatty.gui.components.settings.TableEditor;
import java.awt.Component;
import java.awt.Dimension;
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.List;
import java.util.Set;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
/**
*
* @author tduva
*/
public class AddressbookDialog extends JDialog {
private final AddressbookEditor table;
private final JFrame owner;
private final Addressbook addressbook;
public AddressbookDialog(JFrame owner, Addressbook addressbook) {
super(owner);
setTitle("Addressbook");
this.addressbook = addressbook;
this.owner = owner;
table = new AddressbookEditor(this, new TableListener());
table.setContextMenu(new ContextMenu());
setLayout(new GridBagLayout());
GridBagConstraints gbc;
gbc = new GridBagConstraints(0, 0, 1, 1, 1, 1, GridBagConstraints.CENTER,
GridBagConstraints.BOTH, new Insets(0,0,0,0), 0, 0);
add(table, gbc);
setPreferredSize(new Dimension(300,400));
pack();
}
private class ContextMenu extends TableEditor.TableContextMenu<AddressbookEntry> {
private final ActionListener actionListener;
private AddressbookEntry currentEntry;
public ContextMenu() {
actionListener = new Action();
}
@Override
public void showMenu(AddressbookEntry entry, Component invoker, int x, int y) {
currentEntry = entry;
removeAll();
List<String> presetCategories = addressbook.getCategories();
Set<String> categories = entry.getCategories();
for (String cat : presetCategories) {
boolean selected = categories.contains(cat);
JCheckBoxMenuItem item = new JCheckBoxMenuItem(cat, selected);
item.addActionListener(actionListener);
item.setActionCommand(cat);
add(item);
}
this.show(invoker, x, y);
}
private class Action implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String category = e.getActionCommand();
AddressbookEntry entry = currentEntry;
boolean selected = ((JCheckBoxMenuItem)e.getSource()).isSelected();
AddressbookEntry changedEntry;
if (selected) {
changedEntry = addressbook.add(entry.getName(), category);
} else {
changedEntry = addressbook.remove(entry.getName(), category);
}
table.setEntry(changedEntry);
}
}
}
private class TableListener implements TableEditor.TableEditorListener<AddressbookEntry> {
@Override
public void itemAdded(AddressbookEntry item) {
addressbook.set(item);
}
@Override
public void itemRemoved(AddressbookEntry item) {
addressbook.remove(item);
}
@Override
public void itemEdited(AddressbookEntry oldItem, AddressbookEntry newItem) {
if (oldItem.getName().equals(newItem.getName())) {
addressbook.set(newItem);
} else {
addressbook.rename(oldItem.getName(), newItem);
}
}
@Override
public void refreshData() {
loadData();
}
}
private void loadData() {
table.setData(addressbook.getEntries());
}
public void showDialog(final String name) {
if (!isVisible()) {
loadData();
setVisible(true);
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
if (name != null) {
table.edit(name);
}
}
});
}
}