package com.bagri.tools.vvm.ui; import javax.management.ObjectName; import javax.swing.*; import com.bagri.tools.vvm.event.ApplicationEvent; import com.bagri.tools.vvm.model.*; import com.bagri.tools.vvm.util.Icons; import com.bagri.tools.vvm.util.WindowUtil; import static com.bagri.tools.vvm.util.Icons.*; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class EditNodeDialog extends JDialog { private static final KeyStroke ESCAPE_STROKE = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); private JTextField nodeId; private ObjectName objectName; private Map<String, NodeOption> options = new HashMap<String, NodeOption>(); private ActionListener successListener; private XTable optionsGrid; private enum Mode { ADD, EDIT } public EditNodeDialog(Node node, final JComponent owner) { super(WindowUtil.getFrameForComponent(owner), ((null == node) ? "Add" : "Edit") + " Node", true); Mode mode = (null == node) ? Mode.ADD : Mode.EDIT; JPanel fieldsPanel = new JPanel(new GridBagLayout()); fieldsPanel.setBorder(BorderFactory.createEtchedBorder()); // fieldsPanel.setMinimumSize(new Dimension(200, 100)); GridBagConstraints cs = new GridBagConstraints(); cs.fill = GridBagConstraints.HORIZONTAL; JLabel lbNodeId = new JLabel("Name: "); cs.gridx = 0; cs.gridy = 0; cs.gridwidth = 1; cs.weightx=0; fieldsPanel.add(lbNodeId, cs); nodeId = new JTextField(20); // nodeId.setMinimumSize(new Dimension(200, -1)); cs.gridx = 1; cs.gridy = 0; cs.gridwidth = 2; fieldsPanel.add(nodeId, cs); if (Mode.EDIT == mode) { objectName = node.getObjectName(); nodeId.setText(node.getName()); for (NodeOption op : node.getNodeOptions()) { options.put(op.getOptionName(), op); } } JPanel optionsPanel = new JPanel(new BorderLayout()); JToolBar toolBar = new JToolBar(); // "Add Option" button JButton addOption = new JButton("Add"); addOption.setToolTipText("Adds new option"); addOption.setIcon(Icons.ADD_ICON); addOption.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { final EditNodeOptionDialog dlg = new EditNodeOptionDialog(null, owner); dlg.setSuccessListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { NodeOption op = dlg.getOption(); if (null != op.getOptionName()) options.put(op.getOptionName(), op); optionsGrid.reload(); } }); dlg.setVisible(true); } }); 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) { 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()), owner); dlg.setSuccessListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { NodeOption op = dlg.getOption(); if (null != op.getOptionName()) options.put(op.getOptionName(), op); optionsGrid.reload(); } }); dlg.setVisible(true); } } }); toolBar.add(editOption); toolBar.addSeparator(); // "Delete Option" button JButton deleteOption = new JButton("Delete"); deleteOption.setToolTipText("Delete option"); deleteOption.setIcon(Icons.DELETE_ICON); deleteOption.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int selectedIndex = optionsGrid.getSelectionModel().getLeadSelectionIndex(); if (selectedIndex >= 0 && selectedIndex < optionsGrid.getModel().getRowCount()) { GridRow row = ((GridTableModel) optionsGrid.getModel()).getRow(selectedIndex); int n = JOptionPane.showConfirmDialog( EditNodeDialog.this, "Are you sure you want to delete selected option \"" + row.getId().toString() + "\"?", "Confirm deletion", JOptionPane.YES_NO_OPTION); if (JOptionPane.YES_OPTION == n) { options.remove(row.getId().toString()); optionsGrid.reload(); } } } }); toolBar.add(deleteOption); toolBar.addSeparator(); toolBar.setFloatable(false); optionsPanel.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 List<GridRow> loadData() { List<GridRow> result = new ArrayList<GridRow>(); 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) { 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()), owner); dlg.setSuccessListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { NodeOption op = dlg.getOption(); if (null != op.getOptionName()){ options.put(op.getOptionName(), op); optionsGrid.reload(); } } }); dlg.setVisible(true); } } } }); optionsPanel.add(new JScrollPane(optionsGrid), BorderLayout.CENTER); optionsGrid.reload(); JButton editButton = new JButton((mode == Mode.ADD) ? "Add Node" : "Update"); editButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (null != successListener) { successListener.actionPerformed(new ActionEvent(EditNodeDialog.this, e.getID(), "editNode")); } dispose(); } }); JButton cancelButton = new JButton("Cancel"); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); } }); JPanel bp = new JPanel(); bp.add(editButton); bp.add(cancelButton); getContentPane().add(fieldsPanel, BorderLayout.PAGE_START); getContentPane().add(optionsPanel, BorderLayout.CENTER); getContentPane().add(bp, BorderLayout.PAGE_END); setPreferredSize(new Dimension(280, 300)); setMinimumSize(new Dimension(280, 300)); pack(); setResizable(false); setLocationRelativeTo(owner); Action dispatchClosing = new AbstractAction() { public void actionPerformed(ActionEvent event) { dispatchEvent(new WindowEvent( EditNodeDialog.this, WindowEvent.WINDOW_CLOSING )); } }; JRootPane root = getRootPane(); root.setDefaultButton(editButton); root.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ESCAPE_STROKE, ApplicationEvent.DISPATCH_WINDOW_CLOSING_ACTION); root.getActionMap().put(ApplicationEvent.DISPATCH_WINDOW_CLOSING_ACTION, dispatchClosing ); } public Node getNode() { Node res = new Node(objectName, nodeId.getText()); res.setNodeOptions(new ArrayList<NodeOption>(options.values())); return res; } public void setSuccessListener(ActionListener successListener) { this.successListener = successListener; } }