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}