private bool GenerateStepDefinitionSkeleton(GherkinEditorContext editorContext)
        {
            var bindingMatchService = GetBindingMatchService(editorContext.LanguageService);

            if (bindingMatchService == null)
            {
                return(false);
            }

            var fileScope = editorContext.LanguageService.GetFileScope(waitForLatest: true);

            if (fileScope == null)
            {
                return(false);
            }

            var featureTitle   = GetFeatureTitle(fileScope);
            var bindingCulture = editorContext.ProjectScope.SpecFlowConfiguration.BindingCulture ?? fileScope.GherkinDialect.CultureInfo;
            var steps          = GetUnboundSteps(bindingMatchService, fileScope, bindingCulture).ToArray();

            if (steps.Length == 0)
            {
                MessageBox.Show("All steps are bound!", "Generate step definition skeleton");
                return(true);
            }

            var specFlowProject             = ((VsProjectScope)editorContext.ProjectScope).Project;
            var defaultLanguage             = VsProjectScope.GetTargetLanguage(specFlowProject);
            var stepDefinitionSkeletonStyle = editorContext.ProjectScope.SpecFlowConfiguration.StepDefinitionSkeletonStyle;

            using (var skeletonGeneratorForm = new GenerateStepDefinitionSkeletonForm(featureTitle, steps, specFlowProject, stepDefinitionSkeletonStyle, defaultLanguage, dte))
            {
                skeletonGeneratorForm.OnPreview = (form) =>
                {
                    var skeleton = stepDefinitionSkeletonProvider.GetBindingClassSkeleton(
                        defaultLanguage, form.SelectedSteps, "MyNamespace",
                        form.ClassName, form.Style, bindingCulture);
                    MessageBox.Show(skeleton, "Step definition skeleton preview");
                };
                skeletonGeneratorForm.OnCopy = (form) =>
                {
                    var skeleton = string.Join(Environment.NewLine,
                                               form.SelectedSteps.Select(si => stepDefinitionSkeletonProvider.GetStepDefinitionSkeleton(
                                                                             defaultLanguage, si, form.Style, bindingCulture)).Distinct()).Indent(StepDefinitionSkeletonProvider.METHOD_INDENT);

                    Clipboard.SetText(skeleton);
                    return(true);
                };
                skeletonGeneratorForm.OnGenerate = (form, targetPath) =>
                {
                    var project  = GetTartgetProject(targetPath, specFlowProject);
                    var language = VsProjectScope.GetTargetLanguage(project);

                    var skeleton = stepDefinitionSkeletonProvider.GetBindingClassSkeleton(
                        language, form.SelectedSteps, CalculateNamespace(targetPath, project),
                        form.ClassName, form.Style, bindingCulture);

                    string folder = Path.GetDirectoryName(targetPath);
                    if (folder != null && !Directory.Exists(folder))
                    {
                        Directory.CreateDirectory(folder);
                    }
                    File.WriteAllText(targetPath, skeleton, Encoding.UTF8);

                    var projectItem = VsxHelper.FindProjectItemByFilePath(project, targetPath);
                    if (projectItem == null)
                    {
                        projectItem = project.ProjectItems.AddFromFile(targetPath);
                    }

                    if (projectItem != null)
                    {
                        projectItem.Open();
                    }

                    return(true);
                };

                skeletonGeneratorForm.ShowDialog();
            }

            return(true);
        }