package org.intellij.plugins.markdown.lang.psi.impl;
import com.intellij.execution.process.ConsoleHighlighter;
import com.intellij.lang.ASTNode;
import com.intellij.navigation.ColoredItemPresentation;
import com.intellij.navigation.ItemPresentation;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.psi.PsiElement;
import org.intellij.plugins.markdown.lang.MarkdownTokenTypeSets;
import org.intellij.plugins.markdown.lang.MarkdownTokenTypes;
import org.intellij.plugins.markdown.structureView.MarkdownBasePresentation;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
public class MarkdownListItemImpl extends MarkdownCompositePsiElementBase {
public MarkdownListItemImpl(@NotNull ASTNode node) {
super(node);
}
@Nullable
public PsiElement getMarkerElement() {
final PsiElement child = getFirstChild();
if (child != null && MarkdownTokenTypeSets.LIST_MARKERS.contains(child.getNode().getElementType())) {
return child;
}
else {
return null;
}
}
@Nullable
public PsiElement getCheckBox() {
final PsiElement markerElement = getMarkerElement();
if (markerElement == null) {
return null;
}
final PsiElement candidate = markerElement.getNextSibling();
if (candidate != null && candidate.getNode().getElementType() == MarkdownTokenTypes.CHECK_BOX) {
return candidate;
}
else {
return null;
}
}
@Override
public ItemPresentation getPresentation() {
return new MyItemPresentation();
}
@Override
protected String getPresentableTagName() {
return "li";
}
private class MyItemPresentation extends MarkdownBasePresentation implements ColoredItemPresentation {
@Nullable
@Override
public String getPresentableText() {
if (!isValid()) {
return null;
}
final PsiElement markerElement = getMarkerElement();
if (markerElement == null) {
return null;
}
return markerElement.getText();
}
@Nullable
@Override
public String getLocationString() {
if (!isValid()) {
return null;
}
if (hasTrivialChildren()) {
final MarkdownCompositePsiElementBase element = findChildByClass(MarkdownCompositePsiElementBase.class);
assert element != null;
return element.shrinkTextTo(PRESENTABLE_TEXT_LENGTH);
}
else {
return null;
}
}
@Nullable
@Override
public Icon getIcon(boolean unused) {
return null;
}
@Nullable
@Override
public TextAttributesKey getTextAttributesKey() {
final PsiElement checkBox = getCheckBox();
if (checkBox == null) {
return null;
}
if (checkBox.textContains('x') || checkBox.textContains('X')) {
return ConsoleHighlighter.GREEN;
}
else {
return ConsoleHighlighter.RED;
}
}
}
}