package jreepad; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import javax.swing.Box; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JScrollPane; import javax.swing.JSpinner; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.SpinnerNumberModel; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.table.AbstractTableModel; /** * The search dialog. * * @version $Id: SearchDialog.java,v 1.1 2007-02-05 11:06:44 pewu Exp $ */ public class SearchDialog extends JDialog { private JTextField nodeSearchField; private JComboBox searchWhereSelector; private JSpinner searchMaxNumSpinner; private JCheckBox searchCaseCheckBox; private AbstractTableModel searchResultsTableModel; private JTable searchResultsTable; private JScrollPane searchResultsTableScrollPane; private JLabel searchResultsLabel; private JreepadView theJreepad; public SearchDialog(Frame owner, JreepadView theJreepad) { super(owner, JreepadViewer.lang.getString("SEARCH_WINDOWTITLE"), false); this.theJreepad = theJreepad; setVisible(false); Box vBox = Box.createVerticalBox(); // Box hBox = Box.createHorizontalBox(); nodeSearchField = new JTextField(""); vBox.add(new JLabel(JreepadViewer.lang.getString("SEARCH_SEARCHFOR"))); hBox.add(nodeSearchField); nodeSearchField.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doTheSearch(); } }); nodeSearchField.addCaretListener(new CaretListener() { public void caretUpdate(CaretEvent e) { doTheSearch(); } }); vBox.add(hBox); // searchWhereSelector = new JComboBox(new String[] { JreepadViewer.lang.getString("SEARCH_SELECTEDNODE"), JreepadViewer.lang.getString("SEARCH_WHOLETREE") }); searchWhereSelector.setSelectedIndex(1); searchWhereSelector.setEditable(false); searchWhereSelector.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doTheSearch(); } }); hBox = Box.createHorizontalBox(); hBox.add(Box.createGlue()); hBox.add(new JLabel(JreepadViewer.lang.getString("SEARCH_SEARCHWHERE"))); hBox.add(searchWhereSelector); hBox.add(Box.createGlue()); hBox.add(searchCaseCheckBox = new JCheckBox(JreepadViewer.lang .getString("SEARCH_CASESENSITIVE"), false)); searchCaseCheckBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { doTheSearch(); } }); hBox.add(Box.createGlue()); vBox.add(hBox); // // searchMaxNumSpinner = new DSpinner(1,1000,getPrefs().searchMaxNum); searchMaxNumSpinner = new JSpinner(new SpinnerNumberModel(getPrefs().searchMaxNum, 1, 1000, 1)); /* * searchMaxNumSpinner.addCaretListener(new CaretListener(){ public void * caretUpdate(CaretEvent e){ doTheSearch();}}); searchMaxNumSpinner.addActionListener(new * ActionListener(){ public void actionPerformed(ActionEvent e){ doTheSearch();}}); */ searchMaxNumSpinner.getModel().addChangeListener(new ChangeListener() { public void stateChanged(ChangeEvent e) { doTheSearch(); } }); hBox = Box.createHorizontalBox(); hBox.add(Box.createGlue()); hBox.add(new JLabel(JreepadViewer.lang.getString("SEARCH_MAXRESULTS"))); hBox.add(searchMaxNumSpinner); hBox.add(Box.createGlue()); vBox.add(hBox); // // NOW FOR THE SEARCH RESULTS TABLE - COULD BE TRICKY! searchResultsTableModel = new AbstractTableModel() { private final String[] columns = new String[] { JreepadViewer.lang.getString("SEARCH_TBL_COL_NODE"), JreepadViewer.lang.getString("SEARCH_TBL_COL_ARTICLETEXT"), JreepadViewer.lang.getString("SEARCH_TBL_COL_FULLPATH") }; public int getColumnCount() { return columns.length; } public String getColumnName(int index) { return columns[index]; } public int getRowCount() { JreepadSearcher.JreepadSearchResult[] results = SearchDialog.this.theJreepad .getSearchResults(); if (results == null || results.length == 0) return 1; else return results.length; } public Object getValueAt(int row, int col) { JreepadSearcher.JreepadSearchResult[] results = SearchDialog.this.theJreepad .getSearchResults(); if (results == null || results.length == 0) switch (col) { case 2: return ""; case 1: return (nodeSearchField.getText() == "" ? JreepadViewer.lang .getString("SEARCH_TBL_BEFORERESULTS") : JreepadViewer.lang .getString("SEARCH_TBL_NORESULTS")); default: return ""; } else switch (col) { case 2: return results[row].getTreePath(); case 1: return results[row].getArticleQuote(); default: return results[row].getNode().getTitle(); } } }; searchResultsTable = new JTable(searchResultsTableModel); searchResultsTable.setCellSelectionEnabled(false); searchResultsTable.setColumnSelectionAllowed(false); searchResultsTable.setRowSelectionAllowed(true); searchResultsTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); searchResultsTableScrollPane = new JScrollPane(searchResultsTable); vBox.add(searchResultsLabel = new JLabel(JreepadViewer.lang.getString("SEARCH_RESULTS"))); vBox.add(searchResultsTableScrollPane); // // Add mouse listener MouseListener sml = new MouseAdapter() { public void mouseClicked(MouseEvent e) { mouseClickedOnSearchResultsTable(e); } }; searchResultsTable.addMouseListener(sml); // getContentPane().add(vBox); // Now we'll add some keyboard shortcuts KeyAdapter searchKeyListener = new KeyAdapter() { public void keyPressed(KeyEvent eek) { switch (eek.getKeyCode()) { case KeyEvent.VK_ESCAPE: setVisible(false); break; case KeyEvent.VK_W: if (eek.isControlDown() || eek.isMetaDown()) setVisible(false); break; } } }; addKeyListener(searchKeyListener); nodeSearchField.addKeyListener(searchKeyListener); searchCaseCheckBox.addKeyListener(searchKeyListener); searchWhereSelector.addKeyListener(searchKeyListener); searchResultsTable.addKeyListener(searchKeyListener); searchMaxNumSpinner.addKeyListener(searchKeyListener); searchResultsTable.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent eek) { switch (eek.getKeyCode()) { case KeyEvent.VK_SPACE: case KeyEvent.VK_ENTER: mouseClickedOnSearchResultsTable(null); break; } } }); // Finished establishing the search dialogue box } private void doTheSearch() { getPrefs().searchMaxNum = ((Integer)searchMaxNumSpinner.getValue()).intValue(); // DSpinner version getPrefs().searchMaxNum = searchMaxNumSpinner.getValue(); performSearch(nodeSearchField.getText(), nodeSearchField.getText(), // articleSearchField.getText(), searchWhereSelector.getSelectedIndex(), true /* searchCombinatorSelector.getSelectedIndex()==0 */, searchCaseCheckBox .isSelected(), getPrefs().searchMaxNum); } private boolean performSearch(String inNodes, String inArticles, int searchWhat /* 0=selected, 1=all */, boolean orNotAnd, boolean caseSensitive, int maxResults) { // setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); boolean ret = theJreepad.performSearch(inNodes, inArticles, searchWhat, orNotAnd, caseSensitive, maxResults); // setCursor(Cursor.getDefaultCursor()); if (!ret) { // JOptionPane.showMessageDialog(searchDialog, "Found nothing.", "Search result..." , // JOptionPane.INFORMATION_MESSAGE); searchResultsLabel.setText(JreepadViewer.lang.getString("SEARCH_RESULTS")); } else searchResultsLabel.setText(JreepadViewer.lang.getString("SEARCH_RESULTS") + theJreepad.getSearchResults().length + JreepadViewer.lang.getString("SEARCH_NODES_MATCHED")); searchResultsTableModel.fireTableStructureChanged(); // searchResultsTable.repaint(); return ret; } private void mouseClickedOnSearchResultsTable(MouseEvent e) { JreepadSearcher.JreepadSearchResult[] results = theJreepad.getSearchResults(); int selectedRow = searchResultsTable.getSelectedRow(); if (results == null || results.length == 0 || selectedRow == -1) return; // Select the node in the tree theJreepad.getTree().setSelectionPath(results[selectedRow].getTreePath()); theJreepad.getTree().scrollPathToVisible(results[selectedRow].getTreePath()); } private static JreepadPrefs getPrefs() { return JreepadView.getPrefs(); } public void setJreepad(JreepadView theJreepad) { this.theJreepad = theJreepad; } public void open() { setVisible(true); nodeSearchField.requestFocus(); nodeSearchField.setSelectionStart(0); } }