package com.bagri.tools.vvm.ui; import javax.management.ObjectName; import javax.swing.*; import com.bagri.tools.vvm.event.*; 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 ClusterManagementPanel extends JPanel { private static final Logger LOGGER = Logger.getLogger(ClusterManagementPanel.class.getName()); private final ClusterManagementService clusterService; private final EventBus<ApplicationEvent> eventBus; private JTabbedPane tabbedPane; private JToolBar toolBar; private XTable grid; public ClusterManagementPanel(ClusterManagementService clusterService, EventBus<ApplicationEvent> eventBus) { super(new GridLayout(1, 1)); this.clusterService = clusterService; this.eventBus = eventBus; tabbedPane = new JTabbedPane(); tabbedPane.addTab(ClusterManagement.CLUSTER_MANAGEMENT, createMainPanel()); add(tabbedPane); tabbedPane.setBorder(BorderFactory.createEmptyBorder()); setBorder(BorderFactory.createEmptyBorder()); } private JPanel createMainPanel() { final JPanel panel = new JPanel(new BorderLayout()); toolBar = new JToolBar(); // "Add Node" button JButton addNode = new JButton("Add"); addNode.setToolTipText("Adds new node"); addNode.setIcon(ADD_ICON); addNode.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { onAdd(); } }); toolBar.add(addNode); toolBar.addSeparator(); // "Edit Node" button JButton editNode = new JButton("Edit"); editNode.setToolTipText("Edit selected node"); editNode.setIcon(EDIT_ICON); editNode.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { onEdit(); } }); toolBar.add(editNode); toolBar.addSeparator(); // "Delete Node" button JButton deleteNode = new JButton("Delete"); deleteNode.setToolTipText("Delete selected node"); deleteNode.setIcon(DELETE_ICON); deleteNode.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { onDelete(); } }); toolBar.add(deleteNode); 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("Name"); c.setColumnClass(String.class); c.setWidth(45); c.setResizable(true); configs.add(c); grid = new XTable(configs, new GridDataLoader() { @Override public java.util.List<GridRow> loadData() { java.util.List<Node> nodes; try { nodes = clusterService.getNodes(); } catch (ServiceException e) { ErrorUtil.showError(ClusterManagementPanel.this, e); return null; } java.util.List<GridRow> rows = new ArrayList<GridRow>(); for (Node n : nodes) { rows.add(new DefaultGridRow(n.getObjectName(), new Object[]{n.getName()})); } return rows; } }); grid.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() >=2 ){ onEdit(); } } }); eventBus.addEventHandler(new EventHandler<ApplicationEvent>() { @Override public void handleEvent(ApplicationEvent e) { if (ClusterManagement.CLUSTER_STATE_CHANGED.equals(e.getCommand())) { grid.reload(); invalidate(); } } }); panel.add(new JScrollPane(grid), BorderLayout.CENTER); return panel; } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); if (!enabled) { grid.clearSelection(); grid.getTableHeader().setEnabled(false); grid.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 (!grid.isLoaded()) { grid.reload(); } } // --- Event Handlers --- // private void onAdd() { final EditNodeDialog dlg = new EditNodeDialog(null, ClusterManagementPanel.this); dlg.setSuccessListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { try { clusterService.addNode(dlg.getNode()); } catch (ServiceException e1) { LOGGER.throwing(ClusterManagementPanel.class.getName(), "onAddNode", e1); ErrorUtil.showError(ClusterManagementPanel.this, e1); } eventBus.fireEvent(new ApplicationEvent(dlg, ClusterManagement.CLUSTER_STATE_CHANGED)); } }); } }); dlg.setVisible(true); } private void onEdit() { int selectedIndex = grid.getSelectionModel().getLeadSelectionIndex(); if (selectedIndex >= 0 && selectedIndex < grid.getModel().getRowCount()) { GridRow row = ((GridTableModel) grid.getModel()).getRow(selectedIndex); Node node; try { node = clusterService.getNode((ObjectName) row.getId()); } catch (ServiceException e1) { LOGGER.throwing(ClusterManagementPanel.class.getName(), "onEditNode", e1); ErrorUtil.showError(ClusterManagementPanel.this, e1); return; } final EditNodeDialog dlg = new EditNodeDialog(node, ClusterManagementPanel.this); dlg.setSuccessListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { try { clusterService.saveNode(dlg.getNode()); } catch (ServiceException e1) { LOGGER.throwing(ClusterManagementPanel.class.getName(), "onEditNode", e1); ErrorUtil.showError(ClusterManagementPanel.this, e1); return; } eventBus.fireEvent(new ApplicationEvent(dlg, ClusterManagement.CLUSTER_STATE_CHANGED)); } }); } }); dlg.setVisible(true); } } private void onDelete() { int selectedIndex = grid.getSelectionModel().getLeadSelectionIndex(); if (selectedIndex >= 0 && selectedIndex < grid.getModel().getRowCount()) { final GridRow row = ((GridTableModel) grid.getModel()).getRow(selectedIndex); int n = JOptionPane.showConfirmDialog( ClusterManagementPanel.this, "Are you sure you want to delete selected node \"" + row.getValueAt(0) + "\"?", "Confirm deletion", JOptionPane.YES_NO_OPTION); if (JOptionPane.YES_OPTION == n) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { try { Node node = clusterService.getNode((ObjectName) row.getId()); clusterService.deleteNode(node); } catch (ServiceException e1) { LOGGER.throwing(ClusterManagementPanel.class.getName(), "onDeleteNode", e1); ErrorUtil.showError(ClusterManagementPanel.this, e1); } eventBus.fireEvent(new ApplicationEvent(ClusterManagementPanel.this, ClusterManagement.CLUSTER_STATE_CHANGED)); } }); } } } }