package com.bagri.tools.vvm.ui;
import javax.swing.*;
import com.bagri.tools.vvm.model.*;
import com.bagri.tools.vvm.service.ClusterManagementService;
import com.bagri.tools.vvm.service.ServiceException;
import com.bagri.tools.vvm.util.ErrorUtil;
import static com.bagri.tools.vvm.util.Icons.*;
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.*;
import java.util.logging.Logger;
public class NodeManagementPanel extends JPanel {
private static final Logger LOGGER = Logger.getLogger(NodeManagementPanel.class.getName());
private final ClusterManagementService clusterService;
private XTable optionsGrid;
private Map<String, NodeOption> options = new HashMap<String, NodeOption>();
private Node node;
private JToolBar toolBar;
private JTabbedPane tabbedPane;
public NodeManagementPanel(ClusterManagementService clusterService, Node node) {
super(new GridLayout(1, 1));
this.clusterService = clusterService;
this.node = node;
tabbedPane = new JTabbedPane();
tabbedPane.addTab(node.getName(), createMainPanel());
add(tabbedPane);
tabbedPane.setBorder(BorderFactory.createEmptyBorder());
setBorder(BorderFactory.createEmptyBorder());
}
private JPanel createMainPanel() {
final JPanel panel = new JPanel(new BorderLayout());
toolBar = new JToolBar();
// "Add Option" button
JButton addOption = new JButton("Add");
addOption.setToolTipText("Adds new option");
addOption.setIcon(ADD_ICON);
addOption.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onAdd();
}
});
toolBar.add(addOption);
toolBar.addSeparator();
// "Edit Option" button
JButton editOption = new JButton("Edit");
editOption.setToolTipText("Edit option");
editOption.setIcon(EDIT_ICON);
editOption.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onEdit();
}
});
toolBar.add(editOption);
toolBar.addSeparator();
// "Delete Option" button
JButton deleteOption = new JButton("Delete");
deleteOption.setToolTipText("Delete option");
deleteOption.setIcon(DELETE_ICON);
deleteOption.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
onDelete();
}
});
toolBar.add(deleteOption);
toolBar.addSeparator();
toolBar.setFloatable(false);
panel.add(toolBar, BorderLayout.PAGE_START);
// Column configs
ArrayList<ColumnConfig> configs = new ArrayList<ColumnConfig>();
ColumnConfig c = new ColumnConfig();
c.setHeader("Option name");
c.setColumnClass(String.class);
c.setWidth(40);
c.setResizable(true);
configs.add(c);
c = new ColumnConfig();
c.setHeader("Option value");
c.setColumnClass(String.class);
c.setWidth(40);
c.setResizable(true);
configs.add(c);
optionsGrid = new XTable(configs, new GridDataLoader() {
@Override
public java.util.List<GridRow> loadData() {
java.util.List<GridRow> result = new ArrayList<GridRow>();
try {
Node loadedNode = clusterService.getNode(node.getObjectName());
options.clear();
for (NodeOption option : loadedNode.getNodeOptions()) {
options.put(option.getOptionName(), option);
}
} catch (ServiceException e) {
LOGGER.throwing(NodeManagementPanel.class.getName(), "loadData", e);
ErrorUtil.showError(NodeManagementPanel.this, e);
return result;
}
for (NodeOption option : options.values()) {
GridRow row = new DefaultGridRow(option.getOptionName(), new Object[] {option.getOptionName(), option.getOptionValue()});
result.add(row);
}
return result;
}
});
optionsGrid.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount()>=2) {
onEdit();
}
}
});
panel.add(new JScrollPane(optionsGrid), BorderLayout.CENTER);
return panel;
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if (!enabled) {
optionsGrid.clearSelection();
optionsGrid.getTableHeader().setEnabled(false);
optionsGrid.setEnabled(false);
for (Component c : toolBar.getComponents()) {
c.setEnabled(false);
}
toolBar.setEnabled(false);
for (Component c : tabbedPane.getComponents()) {
c.setEnabled(false);
}
tabbedPane.setEnabled(false);
}
}
@Override
public void invalidate() {
super.invalidate();
if (!optionsGrid.isLoaded()) {
optionsGrid.reload();
}
}
// --- Event Handlers --- //
private void onAdd() {
final EditNodeOptionDialog dlg = new EditNodeOptionDialog(null, NodeManagementPanel.this);
dlg.setSuccessListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
NodeOption op = dlg.getOption();
if (null != op.getOptionName()) {
options.put(op.getOptionName(), op);
node.setNodeOptions(new ArrayList<NodeOption>(options.values()));
try {
clusterService.saveNode(node);
} catch (ServiceException e1) {
LOGGER.throwing(NodeManagementPanel.class.getName(), "onAddOption", e1);
ErrorUtil.showError(NodeManagementPanel.this, e1);
}
optionsGrid.reload();
}
}
});
}
});
dlg.setVisible(true);
}
private void onEdit() {
int selectedIndex = optionsGrid.getSelectionModel().getLeadSelectionIndex();
if (selectedIndex >= 0 && selectedIndex < optionsGrid.getModel().getRowCount()) {
GridRow row = ((GridTableModel) optionsGrid.getModel()).getRow(selectedIndex);
final EditNodeOptionDialog dlg = new EditNodeOptionDialog(options.get(row.getId().toString()), NodeManagementPanel.this);
dlg.setSuccessListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
NodeOption op = dlg.getOption();
if (null != op.getOptionName()) {
options.put(op.getOptionName(), op);
node.setNodeOptions(new ArrayList<NodeOption>(options.values()));
try {
clusterService.saveNode(node);
} catch (ServiceException e1) {
LOGGER.throwing(NodeManagementPanel.class.getName(), "onEditOption", e1);
ErrorUtil.showError(NodeManagementPanel.this, e1);
}
optionsGrid.reload();
}
}
});
}
});
dlg.setVisible(true);
}
}
private void onDelete() {
int selectedIndex = optionsGrid.getSelectionModel().getLeadSelectionIndex();
if (selectedIndex >= 0 && selectedIndex < optionsGrid.getModel().getRowCount()) {
final GridRow row = ((GridTableModel) optionsGrid.getModel()).getRow(selectedIndex);
int n = JOptionPane.showConfirmDialog(
NodeManagementPanel.this,
"Are you sure you want to delete selected option \"" + row.getId().toString() + "\"?",
"Confirm deletion",
JOptionPane.YES_NO_OPTION);
if (JOptionPane.YES_OPTION == n) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
options.remove(row.getId().toString());
node.setNodeOptions(new ArrayList<NodeOption>(options.values()));
try {
clusterService.saveNode(node);
} catch (ServiceException e1) {
LOGGER.throwing(NodeManagementPanel.class.getName(), "onDeleteOption", e1);
ErrorUtil.showError(NodeManagementPanel.this, e1);
}
optionsGrid.reload();
}
});
}
}
}
}