/* * 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.appletgui; import java.util.*; import java.awt.*; import java.awt.event.*; import jalview.datamodel.*; import jalview.jbappletgui.*; public class Finder extends GFinder { AlignViewport av; AlignmentPanel ap; Frame frame; SuperGroup searchGroup; Vector searchResults; int seqIndex = 0; int resIndex = 0; public Finder(final AlignmentPanel ap) { this.av = ap.av; this.ap = ap; frame = new Frame(); frame.add(this); jalview.bin.JalviewLite.addFrame(frame, "Find", 340, 120); frame.repaint(); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { ap.highlightSearchResults(null); } }); } public void textfield_actionPerformed(ActionEvent e) { doSearch(false); } public void findNext_actionPerformed(ActionEvent e) { doSearch(false); } public void findAll_actionPerformed(ActionEvent e) { resIndex = 0; seqIndex = 0; doSearch(true); } public void cancel_actionPerformed(ActionEvent e) { try { // if allResults is null, this effectively switches displaySearch flag in seqCanvas ap.highlightSearchResults(null); ap.idPanel.highlightSearchResults(null); // frame.setClosed(true); } catch (Exception ex) {} } public void createNewGroup_actionPerformed(ActionEvent e) { Color[] newColors = new Color[24]; for (int i = 0; i < 24; i++) { newColors[i] = new Color(60, 160, 115); } jalview.schemes.UserColourScheme ucs = new jalview.schemes.UserColourScheme( newColors); String searchString = textfield.getText(); searchGroup = new SuperGroup(searchString, ucs, true, true, false); for (int i = 0; i < searchResults.size(); i += 3) { // its possible edits may have occurred since search was performed // account for this here SequenceI seq = av.alignment.getSequenceAt(Integer.parseInt(searchResults. elementAt(i).toString())); int startRes = seq.findIndex(Integer.parseInt(searchResults.elementAt(i + 1).toString())) - 1; int endRes = seq.findIndex(Integer.parseInt(searchResults.elementAt(i + 2). toString())) - 1; SequenceGroup sg = new SequenceGroup(searchString, ucs, true, true, false, startRes, endRes); sg.addSequence(seq, false); av.alignment.addGroup(sg); searchGroup.addGroup(sg); } ap.av.alignment.addSuperGroup(searchGroup); ap.highlightSearchResults(null); } void doSearch(boolean findAll) { createNewGroup.setEnabled(false); String searchString = textfield.getText().toUpperCase(); com.stevesoft.pat.Regex regex = new com.stevesoft.pat.Regex(searchString); searchResults = new Vector(); int[] allResults = null; 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() < 1) { seq = (Sequence) av.getAlignment().getSequenceAt(0); } else { seq = (Sequence) (av.getSelectionGroup().getSequenceAt(0)); } searchResults.addElement(Integer.toString(av.getAlignment().findIndex(seq))); searchResults.addElement(String.valueOf(res)); searchResults.addElement(String.valueOf(res)); } catch (NumberFormatException ex) {} /////////////////////////////////////////////// int end = av.alignment.getHeight(); SequenceGroup selection = av.getSelectionGroup(); if (selection != null) { if (selection.getSize() < 1 || (selection.getEndRes() - selection.getStartRes() < 2)) { selection = null; } } while (!found && seqIndex < end) { seq = (Sequence) av.alignment.getSequenceAt(seqIndex); if (selection != null && !selection.sequences.contains(seq)) { seqIndex++; resIndex = 0; continue; } item = seq.getSequence().toUpperCase(); if (selection != null && selection.getEndRes() < av.alignment.getWidth()) { item = item.substring(0, selection.getEndRes() + 1); } ///Shall we ignore gaps???? StringBuffer noGaps = 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))) { noGaps.append(item.charAt(j)); spaces.addElement(new Integer(insertCount)); } else { insertCount++; } } for (int r = resIndex; r < noGaps.length(); r++) { if (regex.searchFrom(noGaps.toString(), r)) { resIndex = regex.matchedFrom(); if (selection != null && (resIndex + Integer.parseInt(spaces.elementAt(resIndex).toString())) < selection.getStartRes()) { continue; } searchResults.addElement(Integer.toString(seqIndex)); 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.addElement(sres + ""); searchResults.addElement(eres + ""); if (!findAll) { // thats enough, break and display the result found = true; resIndex++; break; } r = resIndex; } } 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.addElement(av.alignment.getSequenceAt(id)); } } if (searchResults.size() == 0 && idMatch.size() > 0) { ap.idPanel.highlightSearchResults(idMatch); } if (searchResults.size() > 0) { allResults = new int[searchResults.size()]; for (int i = 0; i < searchResults.size(); i++) { allResults[i] = Integer.parseInt(searchResults.elementAt(i).toString()); } createNewGroup.setEnabled(true); } else { resIndex = 0; seqIndex = 0; } // if allResults is null, this effectively switches displaySearch flag in seqCanvas ap.highlightSearchResults(allResults); if (findAll) { String message = (searchResults.size() / 3) + " matches found."; System.out.println(message); } } }