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}