001package com.ganteater.ae.desktop.editor; 002 003import java.awt.BorderLayout; 004import java.awt.Dimension; 005import java.awt.event.ActionEvent; 006import java.awt.event.ActionListener; 007import java.util.Arrays; 008import java.util.HashMap; 009import java.util.Map; 010import java.util.Set; 011import java.util.Vector; 012 013import javax.swing.JButton; 014import javax.swing.JPanel; 015import javax.swing.JScrollPane; 016import javax.swing.JTable; 017import javax.swing.ListSelectionModel; 018import javax.swing.SwingUtilities; 019import javax.swing.table.DefaultTableModel; 020 021import org.apache.commons.lang.ObjectUtils; 022 023import com.ganteater.ae.desktop.ui.AEFrame; 024import com.ganteater.ae.processor.Processor; 025import com.ganteater.ae.util.xml.easyparser.Node; 026 027public class VariableViewPanel extends JPanel implements Editor { 028 029 private static final long serialVersionUID = 2888716197417976230L; 030 031 private JTable fVariablesTable = new JTable(); 032 033 private TaskEditor editor; 034 035 private Vector<Vector<String>> fVariables = new Vector<>(); 036 037 public void init(TaskEditor editor, Node node) { 038 setLayout(new BorderLayout()); 039 this.editor = editor; 040 041 fVariablesTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); 042 fVariablesTable.setCellSelectionEnabled(true); 043 044 JPanel panel = new JPanel(new BorderLayout()); 045 JButton button = new JButton(AEFrame.getIcon("refresh.png")); 046 button.addActionListener(new ActionListener() { 047 048 public void actionPerformed(ActionEvent arg0) { 049 SwingUtilities.invokeLater(() -> refreshData()); 050 } 051 052 }); 053 054 panel.add(button, BorderLayout.EAST); 055 add(panel, BorderLayout.NORTH); 056 fVariablesTable.setSize(new Dimension(0, 0)); 057 add(new JScrollPane(fVariablesTable), BorderLayout.CENTER); 058 refreshData(); 059 } 060 061 public void refreshData() { 062 if (editor.getTaskProcessor() != null) { 063 synchronized (fVariables) { 064 fVariables.removeAllElements(); 065 Map<String, Object> variables = new HashMap<String, Object>(Processor.getGlobalVariables()); 066 variables.putAll((Map<String, Object>) editor.getTaskProcessor().getVariables()); 067 loadProperties(variables); 068 069 Vector<String> columnNames = new Vector<>(); 070 columnNames.add("Name"); 071 columnNames.add("Value"); 072 073 DefaultTableModel dataModel = new DefaultTableModel(fVariables, columnNames) { 074 @Override 075 public boolean isCellEditable(int row, int column) { 076 return false; 077 } 078 }; 079 fVariablesTable.setModel(dataModel); 080 } 081 082 fVariablesTable.repaint(); 083 } 084 } 085 086 private void loadProperties(Map<String, Object> variables) { 087 Set tehKeySet = variables.keySet(); 088 Object[] theKeys = tehKeySet.toArray(); 089 Arrays.sort(theKeys); 090 091 for (int theCurId = 0; theCurId < theKeys.length; theCurId++) { 092 093 Vector theCurrentRow = new Vector(); 094 095 String key = (String) theKeys[theCurId]; 096 Object theValue = variables.get(key); 097 098 theCurrentRow.add(key); 099 if (theValue instanceof String) { 100 theCurrentRow.add(theValue); 101 } else if (theValue instanceof String[]) { 102 StringBuffer theBuffer = new StringBuffer(); 103 String[] valueArray = (String[]) theValue; 104 theBuffer.append("{ARRAY}["); 105 for (int i = 0; i < valueArray.length; i++) { 106 theBuffer.append(valueArray[i]); 107 if (i < valueArray.length - 1) { 108 theBuffer.append("]["); 109 } 110 } 111 theBuffer.append(']'); 112 theCurrentRow.add(theBuffer.toString()); 113 } else if (theValue instanceof Map) { 114 StringBuffer theBuffer = new StringBuffer(); 115 Map valueArray = (Map) theValue; 116 theBuffer.append("{MAP}[" + ObjectUtils.toString(valueArray)); 117 theBuffer.append(']'); 118 theCurrentRow.add(theBuffer.toString()); 119 } else { 120 StringBuffer theBuffer = new StringBuffer(); 121 theBuffer.append(ObjectUtils.toString(theValue)); 122 theCurrentRow.add(theBuffer.toString()); 123 } 124 fVariables.add(theCurrentRow); 125 } 126 } 127}