public bool IncludeChildrenOPCNodes(ICollection <FreeHierarchyTreeItem> children, bool isSelected = false, HashSet <long> selectedNodes = null, bool includeChildren = true) { if (HierObject == null) { return(false); } Descriptor.NeedFindUaNode = true; var mainNode = HierObject as TUANode; var result = false; if (mainNode == null || mainNode.DependentNodes == null) { return(false); } IsUaNodesInitializet = true; var uadependentnodes = UAHierarchyDictionaries.UANodesDict.GetValues( new HashSet <long>(mainNode.DependentNodes .Where(c => c.UAReferenceType != EnumOpcReferenceType.HasTypeDefinition) .Select(c => c.UANodeId)), Manager.UI.ShowMessage); //Перебор всех зависимых OPC узлов foreach (var dependentNode in uadependentnodes) { UserRightsForTreeObject right; var isExistsRight = Manager.User.AccumulateRightsAndVerify(dependentNode, EnumObjectRightType.SeeDbObjects, HierObject.GetObjectRightType(), out right); var selected = isSelected || (selectedNodes != null && selectedNodes.Contains(dependentNode.UANodeId)); var newItem = new FreeHierarchyTreeItem(Descriptor, dependentNode, selected, string.Empty, Descriptor.GetMinIdAndDecrement(), this, true, nodeRights: right, freeHierItemType: EnumFreeHierarchyItemType.UANode); var isExistsChildSeeDbObjects = false; if (children.Any(i => i.GetKey == newItem.GetKey)) { // newItem.Dispose(); return(result); } if (includeChildren) { isExistsChildSeeDbObjects = newItem.IncludeChildrenOPCNodes(newItem.Children, isSelected, selectedNodes); } //У объекта есть права на просмотр, или на дочерний объект if (isExistsRight || isExistsChildSeeDbObjects) { children.Add(newItem); Descriptor.Tree.TryAdd(newItem.FreeHierItem_ID, newItem); result = true; } else { newItem.Dispose(); } } return(result); }
public void Dispose() { try { FreeHierarchyTree = null; SelectedChanged = null; SelectedItems = null; //ContextMenu = null; //if (Tree != null && Tree.Count > 0) //{ // foreach (var t in Tree.Values.ToList()) // { // if (t == null) continue; // t.Dispose(); // } // Tree = null; //} if (PreviousSelected != null) { PreviousSelected.Dispose(); PreviousSelected = null; } if (Tree != null) { Tree = null; } } catch { } }
private static ConcurrentDictionary <int, FreeHierarchyTreeItem> GenerateStandartTreeSections(FreeHierarchyTreeDescriptor descriptor) { var result = new ConcurrentDictionary <int, FreeHierarchyTreeItem>(); var items = new List <FreeHierarchyTreeItem>(); HashSet <ID_TypeHierarchy> objectsHasRightDbSee = null; var hiers1 = EnumClientServiceDictionary.HierLev1List.Values; if (Manager.User != null && !Manager.User.IsAdmin) { try { //Запрашиваем права на список объектов objectsHasRightDbSee = Manager.User.UserHasRightDbSee(hiers1.Select(h1 => new ID_TypeHierarchy { ID = h1.Id, TypeHierarchy = enumTypeHierarchy.Dict_HierLev1, }).ToList()); } catch (Exception ex) { Manager.UI.ShowMessage("Ошибка запроса прав: " + ex.Message); } } foreach (var item in hiers1.OrderBy(v => v.Item)) { //Глобальный фильтр if (!IsGlobalFilterHaveItem(item)) { continue; } var minID = descriptor.GetMinIdAndDecrement(); UserRightsForTreeObject hier1Right; var isExistsRight = Manager.User.AccumulateRightsAndVerify(item, EnumObjectRightType.SeeDbObjects, null, out hier1Right); if (!isExistsRight && Manager.User != null && !Manager.User.IsAdmin && objectsHasRightDbSee != null) { //Проверяем через дочерних объектов isExistsRight = objectsHasRightDbSee.Any(o => o.ID == item.Id && o.TypeHierarchy == item.GetTypeHierarchy()); } var newItem = new FreeHierarchyTreeItem(descriptor, item, nodeName: item.Name) { FreeHierItem_ID = minID, IncludeObjectChildren = true, FreeHierItemType = EnumFreeHierarchyItemType.HierLev1, NodeRights = hier1Right }; newItem.Descriptor.Tree = result; bool isExistsChildSeeDbObjects = false; if (newItem.IncludeObjectChildren) { isExistsChildSeeDbObjects = newItem.LoadStaticChildren(isExistsRight, isLoadStatic: true); } isExistsChildSeeDbObjects = newItem.IncludeChildrenSection(item.Id, item.Type, newItem.Children) || isExistsChildSeeDbObjects || item.TIStatus.HasFlag(EnumTIStatus.Is_Section_Enabled); //У объекта нет прав на просмотр, или нет дочерних объектов на которые есть такие права if (isExistsChildSeeDbObjects) //Включаем только если есть сечения { items.Add(newItem); } else { newItem.Dispose(); } } //Сечения которые не привязаны ни к чему foreach (var section in EnumClientServiceDictionary.GetSections().Values.Where(s => s.ParentId <= 0 && s.Section_ID > 0).OrderBy(s => s.Item)) { UserRightsForTreeObject right; if (!Manager.User.AccumulateRightsAndVerify(section, EnumObjectRightType.SeeDbObjects, null, out right)) { continue; } var minID = descriptor.GetMinIdAndDecrement(); FreeHierarchyTreeItem newItem = new FreeHierarchyTreeItem(descriptor, section) { FreeHierItem_ID = minID, IncludeObjectChildren = true, NodeRights = right, FreeHierItemType = EnumFreeHierarchyItemType.Section, }; newItem.Descriptor.Tree = result; newItem.LoadStaticChildren(true); items.Add(newItem); } if (FreeHierarchyTreeDescriptor.Sort != null) { FreeHierarchyTreeDescriptor.Sort(items); } foreach (var i in items) { result[i.FreeHierItem_ID] = i; } return(result); }