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