private bool Browse(Node node, double start, double range)
{
// watch for circular references.
if (m_availableNodes.ContainsKey(node.NodeId))
{
return true;
}
// get the master list of references.
BrowseDescription nodeToBrowse = new BrowseDescription();
nodeToBrowse.NodeId = node.NodeId;
nodeToBrowse.BrowseDirection = BrowseDirection.Both;
nodeToBrowse.IncludeSubtypes = true;
nodeToBrowse.NodeClassMask = 0;
nodeToBrowse.ReferenceTypeId = ReferenceTypeIds.References;
nodeToBrowse.ResultMask = (uint)BrowseResultMask.All;
ReferenceDescriptionCollection references = new ReferenceDescriptionCollection();
if (!Browse(node, nodeToBrowse, references))
{
return false;
}
// save references.
node.Handle = references;
// add to dictionary.
m_availableNodes.Add(node.NodeId, node);
// build list of hierachial targets.
List<Node> targets = new List<Node>();
for (int ii = 0; ii < references.Count; ii++)
{
ReferenceDescription reference = references[ii];
if (!reference.IsForward)
{
continue;
}
if (!Session.TypeTree.IsTypeOf(reference.ReferenceTypeId, ReferenceTypeIds.HierarchicalReferences))
{
continue;
}
Node target = Node.Copy(new Node(reference));
targets.Add(target);
}
// recursively follow sub-tree.
if (targets.Count > 0)
{
double increment = range/targets.Count;
double position = start;
for (int ii = 0; ii < targets.Count; ii++)
{
if (range == MaxProgress)
{
Log("Browsing children of '{0}'. NodeId = {1}", targets[ii], targets[ii].NodeId);
}
Browse(targets[ii], position, increment);
position += increment;
ReportProgress(position);
}
}
return true;
}