001package com.ganteater.ae.desktop.ui;
002
003import java.awt.BorderLayout;
004import java.awt.Font;
005import java.awt.event.KeyAdapter;
006import java.awt.event.KeyEvent;
007import java.awt.event.MouseAdapter;
008import java.awt.event.MouseEvent;
009import java.util.Arrays;
010import java.util.Set;
011import java.util.TreeSet;
012import java.util.Vector;
013
014import javax.swing.BorderFactory;
015import javax.swing.DefaultCellEditor;
016import javax.swing.JButton;
017import javax.swing.JCheckBox;
018import javax.swing.JOptionPane;
019import javax.swing.JPanel;
020import javax.swing.JScrollPane;
021import javax.swing.JTable;
022import javax.swing.JTextField;
023import javax.swing.ListSelectionModel;
024import javax.swing.SwingUtilities;
025import javax.swing.border.EmptyBorder;
026import javax.swing.table.AbstractTableModel;
027import javax.swing.table.DefaultTableModel;
028import javax.swing.table.TableColumn;
029
030import org.apache.commons.lang.StringUtils;
031
032import com.ganteater.ae.AEWorkspace;
033import com.ganteater.ae.CommandException;
034import com.ganteater.ae.desktop.editor.TaskEditor;
035
036public class RecipesPanel extends JPanel {
037
038        private static final long serialVersionUID = -7864956226414737090L;
039
040        private static final String MENU_PREFERENCE_PROP_NAME = "MenuPreferences";
041
042        private Vector<Vector<Object>> pathVaribles = new Vector<>();
043
044        private AEFrame aeFrame;
045
046        private Set<String> menuTasks = new TreeSet<>();
047
048        private JTable table = new JTable();
049
050        private JTextField filter = new JTextField();
051
052        public RecipesPanel(AEFrame aeFrame) {
053                super(new BorderLayout());
054
055                this.aeFrame = aeFrame;
056
057                Vector<String> columns = new Vector<>();
058
059                columns.add("Menu");
060                columns.add("Name");
061                columns.add("Path");
062
063                DefaultTableModel defaultTableModel = new DefaultTableModel(pathVaribles, columns) {
064
065                        private static final long serialVersionUID = 1L;
066
067                        @Override
068                        public boolean isCellEditable(int row, int column) {
069                                return column == 0;
070                        }
071
072                        @Override
073                        public Class<?> getColumnClass(int coll) {
074                                if (coll == 0)
075                                        return Boolean.class;
076                                return String.class;
077                        }
078
079                        @Override
080                        public void setValueAt(Object value, int row, int coll) {
081                                if (coll == 0) {
082                                        Vector<Object> vector = pathVaribles.get(row);
083                                        vector.set(0, value);
084                                        String task = (String) vector.get(1);
085                                        if ((boolean) value) {
086                                                menuTasks.add(task);
087                                        } else {
088                                                menuTasks.remove(task);
089                                        }
090                                        saveMenuList();
091                                }
092                        }
093                };
094
095                table.setModel(defaultTableModel);
096                table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
097                table.setCellSelectionEnabled(true);
098                table.addMouseListener(new MouseAdapter() {
099
100                        @Override
101                        public void mouseClicked(MouseEvent arg0) {
102                                try {
103                                        if (arg0.getClickCount() == 2) {
104                                                int selectedRow = table.getSelectedRow();
105                                                if (selectedRow >= 0) {
106                                                        String name = (String) table.getModel().getValueAt(selectedRow, 1);
107                                                        TaskEditor editTask = aeFrame.editTask(name);
108                                                        if (editTask != null) {
109                                                                editTask.setRunButtonAction(true);
110                                                                if (arg0.isControlDown()) {
111                                                                        editTask.runTaskNode();
112                                                                }
113                                                        }
114                                                }
115
116                                        }
117                                } catch (Exception e) {
118                                        JOptionPane.showMessageDialog(JOptionPane.getRootFrame(),
119                                                        "Unexpected error: " + e.getMessage());
120                                        e.printStackTrace();
121                                }
122                        }
123
124                });
125
126                TableColumn column = table.getColumnModel().getColumn(0);
127                column.setPreferredWidth(40);
128                column.setMaxWidth(40);
129                column.setCellEditor(new DefaultCellEditor(new JCheckBox()));
130
131                column = table.getColumnModel().getColumn(1);
132                column.setPreferredWidth(200);
133
134                column = table.getColumnModel().getColumn(2);
135                column.setPreferredWidth(28);
136
137                table.getTableHeader().setReorderingAllowed(false);
138
139                filter.setBorder(BorderFactory.createEtchedBorder());
140                filter.addKeyListener(new KeyAdapter() {
141                        @Override
142                        public void keyReleased(KeyEvent e) {
143                                refreshTaskPathTable();
144                                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
145                                        int rowCount = table.getRowCount();
146                                        if (rowCount == 1) {
147                                                String taskName = (String) table.getModel().getValueAt(0, 1);
148                                                TaskEditor editTask;
149                                                try {
150                                                        editTask = aeFrame.editTask(taskName);
151                                                        if (editTask != null) {
152                                                                editTask.setRunButtonAction(true);
153                                                        }
154                                                } catch (CommandException e1) {
155                                                        // TODO Auto-generated catch block
156                                                        e1.printStackTrace();
157                                                }
158                                        }
159                                }
160                        }
161                });
162
163                JPanel filterPanel = new JPanel(new BorderLayout());
164                filterPanel.add(filter, BorderLayout.CENTER);
165                JButton cleanFilterBtn = new JButton("X");
166                cleanFilterBtn.addActionListener(e -> {
167                        filter.setText("");
168                        refreshTaskPathTable();
169                });
170                filter.addKeyListener(new KeyAdapter() {
171                        @Override
172                        public void keyPressed(KeyEvent e) {
173                                if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
174                                        filter.setText("");
175                                }
176                        }
177                });
178                cleanFilterBtn.setFont(new Font(cleanFilterBtn.getFont().getName(), Font.PLAIN, 14));
179                cleanFilterBtn.setBorder(new EmptyBorder(0, 0, 0, 0));
180                cleanFilterBtn.setBorderPainted(false);
181                filterPanel.add(cleanFilterBtn, BorderLayout.EAST);
182                add(filterPanel, BorderLayout.NORTH);
183
184                add(new JScrollPane(table), BorderLayout.CENTER);
185        }
186
187        public void refreshTaskPathTable() {
188                String filerText = filter.getText();
189
190                pathVaribles.removeAllElements();
191                String menuPrefStr = AEWorkspace.getInstance().getDefaultUserConfiguration(MENU_PREFERENCE_PROP_NAME, null);
192                String[] prefMenu = StringUtils.split(menuPrefStr, ";");
193                if (prefMenu != null) {
194                        Set<Object> tehKeySet = aeFrame.getWorkspace().getTestsDescList().keySet();
195                        for (String menu : prefMenu) {
196                                if (tehKeySet.contains(menu)) {
197                                        menuTasks.add(menu);
198                                }
199                        }
200                }
201
202                Set<Object> tehKeySet = aeFrame.getWorkspace().getTestsDescList().keySet();
203                Object[] theKeys = tehKeySet.toArray();
204                Arrays.sort(theKeys);
205
206                for (int theCurId = 0; theCurId < theKeys.length; theCurId++) {
207
208                        String key = (String) theKeys[theCurId];
209                        Object theValue = aeFrame.getWorkspace().getTestsDescList().get(key);
210
211                        boolean menu = menuTasks.contains(key);
212                        if ((StringUtils.isBlank(filerText) || StringUtils.containsIgnoreCase(key, filerText)
213                                        || (StringUtils.containsIgnoreCase("menu", filerText) && menu)) && (!StringUtils.isBlank(filerText) || !key.startsWith("#"))) {
214                                        Vector<Object> theCurrentRow = new Vector<>();
215                                        theCurrentRow.add(menu);
216                                        theCurrentRow.add(key);
217                                        theCurrentRow.add(theValue);
218
219                                        pathVaribles.add(theCurrentRow);
220                        }
221                }
222
223                ((AbstractTableModel) table.getModel()).fireTableDataChanged();
224        }
225
226        private void saveMenuList() {
227                AEWorkspace.getInstance().setDefaultUserConfiguration(MENU_PREFERENCE_PROP_NAME,
228                                StringUtils.join(menuTasks, ";"));
229        }
230
231        public void refresh() {
232                SwingUtilities.invokeLater(new Runnable() {
233                        public void run() {
234                                invalidate();
235                                repaint();
236                        }
237                });
238        }
239
240        public void setMenuTask(String task) {
241                menuTasks.add(task);
242        }
243
244        public Set<String> getMenuTasks() {
245                return menuTasks;
246        }
247
248        public JTable getTable() {
249                return table;
250        }
251
252}