package com.openfarmanager.android.view; import android.content.Context; import android.graphics.Color; import android.text.SpannableString; import android.text.Spanned; import android.text.style.BackgroundColorSpan; import android.util.TypedValue; import android.widget.TextView; import com.openfarmanager.android.App; import com.openfarmanager.android.adapters.LinesAdapter; import com.openfarmanager.android.utils.FileUtilsExt; import org.apache.commons.io.IOCase; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * author: vnamashko */ public class SearchableTextView extends TextView implements SearchableView { public static final int SELECTION_MODE_BACKGROUND = 0; private int selectionMode = SELECTION_MODE_BACKGROUND; private String mText; public SearchableTextView(Context context, String text) { super(context); setTextColor(Color.CYAN); setTextSize(TypedValue.COMPLEX_UNIT_SP, App.sInstance.getSettings().getViewerFontSize()); setTypeface(App.sInstance.getSettings().getViewerFontType()); setupText(text); } public void setText() { setText(mText); } @Override public void setupText(String newText) { mText = newText; // TODO : in some reason TextView with empty content ignored in list view and empty line is hidden, so give non empty string. if (mText.equals("")) { mText = " "; } } public String getViewText() { return mText; } public void search(String pattern, IOCase caseSensitive, boolean wholeWords) { generalSearch(pattern, caseSensitive, wholeWords, false); } @Override public int getMode() { return LinesAdapter.MODE_VIEW; } private void generalSearch(String pattern, IOCase caseSensitive, boolean wholeWords, boolean replace) { if (pattern == null) { setText(mText); return; } Pattern patternMatch = FileUtilsExt.createWordSearchPattern(pattern, wholeWords, caseSensitive); Matcher matcher = patternMatch.matcher(mText); if (matcher.find()) { SpannableString string = new SpannableString(mText); int firstOccurrence; do { firstOccurrence = matcher.start(); setSelection(pattern, string, firstOccurrence); } while (matcher.find()); setText(string); } else { setText(mText); } } private void setSelection(String pattern, SpannableString string, int firstOccurrence) { string.setSpan(new BackgroundColorSpan( Color.YELLOW), firstOccurrence, firstOccurrence + pattern.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } }