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}