Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }