package org.eclipse.iee.core.document.text;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public abstract class AbstractCompositeNode<C extends INode> extends AbstractNode implements ICompositeNode<C> {
private List<C> fChildren = new ArrayList<>();
public List<C> getChildren() {
return Collections.unmodifiableList(fChildren);
}
public void traverse(NodeVisitor visitor) {
traverse(visitor, 0);
}
void traverse(NodeVisitor visitor, int depth) {
visitor.head(this);
for (C child : getChildren()) {
child.traverse(visitor);
}
visitor.tail(this);
}
public boolean hasText() {
for (C node : getChildren()) {
if (node.hasText()) {
return true;
}
}
return false;
}
public void addChild(C child) {
List<C> oldValue = this.fChildren;
this.fChildren = new ArrayList<>(fChildren);
fChildren.add(child);
child.setParent(this);
getEventBusSupport().firePropertyChange("children", oldValue, fChildren);
}
public void removeChild(C child) {
List<C> oldValue = this.fChildren;
this.fChildren = new ArrayList<>(fChildren);
fChildren.remove(child);
getEventBusSupport().firePropertyChange("children", oldValue, fChildren);
}
@Override
public boolean isOrContains(INode node) {
if (this == node) {
return true;
} else {
for (C c : fChildren) {
if (c.isOrContains(node)) {
return true;
}
}
}
return false;
}
@Override
public void addChildAfter(C right, C text) {
List<C> oldValue = this.fChildren;
this.fChildren = new ArrayList<>(fChildren);
int indexOf = fChildren.indexOf(text);
fChildren.add(indexOf + 1, right);
right.setParent(this);
getEventBusSupport().firePropertyChange("children", oldValue, fChildren);
}
@Override
public void addChildBefore(C left, C text) {
List<C> oldValue = this.fChildren;
this.fChildren = new ArrayList<>(fChildren);
int indexOf = fChildren.indexOf(text);
fChildren.add(indexOf, left);
left.setParent(this);
getEventBusSupport().firePropertyChange("children", oldValue, fChildren);
}
@Override
public void replace(C replaced, C with) {
List<C> oldValue = this.fChildren;
this.fChildren = new ArrayList<>(fChildren);
int indexOf = fChildren.indexOf(replaced);
fChildren.set(indexOf, with);
with.setParent(this);
replaced.setParent(null);
getEventBusSupport().firePropertyChange("children", oldValue, fChildren);
}
}