/*
* SearchMatcher.java - Abstract string matcher interface
* :tabSize=4:indentSize=4:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* Copyright (C) 1999, 2001, 2002 Slava Pestov
*
* 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 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.gjt.sp.jedit.search;
import org.gjt.sp.jedit.TextUtilities;
/**
* An abstract class for matching strings.
* @author Slava Pestov
* @version $Id$
*/
public abstract class SearchMatcher
{
public SearchMatcher()
{
returnValue = new Match();
}
/**
* Returns the offset of the first match of the specified text
* within this matcher.
* @param text The text to search in
* @param start True if the start of the text is the beginning of a line
* @param end True if the end of the text is the end of a line
* @param firstTime If false and the search string matched at the start
* offset with length zero, automatically find next match
* @param reverse If true, searching will be performed in a backward
* direction.
* @return A {@link Match} object.
* @since jEdit 4.3pre5
*/
public abstract Match nextMatch(CharSequence text, boolean start,
boolean end, boolean firstTime, boolean reverse) throws InterruptedException;
/**
* @param noWordSep the chars that are considered as word chars for this search
* @since jEdit 4.5pre1
*/
public void setNoWordSep(String noWordSep)
{
if (noWordSep == null)
this.noWordSep = "_";
else
this.noWordSep = noWordSep;
}
/**
* Returns the noWordSep that should be used.
* This is used by the HyperSearchOperationNode that
* needs to remember this property since it can have
* to restore it.
* @return the noWordSep property
*/
String getNoWordSep()
{
return noWordSep;
}
/**
* Check if the result is a whole word
* @param text the full text search
* @param start the start match
* @param end the end match
* @return true if the word is a whole word
*/
protected boolean isWholeWord(CharSequence text, int start, int end)
{
if (start != 0)
{
char firstChar = text.charAt(start);
char prevChar = text.charAt(start - 1);
if (!isEndWord(firstChar, prevChar))
{
return false;
}
}
if (end < text.length())
{
char lastChar = text.charAt(end - 1);
char nextChar = text.charAt(end);
if (!isEndWord(lastChar, nextChar))
{
return false;
}
}
return true;
}
private boolean isEndWord(char current, char next)
{
int currentCharType = TextUtilities.getCharType(current, noWordSep);
if (currentCharType != TextUtilities.WORD_CHAR)
return true;
int nextCharType = TextUtilities.getCharType(next, noWordSep);
return nextCharType != TextUtilities.WORD_CHAR;
}
protected Match returnValue;
/**
* true if this SearchMatcher search for whole words only.
*/
protected boolean wholeWord;
/**
* This should contains the noWordSep property of the edit mode of your buffer.
* It contains a list of chars that should be considered as word chars
*/
protected String noWordSep;
//{{{ Match class
public static class Match
{
public int start;
public int end;
public String[] substitutions;
@Override
public String toString()
{
return "Match[" + start + ',' + end + ']';
}
} //}}}
}