/*
* JBoss, Home of Professional Open Source
* Copyright 2015 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
package org.jboss.as.cli.gui.component;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dialog;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Enumeration;
import javax.swing.Box;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.jboss.dmr.ModelNode;
/**
* Editor for parameters that are of ModelType.LIST.
*
* @author Stan Silvert ssilvert@redhat.com (C) 2012 Red Hat Inc.
*/
public class ListEditor extends JPanel implements ListSelectionListener {
private DefaultListModel listModel = new DefaultListModel();
private JList list = new JList(listModel);
private Dialog parent;
private JButton addButton = new JButton("Add...");
private JButton editButton = new JButton("Edit...");
private JButton removeButton = new JButton("Remove");
private JButton moveUpButton = new JButton("\u25B2"); // unicode for solid triangle
private JButton moveDownButton = new JButton("\u25BC"); // unicode for solid inverted triangle
public ListEditor(Dialog parent) {
this.parent = parent;
list.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setPrototypeCellValue("012345678901234567890123456789"); // about 30 characters wide
list.addListSelectionListener(this);
JPanel buttonColumn = makeButtonColumn();
JScrollPane scroller = new JScrollPane(list);
JPanel moveUpDownColumn = makeMoveUpDownColumn();
setLayout(new GridBagLayout());
GridBagConstraints gbConst = new GridBagConstraints();
gbConst.gridx = 0;
gbConst.weightx = 1.0;
gbConst.weighty = 1.0;
add(buttonColumn, gbConst);
add(Box.createHorizontalStrut(5));
gbConst.fill = GridBagConstraints.BOTH;
gbConst.gridx = GridBagConstraints.RELATIVE;
gbConst.weightx = 10.0;
add(scroller, gbConst);
add(Box.createHorizontalStrut(5));
gbConst.fill = GridBagConstraints.NONE;
gbConst.weightx = 1.0;
add(moveUpDownColumn, gbConst);
}
private JPanel makeButtonColumn() {
JPanel buttonColumn = new JPanel(new GridLayout(3, 1, 5, 5));
addButton.setToolTipText("Add an item to the list.");
addButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
ItemEditor editor = new ItemEditor();
editor.setVisible(true);
list.setSelectedIndex(list.getLastVisibleIndex());
}
});
editButton.setToolTipText("Edit selected item.");
editButton.setEnabled(false);
editButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
ItemEditor editor = new ItemEditor(list.getSelectedValue().toString());
editor.setVisible(true);
}
});
removeButton.setToolTipText("Remove selected item.");
removeButton.setEnabled(false);
removeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
listModel.remove(list.getSelectedIndex());
}
});
buttonColumn.add(addButton);
buttonColumn.add(editButton);
buttonColumn.add(removeButton);
return buttonColumn;
}
private JPanel makeMoveUpDownColumn() {
JPanel buttonColumn = new JPanel(new GridLayout(2, 1, 5, 5));
moveUpButton.setToolTipText("Move selected item up.");
moveUpButton.setEnabled(false);
moveUpButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
int selectedIndex = list.getSelectedIndex();
Object toBeMoved = listModel.remove(selectedIndex);
listModel.add(selectedIndex - 1, toBeMoved);
list.setSelectedIndex(selectedIndex - 1);
}
});
moveDownButton.setToolTipText("Move selected item down.");
moveDownButton.setEnabled(false);
moveDownButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
int selectedIndex = list.getSelectedIndex();
Object toBeMoved = listModel.remove(selectedIndex);
listModel.add(selectedIndex + 1, toBeMoved);
list.setSelectedIndex(selectedIndex + 1);
}
});
buttonColumn.add(moveUpButton);
buttonColumn.add(moveDownButton);
return buttonColumn;
}
public ModelNode getValue() {
ModelNode value = new ModelNode();
for (Enumeration elements = listModel.elements(); elements.hasMoreElements(); ) {
value.add(elements.nextElement().toString());
}
return value;
}
public void setValue(ModelNode value) {
if (!value.isDefined()) return;
for (ModelNode item : value.asList()) {
listModel.addElement(item.asString());
}
}
// implement ListSelectionListener
public void valueChanged(ListSelectionEvent lse) {
int selectedIndex = list.getSelectedIndex();
if (selectedIndex == -1) {
editButton.setEnabled(false);
removeButton.setEnabled(false);
moveUpButton.setEnabled(false);
moveDownButton.setEnabled(false);
return;
}
editButton.setEnabled(true);
removeButton.setEnabled(true);
moveUpButton.setEnabled(selectedIndex != 0);
moveDownButton.setEnabled(selectedIndex != list.getLastVisibleIndex());
}
private class ItemEditor extends JDialog {
private boolean isAddMode = true;
private JTextField itemField = new JTextField(30);
public ItemEditor() {
this("Add Item", "");
}
public ItemEditor(String item) {
this("Edit Item", item);
isAddMode = false;
}
private ItemEditor(String label, String item) {
super(parent, label, true);
setLocationRelativeTo(parent);
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
itemField.setText(item);
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout(10, 10));
contentPane.add(itemField, BorderLayout.CENTER);
contentPane.add(makeButtonPanel(), BorderLayout.SOUTH);
pack();
setResizable(false);
}
private JPanel makeButtonPanel() {
JPanel buttonPanel = new JPanel();
JButton ok = new JButton("OK");
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
String editedItem = itemField.getText();
if (isAddMode) {
listModel.addElement(editedItem);
} else {
listModel.set(list.getSelectedIndex(), editedItem);
}
ItemEditor.this.dispose();
}
});
JButton cancel = new JButton("Cancel");
cancel.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
ItemEditor.this.dispose();
}
});
buttonPanel.add(ok);
buttonPanel.add(cancel);
return buttonPanel;
}
}
}