/*
Copyright 2008-2010 Gephi
Authors : Mathieu Bastian <mathieu.bastian@gephi.org>
Website : http://www.gephi.org
This file is part of Gephi.
Gephi is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
Gephi is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with Gephi. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gephi.graph.dhns.node;
import org.gephi.utils.collection.avl.AVLItem;
import org.gephi.graph.api.Group;
import org.gephi.graph.api.GroupData;
import org.gephi.graph.api.Node;
import org.gephi.graph.dhns.core.DurableTreeList.DurableAVLNode;
import org.gephi.graph.dhns.utils.avl.EdgeOppositeTree;
import org.gephi.graph.dhns.utils.avl.MetaEdgeTree;
/**
* Implementation of node with default behaviour.
*
* @author Mathieu Bastian
*/
public class AbstractNode implements Node, Group, AVLItem {
//For all views
protected final NodeDataImpl nodeData;
//Particular
protected final int viewId;
public AbstractNode parent;
public int pre;
public int size;
public int level;
public int post;
public DurableAVLNode avlNode;
protected boolean enabled;
private EdgeOppositeTree edgesOutTree;
private EdgeOppositeTree edgesInTree;
private MetaEdgeTree metaEdgesOutTree;
private MetaEdgeTree metaEdgesInTree;
//Counting
private int enabledInDegree;
private int enabledOutDegree;
private int enabledMutualDegree;
private int mutualMetaEdgeDegree;
public AbstractNode(int ID, int viewId) {
this(viewId, new NodeDataImpl(ID, null), 0, 0, 0, null);
nodeData.getNodes().add(this);
}
public AbstractNode(NodeDataImpl nodeData, int viewId) {
this(viewId, nodeData, 0, 0, 0, null);
nodeData.getNodes().add(this);
}
public AbstractNode(int ID, int viewId, int pre, int size, int level, AbstractNode parent) {
this(viewId, new NodeDataImpl(ID, null), pre, size, level, parent);
nodeData.getNodes().add(this);
}
public AbstractNode(NodeDataImpl nodeData, int viewId, int pre, int size, int level, AbstractNode parent) {
this(viewId, nodeData, pre, size, level, parent);
nodeData.getNodes().add(this);
}
private AbstractNode(int viewId, NodeDataImpl nodeData, int pre, int size, int level, AbstractNode parent) {
this.viewId = viewId;
this.parent = parent;
this.pre = pre;
this.size = size;
this.level = level;
this.post = pre - level + size;
this.nodeData = nodeData;
edgesOutTree = new EdgeOppositeTree(this);
edgesInTree = new EdgeOppositeTree(this);
metaEdgesOutTree = new MetaEdgeTree(this);
metaEdgesInTree = new MetaEdgeTree(this);
}
public int getViewId() {
return viewId;
}
public int getPre() {
return avlNode.getIndex();
}
public int getPost() {
this.post = pre - level + size;
return post;
}
@Override
public int getId() {
return nodeData.ID;
}
@Override
public int getNumber() {
return nodeData.ID;
}
@Override
public NodeDataImpl getNodeData() {
return nodeData;
}
@Override
public GroupData getGroupData() {
return nodeData;
}
public EdgeOppositeTree getEdgesInTree() {
return edgesInTree;
}
public void setEdgesInTree(EdgeOppositeTree edgesInTree) {
this.edgesInTree = edgesInTree;
}
public EdgeOppositeTree getEdgesOutTree() {
return edgesOutTree;
}
public void setEdgesOutTree(EdgeOppositeTree edgesOutTree) {
this.edgesOutTree = edgesOutTree;
}
public MetaEdgeTree getMetaEdgesInTree() {
return metaEdgesInTree;
}
public void setMetaEdgesInTree(MetaEdgeTree metaEdgesInTree) {
this.metaEdgesInTree = metaEdgesInTree;
}
public MetaEdgeTree getMetaEdgesOutTree() {
return metaEdgesOutTree;
}
public void setMetaEdgesOutTree(MetaEdgeTree metaEdgesOutTree) {
this.metaEdgesOutTree = metaEdgesOutTree;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public void clearMetaEdges() {
metaEdgesOutTree = new MetaEdgeTree(this);
metaEdgesInTree = new MetaEdgeTree(this);
}
public boolean isValid(int viewId) {
return avlNode != null && this.viewId == viewId;
}
public AbstractNode getInView(int viewId) {
if (avlNode == null) {
return null;
}
if (this.viewId == viewId) {
return this;
}
return nodeData.getNodes().get(viewId);
}
public void removeFromView(int viewId) {
nodeData.getNodes().remove(viewId);
}
public int countInViews() {
return nodeData.getNodes().getCount();
}
public void incEnabledInDegree() {
enabledInDegree++;
}
public void incEnabledOutDegree() {
enabledOutDegree++;
}
public void incEnabledMutualDegree() {
enabledMutualDegree++;
}
public void incMutualMetaEdgeDegree() {
mutualMetaEdgeDegree++;
}
public void decEnabledInDegree() {
enabledInDegree--;
}
public void decEnabledOutDegree() {
enabledOutDegree--;
}
public void decEnabledMutualDegree() {
enabledMutualDegree--;
}
public void decMutualMetaEdgeDegree() {
mutualMetaEdgeDegree--;
}
public int getEnabledInDegree() {
return enabledInDegree;
}
public void setEnabledInDegree(int enabledInDegree) {
this.enabledInDegree = enabledInDegree;
}
public int getEnabledMutualDegree() {
return enabledMutualDegree;
}
public void setEnabledMutualDegree(int enabledMutualDegree) {
this.enabledMutualDegree = enabledMutualDegree;
}
public int getEnabledOutDegree() {
return enabledOutDegree;
}
public void setEnabledOutDegree(int enabledOutDegree) {
this.enabledOutDegree = enabledOutDegree;
}
public int getMutualMetaEdgeDegree() {
return mutualMetaEdgeDegree;
}
public void setMutualMetaEdgeDegree(int mutualMetaEdgeDegree) {
this.mutualMetaEdgeDegree = mutualMetaEdgeDegree;
}
@Override
public String toString() {
return nodeData.getId();
}
}