Пример #1
0
        public void Rebuild()
        {
            BaseParser lastObject   = (BaseParser)pgData.SelectedObject;
            GridItem   lastProperty = pgData.SelectedGridItem;

            pgData.SelectedObject = null;

            System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
            stopwatch.Start();

            Program.Logger.LogMessage("Rebuilding {0} nodes...", this.GetType().Name);

            treeViewWorker         = new BackgroundWorker();
            treeViewWorker.DoWork += ((s, e) =>
            {
                System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.InvariantCulture;

                tvParsers.Invoke(new Action(() => { tvParsers.Nodes.Clear(); }));

                List <TreeNode> categories = new List <TreeNode>();

                List <Type> typesWithAttrib = Assembly.GetExecutingAssembly().GetTypes()
                                              .Where(x => x.GetCustomAttributes(typeof(PrioritizedCategory), false).Length > 0 && x.GetCustomAttributes(typeof(ParserDescriptor), false).Length > 0)
                                              .OrderBy(x => ((PrioritizedCategory)x.GetAttribute <PrioritizedCategory>()).Priority)
                                              .ThenBy(x => ((ParserDescriptor)x.GetAttribute <ParserDescriptor>()).Priority)
                                              .ToList();

                foreach (Type type in typesWithAttrib)
                {
                    PrioritizedCategory categoryAttrib = type.GetAttribute <PrioritizedCategory>();

                    List <TreeNode> dataNodes = gameDataManager.GenerateTreeNodes(type, customChildCreators.ContainsKey(type) ? customChildCreators[type] : null);

                    tvParsers.Invoke(new Action(() =>
                    {
                        if (tvParsers.Nodes[categoryAttrib.Category] == null)
                        {
                            tvParsers.Nodes.Add(new TreeNode(categoryAttrib.Category)
                            {
                                Name = categoryAttrib.Category
                            });
                        }

                        tvParsers.Nodes[categoryAttrib.Category].Nodes.AddRange(dataNodes.ToArray());
                        tvParsers.Nodes[categoryAttrib.Category].Expand();
                    }));
                }

                tvParsers.Invoke(new Action(() =>
                {
                    tvParsers.SelectedNode = tvParsers.FindNodeByTag(lastObject);
                    if (lastProperty != null)
                    {
                        pgData.SelectedGridItem = lastProperty;
                    }
                    tvParsers.Invalidate();
                }));
            });

            treeViewWorker.RunWorkerCompleted += ((s, e) =>
            {
                stopwatch.Stop();
                Program.Logger.LogMessage("Nodes rebuilt in {0:0.000} sec...", stopwatch.Elapsed.TotalSeconds);
            });

            treeViewWorker.RunWorkerAsync();
        }