package org.elixir_lang.structure_view.element;
import com.intellij.ide.structureView.StructureViewTreeElement;
import com.intellij.navigation.NavigationItem;
import com.intellij.psi.NavigatablePsiElement;
import org.elixir_lang.psi.NamedElement;
import org.jetbrains.annotations.Nullable;
public abstract class Element<T extends NavigatablePsiElement> implements StructureViewTreeElement, NavigationItem {
/*
* Private Instance Fields
*/
protected T navigationItem;
/*
* Constructors
*/
public Element(T navigationItem) {
this.navigationItem = navigationItem;
}
/*
* Public Instance Methods
*/
/**
* @return <code>false</code> if navigation is not possible for any reason.
*/
@Override
public boolean canNavigate() {
return navigationItem.canNavigate();
}
/**
* @return <code>false</code> if navigation to source is not possible for any reason.
* Source means some kind of editor
*/
@Override
public boolean canNavigateToSource() {
return navigationItem.canNavigateToSource();
}
/**
* The name of the {@link #navigationItem}.
*
* @return the {@link NamedElement#getName()} if {@link #navigationItem} is a {@link NamedElement}; otherwise,
* {@code null}.
*/
@Nullable
@Override
public String getName() {
String name = null;
if (navigationItem instanceof NamedElement) {
NamedElement namedElement = (NamedElement) navigationItem;
name = namedElement.getName();
}
return name;
}
/**
* Returns the data object (usually a PSI element) corresponding to the
* structure view element.
*
* @return the data object instance.
*/
@Override
public Object getValue() {
return navigationItem;
}
/**
* Open editor and select/navigate to the object there if possible.
* Just do nothing if navigation is not possible like in case of a package
*
* @param requestFocus <code>true</code> if focus requesting is necessary
*/
@Override
public void navigate(boolean requestFocus) {
navigationItem.navigate(requestFocus);
}
}