001package com.ganteater.ae.desktop.ui;
002
003import java.awt.Component;
004import java.awt.event.ActionEvent;
005import java.awt.event.ActionListener;
006import java.io.Serializable;
007import java.util.ArrayList;
008import java.util.List;
009import java.util.Map;
010
011import javax.swing.AbstractCellEditor;
012import javax.swing.JComboBox;
013import javax.swing.JTable;
014import javax.swing.JTextField;
015import javax.swing.table.TableCellEditor;
016
017import org.apache.commons.lang.StringUtils;
018
019public class ArrayCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
020
021        private static final long serialVersionUID = 1L;
022
023        private Serializable data = new ArrayList<>();
024
025        public ArrayCellEditor(AEFrame frame) {
026        }
027
028        @Override
029        public Object getCellEditorValue() {
030                return data;
031        }
032
033        @Override
034        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
035                data = (Serializable) value;
036                if (value instanceof List) {
037                        JComboBox<String> combo = new JComboBox<>();
038                        @SuppressWarnings("unchecked")
039                        List<String> values = (List<String>) value;
040                        for (String str : values) {
041                                combo.addItem(str);
042                        }
043                        combo.addActionListener(this);
044                        return combo;
045
046                } else if (value instanceof Map) {
047                        return new JTextField(value.toString());
048                }
049
050                return new JTextField((String) data);
051        }
052
053        @SuppressWarnings("unchecked")
054        @Override
055        public void actionPerformed(ActionEvent event) {
056                JComboBox<String> value = (JComboBox<String>) event.getSource();
057                String selected = (String) value.getSelectedItem();
058
059                int itemCount = value.getItemCount();
060                data = new ArrayList<>();
061                ((List<String>) data).add(selected);
062                for (int i = 0; i < itemCount; i++) {
063                        String itemAt = value.getItemAt(i);
064                        if (!StringUtils.equals(selected, itemAt)) {
065                                ((List<String>) data).add(itemAt);
066                        }
067                }
068
069        }
070
071}