package com.siberika.idea.pascal.editor.structure;
import com.intellij.ide.structureView.StructureView;
import com.intellij.ide.structureView.StructureViewModel;
import com.intellij.ide.structureView.StructureViewTreeElement;
import com.intellij.ide.structureView.TreeBasedStructureViewBuilder;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.testFramework.LightVirtualFile;
import com.siberika.idea.pascal.lang.psi.PasModule;
import com.siberika.idea.pascal.sdk.BuiltinsParser;
import com.siberika.idea.pascal.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Author: George Bakhtadze
* Date: 07/05/2015
*/
public class PascalStructureViewBuilder extends TreeBasedStructureViewBuilder {
private static final Logger log = Logger.getInstance(PascalStructureViewBuilder.class);
private Project project;
private PsiFile file;
public void setFile(PsiFile file) {
this.file = file;
}
@NotNull
@Override
public StructureView createStructureView(FileEditor fileEditor, @NotNull Project project) {
this.project = project;
return super.createStructureView(fileEditor, project);
}
@NotNull
@Override
public StructureViewModel createStructureViewModel(@Nullable Editor editor) {
StructureViewTreeElement te;
PsiElement psiFile = file != null ? file : retrievePsiFile(editor);
PasModule mod = PsiUtil.getElementPasModule(psiFile);
if (mod != null) {
te = new PasModuleStructureTreeElement(mod);
} else {
te = new PasStructureViewTreeElement(psiFile, null);
}
return new PascalStructureViewModel(psiFile.getContainingFile(), te);
}
private PsiElement retrievePsiFile(Editor editor) {
Project prj = project;
PsiFile res = null;
if (editor != null) {
VirtualFile vf = FileDocumentManager.getInstance().getFile(editor.getDocument());
prj = editor.getProject() != null ? editor.getProject() : prj;
if ((vf != null) && (prj != null)) {
res = PsiManager.getInstance(prj).findFile(vf);
}
}
if (null != res) {
return res;
} else {
log.info("ERROR: Didn't able to determine PsiFile. Using builtins.");
LightVirtualFile vf = BuiltinsParser.getBuiltinsSource();
return PsiManager.getInstance(prj).findFile(vf);
}
}
}