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}