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}