public void LoadTypes(EnumModuleFilter?rightFilter, HashSet <long> selectedNodes = null, bool IsDeclaratorMainTree = false) { _isDeclaratorMainTree = IsDeclaratorMainTree; _currentRightFilter = rightFilter; if (!Manager.IsDesignMode) { try { if (Items != null) { Items.DisposeChildren(); Items.Clear(); } var treeTypes = GlobalFreeHierarchyDictionary.GetTypes(rightFilter).Values .Where(t => t.Parent == null).ToList(); //пока здесь. для описателя в основном дереве отображаем перечень OPCUA серверов, для этого добавляем строку в стандартные деревья if (IsDeclaratorMainTree && Manager.User.IsAdmin) { FreeHierarchyTypeTreeItem stdtree = treeTypes.FirstOrDefault(i => i.FreeHierTree_ID == -100); FreeHierarchyTypeTreeItem OPCtree = new FreeHierarchyTypeTreeItem { FreeHierTree_ID = -1001, StringName = "Сервера OPCUA" }; if (stdtree != null && !stdtree.Children.Any(i => i.FreeHierTree_ID == -1001)) { stdtree.Children.Add(OPCtree); } else if (stdtree == null && !treeTypes.Any(i => i.FreeHierTree_ID == -1001)) { treeTypes.Add(OPCtree); } } //ТОЛЬКО для описателя if (IsDeclaratorMainTree) { FreeHierarchyTypeTreeItem stdtree = treeTypes.FirstOrDefault(i => i.FreeHierTree_ID == -100); FreeHierarchyTypeTreeItem OPCtree = new FreeHierarchyTypeTreeItem { FreeHierTree_ID = -1002, StringName = "ФИАС - используемые адреса" }; if (stdtree != null && stdtree.Children.All(i => i.FreeHierTree_ID != -1002)) { stdtree.Children.Add(OPCtree); } else if (stdtree == null && treeTypes.All(i => i.FreeHierTree_ID != -1002)) { treeTypes.Add(OPCtree); } } Items = new ObservableCollection <FreeHierarchyTypeTreeItem>(treeTypes); } catch (Exception) { Manager.UI.ShowMessage("Не удалось загрузить типы свободных иерархий!"); } } }
private void tree_ActiveNodeChanged(object sender, ActiveNodeChangedEventArgs e) { try { if (e.NewActiveTreeNode == null || e.NewActiveTreeNode.Data == null) { ActiveTreeNode = null; } else { ActiveTreeNode = e.NewActiveTreeNode.Data as FreeHierarchyTypeTreeItem; } OnActiveNodeChanged(); } catch { } }
/// <summary> /// перезагрузка дерева /// </summary> public void ReloadTree(int?ActiveNode_ID = null) { var fnd = new Dictionary <object, Stack>(); FreeHierarchyTypeTreeItem obj = null; Manager.User.ReloadFreeHierarchyTypes(Manager.UI.ShowMessage); LoadTypes(_currentRightFilter, new HashSet <long> { ActiveNode_ID ?? -101 }, _isDeclaratorMainTree); var allNodes = GlobalFreeHierarchyDictionary.GetTypes(_currentRightFilter); if (allNodes != null) { allNodes.TryGetValue(ActiveNode_ID ?? -101, out obj); } if (obj == null) { return; } //fnd[obj] = obj.GetParents(); ActiveTreeNode = obj; Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new System.Action(delegate() { try { XamTreeFinder.ExpandAndSelectXamTree(fnd, obj, tree); } catch { //ошибки бывают.. } })); }
/// <summary> /// Подгрузчик дерева /// </summary> /// <param name="freeHierarchyTypeTreeItem"></param> /// <param name="isFullReload"></param> public TreeStartLoader(FreeHierarchyTree tree, FreeHierarchyTypeTreeItem freeHierarchyTypeTreeItem, HashSet <long> selectedNodes, bool isFullReload = false, HashSet <int> singreRootFreeHierItemIds = null) { if (freeHierarchyTypeTreeItem == null || tree == null) { return; } var d = new FreeHierarchyTreeDescriptor { //TreeID = freeHierarchyTypeTreeItem.FreeHierTree_ID, FilterStatus = tree.FilterStatus, TreeHashId = GetHashCode(), IsSelectSingle = tree.IsSelectSingle, ShowUspdAndE422InTree = tree.ShowUspdAndE422InTree, IsHideSelectMany = tree.IsHideSelectMany, NeedFindTransformatorsAndreactors = tree.IsShowTransformatorsAndReactors, NeedFindTI = !tree.IsHideTi && (freeHierarchyTypeTreeItem.FreeHierTree_ID >= GlobalFreeHierarchyDictionary.TreeTypeStandartPS || freeHierarchyTypeTreeItem.FreeHierTree_ID == GlobalFreeHierarchyDictionary.TreeTypeStandartTIFormula || freeHierarchyTypeTreeItem.FreeHierTree_ID == GlobalFreeHierarchyDictionary.TreeTypeStandartDistributingArrangementAndBusSystem), IsHideTp = tree.IsHideTp, PermissibleForSelectObjects = tree.PermissibleForSelectObjects, FreeHierarchyTree = tree, }; try { Descriptor = d; FreeHierarchyTypeTreeItem = freeHierarchyTypeTreeItem; FreeHierarchyTreeItems = GlobalFreeHierarchyDictionary.GetTree(d, out IsFirstLoaded, tree.IsHideTi, selectedNodes, isFullReload, singreRootFreeHierItemIds); } catch (Exception ex) { Manager.UI.ShowMessage(ex.Message); } }
public void Dispose() { Descriptor = null; FreeHierarchyTreeItems = null; FreeHierarchyTypeTreeItem = null; }
/// <summary> /// Ждем подгрузки дерева, инициализируем /// </summary> public void LoadTreeAndInit(FreeHierarchyTypeTreeItem freeHierarchyTypeTreeItem, bool isFullReload = false, HashSet <int> singreRootFreeHierItemIds = null) { #region Очищаем старое дерево var items = Items; Items = null; string previousSets = null; if (descriptor != null) { if (descriptor.FreeHierarchyTree != null) { //Запоминаем выбранные на прошлом дереве объекты previousSets = descriptor.FreeHierarchyTree.GetSelectedToSet(); } descriptor.Dispose(); descriptor = null; } if (items != null) { items.DisposeChildren(); items = null; } selectedType.DataContext = null; #endregion if (freeHierarchyTypeTreeItem != null) { Tree_ID = freeHierarchyTypeTreeItem.FreeHierTree_ID; } else { Tree_ID = DefaultTree_ID; } if (previousSets != null) { if (_startSelector != null) { try { _startSelector.Dispose(); _startSelector = null; } catch { } } //Была смена дерева, пытаемся выделить объекты с предыдущего дерева SetItemsForSelection(previousSets, 2); } MainLayout.RunAsync(() => new TreeStartLoader(this, freeHierarchyTypeTreeItem, _selectedNodes, isFullReload, singreRootFreeHierItemIds), loader => { //Ошибка загрузки дерева lock (_selectedNodesSyncLock) { if (loader == null || loader.Descriptor == null) { return; } } if (IsSelectSingle) { butNone.Visibility = showOnlySelected.Visibility = butAll.Visibility = System.Windows.Visibility.Collapsed; } var isFirstUsed = loader.IsFirstLoaded; IDictionary <int, FreeHierarchyTreeItem> source; lock (_selectedNodesSyncLock) { source = loader.FreeHierarchyTreeItems; descriptor = loader.Descriptor; freeHierarchyTypeTreeItem = loader.FreeHierarchyTypeTreeItem; //_loader = null; var prevTypeTreeItem = selectedType.DataContext as FreeHierarchyTypeTreeItem; if (prevTypeTreeItem != null) { selectedType.DataContext = null; prevTypeTreeItem.Dispose(); } descriptor.SelectedChanged += DescOnSelectedChanged; loader.Dispose(); } if (source == null) { return; } selectedType.DataContext = freeHierarchyTypeTreeItem; IEnumerable <KeyValuePair <int, FreeHierarchyTreeItem> > query; query = source.Where(i => i.Value != null && i.Value.Parent == null); //else //{ // //Нужно отобразить с дерево с определенного узла // query = source.Where(i => i.Value != null && singreRootFreeHierItemIds.Contains(i.Value.FreeHierItem_ID)); //} var parents = new RangeObservableCollection <FreeHierarchyTreeItem>(query .Select(i => i.Value).OrderBy(o => o, new FreeHierarchyTreeItemComparer()), new FreeHierarchyTreeItemComparer()); if (IsNSIDocuments) { parents.Add(new FreeHierarchyTreeItem(descriptor, null as FreeHierarchyTreeItem) { FreeHierItemType = EnumFreeHierarchyItemType.CommonDocuments, StringName = "Общие документы" }); } var module = FindModule(this); if (module != null && Manager.Config.TreeDefaults != null) { Manager.Config.TreeDefaults[module.ModuleType + Name] = descriptor.Tree_ID.GetValueOrDefault(); } //Пытаемся оставить совместимость if (module != null && Manager.Config.FreeSets != null) { var setKey = module.ModuleType + ":" + freeHierarchyTypeTreeItem.FreeHierTree_ID; Dictionary <string, List <string> > set; if (Manager.Config.FreeSets.TryGetValue(setKey, out set) && set != null) { Dictionary <string, List <string> > ks; if (Manager.Config.FreeSets.TryGetValue( freeHierarchyTypeTreeItem.FreeHierTree_ID.ToString(), out ks) && ks != null) { foreach (var k in ks) { List <string> existsSet; if (set.TryGetValue(k.Key, out existsSet) && existsSet != null) { existsSet.AddRange(k.Value); } else { set[k.Key] = k.Value; } } } Manager.Config.FreeSets[freeHierarchyTypeTreeItem.FreeHierTree_ID.ToString()] = set; Manager.Config.FreeSets.Remove(setKey); } } sets.InitGlobal(freeHierarchyTypeTreeItem.FreeHierTree_ID.ToString()); Items = parents; if (OnTreeDataLoaded != null) { OnTreeDataLoaded(this, new EventArgsTreeItems { Items = parents, }); } }, priority: DispatcherPriority.Normal); }