/// <summary>
 ///     Merges the children of a program part to make the plot slightly less confusing.
 /// </summary>
 /// <param name="part">the program part</param>
 private static void MergeAndCompress([JetBrains.Annotations.NotNull] CalculationProfiler.ProgramPart part)
 {
     //part.Children.Sort((x,y)=> String.Compare(x.Key, y.Key, StringComparison.Ordinal));
     for (var i = 0; i < part.Children.Count; i++)
     {
         var first = part.Children[i];
         for (var j = i + 1; j < part.Children.Count; j++)
         {
             if (first.Key == part.Children[j].Key)
             {
                 //merge
                 //_compressedItems++;
                 var second = part.Children[j];
                 first.Duration2 += second.Duration2;
                 first.Children.AddRange(second.Children);
                 part.Children.Remove(second);
                 i = -1;
                 break;
             }
         }
     }
     foreach (var child in part.Children)
     {
         MergeAndCompress(child);
     }
 }
 //convert all durations to double for later adding
 private static void InitializeDuration2([JetBrains.Annotations.NotNull] CalculationProfiler.ProgramPart part)
 {
     part.Duration2 = part.Duration.TotalSeconds;
     foreach (var child in part.Children)
     {
         InitializeDuration2(child);
     }
 }
        private void InitPartsList([JetBrains.Annotations.NotNull] CalculationProfiler.ProgramPart part)
        {
            if (_parts.Contains(part))
            {
                throw new LPGException("Fail! Part already in list");
            }
            _parts.Add(part);

            foreach (var child in part.Children)
            {
                InitPartsList(child);
            }
        }
        private void AddBars([JetBrains.Annotations.NotNull] CalculationProfiler.ProgramPart part, int row, double offset, int fontsize,
                             [JetBrains.Annotations.NotNull] Dictionary <int, IntervalBarSeries> itemsByLevel, [JetBrains.Annotations.NotNull] OxyPalette palette, [JetBrains.Annotations.NotNull] PlotModel pm)
        {
            var runningsum = offset;

            for (var i = 0; i < part.Children.Count; i++)
            {
                var programPart = part.Children[i];
                AddBars(programPart, row + 1, runningsum, fontsize, itemsByLevel, palette, pm);
                runningsum += programPart.Duration2;
            }

            //bar
            var item = new IntervalBarItem(offset, offset + part.Duration2)
            {
                Color = palette.Colors[_parts.IndexOf(part)]
            };

            if (!itemsByLevel.ContainsKey(1))
            {
                var series = new IntervalBarSeries
                {
                    FontSize = fontsize
                };
                itemsByLevel.Add(1, series);
            }
            var ibs = new IntervalBarSeries();

            for (var i = 0; i < row; i++)
            {
                ibs.Items.Add(new IntervalBarItem(0, 0, ""));
            }
            ibs.StrokeThickness = 0.1;
            ibs.Items.Add(item);
            pm.Series.Add(ibs);
            //  item.Title = name;

            //annotation
            if (string.IsNullOrWhiteSpace(part.Key))
            {
                throw new LPGException("Empty profiler key");
            }
            var name = part.Key;

            if (name.Length > 100)
            {
                name = name.Substring(0, 97) + "...";
            }
            var textAnnotation1 = new TextAnnotation
            {
                StrokeThickness = 0,
                FontSize        = 6,
                Padding         = new OxyThickness(10, 0, 10, 0)
            };
            var txtValue = name + " - " + part.Duration2.ToString("N1", CultureInfo.InvariantCulture) + "s";

            textAnnotation1.Text = txtValue;

            textAnnotation1.TextHorizontalAlignment = HorizontalAlignment.Left;
            textAnnotation1.TextPosition            = new DataPoint(offset, row + GetOffset(row));

            pm.Annotations.Add(textAnnotation1);
        }