package org.intellij.plugins.markdown.lang.psi.impl;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import com.intellij.lang.ASTNode;
import com.intellij.navigation.ItemPresentation;
import org.intellij.plugins.markdown.lang.psi.MarkdownPsiElement;
import org.intellij.plugins.markdown.structureView.MarkdownBasePresentation;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public abstract class MarkdownCompositePsiElementBase extends ASTWrapperPsiElement implements MarkdownPsiElement {
public static final int PRESENTABLE_TEXT_LENGTH = 50;
public MarkdownCompositePsiElementBase(@NotNull ASTNode node) {
super(node);
}
protected abstract String getPresentableTagName();
@NotNull
protected CharSequence getChars() {
return getTextRange().subSequence(getContainingFile().getViewProvider().getContents());
}
@NotNull
protected String shrinkTextTo(int length) {
final CharSequence chars = getChars();
return chars.subSequence(0, Math.min(length, chars.length())).toString();
}
@NotNull
@Override
public List<MarkdownPsiElement> getCompositeChildren() {
return Arrays.asList(findChildrenByClass(MarkdownPsiElement.class));
}
/**
* @return {@code true} if there is more than one composite child
* OR there is one child which is not a paragraph, {@code false} otherwise.
*/
public boolean hasTrivialChildren() {
final Collection<MarkdownPsiElement> children = getCompositeChildren();
if (children.size() != 1) {
return false;
}
return children.iterator().next() instanceof MarkdownParagraphImpl;
}
@Override
public ItemPresentation getPresentation() {
return new MarkdownBasePresentation() {
@Nullable
@Override
public String getPresentableText() {
if (!isValid()) {
return null;
}
return getPresentableTagName();
}
@Nullable
@Override
public String getLocationString() {
if (!isValid()) {
return null;
}
if (getCompositeChildren().size() == 0) {
return shrinkTextTo(PRESENTABLE_TEXT_LENGTH);
}
else {
return null;
}
}
};
}
}