/*
* WordSearcher.java
*
* Created on 22 March 2007, 19:13
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package vizzy.tasks;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JTextArea;
import javax.swing.text.BadLocationException;
import javax.swing.text.Highlighter;
import org.apache.log4j.Logger;
import vizzy.comp.JScrollHighlightPanel;
import vizzy.model.Conf;
import vizzy.model.SearchResult;
import vizzy.model.SettingsModel;
/**
*
* @author Admin
*/
public class WordSearcher {
private static final Logger log = Logger.getLogger(WordSearcher.class);
private JTextArea textArea;
private String word;
private boolean wasSearching = false;
private JScrollHighlightPanel highlightPanel;
private final List<Object> highlightObjects = new ArrayList<Object>();
private final SettingsModel settings;
private int nextSearchPos = 0;
private int lastSearchPos = 0;
public WordSearcher(SettingsModel settings) {
this.settings = settings;
}
public void setTextArea(JTextArea textArea) {
this.textArea = textArea;
}
public void setHighlightPanel(JScrollHighlightPanel highlightPanel) {
this.highlightPanel = highlightPanel;
}
public String getWord() {
return word;
}
public void clearSearch() {
nextSearchPos = 0;
lastSearchPos = 0;
word = "";
clearHighlights();
wasSearching = false;
}
// Search for a word and return the offset of the
// first occurrence. Highlights are added for all
// occurrences found.
public synchronized SearchResult search(String keyword, String content, int position) {
// log.info("Search " + word);
// new Exception().printStackTrace();
//System.out.println("word = "+ word);
clearHighlights();
wasSearching = true;
word = keyword;
if (keyword == null || keyword.equals("")) {
return null;
}
String sWord;
String sContent;
if (!settings.isRegexp()) {
sWord = word.toLowerCase();
sContent = content.toLowerCase();
} else {
sWord = word;
sContent = content;
}
int tmpIndex;
int wordSize = sWord.length();
int lastIndex = -1;
int firstOffset = -1;
Highlighter highlighter = textArea.getHighlighter();
ArrayList<Integer> indexes = new ArrayList<Integer>();
// init regexp
Pattern pattern = null;
Matcher matcher = null;
if (settings.isRegexp()) {
try {
pattern = Pattern.compile(sWord);
} catch (Exception e) {
return null;
}
matcher = pattern.matcher(sContent);
}
// find match from current position
if (settings.isRegexp()) {
try {
if (matcher.find(position)) {
lastIndex = matcher.start();
wordSize = matcher.group().length();
}
} catch (Exception e) {
return null;
}
} else {
lastIndex = sContent.indexOf(sWord, position);
}
// if match not found try to search from the beginning
if (lastIndex == -1) {
if (settings.isRegexp()) {
try {
if (matcher.find(0)) {
lastIndex = matcher.start();
wordSize = matcher.group().length();
}
} catch (Exception e) {
return null;
}
} else {
lastIndex = sContent.indexOf(sWord);
}
}
// if found
if (lastIndex != -1) {
tmpIndex = lastIndex + wordSize;
try {
highlightObjects.add(highlighter.addHighlight(lastIndex, tmpIndex, Conf.highlightedSearchResultPainter));
} catch (Exception e) {
}
firstOffset = lastIndex;
} else {
if (highlightPanel != null) {
highlightPanel.setIndexes(indexes);
highlightPanel.repaint();
}
return null;
}
if (settings.isHightlightAll()) {
if (settings.isRegexp()) {
matcher.reset();
try {
while (matcher.find()) {
try {
highlightObjects.add(highlighter.addHighlight(matcher.start(), matcher.end(), Conf.searchResultPainter));
indexes.add(matcher.start());
} catch (BadLocationException e) {
break;
}
}
} catch (Exception e) {
return null;
}
} else {
lastIndex = 0;
while (true) {
lastIndex = sContent.indexOf(sWord, lastIndex);
if (lastIndex == -1) {
break;
}
tmpIndex = lastIndex + wordSize;
try {
highlightObjects.add(highlighter.addHighlight(lastIndex, tmpIndex, Conf.searchResultPainter));
indexes.add(lastIndex);
} catch (BadLocationException e) {
break;
}
lastIndex = tmpIndex;
}
}
}
if (highlightPanel != null) {
highlightPanel.setIndexes(indexes);
highlightPanel.repaint();
}
nextSearchPos = firstOffset + wordSize;
lastSearchPos = firstOffset;
return new SearchResult(firstOffset, wordSize);
}
public boolean isWasSearching() {
return wasSearching;
}
public synchronized void clearHighlights() {
Highlighter highlighter = textArea.getHighlighter();
for (Object object : highlightObjects) {
highlighter.removeHighlight(object);
}
}
public String filter(String keyword, String content) throws Exception {
wasSearching = true;
clearHighlights();
lastSearchPos = 0;
nextSearchPos = 0;
word = keyword;
if (word == null || word.equals("")) {
return "";
}
String sWord = word.toLowerCase();
String sContent = content;
String[] words = sWord.split(",");
for (int i = 0; i < words.length; i++) {
words[i] = words[i].trim();
}
StringBuilder sb = new StringBuilder("");
int totalLines = textArea.getLineCount();
for (int i=0; i < totalLines; i++) {
int start = textArea.getLineStartOffset(i);
int end = textArea.getLineEndOffset(i);
String lineText = new String(sContent.substring(start, end));
for (int j = 0; j < words.length; j++) {
String w = words[j];
if (lineText.toLowerCase().indexOf(w) != -1) {
sb.append(lineText);
break;
}
}
}
return sb.toString();
}
public int getNextSearchPos() {
return nextSearchPos;
}
public int getLastSearchPos() {
return lastSearchPos;
}
}