blob: 722abac0c1662ccb73eeb0d395f5f426cf16ca69 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.eclipse.dltk.internal.ui.search;
import java.util.StringTokenizer;
import org.eclipse.dltk.core.IField;
import org.eclipse.dltk.core.search.IDLTKSearchConstants;
import org.eclipse.dltk.core.search.SearchMatch;
import org.eclipse.dltk.ui.DLTKUIPlugin;
import org.eclipse.dltk.ui.search.ElementQuerySpecification;
import org.eclipse.dltk.ui.search.PatternQuerySpecification;
import org.eclipse.dltk.ui.search.QuerySpecification;
import org.eclipse.search.ui.text.Match;
import org.eclipse.search.ui.text.MatchFilter;
abstract class DLTKMatchFilter extends MatchFilter {
private static final String SETTINGS_LAST_USED_FILTERS = "filters_last_used"; //$NON-NLS-1$
public static DLTKMatchFilter[] getLastUsedFilters() {
String string = DLTKUIPlugin.getDefault().getDialogSettings().get(
SETTINGS_LAST_USED_FILTERS);
if (string != null && string.length() > 0) {
return decodeFiltersString(string);
}
return getDefaultFilters();
}
public static void setLastUsedFilters(DLTKMatchFilter[] filters) {
String encoded = encodeFilters(filters);
DLTKUIPlugin.getDefault().getDialogSettings().put(
SETTINGS_LAST_USED_FILTERS, encoded);
}
public static DLTKMatchFilter[] getDefaultFilters() {
return new DLTKMatchFilter[] { POTENTIAL_FILTER };
}
private static String encodeFilters(DLTKMatchFilter[] enabledFilters) {
StringBuffer buf = new StringBuffer();
buf.append(enabledFilters.length);
for (int i = 0; i < enabledFilters.length; i++) {
buf.append(';');
buf.append(enabledFilters[i].getID());
}
return buf.toString();
}
private static DLTKMatchFilter[] decodeFiltersString(String encodedString) {
StringTokenizer tokenizer = new StringTokenizer(encodedString, String
.valueOf(';'));
int count = Integer.valueOf(tokenizer.nextToken()).intValue();
DLTKMatchFilter[] res = new DLTKMatchFilter[count];
for (int i = 0; i < count; i++) {
res[i] = findMatchFilter(tokenizer.nextToken());
}
return res;
}
@Override
public boolean filters(Match match) {
if (match instanceof DLTKElementMatch) {
return filters((DLTKElementMatch) match);
}
return false;
}
public abstract boolean isApplicable(DLTKSearchQuery query);
public abstract boolean filters(DLTKElementMatch match);
private static final DLTKMatchFilter POTENTIAL_FILTER = new PotentialFilter();
// private static final MatchFilter IMPORT_FILTER= new ImportFilter();
private static final DLTKMatchFilter SCRIPTDOC_FILTER = new ScriptdocFilter();
private static final DLTKMatchFilter READ_FILTER = new ReadFilter();
private static final DLTKMatchFilter WRITE_FILTER = new WriteFilter();
// private static final MatchFilter INEXACT_FILTER= new
// InexactMatchFilter();
// private static final MatchFilter ERASURE_FILTER= new
// ErasureMatchFilter();
private static final DLTKMatchFilter[] ALL_FILTERS = new DLTKMatchFilter[] {
POTENTIAL_FILTER,
// IMPORT_FILTER,
SCRIPTDOC_FILTER, READ_FILTER, WRITE_FILTER
// INEXACT_FILTER,
// ERASURE_FILTER
};
public static DLTKMatchFilter[] allFilters() {
return ALL_FILTERS;
}
private static DLTKMatchFilter findMatchFilter(String id) {
for (int i = 0; i < ALL_FILTERS.length; i++) {
if (ALL_FILTERS[i].getID().equals(id))
return ALL_FILTERS[i];
}
return POTENTIAL_FILTER; // just return something, should not happen
}
}
class PotentialFilter extends DLTKMatchFilter {
@Override
public boolean filters(DLTKElementMatch match) {
return match.getAccuracy() == SearchMatch.A_INACCURATE;
}
@Override
public String getName() {
return SearchMessages.MatchFilter_PotentialFilter_name;
}
@Override
public String getActionLabel() {
return SearchMessages.MatchFilter_PotentialFilter_actionLabel;
}
@Override
public String getDescription() {
return SearchMessages.MatchFilter_PotentialFilter_description;
}
@Override
public boolean isApplicable(DLTKSearchQuery query) {
return true;
}
@Override
public String getID() {
return "filter_potential"; //$NON-NLS-1$
}
}
abstract class FieldFilter extends DLTKMatchFilter {
@Override
public boolean isApplicable(DLTKSearchQuery query) {
QuerySpecification spec = query.getSpecification();
if (spec instanceof ElementQuerySpecification) {
ElementQuerySpecification elementSpec = (ElementQuerySpecification) spec;
return elementSpec.getElement() instanceof IField;
} else if (spec instanceof PatternQuerySpecification) {
PatternQuerySpecification patternSpec = (PatternQuerySpecification) spec;
return patternSpec.getSearchFor() == IDLTKSearchConstants.FIELD;
}
return false;
}
}
class WriteFilter extends FieldFilter {
@Override
public boolean filters(DLTKElementMatch match) {
return match.isWriteAccess() && !match.isReadAccess();
}
@Override
public String getName() {
return SearchMessages.MatchFilter_WriteFilter_name;
}
@Override
public String getActionLabel() {
return SearchMessages.MatchFilter_WriteFilter_actionLabel;
}
@Override
public String getDescription() {
return SearchMessages.MatchFilter_WriteFilter_description;
}
@Override
public String getID() {
return "filter_writes"; //$NON-NLS-1$
}
}
class ReadFilter extends FieldFilter {
@Override
public boolean filters(DLTKElementMatch match) {
return match.isReadAccess() && !match.isWriteAccess();
}
@Override
public String getName() {
return SearchMessages.MatchFilter_ReadFilter_name;
}
@Override
public String getActionLabel() {
return SearchMessages.MatchFilter_ReadFilter_actionLabel;
}
@Override
public String getDescription() {
return SearchMessages.MatchFilter_ReadFilter_description;
}
@Override
public String getID() {
return "filter_reads"; //$NON-NLS-1$
}
}
class ScriptdocFilter extends DLTKMatchFilter {
@Override
public boolean filters(DLTKElementMatch match) {
return match.isScriptdoc();
}
@Override
public String getName() {
return SearchMessages.MatchFilter_DLTKdocFilter_name;
}
@Override
public String getActionLabel() {
return SearchMessages.MatchFilter_DLTKdocFilter_actionLabel;
}
@Override
public String getDescription() {
return SearchMessages.MatchFilter_DLTKdocFilter_description;
}
@Override
public boolean isApplicable(DLTKSearchQuery query) {
return true;
}
@Override
public String getID() {
return "filter_javadoc"; //$NON-NLS-1$
}
}