package org.elixir_lang.structure_view.sorter; import com.intellij.icons.AllIcons; import com.intellij.ide.util.treeView.smartTree.ActionPresentation; import com.intellij.ide.util.treeView.smartTree.ActionPresentationData; import com.intellij.ide.util.treeView.smartTree.Sorter; import org.apache.commons.lang.NotImplementedException; import org.elixir_lang.structure_view.element.Timed; import org.elixir_lang.structure_view.element.Visible; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.util.Comparator; /** * Sorts element by their {@code #time()}, which indicates whether the element works at */ public class Visibility implements Sorter { /* * CONSTANTS */ public static final Sorter INSTANCE = new Visibility(); @NonNls public static final String VISIBILITY_SORTER_ID = "VISIBILITY_COMPARATOR"; /* * Constructors */ /** * Returns the comparator used for comparing nodes in the tree. * * @return the comparator for comparing nodes. */ @Override public Comparator getComparator() { return new Comparator() { @Override public int compare(Object o1, Object o2) { int comparison = 2; Visible.Visibility visibility1 = null; Visible.Visibility visibility2 = null; if (o1 instanceof Visible) { Visible visible1 = (Visible) o1; visibility1 = visible1.visibility(); } if (o2 instanceof Visible) { Visible visible2 = (Visible) o2; visibility2 = visible2.visibility(); } if (visibility1 == visibility2) { comparison = 0; } else if (visibility1 == Visible.Visibility.PUBLIC) { comparison = -1; } else if (visibility1 == null) { if (visibility2 == Visible.Visibility.PUBLIC) { comparison = 1; } else if (visibility2 == Visible.Visibility.PRIVATE) { comparison = -1; } } else if (visibility1 == Visible.Visibility.PRIVATE) { comparison = 1; } assert comparison != 2; return comparison; } }; } /* * Instance Methods */ /** * Returns a unique identifier for the action. * * @return the action identifier. */ @NotNull @Override public String getName() { return VISIBILITY_SORTER_ID; } /** * Returns the presentation for the action. * * @return the action presentation. * @see ActionPresentationData#ActionPresentationData(String, String, Icon) */ @NotNull @Override public ActionPresentation getPresentation() { return new ActionPresentationData( "Sort by Visibility", "Sort into public, unknown, and private", AllIcons.ObjectBrowser.VisibilitySort ); } @Override public boolean isVisible() { return true; } }