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.Button;
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        @Override
038        public void init(TaskEditor editor) {
039                setLayout(new BorderLayout());
040                this.editor = editor;
041
042                fVariablesTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
043                fVariablesTable.setCellSelectionEnabled(true);
044
045                JPanel panel = new JPanel(new BorderLayout());
046                JButton button = new Button("refresh.png");
047                button.addActionListener(new ActionListener() {
048
049                        public void actionPerformed(ActionEvent arg0) {
050                                SwingUtilities.invokeLater(() -> refreshData());
051                        }
052
053                });
054
055                panel.add(button, BorderLayout.EAST);
056                add(panel, BorderLayout.NORTH);
057                fVariablesTable.setSize(new Dimension(0, 0));
058                add(new JScrollPane(fVariablesTable), BorderLayout.CENTER);
059                refreshData();
060        }
061
062        public void refreshData() {
063                if (editor.getTaskProcessor() != null) {
064                        synchronized (fVariables) {
065                                fVariables.removeAllElements();
066                                Map<String, Object> variables = new HashMap<String, Object>(Processor.getGlobalVariables());
067                                variables.putAll((Map<String, Object>) editor.getTaskProcessor().getVariables());
068                                loadProperties(variables);
069
070                                Vector<String> columnNames = new Vector<>();
071                                columnNames.add("Name");
072                                columnNames.add("Value");
073
074                                DefaultTableModel dataModel = new DefaultTableModel(fVariables, columnNames) {
075                                        @Override
076                                        public boolean isCellEditable(int row, int column) {
077                                                return false;
078                                        }
079                                };
080                                fVariablesTable.setModel(dataModel);
081                        }
082
083                        fVariablesTable.repaint();
084                }
085        }
086
087        private void loadProperties(Map<String, Object> variables) {
088                Set tehKeySet = variables.keySet();
089                Object[] theKeys = tehKeySet.toArray();
090                Arrays.sort(theKeys);
091
092                for (int theCurId = 0; theCurId < theKeys.length; theCurId++) {
093
094                        Vector theCurrentRow = new Vector();
095
096                        String key = (String) theKeys[theCurId];
097                        Object theValue = variables.get(key);
098
099                        theCurrentRow.add(key);
100                        if (theValue instanceof String) {
101                                theCurrentRow.add(theValue);
102                        } else if (theValue instanceof String[]) {
103                                StringBuffer theBuffer = new StringBuffer();
104                                String[] valueArray = (String[]) theValue;
105                                theBuffer.append("{ARRAY}[");
106                                for (int i = 0; i < valueArray.length; i++) {
107                                        theBuffer.append(valueArray[i]);
108                                        if (i < valueArray.length - 1) {
109                                                theBuffer.append("][");
110                                        }
111                                }
112                                theBuffer.append(']');
113                                theCurrentRow.add(theBuffer.toString());
114                        } else if (theValue instanceof Map) {
115                                StringBuffer theBuffer = new StringBuffer();
116                                Map valueArray = (Map) theValue;
117                                theBuffer.append("{MAP}[" + ObjectUtils.toString(valueArray));
118                                theBuffer.append(']');
119                                theCurrentRow.add(theBuffer.toString());
120                        } else {
121                                StringBuffer theBuffer = new StringBuffer();
122                                theBuffer.append(ObjectUtils.toString(theValue));
123                                theCurrentRow.add(theBuffer.toString());
124                        }
125                        fVariables.add(theCurrentRow);
126                }
127        }
128
129        @Override
130        public void setEditorNode(Node editorNode) {
131        }
132}