blob: 4bcbb06b72d00f7811d9d1f9767aa7e888f8dbdc [file] [log] [blame]
package org.eclipse.ui.views.navigator;
/**********************************************************************
Copyright (c) 2000, 2001, 2002, International Business Machines Corp and others.
All rights reserved.   This program and the accompanying materials
are made available under the terms of the Common Public License v0.5
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v05.html
 
Contributors:
**********************************************************************/
import java.util.*;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.ui.internal.ViewsPlugin;
import org.eclipse.ui.internal.WorkbenchPlugin;
/**
* Filter used to determine whether resources are to be shown or not.
*
* @since 2.0
*/
public class ResourcePatternFilter extends ViewerFilter {
private String[] patterns;
private StringMatcher[] matchers;
static final String COMMA_SEPARATOR = ",";//$NON-NLS-1$
static final String FILTERS_TAG = "resourceFilters";//$NON-NLS-1$
/**
* Creates a new resource pattern filter.
*/
public ResourcePatternFilter() {
super();
}
/**
* Return the currently configured StringMatchers. If there aren't any look
* them up.
*/
private StringMatcher[] getMatchers() {
if (this.matchers == null)
initializeFromPreferences();
return this.matchers;
}
/**
* Gets the patterns for the receiver. Returns the cached values if there
* are any - if not look it up.
*/
public String[] getPatterns() {
if (this.patterns == null)
initializeFromPreferences();
return this.patterns;
}
/**
* Initializes the filters from the preference store.
*/
private void initializeFromPreferences() {
// get the filters that were saved by ResourceNavigator.setFiltersPreference
IPreferenceStore viewsPrefs = ViewsPlugin.getDefault().getPreferenceStore();
String storedPatterns = viewsPrefs.getString(FILTERS_TAG);
if (storedPatterns.length() == 0) {
// try to migrate patterns from old workbench preference store location
IPreferenceStore workbenchPrefs = WorkbenchPlugin.getDefault().getPreferenceStore();
storedPatterns = workbenchPrefs.getString(FILTERS_TAG);
if (storedPatterns.length() > 0) {
viewsPrefs.setValue(FILTERS_TAG, storedPatterns);
workbenchPrefs.setValue(FILTERS_TAG, ""); //$NON-NLS-1$
}
}
if (storedPatterns.length() == 0) {
// revert to all filter extensions with selected == "true"
// if there are no filters in the preference store
List defaultFilters = FiltersContentProvider.getDefaultFilters();
String[] patterns = new String[defaultFilters.size()];
defaultFilters.toArray(patterns);
setPatterns(patterns);
return;
}
//Get the strings separated by a comma and filter them from the currently
//defined ones
List definedFilters = FiltersContentProvider.getDefinedFilters();
StringTokenizer entries = new StringTokenizer(storedPatterns, COMMA_SEPARATOR);
List patterns = new ArrayList();
while (entries.hasMoreElements()) {
String nextToken = entries.nextToken();
if (definedFilters.indexOf(nextToken) > -1)
patterns.add(nextToken);
}
//Convert to an array of Strings
String[] patternArray = new String[patterns.size()];
patterns.toArray(patternArray);
setPatterns(patternArray);
}
/* (non-Javadoc)
* Method declared on ViewerFilter.
*/
public boolean select(Viewer viewer, Object parentElement, Object element) {
IResource resource = null;
if (element instanceof IResource) {
resource = (IResource) element;
} else
if (element instanceof IAdaptable) {
IAdaptable adaptable = (IAdaptable) element;
resource = (IResource) adaptable.getAdapter(IResource.class);
}
if (resource != null) {
String name = resource.getName();
StringMatcher[] testMatchers = getMatchers();
for (int i = 0; i < testMatchers.length; i++) {
if (testMatchers[i].match(name))
return false;
}
return true;
}
return true;
}
/**
* Sets the patterns to filter out for the receiver.
*/
public void setPatterns(String[] newPatterns) {
this.patterns = newPatterns;
this.matchers = new StringMatcher[newPatterns.length];
for (int i = 0; i < newPatterns.length; i++) {
//Reset the matchers to prevent constructor overhead
matchers[i] = new StringMatcher(newPatterns[i], true, false);
}
}
}