private void Step()
        {
            if (_currentWindow.MoveNext())
            {
                IndicatorDialog dialog = _currentWindow.Current;

                //dialog.OnClose += (sender,e) => Step();
                //dialog.OnOk += (sender,e) => Step();
                //dialog.OnCancel += (sender,e) => Step();
                dialog.Indicator.DialogClosed        += (sender, e) => Step();
                dialog.Indicator._postCalculateAction = Step;

                dialog.Indicator.Calculate();//here we decide either to show dialog or not
            }
            else if (_currentWindow != null)
            {
                _currentWindow.Dispose();
            }
        }
        private IEnumerable <IndicatorDialog> ProcessIndicators()
        {
            bool   raiseIndicatorAddEvent = false;
            bool   userCanceled           = true;
            string indicatorName          = "";

            if (!IsHeatMap && _recalc)
            {
                //lock (_series)
                {
                    List <Indicator> toBeRemoved    = new List <Indicator>();
                    List <Series>    copyOfOriginal = new List <Series>();
                    copyOfOriginal.AddRange(_series);
                    foreach (Series series in copyOfOriginal)
                    {
                        Indicator indicator = series as Indicator;
                        if (indicator == null || indicator is TwinIndicator)
                        {
                            continue;
                        }
                        if (indicator._recycleFlag)
                        {
                            toBeRemoved.Add(indicator);
                            continue;
                        }
                        _chartX._updatingIndicator = true;

                        using (IndicatorDialog dialog = new IndicatorDialog())
                        {
                            //dialog.AppRoot = _chartX.AppRoot; //!!! Required
                            indicator._dialog = dialog;
                            dialog.Indicator  = indicator;
                            yield return(dialog);

                            if (indicator._toBeAdded)
                            {
                                raiseIndicatorAddEvent = true;
                                userCanceled           = !indicator._calculateResult;
                                indicatorName          = indicator.FullName;
                            }
                            indicator._toBeAdded = false;
                            if (!indicator._calculateResult)
                            {
                                toBeRemoved.Add(indicator);
                            }
                        }
                    }
                    foreach (Indicator indicator in toBeRemoved)
                    {
                        RemoveSeries(indicator, true);
                    }
                }
            }

            PostIndicatorCalculate();
            if (_afterPaintAction != null)
            {
                _afterPaintAction();
            }

            if (raiseIndicatorAddEvent)
            {
                _chartX.FireIndicatorAddCompleted(_index, indicatorName, userCanceled);
            }
        }