package com.siberika.idea.pascal.editor.structure; import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.ide.structureView.impl.common.PsiTreeElementBase; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.siberika.idea.pascal.PascalIcons; import com.siberika.idea.pascal.lang.psi.PasEntityScope; import com.siberika.idea.pascal.lang.psi.PascalNamedElement; import com.siberika.idea.pascal.lang.psi.PascalStructType; import com.siberika.idea.pascal.lang.psi.impl.PasField; import com.siberika.idea.pascal.util.PsiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; /** * Author: George Bakhtadze * Date: 16/09/2013 */ public class PasStructureViewTreeElement extends PsiTreeElementBase<PsiElement> implements StructureViewTreeElement { private final PasField field; protected PasStructureViewTreeElement(PsiElement psiElement, PasField field) { super(field != null ? field.getElement() : psiElement); this.field = field; } @NotNull @Override public Collection<StructureViewTreeElement> getChildrenBase() { return Collections.emptyList(); } @NotNull public static Collection<StructureViewTreeElement> collectChildren(@Nullable PasEntityScope element) { if (null == element) { return Collections.emptyList(); } Collection<PasField> fields = element.getAllFields(); Collection<StructureViewTreeElement> res = new ArrayList<StructureViewTreeElement>(); for (PasField field : fields) { if (PasField.TYPES_STRUCTURE.contains(field.fieldType)) { if (field.fieldType == PasField.FieldType.TYPE) { PascalStructType structType = PasStructStructureTreeElement.getStructElement(field); if (structType != null) { res.add(new PasStructStructureTreeElement(structType)); } else { res.add(new PasStructureViewTreeElement(field.getElement(), field)); } } else { res.add(new PasStructureViewTreeElement(field.getElement(), field)); } } } return res; } public PasField getField() { return field; } @Override public Icon getIcon(boolean open) { if (field != null) { if (field.fieldType == PasField.FieldType.VARIABLE) { return PascalIcons.VARIABLE; } else if (field.fieldType == PasField.FieldType.CONSTANT) { return PascalIcons.CONSTANT; } else if (field.fieldType == PasField.FieldType.TYPE) { return PascalIcons.TYPE; } else if (field.fieldType == PasField.FieldType.PROPERTY) { return PascalIcons.PROPERTY; } else if (field.fieldType == PasField.FieldType.ROUTINE) { return PascalIcons.ROUTINE; } } return super.getIcon(open); } @Nullable @Override public String getPresentableText() { PsiElement element = getElement(); if (element instanceof PascalNamedElement) { return PsiUtil.getFieldName((PascalNamedElement) element); } else if (element instanceof PsiFile) { return ((PsiFile) element).getName(); } else { return "-"; } } }