/// <summary> /// Constructor for the tree. /// </summary> public classFactorTree() { m_datasetList = new ArrayList(); m_factorList = new ArrayList(); m_currentTree = null; m_treeDirty = true; }
protected void Init() { m_level = -1; m_idNumber = -1; m_groupIDNumber = -1; m_name = string.Empty; m_groupIDName = string.Empty; m_parent = null; m_children = new ArrayList(); }
public classTreeNode(classTreeNode parent) { Init(); m_parent = parent; }
/// <summary> /// Builds a tree from the hash-table for visualization or hierachy parsing. /// </summary> /// <returns></returns> public classTreeNode BuildTree() { m_currentTree = null; m_currentTree = new classTreeNode(); // Only sort if there were changes made to the ordering. if (m_treeDirty) { /// /// This object implements the IComparer interface for sorting. /// var tempDatasort = new ArrayList(); tempDatasort = m_datasetList.Clone() as ArrayList; if (m_datasetMapping == null || m_datasetMapping.Length != m_datasetList.Count) { m_datasetMapping = new long[m_datasetList.Count]; } m_datasetList.Sort(this); /// Un-mapped items will be -1 for (var i = 0; i < tempDatasort.Count; i++) { var oldName = tempDatasort[i] as clsFactorDataset; for (var j = 0; j < m_datasetList.Count; j++) { var newName = m_datasetList[j] as clsFactorDataset; if (oldName.Name == newName.Name) { m_datasetMapping[oldName.Index] = j; break; } m_datasetMapping[oldName.Index] = -1; } } // Tree has been sorted. Next time we can skip this step. m_treeDirty = false; } if (m_datasetList.Count <= 0) return m_currentTree; /// /// Now build the tree /// var root = m_currentTree; foreach (clsFactorDataset data in m_datasetList) { var tempRootNode = root; var createNew = false; long i = 0; /// /// Foreach factor, find where the tree needs to branch. /// foreach (clsFactor factor in m_factorList) { /// /// Get the factor value information /// var factorValue = data.Values[factor.Name] as string; // If we have children compare to the last item. if (factorValue == null) { factorValue = "<undefined>"; createNew = true; } else if (createNew == false && tempRootNode.Children != null && tempRootNode.Children.Count > 0) { /// /// The last node should be the one we need to examine against. /// var node = tempRootNode.Children[tempRootNode.Children.Count - 1] as classTreeNode; if (node.Name != factorValue) createNew = true; else tempRootNode = node; } else { createNew = true; } if (createNew) { var newNode = new classTreeNode(); newNode.Name = factorValue; newNode.Parent = tempRootNode; newNode.Level = i; tempRootNode.Children.Add(newNode); tempRootNode = newNode; } i++; } /// /// Add the dataset /// var dataNode = new classTreeNode(); dataNode.Name = data.Name; dataNode.Parent = tempRootNode; dataNode.Level = i; tempRootNode.Children.Add(dataNode); } return m_currentTree; }