package com.kostbot.zoodirector.ui;
import com.google.common.base.Strings;
import com.kostbot.zoodirector.config.ZooDirectorConfig;
import com.kostbot.zoodirector.ui.helpers.DynamicTable;
import org.jdesktop.swingx.JXTable;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.Map;
public class ZooDirectorConfigEditor extends JDialog {
private final ZooDirectorConfig config;
private final DefaultTableModel aliasTableModel;
private final JXTable aliasTable;
private class AliasPopupMenu extends JPopupMenu {
private final JMenuItem addAliasMenuItem;
private final JMenuItem removeAliasMenuItem;
AliasPopupMenu() {
super();
removeAliasMenuItem = new JMenuItem("remove");
removeAliasMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DynamicTable.removeSelectedRows(aliasTable);
}
});
add(removeAliasMenuItem);
addAliasMenuItem = new JMenuItem("add");
addAliasMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
addAlias();
}
});
add(addAliasMenuItem);
}
private void enableDelete(boolean enable) {
removeAliasMenuItem.setEnabled(enable);
}
}
public ZooDirectorConfigEditor(JFrame parent, ZooDirectorConfig config, final String connectionString) {
super(parent, "Configuration", true);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
this.config = config;
JPanel mainPanel = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.weightx = 0.5;
c.insets.top = 5;
c.insets.left = 5;
c.insets.right = 5;
c.insets.bottom = 2;
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy += 1;
mainPanel.add(new JLabel("Aliases"), c);
c.gridy += 1;
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.CENTER;
mainPanel.add(new JLabel("<html><i>any alias with empty name or connection string will not be saved</i></html>"), c);
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth = 2;
c.gridx = 0;
c.gridy += 1;
aliasTableModel = new DefaultTableModel(new String[]{"alias", "connection string"}, 0);
aliasTable = new JXTable(aliasTableModel);
aliasTable.setHorizontalScrollEnabled(true);
aliasTable.setAutoStartEditOnKeyStroke(true);
aliasTable.setToolTipText("double click to edit");
final AliasPopupMenu tableMenu = new AliasPopupMenu();
Map<String, String> aliases = config.getConnectionAliases();
for (String alias : aliases.keySet()) {
aliasTableModel.addRow(new String[]{alias, aliases.get(alias)});
}
aliasTable.setPreferredScrollableViewportSize(new Dimension(400, 200));
aliasTable.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON3) {
int clickedRow = aliasTable.rowAtPoint(e.getPoint());
// Show context menu if clicking selected row
tableMenu.enableDelete(aliasTable.isRowSelected(clickedRow));
tableMenu.show(aliasTable, e.getX(), e.getY());
}
}
});
mainPanel.add(new JScrollPane(aliasTable), c);
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.LINE_END;
c.gridy += 1;
JPanel addButtonPanel = new JPanel();
JButton addCurrentButton = new JButton("Add Current");
addButtonPanel.add(addCurrentButton);
if (Strings.isNullOrEmpty(connectionString)) {
addCurrentButton.setEnabled(false);
} else {
addCurrentButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
addAlias(new String[]{connectionString, connectionString});
}
});
}
JButton addAliasButton = new JButton("Add");
addAliasButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
addAlias();
}
});
addButtonPanel.add(addAliasButton);
mainPanel.add(addButtonPanel, c);
c.anchor = GridBagConstraints.LINE_START;
c.gridy += 1;
c.insets.top = 5;
c.insets.bottom = 5;
JPanel buttonPanel = new JPanel();
JButton saveButton = new JButton("OK");
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
save();
dispose();
}
});
buttonPanel.add(saveButton);
JButton cancelButton = new JButton("Cancel");
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dispose();
}
});
buttonPanel.add(cancelButton);
mainPanel.add(buttonPanel, c);
add(mainPanel);
pack();
}
private void addAlias() {
addAlias(new String[]{"", "<double click to edit>"});
}
private void addAlias(String[] aliasEntry) {
aliasTableModel.addRow(aliasEntry);
}
private void save() {
Map<String, String> aliases = new HashMap<String, String>(aliasTableModel.getRowCount());
for (int i = 0; i < aliasTableModel.getRowCount(); ++i) {
String name = (String) aliasTableModel.getValueAt(i, 0);
String value = (String) aliasTableModel.getValueAt(i, 1);
// Skip bad rows
if (Strings.isNullOrEmpty(name) || Strings.isNullOrEmpty(value)) {
continue;
}
aliases.put(name, value);
}
if (!aliases.equals(config.getConnectionAliases())) {
config.setConnectionAliases(aliases);
}
}
}