Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        /// <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);
        }