package org.erlide.ui.editors.erl.outline.filters;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.ui.views.contentoutline.ContentOutline;
import org.erlide.ui.editors.erl.outline.ErlangOutlinePage;
import org.erlide.ui.prefs.PreferenceConstants;
import org.erlide.util.ErlLogger;
import org.erlide.util.ListsUtils;
import org.osgi.service.prefs.BackingStoreException;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.common.collect.Sets.SetView;
public class OutlineFilterUtils {
private static final String SEPARATOR = ",";
public static boolean loadViewDefaults(final List<String> userDefinedPatterns,
final Set<String> enabledFilterIDs) {
final IEclipsePreferences prefsNode = ErlangOutlinePage.getPrefsNode();
final boolean areUserDefinedPatternsEnabled = prefsNode.getBoolean(
PreferenceConstants.OUTLINE_CUSTOM_PATTERN_FILTERS_ENABLED, false);
final String userDefinedPatternsString = prefsNode
.get(PreferenceConstants.OUTLINE_CUSTOM_PATTERN_FILTERS, "");
userDefinedPatterns
.addAll(ListsUtils.unpackList(userDefinedPatternsString, SEPARATOR));
final String enabledFilterIDsString = prefsNode
.get(PreferenceConstants.OUTLINE_ENABLED_FILTERS, "");
enabledFilterIDs.addAll(ListsUtils.unpackList(enabledFilterIDsString, SEPARATOR));
return areUserDefinedPatternsEnabled;
}
public static void storeViewDefaults(final boolean areUserDefinedPatternsEnabled,
final List<String> userDefinedPatterns, final Set<String> enabledFilterIDs) {
final IEclipsePreferences prefsNode = ErlangOutlinePage.getPrefsNode();
prefsNode.putBoolean(PreferenceConstants.OUTLINE_CUSTOM_PATTERN_FILTERS_ENABLED,
areUserDefinedPatternsEnabled);
prefsNode.put(PreferenceConstants.OUTLINE_CUSTOM_PATTERN_FILTERS,
ListsUtils.packList(userDefinedPatterns, SEPARATOR));
prefsNode.put(PreferenceConstants.OUTLINE_ENABLED_FILTERS,
ListsUtils.packList(enabledFilterIDs, SEPARATOR));
try {
prefsNode.flush();
} catch (final BackingStoreException e) {
ErlLogger.error(e);
}
}
public static void updateViewerFilters(final StructuredViewer viewer,
final List<String> oldUserDefinedPatterns,
final Set<String> oldEnabledFilterIDs, final List<String> userDefinedPatterns,
final Set<String> enabledFilterIDs, final PatternFilter patternFilter) {
SetView<String> intersection = Sets.intersection(oldEnabledFilterIDs,
enabledFilterIDs);
SetView<String> difference = Sets.difference(enabledFilterIDs, intersection);
SetView<String> oldDifference = Sets.difference(oldEnabledFilterIDs,
intersection);
final HashSet<String> oldPatterns = Sets.newHashSet(oldUserDefinedPatterns);
final HashSet<String> patterns = Sets.newHashSet(userDefinedPatterns);
for (final String id : oldDifference) {
final FilterDescriptor desc = FilterDescriptor.getFilterDescriptor(id);
if (desc.isClassFilter()) {
viewer.removeFilter(desc.getViewerFilter());
} else {
oldPatterns.add(desc.getPattern());
}
}
for (final String id : difference) {
final FilterDescriptor desc = FilterDescriptor.getFilterDescriptor(id);
if (desc.isClassFilter()) {
final ViewerFilter createViewerFilter = desc.getViewerFilter();
viewer.addFilter(createViewerFilter);
} else {
patterns.add(desc.getPattern());
}
}
intersection = Sets.intersection(oldPatterns, patterns);
difference = Sets.difference(patterns, intersection);
oldDifference = Sets.difference(oldPatterns, intersection);
if (difference.isEmpty() && oldDifference.isEmpty()) {
return;
}
final boolean oldPatternFilterEmpty = patternFilter.isEmpty();
patternFilter.removePatterns(oldDifference);
patternFilter.addPatterns(difference);
if (oldPatternFilterEmpty != patternFilter.isEmpty()) {
if (oldPatternFilterEmpty) {
viewer.addFilter(patternFilter);
} else {
viewer.removeFilter(patternFilter);
}
} else {
viewer.refresh();
}
}
public static void addFilter(final String filterId, final boolean value,
final Object activePart) {
final FilterDescriptor desc = FilterDescriptor.getFilterDescriptor(filterId);
final ViewerFilter filter = desc.getViewerFilter();
if (filter == null) {
return;
}
final ErlangOutlinePage erlangOutlinePage;
if (activePart instanceof ErlangOutlinePage) {
erlangOutlinePage = (ErlangOutlinePage) activePart;
} else {
final ContentOutline outline = (ContentOutline) activePart;
erlangOutlinePage = (ErlangOutlinePage) outline
.getAdapter(ErlangOutlinePage.class);
}
final TreeViewer viewer = erlangOutlinePage.getTreeViewer();
if (viewer == null) {
return;
}
if (value) {
viewer.addFilter(filter);
} else {
viewer.removeFilter(filter);
}
}
public static void setFilters(final Collection<FilterDescriptor> filterDescs,
final Object activePart) {
final List<ViewerFilter> filters = Lists
.newArrayListWithCapacity(filterDescs.size());
for (final FilterDescriptor desc : filterDescs) {
final ViewerFilter filter = desc.getViewerFilter();
if (filter == null) {
continue;
}
filters.add(filter);
}
final ErlangOutlinePage erlangOutlinePage;
if (activePart instanceof ErlangOutlinePage) {
erlangOutlinePage = (ErlangOutlinePage) activePart;
} else {
final ContentOutline outline = (ContentOutline) activePart;
erlangOutlinePage = (ErlangOutlinePage) outline
.getAdapter(ErlangOutlinePage.class);
}
final TreeViewer viewer = erlangOutlinePage.getTreeViewer();
if (viewer == null) {
return;
}
viewer.setFilters(filters.toArray(new ViewerFilter[filters.size()]));
}
}