/// <summary> /// The TREELIB (see FilterTreeViewLib (Project) > Properties > Conditional Compilation Symbol) /// switch determines whether the TreeLib LevelOrder traversal function is used or not. /// The point for training is here: /// /// Both functions are equivalent but using the TreeLib traversal function should simplify /// the problem of efficiently traversing any tree in the given order. /// </summary> #if TREELIB ///<summary> /// Convert a Model into a ViewModel using /// a LevelOrderTraversal Algorithm via TreeLib library. ///</summary> internal static MetaLocationViewModel GetViewModelFromModel(MetaLocationModel srcRoot) { if (srcRoot == null) { return(null); } var srcItems = TreeLib.BreadthFirst.Traverse.LevelOrder(srcRoot, i => i.Children); var dstIdItems = new Dictionary <int, MetaLocationViewModel>(); MetaLocationViewModel dstRoot = null; foreach (var node in srcItems.Select(i => i.Node)) { if (node.Parent == null) { dstRoot = new MetaLocationViewModel(node, null); dstIdItems.Add(dstRoot.ID, dstRoot); } else { MetaLocationViewModel vmParentItem; // Find parent ViewModel for Model dstIdItems.TryGetValue(node.Parent.ID, out vmParentItem); var dstNode = new MetaLocationViewModel(node, vmParentItem); vmParentItem.ChildrenAdd(dstNode); // Insert converted ViewModel below ViewModel parent dstIdItems.Add(dstNode.ID, dstNode); } } dstIdItems.Clear(); // Destroy temp ID look-up structure return(dstRoot); }
/// <summary> /// Convert a Model into a ViewModel using /// a LevelOrderTraversal Algorithm /// </summary> /// <param name="srcRoot"></param> internal static MetaLocationViewModel GetViewModelFromModel(MetaLocationModel srcRoot) { if (srcRoot == null) { return(null); } MetaLocationViewModel dstRoot = new MetaLocationViewModel(srcRoot, null); Queue <MetaLocationModel> srcQueue = new Queue <MetaLocationModel>(); Queue <MetaLocationViewModel> dstQueue = new Queue <MetaLocationViewModel>(); srcQueue.Enqueue(srcRoot); dstQueue.Enqueue(dstRoot); while (srcQueue.Count() > 0) { MetaLocationModel srcCurrent = srcQueue.Dequeue(); MetaLocationViewModel dstCurrent = dstQueue.Dequeue(); ////Console.WriteLine(string.Format("{0,4} - {1}" //// , iLevel, current.GetPath())); foreach (var item in srcCurrent.Children) { var dstVM = new MetaLocationViewModel(item, dstCurrent); dstCurrent.ChildrenAddBackupNodes(dstVM); srcQueue.Enqueue(item); dstQueue.Enqueue(dstVM); } } return(dstRoot); }