001package com.ganteater.ae.desktop.ui;
002
003import java.util.ArrayList;
004import java.util.Arrays;
005import java.util.Map;
006import java.util.Set;
007
008import javax.swing.DefaultCellEditor;
009import javax.swing.JTable;
010import javax.swing.JTextField;
011import javax.swing.SwingUtilities;
012import javax.swing.table.AbstractTableModel;
013
014import org.apache.commons.collections.map.LinkedMap;
015import org.apache.commons.lang.StringUtils;
016
017import com.ganteater.ae.AEWorkspace;
018
019public class EnvPropertiesTable extends JTable {
020
021        public class VarTableModel extends AbstractTableModel {
022
023                private static final long serialVersionUID = 1L;
024                private LinkedMap fRows = new LinkedMap();
025
026                public void refresh() {
027                        Set<String> tehKeySet = getWorkspace().getSystemVariables().keySet();
028                        fRows.clear();
029                        String[] theKeys = tehKeySet.toArray(new String[tehKeySet.size()]);
030                        Arrays.sort(theKeys);
031
032                        for (String theName : theKeys) {
033                                Object theValue = getWorkspace().getSystemVariables().get(theName);
034                                fRows.put(theName, theValue);
035                        }
036                }
037
038                public int getColumnCount() {
039                        return 2;
040                }
041
042                public int getRowCount() {
043                        return fRows.size();
044                }
045
046                public Object getValueAt(int row, int col) {
047                        return col == 0 ? fRows.get(row) : fRows.getValue(row);
048                }
049
050                @Override
051                public boolean isCellEditable(int rowIndex, int columnIndex) {
052                        return columnIndex > 0;
053                }
054
055                @Override
056                public Class<?> getColumnClass(int columnIndex) {
057                        int selectedRow = getSelectedRow();
058                        int index = selectedRow < 0 ? 0 : selectedRow;
059                        Object object = columnIndex == 0 ? fRows.get(index) : fRows.getValue(index);
060                        Class<? extends Object> clazz = object != null ? object.getClass() : String.class;
061                        return clazz;
062                }
063
064                @Override
065                public void setValueAt(Object value, int rowIndex, int columnIndex) {
066                        if (columnIndex == 1) {
067                                String object = (String) fRows.get(rowIndex);
068                                String name = object.toUpperCase();
069
070                                getWorkspace().getSystemVariables().put(name, value);
071                                fRows.put(name, value);
072
073                                if (AEFrame.LOOK_AND_FEEL.equals(name)) {
074                                        SwingUtilities.invokeLater(() -> {
075                                                frame.lookAndFeel((String) value);
076                                                SwingUtilities.updateComponentTreeUI(frame);
077                                        });
078                                }
079                        } else if (fRows.indexOf(value) < 0 && columnIndex == 0 && rowIndex >= getRowCount()) {
080                                fRows.put(StringUtils.upperCase((String) value), null);
081                        }
082                }
083
084                @Override
085                public String getColumnName(int column) {
086                        if (column == 0) {
087                                return "Name";
088                        } else {
089                                return "Value";
090                        }
091                }
092        }
093
094        private static final long serialVersionUID = 1L;
095        private AEFrame frame;
096        private VarTableModel dataModel;
097
098        public EnvPropertiesTable(AEFrame aeFrame) {
099                this.frame = aeFrame;
100                setDefaultEditor(String.class, new DefaultCellEditor(new JTextField()));
101                setDefaultEditor(Map.class, new ArrayCellEditor(frame));
102                setDefaultEditor(ArrayList.class, new ArrayCellEditor(frame));
103                setDefaultEditor(String[].class, new ArrayCellEditor(frame));
104                getTableHeader().setReorderingAllowed(false);
105                dataModel = new VarTableModel();
106                setModel(dataModel);
107        }
108
109        public AEWorkspace getWorkspace() {
110                return frame.getWorkspace();
111        }
112
113        public void refresh() {
114                dataModel.refresh();
115                dataModel.fireTableDataChanged();
116        }
117
118        public void addVariable(String key, Object value) {
119                if (StringUtils.isNotBlank(key)) {
120                        dataModel.setValueAt(key, dataModel.getRowCount(), 0);
121                        dataModel.fireTableDataChanged();
122                }
123        }
124}