package org.jetbrains.plugins.cucumber.psi.impl;
import com.intellij.extapi.psi.ASTWrapperPsiElement;
import com.intellij.lang.ASTNode;
import com.intellij.navigation.ItemPresentation;
import com.intellij.openapi.util.Iconable;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.tree.TokenSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.cucumber.psi.GherkinElementVisitor;
import org.jetbrains.plugins.cucumber.psi.GherkinPsiElement;
import org.jetbrains.plugins.cucumber.psi.GherkinTokenTypes;
import javax.swing.*;
/**
* @author yole
*/
public abstract class GherkinPsiElementBase extends ASTWrapperPsiElement implements GherkinPsiElement {
private static final TokenSet TEXT_FILTER = TokenSet.create(GherkinTokenTypes.TEXT);
public GherkinPsiElementBase(@NotNull final ASTNode node) {
super(node);
}
@NotNull
protected String getElementText() {
final ASTNode node = getNode();
final ASTNode[] children = node.getChildren(TEXT_FILTER);
return StringUtil.join(children, astNode -> astNode.getText(), " ").trim();
}
@Override
public ItemPresentation getPresentation() {
return new ItemPresentation() {
public String getPresentableText() {
return GherkinPsiElementBase.this.getPresentableText();
}
public String getLocationString() {
return null;
}
public Icon getIcon(final boolean open) {
return GherkinPsiElementBase.this.getIcon(Iconable.ICON_FLAG_VISIBILITY);
}
};
}
protected String getPresentableText() {
return toString();
}
protected String buildPresentableText(final String prefix) {
final StringBuilder result = new StringBuilder(prefix);
final String name = getElementText();
if (!StringUtil.isEmpty(name)) {
result.append(": ").append(name);
}
return result.toString();
}
@Override
public void accept(@NotNull PsiElementVisitor visitor) {
if (visitor instanceof GherkinElementVisitor) {
acceptGherkin((GherkinElementVisitor) visitor);
}
else {
super.accept(visitor);
}
}
protected abstract void acceptGherkin(GherkinElementVisitor gherkinElementVisitor);
}