/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.clothocad.tool.sequenceview;
import java.util.regex.*;
/**
*
* @author Nade Sritanyaratana
* @author Roza Ghamari
*/
public class ClothoSearchUtil {
/** Constructor. Instantiates ClothoHelper.
* @param pattern
* @param searchtext
*/
public ClothoSearchUtil(String pattern, String searchtext){
makePattern(pattern, "");
makeSearchIndex(searchtext);
patternString = pattern;
searchText = searchtext;
}
/**
* Constructor. Option determines if search should be case sensitive.
* @param pattern
* @param searchtext
* @param option
*/
public ClothoSearchUtil(String pattern, String searchtext, String option){
makePattern(pattern, option);
makeSearchIndex(searchtext);
patternString = pattern;
searchText = searchtext;
}
public int getHitCount(){
return _hitCount;
}
public int[][] getSearch(){
return _search;
}
public int[] getSearchEnd(){
return _searchEnd;
}
public int[] getSearchStart(){
return _searchStart;
}
private void makePattern(String pattern, String option) {
if (option.matches("case")) {
_pattern = java.util.regex.Pattern.compile(pattern,
java.util.regex.Pattern.UNIX_LINES +
java.util.regex.Pattern.MULTILINE);
}
else
_pattern = java.util.regex.Pattern.compile(pattern,
java.util.regex.Pattern.CASE_INSENSITIVE +
java.util.regex.Pattern.UNIX_LINES +
java.util.regex.Pattern.MULTILINE);
}
/**
* makeSearchIndex creates an int[][] = search[i][j].
* i=0 corresponds to the start of match j.
* i=1 corresponds to the end of match j.
* j corresponds to a particular match, j=0 being the first match.
* @param pattern
* @param searchtext
*/
private void makeSearchIndex(String searchtext) {
_matcher = _pattern.matcher(searchtext);
_hitCount = 0;
while (_matcher.find()){
_hitCount++;
}
_matcher.reset();
_search = new int[2][_hitCount];
_searchStart = new int[_hitCount];
_searchEnd = new int[_hitCount];
int newlinecompensation = 0;
for (int i=0; _matcher.find(); i++){
newlinecompensation = subSearch("\n",searchtext.substring(0, _matcher.end()));
_searchStart[i]=_matcher.start() - newlinecompensation;
_searchEnd[i]=_matcher.end() - newlinecompensation;
}
_search[0]= _searchStart;
_search[1]= _searchEnd;
}
/**
* subsearch used only for "meta" ClothoSearchUtil purposes. Its uses are
* listed below:
* 1. to search how many newlines there are in the substring for a JTextPane
* hack (see ClothoHelpConnection.search).
*
* Returns an int corresponding to hitcount.
* @param pattern
* @param searchtext
* @return
*/
private int subSearch(String pattern, String searchtext) {
Pattern p = java.util.regex.Pattern.compile(pattern,
java.util.regex.Pattern.UNIX_LINES +
java.util.regex.Pattern.MULTILINE);
Matcher m = p.matcher(searchtext);
int hitCount = 0;
while (m.find()){
hitCount++;
}
return hitCount;
}
private int _hitCount;
private int[] _searchEnd;
private int[] _searchStart;
private int[][] _search;
private Matcher _matcher;
private Pattern _pattern;
public String patternString;
public String searchText;
}