/// <summary> /// Append new stream to the stream hierarchic. /// </summary> /// <param name="item">The item.</param> private void AppendStream(MarbleBase item) { string fullName = item.Name; #region Validation if (string.IsNullOrEmpty(fullName)) { return; // TODO: error log } #endregion // Validation string[] path = fullName.Split(new [] { "." }, StringSplitOptions.RemoveEmptyEntries); IVMDataStream parent = _hierarchic.FirstOrDefault(node => node.Name == path[0]); var request = new CreateStreamVMRequest(item, parent, path.ToArray(), 1); CreateStreamVMRecursive(request); }
/// <summary> /// Creates the stream VM recursively. /// </summary> /// <param name="item">The item.</param> /// <param name="parent">The parent.</param> /// <param name="path">The path.</param> /// <param name="level">The level.</param> /// <returns></returns> private void CreateStreamVMRecursive(CreateStreamVMRequest request) { IVMDataStream vmStream = null; if (request.Parent != null) { vmStream = request.Parent.Children.FirstOrDefault(node => node.Name == request.FullName); } if (vmStream != null) { // TODO: add keywords to existing paths if (request.IsLastLevel) { return; } } else { ListCollectionView view = new ListCollectionView(_flatData); string fullName = request.FullName; view.Filter = obj => ((MarbleBase)obj).Name.StartsWith(fullName); // TBD: whether intermediate level should have an active ListCollectionView? string[] keywords = request.Item.Keywords; string name = request.Path[request.Level - 1]; vmStream = new VMDataStream(name, fullName, keywords, view); if (request.Parent == null) { _hierarchic.Add(vmStream); } if (request.IsLastLevel) { return; } } request.IncreamentLevel(vmStream); CreateStreamVMRecursive(request); }