/*
* Copyright (c) 2012 Sam Harwell, Tunnel Vision Laboratories LLC
* All rights reserved.
*
* The source code of this document is proprietary work, and is not licensed for
* distribution. For information about licensing, contact Sam Harwell at:
* sam@tunnelvisionlabs.com
*/
package org.antlr.netbeans.editor.navigation;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JToggleButton;
import org.antlr.netbeans.editor.navigation.actions.SortByNameAction;
import org.antlr.netbeans.editor.navigation.actions.SortBySourceAction;
import org.openide.util.ImageUtilities;
import org.openide.util.NbBundle;
import org.openide.util.NbPreferences;
/**
*
* @author Sam Harwell
*/
@NbBundle.Messages({
"LBL_ShowInherited=Show Inherited",
"LBL_ShowInheritedTip=Show Inherited"
})
public abstract class Filters {
protected static final String SHOW_INHERITED = "show_inherited";
protected static final String SORT_ALPHA = "sort_alpha";
protected static final String SORT_POSITION = "sort_position";
private final NavigatorPanelUI ui;
private FiltersManager filtersManager;
private boolean naturalSort;
private JToggleButton sortByNameButton;
private JToggleButton sortByPositionButton;
public Filters(NavigatorPanelUI ui) {
this.ui = ui;
naturalSort = NbPreferences.forModule(getClass()).getBoolean("naturalSort", false);
}
public boolean isNaturalSort() {
return naturalSort;
}
public void setNaturalSort(boolean value) {
this.naturalSort = value;
NbPreferences.forModule(getClass()).putBoolean("naturalSort", value);
if (sortByNameButton != null) {
sortByNameButton.setSelected(!value);
}
if (sortByPositionButton != null) {
sortByPositionButton.setSelected(value);
}
ui.sort();
}
public final FiltersManager getInstance() {
if (filtersManager == null) {
filtersManager = createFilters();
}
return filtersManager;
}
public JComponent getComponent() {
FiltersManager filters = getInstance();
return filters.getComponent(createSortButtons());
}
public Collection<Description> filter(Collection<Description> original) {
ArrayList<Description> result = new ArrayList<>(original.size());
for (Description description : original) {
if (!filterImpl(description)) {
continue;
}
result.add(description);
}
sortImpl(result);
return result;
}
protected boolean supportsInheritedMembers() {
return true;
}
protected boolean filterImpl(Description description) {
boolean inherited = filtersManager.isSelected(SHOW_INHERITED);
return inherited || !description.isInherited();
}
protected void sortImpl(List<Description> descriptions) {
Collections.sort(descriptions, isNaturalSort() ? Description.POSITION_COMPARATOR : Description.ALPHA_COMPARATOR);
}
protected FiltersManager createFilters() {
FiltersDescription desc = new FiltersDescription();
describeFilters(desc);
return FiltersDescription.createManager(desc);
}
protected void describeFilters(FiltersDescription desc) {
if (supportsInheritedMembers()) {
desc.addFilter(SHOW_INHERITED,
Bundle.LBL_ShowInherited(),
Bundle.LBL_ShowInheritedTip(),
false, ImageUtilities.loadImageIcon("org/antlr/netbeans/editor/navigation/resources/filterHideInherited.png", false), //NOI18N
null
);
}
}
protected JToggleButton[] createSortButtons() {
if (sortByNameButton == null) {
sortByNameButton = new JToggleButton(new SortByNameAction(this));
sortByNameButton.setToolTipText(sortByNameButton.getText());
sortByNameButton.setText(null);
sortByNameButton.setSelected(!naturalSort);
sortByNameButton.setFocusable(false);
}
if (sortByPositionButton == null) {
sortByPositionButton = new JToggleButton(new SortBySourceAction(this));
sortByPositionButton.setToolTipText(sortByPositionButton.getText());
sortByPositionButton.setText(null);
sortByPositionButton.setSelected(naturalSort);
sortByPositionButton.setFocusable(false);
}
return new JToggleButton[] { sortByNameButton, sortByPositionButton };
}
}