/* * Jalview - A Sequence Alignment Editor and Viewer * Copyright (C) 2005 AM Waterhouse, J Procter, G Barton, M Clamp, S Searle * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package jalview.gui; import jalview.datamodel.*; import jalview.jbgui.*; import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import javax.swing.event.*; /** * DOCUMENT ME! * * @author $author$ * @version $Revision$ */ public class Finder extends GFinder { AlignViewport av; AlignmentPanel ap; JInternalFrame frame; int seqIndex = 0; int resIndex = 0; SearchResults searchResults; /** * Creates a new Finder object. * * @param av DOCUMENT ME! * @param ap DOCUMENT ME! * @param f DOCUMENT ME! */ public Finder(AlignViewport av, AlignmentPanel ap, JInternalFrame f) { this.av = av; this.ap = ap; frame = f; // all a big pain, but we need to wait until the frame is visible before the textfield can // obtain the focus///////////////////////// frame.addInternalFrameListener(new InternalFrameAdapter() { public void internalFrameOpened(InternalFrameEvent evt) { SwingUtilities.invokeLater(new Runnable() { public void run() { textfield.requestFocus(); } }); } }); } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ public void findNext_actionPerformed(ActionEvent e) { doSearch(false); } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ public void findAll_actionPerformed(ActionEvent e) { resIndex = 0; seqIndex = 0; doSearch(true); } /** * DOCUMENT ME! * * @param e DOCUMENT ME! */ public void createNewGroup_actionPerformed(ActionEvent e) { JLabel label = new JLabel("Enter name of new sequence feature"); JTextField textinput = new JTextField(textfield.getText()); JPanel panel = new JPanel(new BorderLayout()); panel.add(label, BorderLayout.NORTH); panel.add(textinput, BorderLayout.SOUTH); int reply = JOptionPane.showInternalConfirmDialog(Desktop.desktop, panel, "New Sequence Feature Name", JOptionPane.OK_CANCEL_OPTION ); if(reply != JOptionPane.OK_OPTION) return; for (int i = 0; i < searchResults.getSize(); i ++ ) { SequenceI seq = searchResults.getResultSequence(i); SequenceFeature sf = new SequenceFeature(textinput.getText(), "Search Results", null, searchResults.getResultStart(i), searchResults.getResultEnd(i), "Search Results"); ap.seqPanel.seqCanvas.getFeatureRenderer().addNewFeature( textinput.getText(), new Color(60,160,115), "Search Results"); seq.getDatasetSequence().addSequenceFeature(sf); } ap.seqPanel.seqCanvas.getFeatureRenderer().findAllFeatures(); ap.alignFrame.showSeqFeatures.setSelected(true); av.setShowSequenceFeatures(true); ap.highlightSearchResults(null); } /** * DOCUMENT ME! * * @param findAll DOCUMENT ME! */ void doSearch(boolean findAll) { createNewGroup.setEnabled(false); String searchString = textfield.getText().trim(); if(!caseSensitive.isSelected()) searchString = searchString.toUpperCase(); if(searchString.length()<1) return; com.stevesoft.pat.Regex regex = new com.stevesoft.pat.Regex(searchString); searchResults = new SearchResults(); Sequence seq; String item = null; boolean found = false; ////// is the searchString a residue number? try { int res = Integer.parseInt(searchString); found = true; if (av.getSelectionGroup() == null || av.getSelectionGroup().getSize(false) < 1) { seq = (Sequence) av.getAlignment().getSequenceAt(0); } else { seq = (Sequence) (av.getSelectionGroup().getSequenceAt(0)); } searchResults.addResult(seq, res, res); } catch (NumberFormatException ex) { } /////////////////////////////////////////////// int end = av.alignment.getHeight(); SequenceGroup selection = av.getSelectionGroup(); if (selection != null) { if ((selection.getSize(false) < 1) || ((selection.getEndRes() - selection.getStartRes()) < 2)) { selection = null; } } while (!found && (seqIndex < end)) { seq = (Sequence) av.alignment.getSequenceAt(seqIndex); if ((selection != null) && !selection.getSequences(false).contains(seq)) { seqIndex++; resIndex = 0; continue; } item = seq.getSequence(); if(!caseSensitive.isSelected()) item = item.toUpperCase(); if ((selection != null) && (selection.getEndRes() < av.alignment.getWidth()-1)) { item = item.substring(0, selection.getEndRes() + 1); } ///Shall we ignore gaps???? StringBuffer noGapsSB = new StringBuffer(); int insertCount = 0; Vector spaces = new Vector(); for (int j = 0; j < item.length(); j++) { if (!jalview.util.Comparison.isGap(item.charAt(j))) { noGapsSB.append(item.charAt(j)); spaces.add(new Integer(insertCount)); } else { insertCount++; } } String noGaps = noGapsSB.toString(); for (int r = resIndex; r < noGaps.length(); r++) { if (regex.searchFrom(noGaps, r)) { resIndex = regex.matchedFrom(); if ((selection != null) && ((resIndex + Integer.parseInt(spaces.get(resIndex).toString())) < selection.getStartRes())) { continue; } int sres = seq.findPosition(resIndex + Integer.parseInt(spaces.elementAt(resIndex) .toString())); int eres = seq.findPosition(regex.matchedTo() - 1 + Integer.parseInt(spaces.elementAt(regex.matchedTo() - 1).toString())); searchResults.addResult(seq, sres, eres); if (!findAll) { // thats enough, break and display the result found = true; resIndex++; break; } r = resIndex; } else { break; } } if (!found) { seqIndex++; resIndex = 0; } } Vector idMatch = new Vector(); for (int id = 0; id < av.alignment.getHeight(); id++) { if (regex.search(av.alignment.getSequenceAt(id).getName())) { idMatch.add(av.alignment.getSequenceAt(id)); } } if ((searchResults.getSize() == 0) && (idMatch.size() > 0)) { ap.idPanel.highlightSearchResults(idMatch); } int resultSize = searchResults.getSize(); if (searchResults.getSize() > 0) createNewGroup.setEnabled(true); else searchResults = null; // if allResults is null, this effectively switches displaySearch flag in seqCanvas ap.highlightSearchResults(searchResults); if(!findAll && resultSize==0) { JOptionPane.showInternalMessageDialog(this, "Finished searching", null, JOptionPane.INFORMATION_MESSAGE); resIndex = 0; seqIndex = 0; } if (findAll) { String message = resultSize + " matches found."; JOptionPane.showInternalMessageDialog(this, message, null, JOptionPane.INFORMATION_MESSAGE); } } }