blob: d071877968722ff15943a179cf8f19fcec6f0c2e [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.find;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.UserDataHolderBase;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.search.SearchScope;
import com.intellij.util.PatternUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
/**
* Represents the settings of a Find, Replace, Find in Path or Replace in Path
* operations.
*/
public class FindModel extends UserDataHolderBase implements Cloneable {
private static final Logger LOG = Logger.getInstance("#com.intellij.find.FindModel");
public static void initStringToFindNoMultiline(FindModel findModel, String s) {
if (!StringUtil.isEmpty(s)) {
if (!s.contains("\r") && !s.contains("\n")) {
findModel.setStringToFind(s);
}
else {
findModel.setStringToFind(StringUtil.escapeToRegexp(s));
findModel.setRegularExpressions(true);
}
}
}
public interface FindModelObserver {
void findModelChanged(FindModel findModel);
}
private final List<FindModelObserver> myObservers = ContainerUtil.createLockFreeCopyOnWriteList();
public void addObserver(FindModelObserver observer) {
myObservers.add(observer);
}
public void removeObserver(FindModelObserver observer) {
myObservers.remove(observer);
}
private void notifyObservers() {
for (FindModelObserver observer : myObservers) {
observer.findModelChanged(this);
}
}
private String myStringToFind = "";
private String myStringToReplace = "";
private boolean isSearchHighlighters = false;
private boolean isReplaceState = false;
private boolean isWholeWordsOnly = false;
private SearchContext searchContext = SearchContext.ANY;
private boolean isFromCursor = true;
private boolean isForward = true;
private boolean isGlobal = true;
private boolean isRegularExpressions = false;
private boolean isCaseSensitive = false;
private boolean isMultipleFiles = false;
private boolean isPromptOnReplace = true;
private boolean isReplaceAll = false;
private boolean isOpenNewTab = false;
private boolean isOpenInNewTabEnabled = false;
private boolean isOpenNewTabVisible = false;
private boolean isProjectScope = true;
private boolean isFindAll = false;
private boolean isFindAllEnabled = false;
private String moduleName;
private String directoryName = null;
private boolean isWithSubdirectories = true;
private String fileFilter;
private String customScopeName;
private SearchScope customScope;
private boolean isCustomScope = false;
private boolean isMultiline = false;
private boolean mySearchInProjectFiles;
public boolean isMultiline() {
return isMultiline;
}
public void setMultiline(boolean multiline) {
if (multiline != isMultiline) {
if (!multiline) {
initStringToFindNoMultiline(this, getStringToFind());
}
isMultiline = multiline;
notifyObservers();
}
}
/**
* Gets the Preserve Case flag.
*
* @return the value of the Preserve Case flag.
*/
public boolean isPreserveCase() {
return isPreserveCase;
}
/**
* Sets the Preserve Case flag.
*
* @param preserveCase the value of the Preserve Case flag.
*/
public void setPreserveCase(boolean preserveCase) {
boolean changed = isPreserveCase != preserveCase;
isPreserveCase = preserveCase;
if (changed) {
notifyObservers();
}
}
private boolean isPreserveCase = false;
/**
* Copies all the settings from the specified model.
*
* @param model the model to copy settings from.
*/
public void copyFrom(FindModel model) {
myStringToFind = model.myStringToFind;
myStringToReplace = model.myStringToReplace;
isReplaceState = model.isReplaceState;
isWholeWordsOnly = model.isWholeWordsOnly;
isFromCursor = model.isFromCursor;
isForward = model.isForward;
isGlobal = model.isGlobal;
isRegularExpressions = model.isRegularExpressions;
isCaseSensitive = model.isCaseSensitive;
isMultipleFiles = model.isMultipleFiles;
isPromptOnReplace = model.isPromptOnReplace;
isReplaceAll = model.isReplaceAll;
isOpenNewTab = model.isOpenNewTab;
isOpenInNewTabEnabled = model.isOpenInNewTabEnabled;
isOpenNewTabVisible = model.isOpenNewTabVisible;
isProjectScope = model.isProjectScope;
directoryName = model.directoryName;
isWithSubdirectories = model.isWithSubdirectories;
isPreserveCase = model.isPreserveCase;
fileFilter = model.fileFilter;
moduleName = model.moduleName;
customScopeName = model.customScopeName;
customScope = model.customScope;
isCustomScope = model.isCustomScope;
isFindAll = model.isFindAll;
searchContext = model.searchContext;
isMultiline = model.isMultiline;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
FindModel findModel = (FindModel)o;
if (isCaseSensitive != findModel.isCaseSensitive) return false;
if (isCustomScope != findModel.isCustomScope) return false;
if (isFindAll != findModel.isFindAll) return false;
if (isFindAllEnabled != findModel.isFindAllEnabled) return false;
if (isForward != findModel.isForward) return false;
if (isFromCursor != findModel.isFromCursor) return false;
if (isGlobal != findModel.isGlobal) return false;
if (searchContext != findModel.searchContext) return false;
if (isMultiline != findModel.isMultiline) return false;
if (isMultipleFiles != findModel.isMultipleFiles) return false;
if (isOpenInNewTabEnabled != findModel.isOpenInNewTabEnabled) return false;
if (isOpenNewTab != findModel.isOpenNewTab) return false;
if (isOpenNewTabVisible != findModel.isOpenNewTabVisible) return false;
if (isPreserveCase != findModel.isPreserveCase) return false;
if (isProjectScope != findModel.isProjectScope) return false;
if (isPromptOnReplace != findModel.isPromptOnReplace) return false;
if (isRegularExpressions != findModel.isRegularExpressions) return false;
if (isReplaceAll != findModel.isReplaceAll) return false;
if (isReplaceState != findModel.isReplaceState) return false;
if (isSearchHighlighters != findModel.isSearchHighlighters) return false;
if (isWholeWordsOnly != findModel.isWholeWordsOnly) return false;
if (isWithSubdirectories != findModel.isWithSubdirectories) return false;
if (customScope != null ? !customScope.equals(findModel.customScope) : findModel.customScope != null) return false;
if (customScopeName != null ? !customScopeName.equals(findModel.customScopeName) : findModel.customScopeName != null) return false;
if (directoryName != null ? !directoryName.equals(findModel.directoryName) : findModel.directoryName != null) return false;
if (fileFilter != null ? !fileFilter.equals(findModel.fileFilter) : findModel.fileFilter != null) return false;
if (moduleName != null ? !moduleName.equals(findModel.moduleName) : findModel.moduleName != null) return false;
if (myStringToFind != null ? !myStringToFind.equals(findModel.myStringToFind) : findModel.myStringToFind != null) return false;
if (myStringToReplace != null ? !myStringToReplace.equals(findModel.myStringToReplace) : findModel.myStringToReplace != null) {
return false;
}
if (mySearchInProjectFiles != findModel.mySearchInProjectFiles) return false;
return true;
}
@Override
public int hashCode() {
int result = 0;
result = 31 * result + (myStringToFind != null ? myStringToFind.hashCode() : 0);
result = 31 * result + (myStringToReplace != null ? myStringToReplace.hashCode() : 0);
result = 31 * result + (isSearchHighlighters ? 1 : 0);
result = 31 * result + (isReplaceState ? 1 : 0);
result = 31 * result + (isWholeWordsOnly ? 1 : 0);
result = 31 * result + (searchContext.ordinal());
result = 31 * result + (isFromCursor ? 1 : 0);
result = 31 * result + (isForward ? 1 : 0);
result = 31 * result + (isGlobal ? 1 : 0);
result = 31 * result + (isRegularExpressions ? 1 : 0);
result = 31 * result + (isCaseSensitive ? 1 : 0);
result = 31 * result + (isMultipleFiles ? 1 : 0);
result = 31 * result + (isPromptOnReplace ? 1 : 0);
result = 31 * result + (isReplaceAll ? 1 : 0);
result = 31 * result + (isOpenNewTab ? 1 : 0);
result = 31 * result + (isOpenInNewTabEnabled ? 1 : 0);
result = 31 * result + (isOpenNewTabVisible ? 1 : 0);
result = 31 * result + (isProjectScope ? 1 : 0);
result = 31 * result + (isFindAll ? 1 : 0);
result = 31 * result + (isFindAllEnabled ? 1 : 0);
result = 31 * result + (moduleName != null ? moduleName.hashCode() : 0);
result = 31 * result + (directoryName != null ? directoryName.hashCode() : 0);
result = 31 * result + (isWithSubdirectories ? 1 : 0);
result = 31 * result + (fileFilter != null ? fileFilter.hashCode() : 0);
result = 31 * result + (customScopeName != null ? customScopeName.hashCode() : 0);
result = 31 * result + (customScope != null ? customScope.hashCode() : 0);
result = 31 * result + (isCustomScope ? 1 : 0);
result = 31 * result + (isMultiline ? 1 : 0);
result = 31 * result + (isPreserveCase ? 1 : 0);
result = 31 * result + (mySearchInProjectFiles ? 1 : 0);
result = 31 * result + (myPattern != null ? myPattern.hashCode() : 0);
return result;
}
/**
* Gets the string to find.
*
* @return the string to find.
*/
@NotNull
public String getStringToFind() {
return myStringToFind;
}
/**
* Sets the string to find.
*
* @param s the string to find.
*/
public void setStringToFind(@NotNull String s) {
boolean changed = !StringUtil.equals(s, myStringToFind);
myStringToFind = s;
myPattern = PatternUtil.NOTHING;
if (changed) {
notifyObservers();
}
}
/**
* Gets the string to replace with.
*
* @return the string to replace with.
*/
@NotNull
public String getStringToReplace() {
return myStringToReplace;
}
/**
* Sets the string to replace with.
*
* @param s the string to replace with.
*/
public void setStringToReplace(@NotNull String s) {
boolean changed = !StringUtil.equals(s, myStringToReplace);
myStringToReplace = s;
if (changed) {
notifyObservers();
}
}
/**
* Gets the value indicating whether the operation is a Find or a Replace.
*
* @return true if the operation is a Replace, false if it is a Find.
*/
public boolean isReplaceState() {
return isReplaceState;
}
/**
* Sets the value indicating whether the operation is a Find or a Replace.
*
* @param val true if the operation is a Replace, false if it is a Find.
*/
public void setReplaceState(boolean val) {
boolean changed = val != isReplaceState;
isReplaceState = val;
if (changed) {
notifyObservers();
}
}
/**
* Gets the origin for the find.
*
* @return true if the origin is From Cursor, false if it is Entire Scope.
*/
public boolean isFromCursor() {
return isFromCursor;
}
/**
* Sets the origin for the find.
*
* @param val true if the origin is From Cursor, false if it is Entire Scope.
*/
public void setFromCursor(boolean val) {
boolean changed = val != isFromCursor;
isFromCursor = val;
if (changed) {
notifyObservers();
}
}
/**
* Gets the direction for the find.
*
* @return true if the find is forward, false if it is backward.
*/
public boolean isForward() {
return isForward;
}
/**
* Sets the direction for the find.
*
* @param val true if the find is forward, false if it is backward.
*/
public void setForward(boolean val) {
boolean changed = val != isForward;
isForward = val;
if (changed) {
notifyObservers();
}
}
/**
* Gets the Regular Expressions flag.
*
* @return the value of the Regular Expressions flag.
*/
public boolean isRegularExpressions() {
return isRegularExpressions;
}
/**
* Sets the Regular Expressions flag.
*
* @param val the value of the Regular Expressions flag.
*/
public void setRegularExpressions(boolean val) {
boolean changed = val != isRegularExpressions;
isRegularExpressions = val;
if (changed) {
notifyObservers();
}
}
/**
* Gets the Case Sensitive flag.
*
* @return the value of the Case Sensitive flag.
*/
public boolean isCaseSensitive() {
return isCaseSensitive;
}
/**
* Sets the Case Sensitive flag.
*
* @param val the value of the Case Sensitive flag.
*/
public void setCaseSensitive(boolean val) {
boolean changed = val != isCaseSensitive;
isCaseSensitive = val;
if (changed) {
myPattern = PatternUtil.NOTHING;
notifyObservers();
}
}
/**
* Checks if the find or replace operation affects multiple files.
*
* @return true if the operation affects multiple files, false if it affects a single file.
*/
public boolean isMultipleFiles() {
return isMultipleFiles;
}
/**
* Sets the value indicating whether the find or replace operation affects multiple files.
*
* @param val true if the operation affects multiple files, false if it affects a single file.
*/
public void setMultipleFiles(boolean val) {
boolean changed = val != isMultipleFiles;
isMultipleFiles = val;
if (changed) {
notifyObservers();
}
}
/**
* Gets the Prompt on Replace flag.
*
* @return the value of the Prompt on Replace flag.
*/
public boolean isPromptOnReplace() {
return isPromptOnReplace;
}
/**
* Sets the Prompt on Replace flag.
*
* @param val the value of the Prompt on Replace flag.
*/
public void setPromptOnReplace(boolean val) {
boolean changed = val != isPromptOnReplace;
isPromptOnReplace = val;
if (changed) {
notifyObservers();
}
}
/**
* Gets the Whole Words Only flag.
*
* @return the value of the Whole Words Only flag.
*/
public boolean isWholeWordsOnly() {
return isWholeWordsOnly;
}
/**
* Sets the Whole Words Only flag.
*
* @param isWholeWordsOnly the value of the Whole Words Only flag.
*/
public void setWholeWordsOnly(boolean isWholeWordsOnly) {
boolean changed = isWholeWordsOnly != this.isWholeWordsOnly;
this.isWholeWordsOnly = isWholeWordsOnly;
if (changed) {
notifyObservers();
}
}
/**
* Gets the scope of the operation.
*
* @return true if the operation affects the entire file, false if it affects the selected text.
*/
public boolean isGlobal() {
return isGlobal;
}
/**
* Sets the scope of the operation.
*
* @param isGlobal true if the operation affects the entire file, false if it affects the selected text.
*/
public void setGlobal(boolean isGlobal) {
boolean changed = this.isGlobal != isGlobal;
this.isGlobal = isGlobal;
if (changed) {
notifyObservers();
}
}
/**
* Gets the Replace All flag.
*
* @return the value of the Replace All flag.
*/
public boolean isReplaceAll() {
return isReplaceAll;
}
/**
* Sets the Replace All flag.
*
* @param replaceAll the value of the Replace All flag.
*/
public void setReplaceAll(boolean replaceAll) {
boolean changed = isReplaceAll != replaceAll;
isReplaceAll = replaceAll;
notifyObservers();
}
/**
* Gets the Open in New Tab flag.
*
* @return the value of the Open in New Tab flag.
*/
public boolean isOpenInNewTab() {
return isOpenNewTab;
}
/**
* Sets the Open in New Tab flag.
*
* @param showInNewTab the value of the Open in New Tab flag.
*/
public void setOpenInNewTab(boolean showInNewTab) {
boolean changed = showInNewTab != isOpenNewTab;
isOpenNewTab = showInNewTab;
if (changed) {
notifyObservers();
}
}
/**
* Gets the value indicating whether the Open in New Tab flag is enabled for the operation.
*
* @return true if Open in New Tab is enabled, false otherwise.
*/
public boolean isOpenInNewTabEnabled() {
return isOpenInNewTabEnabled;
}
/**
* Sets the value indicating whether the Open in New Tab flag is enabled for the operation.
*
* @param showInNewTabEnabled true if Open in New Tab is enabled, false otherwise.
*/
public void setOpenInNewTabEnabled(boolean showInNewTabEnabled) {
boolean changed = isOpenInNewTabEnabled != showInNewTabEnabled;
isOpenInNewTabEnabled = showInNewTabEnabled;
if (changed) {
notifyObservers();
}
}
/**
* Gets the value indicating whether the Open in New Tab flag is visible for the operation.
*
* @return true if Open in New Tab is visible, false otherwise.
*/
public boolean isOpenInNewTabVisible() {
return isOpenNewTabVisible;
}
/**
* Sets the value indicating whether the Open in New Tab flag is enabled for the operation.
*
* @param showInNewTabVisible true if Open in New Tab is visible, false otherwise.
*/
public void setOpenInNewTabVisible(boolean showInNewTabVisible) {
boolean changed = showInNewTabVisible != isOpenNewTabVisible;
isOpenNewTabVisible = showInNewTabVisible;
if (changed) {
notifyObservers();
}
}
/**
* Gets the directory used as a scope for Find in Path / Replace in Path.
*
* @return the directory used as a scope, or null if the selected scope is not "Directory".
*/
@Nullable
public String getDirectoryName() {
return directoryName;
}
/**
* Sets the directory used as a scope for Find in Path / Replace in Path.
*
* @param directoryName the directory scope.
*/
public void setDirectoryName(String directoryName) {
boolean changed = !StringUtil.equals(directoryName, directoryName);
this.directoryName = directoryName;
if (changed) {
notifyObservers();
}
}
/**
* Gets the Recursive Search flag for Find in Path / Replace in Path.
*
* @return true if directories are searched recursively, false otherwise.
*/
public boolean isWithSubdirectories() {
return isWithSubdirectories;
}
/**
* Sets the Recursive Search flag for Find in Path / Replace in Path.
*
* @param withSubdirectories true if directories are searched recursively, false otherwise.
*/
public void setWithSubdirectories(boolean withSubdirectories) {
boolean changed = withSubdirectories != isWithSubdirectories;
isWithSubdirectories = withSubdirectories;
if (changed) {
notifyObservers();
}
}
/**
* Gets the flag indicating whether the Whole Project scope is selected for Find in Path /
* Replace in Path.
*
* @return true if the whole project scope is selected, false otherwise.
*/
public boolean isProjectScope() {
return isProjectScope;
}
/**
* Sets the flag indicating whether the Whole Project scope is selected for Find in Path /
* Replace in Path.
*
* @param projectScope true if the whole project scope is selected, false otherwise.
*/
public void setProjectScope(boolean projectScope) {
boolean changed = projectScope != isProjectScope;
isProjectScope = projectScope;
if (changed) {
notifyObservers();
}
}
@Override
public FindModel clone() {
return (FindModel)super.clone();
}
public String toString() {
@NonNls StringBuilder buffer = new StringBuilder();
buffer.append("--- FIND MODEL ---\n");
buffer.append("myStringToFind =").append(myStringToFind).append("\n");
buffer.append("myStringToReplace =").append(myStringToReplace).append("\n");
buffer.append("isReplaceState =").append(isReplaceState).append("\n");
buffer.append("isWholeWordsOnly =").append(isWholeWordsOnly).append("\n");
buffer.append("searchContext =").append(searchContext).append("\n");
buffer.append("isFromCursor =").append(isFromCursor).append("\n");
buffer.append("isForward =").append(isForward).append("\n");
buffer.append("isGlobal =").append(isGlobal).append("\n");
buffer.append("isRegularExpressions =").append(isRegularExpressions).append("\n");
buffer.append("isCaseSensitive =").append(isCaseSensitive).append("\n");
buffer.append("isMultipleFiles =").append(isMultipleFiles).append("\n");
buffer.append("isPromptOnReplace =").append(isPromptOnReplace).append("\n");
buffer.append("isReplaceAll =").append(isReplaceAll).append("\n");
buffer.append("isOpenNewTab =").append(isOpenNewTab).append("\n");
buffer.append("isOpenInNewTabEnabled =").append(isOpenInNewTabEnabled).append("\n");
buffer.append("isOpenNewTabVisible =").append(isOpenNewTabVisible).append("\n");
buffer.append("isProjectScope =").append(isProjectScope).append("\n");
buffer.append("directoryName =").append(directoryName).append("\n");
buffer.append("isWithSubdirectories =").append(isWithSubdirectories).append("\n");
buffer.append("fileFilter =").append(fileFilter).append("\n");
buffer.append("moduleName =").append(moduleName).append("\n");
buffer.append("customScopeName =").append(customScopeName).append("\n");
buffer.append("searchInProjectFiles =").append(mySearchInProjectFiles).append("\n");
return buffer.toString();
}
/**
* Gets the flag indicating whether the search operation is Find Next / Find Previous
* after Highlight Usages in Files.
*
* @return true if the operation moves between highlighted regions, false otherwise.
*/
public boolean searchHighlighters() {
return isSearchHighlighters;
}
/**
* Sets the flag indicating whether the search operation is Find Next / Find Previous
* after Highlight Usages in Files.
*
* @param search true if the operation moves between highlighted regions, false otherwise.
*/
public void setSearchHighlighters(boolean search) {
boolean changed = search != isSearchHighlighters;
isSearchHighlighters = search;
if (changed) {
notifyObservers();
}
}
/**
* Gets the file name filter used for Find in Path / Replace in Path operation.
*
* @return the file name filter text.
*/
public String getFileFilter() {
return fileFilter;
}
/**
* Sets the file name filter used for Find in Path / Replace in Path operation.
*
* @param fileFilter the file name filter text.
*/
public void setFileFilter(String fileFilter) {
boolean changed = !StringUtil.equals(fileFilter, this.fileFilter);
this.fileFilter = fileFilter;
if (changed) {
notifyObservers();
}
}
/**
* Gets the name of the module used as the scope for the Find in Path / Replace
* in Path operation.
*
* @return the module name, or null if the selected scope is not "Module".
*/
@Nullable
public String getModuleName() {
return moduleName;
}
/**
* Sets the name of the module used as the scope for the Find in Path / Replace
* in Path operation.
*
* @param moduleName the name of the module used as the scope.
*/
public void setModuleName(String moduleName) {
boolean changed = !StringUtil.equals(moduleName, this.moduleName);
this.moduleName = moduleName;
if (changed) {
notifyObservers();
}
}
/**
* Gets the flag indicating whether "Find All" button was used to initiate the find
* operation.
*
* @return true if the operation is a "Find All", false otherwise.
* @since 5.1
*/
public boolean isFindAll() {
return isFindAll;
}
/**
* Sets the flag indicating whether "Find All" button was used to initiate the find
* operation.
*
* @param findAll true if the operation is a "Find All", false otherwise.
* @since 5.1
*/
public void setFindAll(final boolean findAll) {
boolean changed = isFindAll != findAll;
isFindAll = findAll;
if (changed) {
notifyObservers();
}
}
/**
* Gets the flag indicating whether "Find All" button is allowed for the operation.
*
* @return true if "Find All" is enabled, false otherwise.
* @since 5.1
*/
public boolean isFindAllEnabled() {
return isFindAllEnabled;
}
/**
* Sets the flag indicating whether "Find All" button is allowed for the operation.
*
* @param findAllEnabled true if "Find All" is enabled, false otherwise.
* @since 5.1
*/
public void setFindAllEnabled(final boolean findAllEnabled) {
boolean changed = isFindAllEnabled != findAllEnabled;
isFindAllEnabled = findAllEnabled;
if (changed) {
notifyObservers();
}
}
public String getCustomScopeName() {
return customScopeName;
}
public void setCustomScopeName(String customScopeName) {
boolean changed = !StringUtil.equals(customScopeName, this.customScopeName);
this.customScopeName = customScopeName;
if (changed) {
notifyObservers();
}
}
public SearchScope getCustomScope() {
return customScope;
}
public void setCustomScope(final SearchScope customScope) {
boolean changed = this.customScope != null ? this.customScope.equals(customScope) : customScope != null;
this.customScope = customScope;
if (changed) {
notifyObservers();
}
}
public boolean isCustomScope() {
return isCustomScope;
}
public void setCustomScope(boolean customScope) {
boolean changed = isCustomScope != customScope;
isCustomScope = customScope;
if (changed) {
notifyObservers();
}
}
public enum SearchContext {
ANY, IN_STRING_LITERALS, IN_COMMENTS, EXCEPT_STRING_LITERALS, EXCEPT_COMMENTS, EXCEPT_COMMENTS_AND_STRING_LITERALS
}
public boolean isInStringLiteralsOnly() {
return searchContext == SearchContext.IN_STRING_LITERALS;
}
public boolean isExceptComments() {
return searchContext == SearchContext.EXCEPT_COMMENTS;
}
public boolean isExceptStringLiterals() {
return searchContext == SearchContext.EXCEPT_STRING_LITERALS;
}
public boolean isInCommentsOnly() {
return searchContext == SearchContext.IN_COMMENTS;
}
public boolean isExceptCommentsAndStringLiterals() {
return searchContext == SearchContext.EXCEPT_COMMENTS_AND_STRING_LITERALS;
}
@Deprecated
public void setInCommentsOnly(boolean inCommentsOnly) {
doApplyContextChange(inCommentsOnly, SearchContext.IN_COMMENTS);
}
@Deprecated
public void setInStringLiteralsOnly(boolean inStringLiteralsOnly) {
doApplyContextChange(inStringLiteralsOnly, SearchContext.IN_STRING_LITERALS);
}
private void doApplyContextChange(boolean newOptionValue, SearchContext option) {
boolean changed = false;
if (newOptionValue) {
changed = searchContext != option;
searchContext = option;
} else if (searchContext == option) { // do not reset unrelated value
changed = true;
searchContext = SearchContext.ANY;
}
if (changed) {
notifyObservers();
}
}
public @NotNull SearchContext getSearchContext() {
return searchContext;
}
public void setSearchContext(@NotNull SearchContext _searchContext) {
doSetContext(_searchContext);
}
private void doSetContext(SearchContext newSearchContext) {
boolean changed = newSearchContext != searchContext;
searchContext = newSearchContext;
if (changed) {
notifyObservers();
}
}
public boolean isSearchInProjectFiles() {
return mySearchInProjectFiles;
}
public void setSearchInProjectFiles(boolean searchInProjectFiles) {
boolean changed = mySearchInProjectFiles != searchInProjectFiles;
mySearchInProjectFiles = searchInProjectFiles;
if (changed) {
notifyObservers();
}
}
private Pattern myPattern = PatternUtil.NOTHING;
public Pattern compileRegExp() {
String toFind = getStringToFind();
Pattern pattern = myPattern;
if (pattern == PatternUtil.NOTHING) {
try {
myPattern = pattern = Pattern.compile(toFind, isCaseSensitive() ? Pattern.MULTILINE : Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
}
catch (PatternSyntaxException e) {
myPattern = pattern = null;
}
}
return pattern;
}
}