/* * JPanel.java * * Created on 19 June 2005, 01:41 */ package org.owasp.webscarab.plugin.search.swing; import java.awt.event.ActionEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Date; import javax.swing.Action; import javax.swing.DefaultComboBoxModel; import javax.swing.JPanel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.TableModel; import org.owasp.webscarab.model.ConversationID; import org.owasp.webscarab.model.ConversationModel; import org.owasp.webscarab.model.HttpUrl; import org.owasp.webscarab.plugin.search.Search; import org.owasp.webscarab.plugin.search.SearchModel; import org.owasp.webscarab.ui.swing.ColumnWidthTracker; import org.owasp.webscarab.ui.swing.ConversationTableModel; import org.owasp.webscarab.ui.swing.DateRenderer; import org.owasp.webscarab.ui.swing.ShowConversationAction; import org.owasp.webscarab.ui.swing.SwingPluginUI; import org.owasp.webscarab.util.swing.ColumnDataModel; import org.owasp.webscarab.util.swing.SwingWorker; import org.owasp.webscarab.util.swing.TableSorter; /** * * @author rogan */ public class SearchPanel extends JPanel implements SwingPluginUI { /** * */ private static final long serialVersionUID = -594313478603602953L; private Search _search; private SearchModel _model; private ConversationModel _conversationModel; private DefaultComboBoxModel _searches = new DefaultComboBoxModel(); private ShowConversationAction _showConversationAction; private TableSorter _conversationSorter; /** Creates new form JPanel */ public SearchPanel(Search search) { _search = search; _model = search.getModel(); _conversationModel = _model.getConversationModel(); initComponents(); searchList.setModel(_searches); searchComboBox.setModel(_searches); _model.addPropertyChangeListener(new Listener()); searchList.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent evt) { Object selected = searchList.getSelectedValue(); String description = ""; String expression = ""; if (selected != null) { description = (String) selected; expression = _model.getSearchExpression(description); } descriptionTextField.setText(description); expressionTextArea.setText(expression); } }); TableModel tm = new ConversationTableModel(_conversationModel); _conversationSorter = new TableSorter(tm, conversationTable.getTableHeader()); conversationTable.setModel(_conversationSorter); conversationTable.setDefaultRenderer(Date.class, new DateRenderer()); ColumnWidthTracker.getTracker("ConversationTable").addTable(conversationTable); _showConversationAction = new ShowConversationAction(_model.getConversationModel()); conversationTable.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) { int row = conversationTable.getSelectedRow(); row = _conversationSorter.modelIndex(row); if (row >-1) { ConversationID id = _conversationModel.getConversationAt(row); _showConversationAction.putValue("CONVERSATION", id); ActionEvent evt = new ActionEvent(conversationTable, 0, (String) _showConversationAction.getValue(Action.ACTION_COMMAND_KEY)); _showConversationAction.actionPerformed(evt); } } } }); updateSearches(); } private void updateSearches() { _searches.removeAllElements(); String[] searches = _model.getSearches(); for (int i=0; i<searches.length; i++) { _searches.addElement(searches[i]); } } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ private void initComponents() {//GEN-BEGIN:initComponents java.awt.GridBagConstraints gridBagConstraints; jSplitPane1 = new javax.swing.JSplitPane(); searchPanel = new javax.swing.JPanel(); jLabel2 = new javax.swing.JLabel(); jScrollPane3 = new javax.swing.JScrollPane(); searchList = new javax.swing.JList(); jLabel1 = new javax.swing.JLabel(); descriptionTextField = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel(); jScrollPane4 = new javax.swing.JScrollPane(); expressionTextArea = new javax.swing.JTextArea(); jPanel3 = new javax.swing.JPanel(); addButton = new javax.swing.JButton(); deleteButton = new javax.swing.JButton(); reloadButton = new javax.swing.JButton(); resultsPanel = new javax.swing.JPanel(); searchComboBox = new javax.swing.JComboBox(); conversationScrollPane = new javax.swing.JScrollPane(); conversationTable = new javax.swing.JTable(); setLayout(new java.awt.BorderLayout()); jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT); jSplitPane1.setOneTouchExpandable(true); searchPanel.setLayout(new java.awt.GridBagLayout()); jLabel2.setText("Searches"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; searchPanel.add(jLabel2, gridBagConstraints); jScrollPane3.setPreferredSize(new java.awt.Dimension(0, 0)); searchList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); jScrollPane3.setViewportView(searchList); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.2; gridBagConstraints.weighty = 1.0; searchPanel.add(jScrollPane3, gridBagConstraints); jLabel1.setText("Description"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; searchPanel.add(jLabel1, gridBagConstraints); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; searchPanel.add(descriptionTextField, gridBagConstraints); jLabel3.setText("Search Expression"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; searchPanel.add(jLabel3, gridBagConstraints); jScrollPane4.setMinimumSize(new java.awt.Dimension(22, 44)); jScrollPane4.setPreferredSize(new java.awt.Dimension(0, 0)); jScrollPane4.setViewportView(expressionTextArea); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; gridBagConstraints.weightx = 0.8; gridBagConstraints.weighty = 0.5; searchPanel.add(jScrollPane4, gridBagConstraints); jPanel3.setLayout(new java.awt.GridLayout(1, 0)); addButton.setText("Add"); addButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { addButtonActionPerformed(evt); } }); jPanel3.add(addButton); deleteButton.setText("Delete"); deleteButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { deleteButtonActionPerformed(evt); } }); jPanel3.add(deleteButton); reloadButton.setText("Reload"); reloadButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { reloadButtonActionPerformed(evt); } }); jPanel3.add(reloadButton); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 4; searchPanel.add(jPanel3, gridBagConstraints); jSplitPane1.setLeftComponent(searchPanel); resultsPanel.setLayout(new java.awt.BorderLayout()); searchComboBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { searchComboBoxActionPerformed(evt); } }); resultsPanel.add(searchComboBox, java.awt.BorderLayout.NORTH); conversationTable.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { }, new String [] { } )); conversationTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_OFF); conversationScrollPane.setViewportView(conversationTable); resultsPanel.add(conversationScrollPane, java.awt.BorderLayout.CENTER); jSplitPane1.setRightComponent(resultsPanel); add(jSplitPane1, java.awt.BorderLayout.CENTER); }//GEN-END:initComponents private void searchComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchComboBoxActionPerformed Object selected = searchComboBox.getSelectedItem(); if (selected != null) { String description = (String) selected; _search.setFilter(description); } }//GEN-LAST:event_searchComboBoxActionPerformed private void reloadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reloadButtonActionPerformed Object selected = searchList.getSelectedValue(); if (selected != null) { final String description = (String) selected; reload(description); } }//GEN-LAST:event_reloadButtonActionPerformed private void deleteButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_deleteButtonActionPerformed Object selected = searchList.getSelectedValue(); if (selected != null) { String description = (String) selected; _search.removeSearch(description); } }//GEN-LAST:event_deleteButtonActionPerformed private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addButtonActionPerformed String description = descriptionTextField.getText(); String expression = expressionTextArea.getText(); if (!description.equals("") && !expression.equals("")) { _search.addSearch(description, expression); reload(description); searchList.setSelectedValue(description, true); searchComboBox.setSelectedItem(description); } }//GEN-LAST:event_addButtonActionPerformed private void reload(final String description) { addButton.setEnabled(false); deleteButton.setEnabled(false); reloadButton.setEnabled(false); SwingWorker worker = new SwingWorker() { public Object construct() { System.err.println("Reloading " + description); _search.reload(description); return null; } public void finished() { addButton.setEnabled(true); deleteButton.setEnabled(true); reloadButton.setEnabled(true); } }; worker.start(); } public Action[] getConversationActions() { return new Action[0]; } public ColumnDataModel<ConversationID>[] getConversationColumns() { return null; } public JPanel getPanel() { return this; } public String getPluginName() { return _search.getPluginName(); } public Action[] getUrlActions() { return new Action[0]; } public ColumnDataModel<HttpUrl>[] getUrlColumns() { return null; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton addButton; private javax.swing.JScrollPane conversationScrollPane; private javax.swing.JTable conversationTable; private javax.swing.JButton deleteButton; private javax.swing.JTextField descriptionTextField; private javax.swing.JTextArea expressionTextArea; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JPanel jPanel3; private javax.swing.JScrollPane jScrollPane3; private javax.swing.JScrollPane jScrollPane4; private javax.swing.JSplitPane jSplitPane1; private javax.swing.JButton reloadButton; private javax.swing.JPanel resultsPanel; private javax.swing.JComboBox searchComboBox; private javax.swing.JList searchList; private javax.swing.JPanel searchPanel; // End of variables declaration//GEN-END:variables private class Listener implements PropertyChangeListener { public void propertyChange(PropertyChangeEvent evt) { if (evt.getPropertyName().equals(SearchModel.PROPERTY_SEARCHES)) { Runnable runner = new Runnable() { public void run() { updateSearches(); } }; runOnEDT(runner); } } private void runOnEDT(Runnable runner) { try { if (!SwingUtilities.isEventDispatchThread()) { SwingUtilities.invokeAndWait(runner); } else { runner.run(); } } catch (Exception e) { e.printStackTrace(); } } } }