/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package ca.weblite.netbeans.mirah;
import ca.weblite.netbeans.mirah.lexer.MirahParser.NBMirahParserResult;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import javax.swing.ImageIcon;
import org.netbeans.modules.csl.api.ElementHandle;
import org.netbeans.modules.csl.api.ElementKind;
import org.netbeans.modules.csl.api.HtmlFormatter;
import org.netbeans.modules.csl.api.Modifier;
import org.netbeans.modules.csl.api.OffsetRange;
import org.netbeans.modules.csl.api.StructureItem;
import org.netbeans.modules.csl.spi.ParserResult;
import org.netbeans.modules.parsing.api.Snapshot;
import org.openide.filesystems.FileObject;
/**
*
* @author shannah
*/
public class MirahStructureItem implements StructureItem {
Snapshot snapshot;
NBMirahParserResult.Block item;
List<MirahStructureItem> children = null;
public MirahStructureItem(Snapshot snapshot, NBMirahParserResult.Block item){
this.snapshot = snapshot;
this.item = item;
}
@Override
public String getName() {
return ""+item.getDescription();
}
@Override
public String getSortText() {
return getName();
}
@Override
public String getHtml(HtmlFormatter hf) {
return getName();
}
@Override
public ElementHandle getElementHandle() {
return new MirahElementHandle(item, snapshot);
}
@Override
public ElementKind getKind() {
return item.getKind();
}
@Override
public Set<Modifier> getModifiers() {
return Collections.emptySet();
}
@Override
public boolean isLeaf() {
return getNestedItems().isEmpty();
}
@Override
public List<? extends StructureItem> getNestedItems() {
if ( children == null ){
children = new ArrayList<MirahStructureItem>();
for (NBMirahParserResult.Block child : item.getChildren()){
children.add(new MirahStructureItem(snapshot, child));
}
}
return children;
}
@Override
public long getPosition() {
return item.getOffset();
}
@Override
public long getEndPosition() {
return item.getOffset()+item.getLength();
}
@Override
public ImageIcon getCustomIcon() {
return null;
}
class MirahElementHandle implements ElementHandle {
Snapshot snapshot;
NBMirahParserResult.Block item;
private MirahElementHandle(NBMirahParserResult.Block item, Snapshot snapshot) {
this.snapshot = snapshot;
this.item = item;
}
@Override
public FileObject getFileObject() {
return snapshot.getSource().getFileObject();
}
@Override
public String getMimeType() {
return "text/x-mirah";
}
@Override
public String getName() {
return ""+item.getDescription();
}
@Override
public String getIn() {
return getName();
}
@Override
public ElementKind getKind() {
return ElementKind.METHOD;
}
@Override
public Set<Modifier> getModifiers() {
return Collections.emptySet();
}
@Override
public boolean signatureEquals(ElementHandle eh) {
if ( !(eh instanceof MirahElementHandle) ) return false;
if ( eh.getName().equals(this.getName()) ) return true;
return false;
}
@Override
public OffsetRange getOffsetRange(ParserResult pr) {
return new OffsetRange( item.getOffset(), item.getOffset() + item.getLength() );
}
}
}