blob: 02fa5a6168edba27d76f1b7e985824a70b4d28b9 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.netbeans.modules.search;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.prefs.Preferences;
import org.netbeans.api.search.SearchPattern.MatchType;
import org.openide.util.NbBundle;
import org.openide.util.NbPreferences;
/**
* Registry for everything related to the Find dialog.
* It is <em>not</em> designed to be persistent across invocations
* of the IDE.
*
* @author Marian Petras
* @author kaktus
*/
public final class FindDialogMemory {
/** maximum count of stored file name patterns */
private static final int maxFileNamePatternCount = 10;
/** singleton instance of this class */
private static FindDialogMemory singleton;
/**
* storage of last used file name patterns
* (initially {@code null})
*/
private List<String> fileNamePatterns;
/**
* Storage of last used Whole Words option.
*/
private boolean wholeWords;
/**
* Storage of last used Case Sensitive option.
*/
private boolean caseSensitive;
/**
* Storage of last used Preserve Case option.
*/
private boolean preserveCase;
/**
* Storage of last used search pattern match type.
*/
private MatchType matchType;
/**
* whether a full text pattern was used last time
*/
private boolean textPatternSpecified;
/**
* whether a replace pattern was specified, or empty string was used
*/
private boolean replacePatternSpecified;
/**
* ID of seach scope type.
*/
private String scopeTypeId;
/**
* whether file name pattern was used last time
*/
private boolean fileNamePatternSpecified;
/**
* Storage of last used Search in Archives option.
*/
private boolean searchInArchives;
/**
* Storage of last used Search in Generated sources option.
*/
private boolean searchInGenerated;
/**
* Storage of last used Path Regular Expression option.
*/
private boolean filePathRegex;
/**
* Storage for last used Use Ignore List option.
*/
private boolean useIgnoreList;
/**
* Storage for Ignore List.
*/
private List<String> ignoreList;
/**
* Storage for Text pattern sandbox content.
*/
private String textSandboxContent;
/**
* Storage for Path pattern sandbox content.
*/
private String pathSandboxContent;
/** Widths of results outline columns */
private String resultsColumnWidths;
private String resultsColumnWidthsDetails;
private String resultsColumnWidthsReplacing;
private int replaceResultsDivider;
/** Tree or flat result view mode. */
private String resultsViewMode;
/** Last selected search provider. */
private String provider;
private boolean openInNewTab;
/** Preferences node for storing history info */
private static Preferences prefs;
/** Name of preferences node where we persist history */
private static final String PREFS_NODE = "FindDialogMemory"; //NOI18N
private static final String PROP_WHOLE_WORDS = "whole_words"; //NOI18N
private static final String PROP_CASE_SENSITIVE = "case_sensitive"; //NOI18N
private static final String PROP_PRESERVE_CASE = "preserve_case"; //NOI18N
private static final String PROP_MATCH_TYPE = "match_type"; //NOI18N
private static final String PROP_SCOPE_TYPE_ID = "scope_type_id"; //NOI18N
private static final String PROP_FILENAME_PATTERN_SPECIFIED = "filename_specified"; //NOI18N
private static final String PROP_FILENAME_PATTERN_PREFIX = "filename_pattern_"; //NOI18N
private static final String PROP_REPLACE_PATTERN_PREFIX = "replace_pattern_"; //NOI18N
private static final String PROP_SEARCH_IN_ARCHIVES = "search_in_archives"; //NOI18N
private static final String PROP_SEARCH_IN_GENERATED = "search_in_generated"; //NOI18N
private static final String PROP_FILE_PATH_REGEX = "file_path_regex"; //NOI18N
private static final String PROP_USE_IGNORE_LIST = "use_ignore_list"; //NOI18N
private static final String PROP_IGNORE_LIST_PREFIX = "ignore_list_"; //NOI18N
private static final String PROP_TEXT_SANDBOX_CONTENT = "text_sandbox_content"; //NOI18N
private static final String PROP_PATH_SANDBOX_CONTENT = "path_sandbox_content"; //NOI18N
private static final String PROP_RESULTS_COLUMN_WIDTHS = "results_column_widths"; //NOI18N
private static final String PROP_RESULTS_COLUMN_WIDTHS_DETAILS = "results_column_widths_details"; //NOI18N
private static final String PROP_RESULTS_COLUMN_WIDTHS_REPLACING = "results_column_widths_replacing"; //NOI18N
private static final String PROP_REPLACE_RESULTS_DIVIDER = "replace_results_divider"; //NOI18N
private static final String PROP_RESULTS_VIEW_MODE = "results_view_mode"; //NOI18N
private static final String PROP_PROVIDER = "provider"; //NOI18N
private static final String PROP_OPEN_IN_NEW_TAB = "open_in_new_tab"; //NOI18N
/** Creates a new instance of FindDialogMemory */
private FindDialogMemory() {
prefs = NbPreferences.forModule(FindDialogMemory.class).node(PREFS_NODE);
load();
}
/**
*/
public static FindDialogMemory getDefault() {
if (singleton == null) {
singleton = new FindDialogMemory();
}
return singleton;
}
/**
* Loads search history stored in previous system sessions.
*/
private void load () {
wholeWords = prefs.getBoolean(PROP_WHOLE_WORDS, false);
caseSensitive = prefs.getBoolean(PROP_CASE_SENSITIVE, false);
try {
String name = prefs.get(PROP_MATCH_TYPE, MatchType.LITERAL.name());
matchType = MatchType.valueOf(name);
} catch (Exception e) {
matchType = MatchType.LITERAL;
}
preserveCase = prefs.getBoolean(PROP_PRESERVE_CASE, false);
scopeTypeId = prefs.get(PROP_SCOPE_TYPE_ID, "open projects"); //NOI18N
fileNamePatternSpecified = prefs.getBoolean(PROP_FILENAME_PATTERN_SPECIFIED, false);
searchInArchives = prefs.getBoolean(PROP_SEARCH_IN_ARCHIVES, false);
searchInGenerated = prefs.getBoolean(PROP_SEARCH_IN_GENERATED, false);
filePathRegex = prefs.getBoolean(PROP_FILE_PATH_REGEX, false);
useIgnoreList = prefs.getBoolean(PROP_USE_IGNORE_LIST, false);
textSandboxContent = prefs.get(PROP_TEXT_SANDBOX_CONTENT,
getText("TextPatternSandbox.textPane.text.default")); //NOI18N
pathSandboxContent = prefs.get(PROP_PATH_SANDBOX_CONTENT,
getText("PathPatternSandbox.textPane.text.default")); //NOI18N
resultsColumnWidths = prefs.get(PROP_RESULTS_COLUMN_WIDTHS,
"100:-1:-1:-1:|0:"); //NOI18N
resultsColumnWidthsDetails = prefs.get(PROP_RESULTS_COLUMN_WIDTHS_DETAILS,
"100:-1:-1:-1:-1:|0:"); //NOI18N
resultsColumnWidthsReplacing = prefs.get(PROP_RESULTS_COLUMN_WIDTHS_REPLACING,
"100:-1:-1:-1:-1:|0:"); //NOI18N
replaceResultsDivider = prefs.getInt(PROP_REPLACE_RESULTS_DIVIDER, -1);
resultsViewMode = prefs.get(PROP_RESULTS_VIEW_MODE, null);
provider = prefs.get(PROP_PROVIDER, null);
openInNewTab = prefs.getBoolean(PROP_OPEN_IN_NEW_TAB, true);
fileNamePatterns = new ArrayList<String>(maxFileNamePatternCount);
ignoreList = new ArrayList<String>();
for(int i=0; i < maxFileNamePatternCount; i++){
String fileNamePattern = prefs.get(PROP_FILENAME_PATTERN_PREFIX + i, null);
if (fileNamePattern != null) {
fileNamePatterns.add(fileNamePattern);
}
}
if (fileNamePatterns.isEmpty()) {
addDefaultFileNamePatterns(fileNamePatterns);
}
int i = 0;
while (true) {
String item = prefs.get(PROP_IGNORE_LIST_PREFIX + i, null);
if (item == null) {
break;
} else {
ignoreList.add(item);
}
i++;
}
}
/**
* Stores a file name pattern.
* If the number of patterns would exceed the maximum
* number of patterns that can be stored, the oldest
* pattern is removed prior to storing the new pattern.
*
* @param pattern pattern to be stored
*/
public void storeFileNamePattern(String pattern) {
int index = fileNamePatterns.indexOf(pattern);
if (index != -1) {
if (index == fileNamePatterns.size() - 1) {
return;
}
fileNamePatterns.remove(index);
} else if (fileNamePatterns.size() == maxFileNamePatternCount) {
fileNamePatterns.remove(0);
}
fileNamePatterns.add(pattern);
for(int i=0;i < fileNamePatterns.size();i++){
prefs.put(PROP_FILENAME_PATTERN_PREFIX + i, fileNamePatterns.get(i));
}
}
/**
* Returns last used file name patterns in order
* from the oldest ones to the most recently used ones.
*
* @return list of the last used file name patterns, or an empty list
* if no file name patterns are stored
*/
public List<String> getFileNamePatterns() {
return (fileNamePatterns != null) ? fileNamePatterns
: Collections.<String>emptyList();
}
/**
* If there is some free space in the list of file name patterns, add some
* default values.
*/
private static void addDefaultFileNamePatterns(List<String> l) {
String[] patterns = {"*.properties", "*.txt", "*.php", "*.xml", //NOI18N
"*.java"}; //NOI18N
int free = maxFileNamePatternCount - l.size();
for (int i = 0; i < free && i < patterns.length; i++) {
l.add(patterns[i]);
}
}
public boolean isWholeWords() {
return wholeWords;
}
public void setWholeWords(boolean wholeWords) {
this.wholeWords = wholeWords;
prefs.putBoolean(PROP_WHOLE_WORDS, wholeWords);
}
public boolean isCaseSensitive() {
return caseSensitive;
}
public boolean isPreserveCase() {
return preserveCase;
}
public void setCaseSensitive(boolean caseSensitive) {
this.caseSensitive = caseSensitive;
prefs.putBoolean(PROP_CASE_SENSITIVE, caseSensitive);
}
public void setPreserveCase(boolean preserveCase) {
this.preserveCase = preserveCase;
prefs.putBoolean(PROP_PRESERVE_CASE, preserveCase);
}
public MatchType getMatchType() {
return matchType;
}
public void setMatchType(MatchType matchType) {
this.matchType = matchType;
prefs.put(PROP_MATCH_TYPE, matchType.name());
}
public String getScopeTypeId() {
return scopeTypeId;
}
public void setScopeTypeId(String scopeTypeId) {
this.scopeTypeId = scopeTypeId;
prefs.put(PROP_SCOPE_TYPE_ID, scopeTypeId);
}
public boolean isTextPatternSpecified() {
return textPatternSpecified;
}
void setTextPatternSpecified(boolean specified) {
textPatternSpecified = specified;
}
public boolean isReplacePatternSpecified() {
return replacePatternSpecified;
}
public void setReplacePatternSpecified(boolean replacePatternSpecified) {
this.replacePatternSpecified = replacePatternSpecified;
}
boolean isFileNamePatternSpecified() {
return fileNamePatternSpecified;
}
public void setFileNamePatternSpecified(boolean specified) {
fileNamePatternSpecified = specified;
prefs.putBoolean(PROP_FILENAME_PATTERN_SPECIFIED, specified);
}
boolean isSearchInArchives() {
return searchInArchives;
}
void setSearchInArchives(boolean searchInArchives) {
this.searchInArchives = searchInArchives;
prefs.putBoolean(PROP_SEARCH_IN_GENERATED, searchInArchives);
}
boolean isSearchInGenerated() {
return searchInGenerated;
}
void setSearchInGenerated(boolean searchInGenerated) {
this.searchInGenerated = searchInGenerated;
prefs.putBoolean(PROP_SEARCH_IN_GENERATED, searchInGenerated);
}
boolean isFilePathRegex() {
return filePathRegex;
}
void setFilePathRegex(boolean filePathRegex) {
this.filePathRegex = filePathRegex;
prefs.putBoolean(PROP_FILE_PATH_REGEX, filePathRegex);
}
boolean IsUseIgnoreList() {
return useIgnoreList;
}
void setUseIgnoreList(boolean useIgnoreList) {
this.useIgnoreList = useIgnoreList;
prefs.putBoolean(PROP_USE_IGNORE_LIST, useIgnoreList);
}
String getTextSandboxContent() {
return textSandboxContent;
}
void setTextSandboxContent(String textSandboxContent) {
this.textSandboxContent = textSandboxContent;
prefs.put(PROP_TEXT_SANDBOX_CONTENT, textSandboxContent);
}
String getPathSandboxContent() {
return pathSandboxContent;
}
void setPathSandboxContent(String pathSandboxContent) {
this.pathSandboxContent = pathSandboxContent;
prefs.put(PROP_PATH_SANDBOX_CONTENT, pathSandboxContent);
}
List<String> getIgnoreList() {
if (ignoreList == null) {
return Collections.emptyList();
} else {
return ignoreList;
}
}
void setIgnoreList(List<String> ignoreList) {
this.ignoreList = ignoreList;
int i = 0;
while (prefs.get(PROP_IGNORE_LIST_PREFIX + i, null) != null) {
prefs.remove(PROP_IGNORE_LIST_PREFIX + i);
i++;
}
for (int j = 0; j < ignoreList.size(); j++) {
prefs.put(PROP_IGNORE_LIST_PREFIX + j, ignoreList.get(j));
}
}
private String getText(String key) {
return NbBundle.getMessage(FindDialogMemory.class, key);
}
public String getResultsColumnWidths() {
return resultsColumnWidths;
}
public void setResultsColumnWidths(String resultsColumnWidths) {
this.resultsColumnWidths = resultsColumnWidths;
prefs.put(PROP_RESULTS_COLUMN_WIDTHS, resultsColumnWidths);
}
public String getResultsColumnWidthsDetails() {
return resultsColumnWidthsDetails;
}
public void setResultsColumnWidthsDetails(
String resultsColumnWidthsDetails) {
this.resultsColumnWidthsDetails = resultsColumnWidthsDetails;
prefs.put(PROP_RESULTS_COLUMN_WIDTHS_DETAILS,
resultsColumnWidthsDetails);
}
public String getResultsColumnWidthsReplacing() {
return resultsColumnWidthsReplacing;
}
public void setResultsColumnWidthsReplacing(
String resultsColumnWidthsReplacing) {
this.resultsColumnWidthsReplacing = resultsColumnWidthsReplacing;
prefs.put(PROP_RESULTS_COLUMN_WIDTHS_REPLACING,
resultsColumnWidthsReplacing);
}
public int getReplaceResultsDivider() {
return replaceResultsDivider;
}
public void setReplaceResultsDivider(int splitDividerLocation) {
this.replaceResultsDivider = splitDividerLocation;
prefs.putInt(PROP_REPLACE_RESULTS_DIVIDER, splitDividerLocation);
}
public String getResultsViewMode() {
return resultsViewMode;
}
public void setResultsViewMode(String resultsViewMode) {
this.resultsViewMode = resultsViewMode;
prefs.put(PROP_RESULTS_VIEW_MODE, resultsViewMode);
}
public String getProvider() {
return provider;
}
public void setProvider(String provider) {
this.provider = provider;
prefs.put(PROP_PROVIDER, provider);
}
public boolean isOpenInNewTab() {
return openInNewTab;
}
public void setOpenInNewTab(boolean openInNewTab) {
this.openInNewTab = openInNewTab;
prefs.putBoolean(PROP_OPEN_IN_NEW_TAB, openInNewTab);
}
}