package flow.netbeans.markdown.csl; 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.StructureItem; import org.openide.filesystems.FileObject; import org.pegdown.ast.HeaderNode; /** * * @author Holger */ public class MarkdownTOCEntryItem implements StructureItem { private final FileObject file; private final HeaderNode node; private final String name; private final String sortText; private final int endIndex; private final int startIndex; private final List<MarkdownTOCEntryItem> nestedItems; public MarkdownTOCEntryItem(FileObject file, HeaderNode node, String sortText, int startIndex, int endIndex, List<MarkdownTOCEntryItem> nestedItems) { this.file = file; this.node = node; this.sortText = sortText; this.endIndex = endIndex; this.nestedItems = new ArrayList<MarkdownTOCEntryItem>(nestedItems); MarkdownInlineVisitor visitor = new MarkdownInlineVisitor(); node.accept(visitor); this.name = visitor.getPlainText(); this.startIndex = startIndex; } @Override public String getName() { return name; } @Override public String getSortText() { return sortText; } @Override public String getHtml(HtmlFormatter formatter) { // TODO: Format embedded links or other markdown? formatter.appendText(getName()); return formatter.getText(); } @Override public ElementHandle getElementHandle() { // TODO: This method should not return null! // return new MarkdownTOCEntryHandle(file, getName(), startIndex, endIndex); return null; } @Override public ElementKind getKind() { return ElementKind.TAG; } @Override public Set<Modifier> getModifiers() { return Collections.emptySet(); } @Override public boolean isLeaf() { return nestedItems.isEmpty(); } @Override public List<MarkdownTOCEntryItem> getNestedItems() { return Collections.unmodifiableList(nestedItems); } @Override public long getPosition() { return startIndex; } @Override public long getEndPosition() { return endIndex; } @Override public ImageIcon getCustomIcon() { return null; } @Override public int hashCode() { int hash = 7; hash = 23 * hash + (this.file != null ? this.file.hashCode() : 0); hash = 23 * hash + (this.name != null ? this.name.hashCode() : 0); return hash; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final MarkdownTOCEntryItem other = (MarkdownTOCEntryItem) obj; if (this.file != other.file && (this.file == null || !this.file.equals(other.file))) { return false; } if ((this.name == null) ? (other.name != null) : !this.name.equals(other.name)) { return false; } return true; } }