package com.redhat.ceylon.eclipse.code.outline;
import java.util.Arrays;
import com.redhat.ceylon.eclipse.util.ModelProxy;
import com.redhat.ceylon.model.typechecker.model.Declaration;
class CeylonHierarchyNode
implements Comparable<CeylonHierarchyNode> {
private final ModelProxy proxy;
private boolean nonUnique;
private boolean multiple;
private CeylonHierarchyNode parent;
private CeylonHierarchyNode[] children =
new CeylonHierarchyNode[0];
private boolean focus;
public CeylonHierarchyNode(Declaration declaration) {
proxy = new ModelProxy(declaration);
}
public Declaration getDeclaration() {
return proxy.get();
}
boolean isNonUnique() {
return nonUnique;
}
void setNonUnique(boolean nonUnique) {
this.nonUnique = nonUnique;
}
void setMultiple(boolean multiple) {
this.multiple = multiple;
}
public boolean isMultiple() {
return multiple;
}
public String getName() {
return proxy.getName();
}
void addChild(CeylonHierarchyNode child) {
if (child==this) {
return;
}
for (CeylonHierarchyNode c: children) {
if (child.equals(c)) return;
}
int length = children.length;
CeylonHierarchyNode[] newChildren =
new CeylonHierarchyNode[length+1];
System.arraycopy(children, 0, newChildren, 0, length);
newChildren[length] = child;
Arrays.sort(newChildren);
children = newChildren;
child.parent = this;
}
public CeylonHierarchyNode[] getChildren() {
return children;
}
public CeylonHierarchyNode getParent() {
return parent;
}
@Override
public boolean equals(Object obj) {
if (this==obj) {
return true;
}
else if (obj instanceof CeylonHierarchyNode) {
return ((CeylonHierarchyNode) obj).proxy.equals(proxy);
}
else {
return false;
}
}
@Override
public int hashCode() {
return proxy.hashCode();
}
@Override
public String toString() {
return proxy.toString();
}
@Override
public int compareTo(CeylonHierarchyNode node) {
if (node.proxy.getQualifiedName()
.equals(proxy.getQualifiedName())) {
return 0;
}
else {
int ct = getName().compareTo(node.getName());
if (ct!=0) {
return ct;
}
else {
return proxy.getQualifiedName()
.compareTo(node.proxy.getQualifiedName());
}
}
}
public boolean isFocus() {
return focus;
}
void setFocus(boolean focus) {
this.focus = focus;
}
}