package com.intellij.perlplugin.extensions;
import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo;
import com.intellij.codeInsight.daemon.RelatedItemLineMarkerProvider;
import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.perlplugin.ModulesContainer;
import com.intellij.perlplugin.Utils;
import com.intellij.perlplugin.bo.Package;
import com.intellij.perlplugin.language.PerlIcons;
import com.intellij.perlplugin.psi.PerlTypes;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiManager;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class PropertyLineMarkerProvider extends RelatedItemLineMarkerProvider {
public PropertyLineMarkerProvider() {
super();
}
@Override
public RelatedItemLineMarkerInfo getLineMarkerInfo(@NotNull PsiElement element) {
return super.getLineMarkerInfo(element);
}
@Override
public void collectNavigationMarkers(List<PsiElement> elements, Collection<? super RelatedItemLineMarkerInfo> result, boolean forNavigation) {
super.collectNavigationMarkers(elements, result, forNavigation);
}
@Override
protected void collectNavigationMarkers(@NotNull PsiElement element, Collection<? super RelatedItemLineMarkerInfo> result) {
if (element !=null && element.getNode().getElementType().equals(PerlTypes.PACKAGE)) {
Project project = element.getProject();
ArrayList<Package> packageList = ModulesContainer.getPackageList(element.getText().replace(";", ""));
ArrayList<PsiElement> targets = new ArrayList();
for (int i = 0; i < packageList.size(); i++) {
String file = packageList.get(i).getOriginFile();
VirtualFile res = ModulesContainer.getVirtualFileFromPath(project,file);//element.getProject().getBaseDir().findChild("PerlDummyProject").findChild("src").findChild("test").findChild(new File(file).getName());
if(res != null) {
targets.add(PsiManager.getInstance(project).findFile(res));
}
}
if (element != null && packageList.size() > 0 && targets.size() > 0) {
NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder.create(PerlIcons.PACKAGE).
setTargets(targets).
setTooltipText("Navigate to package");
RelatedItemLineMarkerInfo<PsiElement> lineMarker = builder.createLineMarkerInfo(element);
result.add(lineMarker);
}
} else if (element !=null && element.getNode().getElementType().equals(PerlTypes.SUBROUTINE)) {
boolean isConstructor = Utils.applyRegex("sub\\s+new", element.getNode().getText()).find();
NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder.create((isConstructor) ? PerlIcons.CONSTRUCTOR : PerlIcons.SUBROUTINE).
setTargets(element).
setTooltipText((isConstructor) ? "Constructor" : "");
result.add(builder.createLineMarkerInfo(element));
}
}
}