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