| /* |
| * Copyright 2000-2012 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.impl; |
| |
| import com.intellij.find.FindBundle; |
| import com.intellij.find.FindModel; |
| import com.intellij.find.FindSettings; |
| import com.intellij.openapi.components.PersistentStateComponent; |
| import com.intellij.openapi.components.State; |
| import com.intellij.openapi.components.Storage; |
| import com.intellij.openapi.components.StoragePathMacros; |
| import com.intellij.openapi.diagnostic.Logger; |
| import com.intellij.openapi.util.DefaultJDOMExternalizer; |
| import com.intellij.openapi.util.InvalidDataException; |
| import com.intellij.openapi.util.JDOMExternalizableStringList; |
| import com.intellij.openapi.util.WriteExternalException; |
| import com.intellij.util.ArrayUtil; |
| import com.intellij.util.PlatformUtils; |
| import org.jdom.Element; |
| import org.jetbrains.annotations.NonNls; |
| import org.jetbrains.annotations.NotNull; |
| |
| import java.util.ArrayList; |
| import java.util.List; |
| |
| @State( |
| name = "FindSettings", |
| storages = { |
| @Storage( |
| file = StoragePathMacros.APP_CONFIG + "/other.xml" |
| )} |
| ) |
| public class FindSettingsImpl extends FindSettings implements PersistentStateComponent<Element> { |
| private static final Logger LOG = Logger.getInstance("#com.intellij.find.impl.FindSettingsImpl"); |
| |
| @NonNls private static final String FIND_DIRECTION_FORWARD = "forward"; |
| @NonNls private static final String FIND_DIRECTION_BACKWARD = "backward"; |
| @NonNls private static final String FIND_ORIGIN_FROM_CURSOR = "from_cursor"; |
| @NonNls private static final String FIND_ORIGIN_ENTIRE_SCOPE = "entire_scope"; |
| @NonNls private static final String FIND_SCOPE_GLOBAL = "global"; |
| @NonNls private static final String FIND_SCOPE_SELECTED = "selected"; |
| private static final String DEFAULT_SEARCH_SCOPE = FindBundle.message("find.scope.all.project.classes"); |
| |
| private static final int MAX_RECENT_SIZE = 30; |
| |
| public FindSettingsImpl() { |
| RECENT_FILE_MASKS.add("*.properties"); |
| RECENT_FILE_MASKS.add("*.html"); |
| RECENT_FILE_MASKS.add("*.jsp"); |
| RECENT_FILE_MASKS.add("*.xml"); |
| RECENT_FILE_MASKS.add("*.java"); |
| RECENT_FILE_MASKS.add("*.js"); |
| RECENT_FILE_MASKS.add("*.as"); |
| RECENT_FILE_MASKS.add("*.css"); |
| RECENT_FILE_MASKS.add("*.mxml"); |
| if (PlatformUtils.isPyCharm()) { |
| RECENT_FILE_MASKS.add("*.py"); |
| } |
| else if (PlatformUtils.isRubyMine()) { |
| RECENT_FILE_MASKS.add("*.rb"); |
| } |
| else if (PlatformUtils.isPhpStorm()) { |
| RECENT_FILE_MASKS.add("*.php"); |
| } |
| } |
| |
| @Override |
| public boolean isSearchOverloadedMethods() { |
| return SEARCH_OVERLOADED_METHODS; |
| } |
| |
| @Override |
| public void setSearchOverloadedMethods(boolean search) { |
| SEARCH_OVERLOADED_METHODS = search; |
| } |
| |
| @SuppressWarnings({"WeakerAccess"}) public boolean SEARCH_OVERLOADED_METHODS = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean SEARCH_IN_LIBRARIES = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean SKIP_RESULTS_WHEN_ONE_USAGE = false; |
| |
| @SuppressWarnings({"WeakerAccess"}) public String FIND_DIRECTION = FIND_DIRECTION_FORWARD; |
| @SuppressWarnings({"WeakerAccess"}) public String FIND_ORIGIN = FIND_ORIGIN_FROM_CURSOR; |
| @SuppressWarnings({"WeakerAccess"}) public String FIND_SCOPE = FIND_SCOPE_GLOBAL; |
| @SuppressWarnings({"WeakerAccess"}) public String FIND_CUSTOM_SCOPE = null; |
| |
| @SuppressWarnings({"WeakerAccess"}) public boolean CASE_SENSITIVE_SEARCH = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean LOCAL_CASE_SENSITIVE_SEARCH = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean PRESERVE_CASE_REPLACE = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean WHOLE_WORDS_ONLY = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean COMMENTS_ONLY = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean STRING_LITERALS_ONLY = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean EXCEPT_COMMENTS = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean EXCEPT_COMMENTS_AND_STRING_LITERALS = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean EXCEPT_STRING_LITERALS = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean LOCAL_WHOLE_WORDS_ONLY = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean REGULAR_EXPRESSIONS = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean LOCAL_REGULAR_EXPRESSIONS = false; |
| @SuppressWarnings({"WeakerAccess"}) public boolean WITH_SUBDIRECTORIES = true; |
| @SuppressWarnings({"WeakerAccess"}) public boolean SHOW_RESULTS_IN_SEPARATE_VIEW = false; |
| |
| @SuppressWarnings({"WeakerAccess"}) public String SEARCH_SCOPE = DEFAULT_SEARCH_SCOPE; |
| @SuppressWarnings({"WeakerAccess"}) public String FILE_MASK; |
| |
| @SuppressWarnings({"WeakerAccess"}) public JDOMExternalizableStringList RECENT_FIND_STRINGS = new JDOMExternalizableStringList(); |
| @SuppressWarnings({"WeakerAccess"}) public JDOMExternalizableStringList RECENT_REPLACE_STRINGS = new JDOMExternalizableStringList(); |
| @SuppressWarnings({"WeakerAccess"}) public JDOMExternalizableStringList RECENT_DIR_STRINGS = new JDOMExternalizableStringList(); |
| @SuppressWarnings({"WeakerAccess"}) @NonNls public JDOMExternalizableStringList RECENT_FILE_MASKS = new JDOMExternalizableStringList(); |
| |
| |
| @Override |
| public void loadState(final Element state) { |
| try { |
| DefaultJDOMExternalizer.readExternal(this, state); |
| } |
| catch (InvalidDataException e) { |
| LOG.info(e); |
| } |
| } |
| |
| @Override |
| public Element getState() { |
| Element element = new Element("state"); |
| try { |
| DefaultJDOMExternalizer.writeExternal(this, element); |
| } |
| catch (WriteExternalException e) { |
| LOG.info(e); |
| } |
| return element; |
| } |
| |
| @Override |
| public boolean isSkipResultsWithOneUsage(){ |
| return SKIP_RESULTS_WHEN_ONE_USAGE; |
| } |
| |
| @Override |
| public void setSkipResultsWithOneUsage(boolean skip){ |
| SKIP_RESULTS_WHEN_ONE_USAGE = skip; |
| } |
| |
| @Override |
| public String getDefaultScopeName() { |
| return SEARCH_SCOPE; |
| } |
| |
| @Override |
| public void setDefaultScopeName(String scope) { |
| SEARCH_SCOPE = scope; |
| } |
| |
| @Override |
| public boolean isForward(){ |
| return FIND_DIRECTION_FORWARD.equals(FIND_DIRECTION); |
| } |
| |
| @Override |
| public void setForward(boolean findDirectionForward){ |
| FIND_DIRECTION = findDirectionForward ? FIND_DIRECTION_FORWARD : FIND_DIRECTION_BACKWARD; |
| } |
| |
| @Override |
| public boolean isFromCursor(){ |
| return FIND_ORIGIN_FROM_CURSOR.equals(FIND_ORIGIN); |
| } |
| |
| @Override |
| public void setFromCursor(boolean findFromCursor){ |
| FIND_ORIGIN = findFromCursor ? FIND_ORIGIN_FROM_CURSOR : FIND_ORIGIN_ENTIRE_SCOPE; |
| } |
| |
| @Override |
| public boolean isGlobal(){ |
| return FIND_SCOPE_GLOBAL.equals(FIND_SCOPE); |
| } |
| |
| @Override |
| public void setGlobal(boolean findGlobalScope){ |
| FIND_SCOPE = findGlobalScope ? FIND_SCOPE_GLOBAL : FIND_SCOPE_SELECTED; |
| } |
| |
| @Override |
| public boolean isCaseSensitive(){ |
| return CASE_SENSITIVE_SEARCH; |
| } |
| |
| @Override |
| public void setCaseSensitive(boolean caseSensitiveSearch){ |
| CASE_SENSITIVE_SEARCH = caseSensitiveSearch; |
| } |
| |
| @Override |
| public boolean isLocalCaseSensitive() { |
| return LOCAL_CASE_SENSITIVE_SEARCH; |
| } |
| |
| @Override |
| public boolean isLocalWholeWordsOnly() { |
| return LOCAL_WHOLE_WORDS_ONLY; |
| } |
| |
| @Override |
| public void setLocalCaseSensitive(final boolean caseSensitiveSearch) { |
| LOCAL_CASE_SENSITIVE_SEARCH = caseSensitiveSearch; |
| } |
| |
| @Override |
| public void setLocalWholeWordsOnly(final boolean wholeWordsOnly) { |
| LOCAL_WHOLE_WORDS_ONLY = wholeWordsOnly; |
| } |
| |
| @Override |
| public boolean isPreserveCase() { |
| return PRESERVE_CASE_REPLACE; |
| } |
| |
| @Override |
| public void setPreserveCase(boolean preserveCase) { |
| PRESERVE_CASE_REPLACE = preserveCase; |
| } |
| |
| @Override |
| public boolean isWholeWordsOnly(){ |
| return WHOLE_WORDS_ONLY; |
| } |
| |
| @Override |
| public void setWholeWordsOnly(boolean wholeWordsOnly){ |
| WHOLE_WORDS_ONLY = wholeWordsOnly; |
| } |
| |
| @Override |
| public boolean isRegularExpressions(){ |
| return REGULAR_EXPRESSIONS; |
| } |
| |
| @Override |
| public void setRegularExpressions(boolean regularExpressions){ |
| REGULAR_EXPRESSIONS = regularExpressions; |
| } |
| |
| @Override |
| public boolean isLocalRegularExpressions() { |
| return LOCAL_REGULAR_EXPRESSIONS; |
| } |
| |
| @Override |
| public void setLocalRegularExpressions(boolean regularExpressions) { |
| LOCAL_REGULAR_EXPRESSIONS = regularExpressions; |
| } |
| |
| @Override |
| public void setWithSubdirectories(boolean b){ |
| WITH_SUBDIRECTORIES = b; |
| } |
| |
| private boolean isWithSubdirectories(){ |
| return WITH_SUBDIRECTORIES; |
| } |
| |
| @Override |
| public void initModelBySetings(FindModel model){ |
| model.setCaseSensitive(isCaseSensitive()); |
| model.setForward(isForward()); |
| model.setFromCursor(isFromCursor()); |
| model.setGlobal(isGlobal()); |
| model.setRegularExpressions(isRegularExpressions()); |
| model.setWholeWordsOnly(isWholeWordsOnly()); |
| FindModel.SearchContext searchContext = isInCommentsOnly() ? |
| FindModel.SearchContext.IN_COMMENTS : |
| isInStringLiteralsOnly() ? |
| FindModel.SearchContext.IN_STRING_LITERALS : |
| isExceptComments() ? |
| FindModel.SearchContext.EXCEPT_COMMENTS : |
| isExceptStringLiterals() ? |
| FindModel.SearchContext.EXCEPT_STRING_LITERALS : |
| isExceptCommentsAndLiterals() ? |
| FindModel.SearchContext.EXCEPT_COMMENTS_AND_STRING_LITERALS : |
| FindModel.SearchContext.ANY; |
| model.setSearchContext(searchContext); |
| model.setWithSubdirectories(isWithSubdirectories()); |
| model.setFileFilter(FILE_MASK); |
| |
| model.setCustomScopeName(FIND_SCOPE); |
| } |
| |
| private static void addStringToList(String str, List<String> list, int maxSize){ |
| if(list.contains(str)){ |
| list.remove(str); |
| } |
| list.add(str); |
| while(list.size() > maxSize){ |
| list.remove(0); |
| } |
| } |
| |
| @Override |
| public void addStringToFind(String s){ |
| if (s == null || s.indexOf('\r') >= 0 || s.indexOf('\n') >= 0){ |
| return; |
| } |
| addStringToList(s, RECENT_FIND_STRINGS, MAX_RECENT_SIZE); |
| } |
| |
| @Override |
| public void addStringToReplace(String s) { |
| if (s == null || s.indexOf('\r') >= 0 || s.indexOf('\n') >= 0){ |
| return; |
| } |
| addStringToList(s, RECENT_REPLACE_STRINGS, MAX_RECENT_SIZE); |
| } |
| |
| @Override |
| public void addDirectory(String s) { |
| if (s == null || s.isEmpty()){ |
| return; |
| } |
| addStringToList(s, RECENT_DIR_STRINGS, MAX_RECENT_SIZE); |
| } |
| |
| @NotNull |
| @Override |
| public String[] getRecentFindStrings(){ |
| return ArrayUtil.toStringArray(RECENT_FIND_STRINGS); |
| } |
| |
| @NotNull |
| @Override |
| public String[] getRecentReplaceStrings(){ |
| return ArrayUtil.toStringArray(RECENT_REPLACE_STRINGS); |
| } |
| |
| @NotNull |
| @Override |
| public String[] getRecentFileMasks() { |
| return ArrayUtil.toStringArray(RECENT_FILE_MASKS); |
| } |
| |
| @NotNull |
| @Override |
| public List<String> getRecentDirectories(){ |
| return new ArrayList<String>(RECENT_DIR_STRINGS); |
| } |
| |
| @Override |
| public String getFileMask() { |
| return FILE_MASK; |
| } |
| |
| @Override |
| public void setFileMask(String _fileMask) { |
| FILE_MASK = _fileMask; |
| if (_fileMask != null && !_fileMask.isEmpty()) { |
| addStringToList(_fileMask, RECENT_FILE_MASKS, MAX_RECENT_SIZE); |
| } |
| } |
| |
| @Override |
| public String getCustomScope() { |
| return SEARCH_SCOPE; |
| } |
| |
| @Override |
| public boolean isInStringLiteralsOnly() { |
| return STRING_LITERALS_ONLY; |
| } |
| |
| @Override |
| public boolean isInCommentsOnly() { |
| return COMMENTS_ONLY; |
| } |
| |
| @Override |
| public void setInCommentsOnly(boolean selected) { |
| COMMENTS_ONLY = selected; |
| } |
| |
| @Override |
| public void setInStringLiteralsOnly(boolean selected) { |
| STRING_LITERALS_ONLY = selected; |
| } |
| |
| @Override |
| public void setCustomScope(final String SEARCH_SCOPE) { |
| this.SEARCH_SCOPE = SEARCH_SCOPE; |
| } |
| |
| @Override |
| public boolean isExceptComments() { |
| return EXCEPT_COMMENTS; |
| } |
| |
| @Override |
| public void setExceptCommentsAndLiterals(boolean selected) { |
| EXCEPT_COMMENTS_AND_STRING_LITERALS = selected; |
| } |
| |
| @Override |
| public boolean isShowResultsInSeparateView() { |
| return SHOW_RESULTS_IN_SEPARATE_VIEW; |
| } |
| |
| @Override |
| public void setShowResultsInSeparateView(boolean optionValue) { |
| SHOW_RESULTS_IN_SEPARATE_VIEW = optionValue; |
| } |
| |
| @Override |
| public boolean isExceptCommentsAndLiterals() { |
| return EXCEPT_COMMENTS_AND_STRING_LITERALS; |
| } |
| |
| @Override |
| public void setExceptComments(boolean selected) { |
| EXCEPT_COMMENTS = selected; |
| } |
| |
| @Override |
| public boolean isExceptStringLiterals() { |
| return EXCEPT_STRING_LITERALS; |
| } |
| |
| @Override |
| public void setExceptStringLiterals(boolean selected) { |
| EXCEPT_STRING_LITERALS = selected; |
| } |
| } |