in ArchivedSamples/Source_Control_Provider_Status_Bar_Integration/C#/SccProvider.cs [1206:1267]
private IList<uint> GetProjectItems(IVsHierarchy pHier, uint startItemid)
{
List<uint> projectNodes = new List<uint>();
// The method does a breadth-first traversal of the project's hierarchy tree
Queue<uint> nodesToWalk = new Queue<uint>();
nodesToWalk.Enqueue(startItemid);
while (nodesToWalk.Count > 0)
{
uint node = nodesToWalk.Dequeue();
projectNodes.Add(node);
DebugWalkingNode(pHier, node);
object property = null;
if (pHier.GetProperty(node, (int)__VSHPROPID.VSHPROPID_FirstChild, out property) == VSConstants.S_OK)
{
uint childnode = (uint)(int)property;
if (childnode == VSConstants.VSITEMID_NIL)
{
continue;
}
DebugWalkingNode(pHier, childnode);
if ((pHier.GetProperty(childnode, (int)__VSHPROPID.VSHPROPID_Expandable, out property) == VSConstants.S_OK && (int)property != 0) ||
(pHier.GetProperty(childnode, (int)__VSHPROPID2.VSHPROPID_Container, out property) == VSConstants.S_OK && (bool)property))
{
nodesToWalk.Enqueue(childnode);
}
else
{
projectNodes.Add(childnode);
}
while (pHier.GetProperty(childnode, (int)__VSHPROPID.VSHPROPID_NextSibling, out property) == VSConstants.S_OK)
{
childnode = (uint)(int)property;
if (childnode == VSConstants.VSITEMID_NIL)
{
break;
}
DebugWalkingNode(pHier, childnode);
if ((pHier.GetProperty(childnode, (int)__VSHPROPID.VSHPROPID_Expandable, out property) == VSConstants.S_OK && (int)property != 0) ||
(pHier.GetProperty(childnode, (int)__VSHPROPID2.VSHPROPID_Container, out property) == VSConstants.S_OK && (bool)property) )
{
nodesToWalk.Enqueue(childnode);
}
else
{
projectNodes.Add(childnode);
}
}
}
}
return projectNodes;
}