package com.intellij.perlplugin.extensions.contributors;
import com.intellij.navigation.ChooseByNameContributor;
import com.intellij.navigation.GotoClassContributor;
import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.perlplugin.ModulesContainer;
import com.intellij.perlplugin.bo.Package;
import com.intellij.perlplugin.language.PerlIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
/**
* Created by ELI-HOME on 28-Feb-15.
*/
public class PerlGoToClassContributor implements ChooseByNameContributor, GotoClassContributor {
class PackageNameNavigationItem implements NavigationItem {
Project project;
Package aPackage;
public PackageNameNavigationItem(Project project, Package aPackage) {
this.project = project;
this.aPackage = aPackage;
}
private VirtualFile getPackageFile() {
return ModulesContainer.getVirtualFileFromPath(project, aPackage.getOriginFile());
}
@Nullable
@Override
public String getName() {
return aPackage.getQualifiedName();
}
@Nullable
@Override
public ItemPresentation getPresentation() {
return new ItemPresentation() {
@Nullable
@Override
public String getPresentableText() {
return aPackage.getQualifiedName();
}
@Nullable
@Override
public String getLocationString() {
return getPackageFile().getPresentableName();
}
@Nullable
@Override
public Icon getIcon(boolean b) {
return PerlIcons.PACKAGE;
}
};
}
@Override
public void navigate(boolean b) {
FileEditorManagerEx.getInstance(project).openFile(getPackageFile(), true);
}
@Override
public boolean canNavigate() {
return true;
}
@Override
public boolean canNavigateToSource() {
return true;
}
}
class PackageScoreComparator implements Comparator<Package> {
@Override
public int compare(Package p1, Package p2) {
return p1.isPotentialMainImplementation() && !p2.isPotentialMainImplementation() ? -1
: !p1.isPotentialMainImplementation() && p2.isPotentialMainImplementation() ? 1
: (p1.getSimpleName().compareToIgnoreCase(p2.getSimpleName()) * -1);
}
}
@Nullable
@Override
public String getQualifiedName(NavigationItem navigationItem) {
return navigationItem.getName();
}
@Nullable
@Override
public String getQualifiedNameSeparator() {
return Package.PACKAGE_SEPARATOR;
}
@NotNull
@Override
public String[] getNames(Project project, boolean b) {
ArrayList<Package> packages = ModulesContainer.getAllPackages();
HashSet<String> symbols = new HashSet<String>();
for (Package aPackage : packages) {
symbols.add(aPackage.getQualifiedName());
}
return symbols.toArray(new String[symbols.size()]);
}
@NotNull
@Override
public NavigationItem[] getItemsByName(String packageName, String searchTerm, Project project, boolean b) {
ArrayList<Package> packages = ModulesContainer.getPackageList(packageName);
Collections.sort(packages,new PackageScoreComparator());
NavigationItem[] navigationItems = new NavigationItem[packages.size()];
for (int i = 0; i < packages.size(); i++) {
navigationItems[i] = new PackageNameNavigationItem(project, packages.get(i));
}
return navigationItems;
}
}