// ObjectListEditor.java package net.sf.gogui.gui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.MessageFormat; import java.util.ArrayList; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import static net.sf.gogui.gui.I18n.i18n; /** Dialog for displaying and editing a list of objects. */ public class ObjectListEditor<OBJECT> { /** Edit properties of object. */ public interface ItemEditor<OBJECT> { OBJECT editItem(Component parent, OBJECT object, MessageDialogs messageDialogs); String getItemLabel(OBJECT object); OBJECT cloneItem(OBJECT object); } public boolean edit(Component parent, String title, ArrayList<OBJECT> objects, ItemEditor<OBJECT> editor, MessageDialogs messageDialogs) { m_messageDialogs = messageDialogs; m_editor = editor; m_actionListener = new ActionListener() { public void actionPerformed(ActionEvent event) { String command = event.getActionCommand(); if (command.equals("edit")) cbEdit(); else if (command.equals("move-up")) cbMoveUp(); else if (command.equals("move-down")) cbMoveDown(); else if (command.equals("remove")) cbRemove(); else assert false; } }; JPanel panel = new JPanel(new BorderLayout(GuiUtil.PAD, 0)); m_list = new JList(); m_list.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { selectionChanged(); } }); m_list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); int rows = Math.min(Math.max(objects.size(), 8), 15); m_list.setVisibleRowCount(rows); JScrollPane scrollPane = new JScrollPane(m_list); panel.add(scrollPane, BorderLayout.CENTER); panel.add(createButtonPanel(), BorderLayout.EAST); JOptionPane optionPane = new JOptionPane(panel, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION); m_objects = new ArrayList<OBJECT>(); copyObjects(objects, m_objects); updateList(m_objects.isEmpty() ? -1 : 0); m_dialog = optionPane.createDialog(parent, title); m_dialog.setVisible(true); Object value = optionPane.getValue(); boolean result = true; if (! (value instanceof Integer) || ((Integer)value).intValue() != JOptionPane.OK_OPTION) result = false; m_dialog.dispose(); if (result) copyObjects(m_objects, objects); return result; } private ActionListener m_actionListener; private JButton m_edit; private JButton m_moveDown; private JButton m_moveUp; private JButton m_remove; private JList m_list; private JDialog m_dialog; private ArrayList<OBJECT> m_objects; private ItemEditor<OBJECT> m_editor; private MessageDialogs m_messageDialogs; private void cbMoveDown() { int index = m_list.getSelectedIndex(); if (index < 0 || index >= m_objects.size() - 1) return; OBJECT temp = m_objects.get(index); m_objects.set(index, m_objects.get(index + 1)); m_objects.set(index + 1, temp); updateList(index + 1); } private void cbEdit() { int index = m_list.getSelectedIndex(); if (index == -1) return; OBJECT object = m_editor.editItem(m_dialog, getObject(index), m_messageDialogs); if (object == null) return; m_objects.set(index, object); updateList(index); } private void cbMoveUp() { int index = m_list.getSelectedIndex(); if (index < 0 || index == 0) return; OBJECT temp = m_objects.get(index); m_objects.set(index, m_objects.get(index - 1)); m_objects.set(index - 1, temp); updateList(index - 1); } private void cbRemove() { int index = m_list.getSelectedIndex(); if (index == -1) return; OBJECT object = getObject(index); String name = m_editor.getItemLabel(object); String disableKey = "net.sf.gogui.gui.ObjectListEditor.remove"; String mainMessage = MessageFormat.format(i18n("MSG_LISTEDITOR_REALLY_REMOVE"), name); String optionalMessage = i18n("MSG_LISTEDITOR_REALLY_REMOVE_2"); if (! m_messageDialogs.showQuestion(disableKey, m_dialog, mainMessage, optionalMessage, i18n("LB_REMOVE"), false)) return; m_objects.remove(object); if (index >= m_objects.size()) index = -1; updateList(index); } private void copyObjects(ArrayList<OBJECT> from, ArrayList<OBJECT> to) { to.clear(); for (int i = 0; i < from.size(); ++i) to.add(m_editor.cloneItem(from.get(i))); } private JButton createButton(String label, String command) { JButton button = new JButton(i18n(label)); button.setEnabled(false); button.setActionCommand(command); button.addActionListener(m_actionListener); return button; } private JPanel createButtonPanel() { JPanel buttonPanel = new JPanel(new GridLayout(0, 1, GuiUtil.PAD, GuiUtil.PAD)); m_moveUp = createButton("LB_LISTEDITOR_MOVE_UP", "move-up"); GuiUtil.setMacBevelButton(m_moveUp); buttonPanel.add(m_moveUp); m_moveDown = createButton("LB_LISTEDITOR_MOVE_DOWN", "move-down"); GuiUtil.setMacBevelButton(m_moveDown); buttonPanel.add(m_moveDown); m_edit = createButton("LB_EDIT", "edit"); GuiUtil.setMacBevelButton(m_edit); buttonPanel.add(m_edit); m_remove = createButton("LB_REMOVE", "remove"); GuiUtil.setMacBevelButton(m_remove); buttonPanel.add(m_remove); JPanel panel = new JPanel(new BorderLayout()); panel.add(buttonPanel, BorderLayout.NORTH); return panel; } private OBJECT getObject(int i) { return m_objects.get(i); } private void selectionChanged() { int index = m_list.getSelectedIndex(); m_edit.setEnabled(index >= 0); m_remove.setEnabled(index >= 0); m_moveUp.setEnabled(index >= 1); m_moveDown.setEnabled(index < m_objects.size() - 1); } private void updateList(int selectedIndex) { ArrayList<String> data = new ArrayList<String>(); for (int i = 0; i < m_objects.size(); ++i) { String name = m_editor.getItemLabel(getObject(i)); data.add(name); } m_list.setListData(data.toArray()); m_list.setSelectedIndex(selectedIndex); m_list.ensureIndexIsVisible(selectedIndex); } }