package org.jetbrains.plugins.cucumber.steps;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiTreeChangeAdapter;
import com.intellij.psi.PsiTreeChangeEvent;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.containers.HashMap;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
public class CucumberPsiTreeListener extends PsiTreeChangeAdapter {
private Map<PsiElement, ChangesWatcher> changesWatchersMap;
public CucumberPsiTreeListener() {
changesWatchersMap = new HashMap<>();
}
public void addChangesWatcher(final PsiElement parent, final ChangesWatcher changesWatcher) {
changesWatchersMap.put(parent, changesWatcher);
}
private void processChange(final PsiElement parent) {
for (Map.Entry<PsiElement, ChangesWatcher> entry : changesWatchersMap.entrySet()) {
if (PsiTreeUtil.isAncestor(entry.getKey(), parent, false)) {
entry.getValue().onChange(parent);
}
}
}
@Override
public void childAdded(@NotNull PsiTreeChangeEvent event) {
processChange(event.getParent());
}
public void childRemoved(@NotNull final PsiTreeChangeEvent event) {
processChange(event.getParent());
}
public void childReplaced(@NotNull final PsiTreeChangeEvent event) {
processChange(event.getParent());
}
public void childrenChanged(@NotNull final PsiTreeChangeEvent event) {
processChange(event.getParent());
}
public void childMoved(@NotNull final PsiTreeChangeEvent event) {
processChange(event.getOldParent());
processChange(event.getNewParent());
}
public interface ChangesWatcher {
void onChange(final PsiElement parentPsiElement);
}
}