Package org.jetbrains.plugins.clojure.structure

Source Code of org.jetbrains.plugins.clojure.structure.ClojureStructureViewElement

package org.jetbrains.plugins.clojure.structure;

import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiNamedElement;
import com.intellij.ide.structureView.StructureViewTreeElement;
import com.intellij.navigation.NavigationItem;
import com.intellij.navigation.ItemPresentation;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.util.Iconable;
import org.jetbrains.plugins.clojure.psi.ClojurePsiElement;
import org.jetbrains.plugins.clojure.psi.api.defs.ClDef;

import javax.swing.*;
import java.util.ArrayList;
import java.util.List;

/**
* @author ilyas
*/
public class ClojureStructureViewElement implements StructureViewTreeElement {
  private PsiElement myElement;

  public ClojureStructureViewElement(PsiElement element) {
    myElement = element;
  }

  public PsiElement getValue() {
    return myElement;
  }

  public void navigate(boolean requestFocus) {
    ((NavigationItem) myElement).navigate(requestFocus);
  }

  public boolean canNavigate() {
    return ((NavigationItem) myElement).canNavigate();
  }

  public boolean canNavigateToSource() {
    return ((NavigationItem) myElement).canNavigateToSource();
  }

  public StructureViewTreeElement[] getChildren() {
    final List<ClojurePsiElement> childrenElements = new ArrayList<ClojurePsiElement>();
    myElement.acceptChildren(new PsiElementVisitor() {
      public void visitElement(PsiElement element) {
        if (isBrowsableElement(element)) {
          childrenElements.add((ClojurePsiElement) element);
        } else {
          element.acceptChildren(this);
        }
      }
    });

    StructureViewTreeElement[] children = new StructureViewTreeElement[childrenElements.size()];
    for (int i = 0; i < children.length; i++) {
      children[i] = new ClojureStructureViewElement(childrenElements.get(i));
    }

    return children;
  }

  private boolean isBrowsableElement(PsiElement element) {
    return element instanceof ClDef &&
            ((ClDef) element).getNameSymbol() != null;
  }

  public ItemPresentation getPresentation() {
    return new ItemPresentation() {
      public String getPresentableText() {
        if (myElement instanceof ClDef) {
          return ((ClDef) myElement).getPresentationText();
        }
        return ((PsiNamedElement) myElement).getName();
      }

      public TextAttributesKey getTextAttributesKey() {
        return null;
      }

      public String getLocationString() {
        return null;
      }

      public Icon getIcon(boolean open) {
        return myElement.getIcon(Iconable.ICON_FLAG_OPEN);
      }
    };
  }
}
TOP

Related Classes of org.jetbrains.plugins.clojure.structure.ClojureStructureViewElement

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.