void LoadData()
        {
            AdornerLayer   layer = AdornerLayer.GetAdornerLayer(this);
            OverlayAdorner ad    = new OverlayAdorner(this);
            WaitBar        bar   = new WaitBar(Translation.WaitBarText);

            ad.Child = bar;
            layer.Add(ad);
            int    rangeStart = RangeStart;
            int    rangeEnd   = RangeEnd;
            string query      = this.CurrentQuery;

            ProfilingDataProvider provider = Provider;
            QueryCompiler         compiler = new QueryCompiler(Reporter, query);

            ringDiagram.SelectedRoot = null;

            task.Execute(() => LoadWorker(provider, compiler, rangeStart, rangeEnd),
                         list => LoadCompleted(list, layer, ad),
                         delegate { layer.Remove(ad); });
        }
        void txtSearchKeyDown(object sender, KeyEventArgs e)
        {
            if (!string.IsNullOrEmpty(txtSearch.Text) && list.Count > 0)
            {
                searchTask.Cancel();
                string text     = txtSearch.Text;
                int    start    = this.RangeStart;
                int    end      = this.RangeEnd;
                var    provider = this.Provider;

                AdornerLayer   layer = AdornerLayer.GetAdornerLayer(this);
                OverlayAdorner ad    = new OverlayAdorner(this);
                WaitBar        bar   = new WaitBar(Translation.WaitBarText);
                ad.Child = bar;
                layer.Add(ad);

                searchTask.Execute(
                    () => DoSearchInBackground(list.Roots.Select(i => i.Node).ToList(), start, end, text, true),
                    result => SearchCompleted(result, layer, ad),
                    delegate { layer.Remove(ad); });
            }
        }
        void Update(CallTreeNodeViewModel item)
        {
            Debug.WriteLine("RingDiagram.Update: new root = " + item);

            task.Cancel();

            Debug.WriteLine("hierarchyStack count: " + hierarchyStack.Count);

            while (hierarchyStack.Count > 0 && !hierarchyStack.Peek().IsAncestorOf(item))
            {
                hierarchyStack.Pop();
            }

            Debug.Assert(hierarchyStack.Count == 0 || hierarchyStack.Peek().IsAncestorOf(item));

            Children.Clear();

            if (item == null)
            {
                return;
            }

            List <Shape> newItems = new List <Shape>();

            Ellipse ell = new Ellipse();

            ell.Width               = 40;
            ell.Height              = 40;
            ell.VerticalAlignment   = VerticalAlignment.Center;
            ell.HorizontalAlignment = HorizontalAlignment.Center;
            ell.Fill    = Brushes.Gray;
            ell.Stroke  = Brushes.Black;
            ell.ToolTip = item.CreateToolTip(Translation);
            ell.Tag     = item;

            ell.MouseLeftButtonDown += (sender, e) =>
            {
                if (hierarchyStack.Count > 1 && hierarchyStack.Peek().Level > 1)
                {
                    var oldItem = hierarchyStack.Pop();
                    SelectedRoot            = hierarchyStack.Peek();
                    SelectedRoot.IsSelected = true;
                    SelectedRoot.IsExpanded = true;
                    oldItem.IsSelected      = false;
                }
            };

            if (hierarchyStack.Count == 0 || hierarchyStack.Peek() != item)
            {
                hierarchyStack.Push(item);
            }

            List <PiePieceDescriptor> pieces = new List <PiePieceDescriptor>();

            task.Execute(
                () => {
                if (item.CpuCyclesSpent > 0)
                {
                    CreateTree(pieces, item, 0, item.CpuCyclesSpent, 0);
                }
            },
                () => {
                Children.Add(ell);
                Children.AddRange(pieces.Select(p => CreatePiePiece(p.Radius, p.WedgeAngle, p.RotationAngle, p.Level, p.Node)));
                item.BringIntoView();
            },
                delegate { }
                );
        }