/// <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
                {
                    //ошибки бывают..
                }
            }));
        }
Beispiel #2
0
        private void InitV2(object serializedSet)
        {
#if DEBUG
            var sw = new System.Diagnostics.Stopwatch();
            sw.Start();
#endif

            FreeHierarchySelectedInfo selectedInfo = null;

            try
            {
                selectedInfo = ProtoHelper.ProtoDeserializeFromString <FreeHierarchySelectedInfo>(serializedSet as string);
            }
            catch (Exception ex)
            {
                ex.ShowMessage();
            }

            if (selectedInfo == null || selectedInfo.Items == null || !selectedInfo.Items.Any())
            {
                return;
            }

#if DEBUG
            sw.Stop();
            Console.WriteLine("InitV2, ProtoDeserializeFromString {0} млс", sw.ElapsedMilliseconds);
            sw.Restart();
#endif

            //Пока просто выделяем выбранные
            ObjectsFromSQL = XamTreeFinder.BuildPathFromSQL(selectedInfo
                                                            .Items
                                                            .Take(limit)
                                                            .Where(s => s.Id != null && s.IsSelect.GetValueOrDefault())
                                                            .Select(s => s.Id).ToList(), _tree.Tree_ID);

#if DEBUG
            sw.Stop();
            Console.WriteLine("InitV2, BuildPathFromSQL {0} млс", sw.ElapsedMilliseconds);
#endif
        }
        private void FoundedGridOnSelectedItemsChanged(object sender, SelectedItemsChangedEventArgs e)
        {
            var xamGrid = sender as DataPresenterBase;

            if (xamGrid == null)
            {
                return;
            }

            IDHierarchy selItem = null;

            if (xamGrid.SelectedItems.Records.Count > 0)
            {
                var record = xamGrid.SelectedItems.Records[0] as DataRecord;
                if (record == null)
                {
                    return;
                }

                selItem = record.DataItem as IDHierarchy;
            }
            else if (xamGrid.SelectedItems.Cells.Count > 0)
            {
                var cell = xamGrid.SelectedItems.Cells[0] as Cell;
                if (cell == null || cell.Record == null)
                {
                    return;
                }

                selItem = cell.Record.DataItem as IDHierarchy;
            }

            if (selItem == null)
            {
                return;
            }

            var path = selItem.Path;

            if (path == null)
            {
                //Строим путь к дереву
                var pathes = XamTreeFinder.BuildPathFromSQL(new List <ID_TypeHierarchy>
                {
                    new ID_TypeHierarchy
                    {
                        ID             = selItem.ID,
                        StringId       = selItem.StringId,
                        FreeHierItemId = selItem.FreeHierItemId,
                        TypeHierarchy  = selItem.TypeHierarchy,
                    }
                }, _descriptor.Tree_ID);

                if (pathes != null && pathes.Count > 0)
                {
                    path = pathes.First().Value.First();
                }
            }

            if (path == null || path.Count == 0)
            {
                return;
            }

            //разворачиваем первый попавшийся
            //Разворачиваем ветку
            _parent.ExpandFromSQL(_parent.tree.Nodes, new ConcurrentStack <ID_TypeHierarchy>(path), true);
        }
        private void FillPathes(List <IDHierarchy> ids, CancellationToken token)
        {
            if (ids == null)
            {
                return;
            }

            //Для тех, у кого пути не вернулись при поиске

            var idsWithoutPath = new List <IDHierarchy>();

            foreach (var id in ids)
            {
                if (string.IsNullOrEmpty(id.ToRootPath))
                {
                    idsWithoutPath.Add(id);
                }
            }

            Task.Factory.StartNew(() =>
            {
                //Строим путь к дереву
                var pathes = XamTreeFinder.BuildPathFromSQL(idsWithoutPath.Select(selItem => new ID_TypeHierarchy
                {
                    ID             = selItem.ID,
                    StringId       = selItem.StringId,
                    FreeHierItemId = selItem.FreeHierItemId,
                    TypeHierarchy  = selItem.TypeHierarchy,
                }).ToList(), _descriptor.Tree_ID);

                if (pathes != null && pathes.Count > 0)
                {
                    return(pathes.ToDictionary(k =>
                    {
                        var fp = k.Value.FirstOrDefault();
                        //if (fp == null) return string.Empty;

                        var ffp = fp.FirstOrDefault() as IDHierarchy;
                        //if (ffp == null) return string.Empty;

                        return ffp;
                    }, v => v.Value, new IDHierarchyComparer()));
                }

                return(null);
            }).ContinueWith(t =>
            {
                if (t.Result == null || t.Result.Count == 0)
                {
                    return;
                }

                //Отмена поиска
                if (token.IsCancellationRequested)
                {
                    return;
                }

                var pathes = t.Result;

                Dispatcher.BeginInvoke((Action)(() =>
                {
                    foreach (var id in idsWithoutPath)
                    {
                        List <List <ID_TypeHierarchy> > path;

                        if (!pathes.TryGetValue(id, out path) || path == null)
                        {
                            continue;
                        }

                        id.Path = path.First();

                        var sb = new StringBuilder();

                        for (int i = path.Count - 1; i >= 1; i--)
                        {
                            var p = path[i];
                            if (p == null)
                            {
                                continue;
                            }

                            sb.Append(p.ToString()).Append("\\");
                        }

                        id.ToRootPath = sb.ToString();
                    }
                }), DispatcherPriority.Background);
            });
        }