/// <summary>
 /// 更新流程步骤表{流程步骤表}对象(即:一条记录
 /// </summary>
 public int Update(TemplateStep templateStep)
 {
     using (var dbContext = UnitOfWork.Get(Unity.ContainerName))
     {
         return(new TemplateStepRepository(dbContext).Update(templateStep));
     }
 }
Exemple #2
0
        public static IStep add_Panel(this List <IStep> steps, string stepTitle, string stepSubTitle, Action <IStep> onComponentLoad)
        {
            Panel panel   = new Panel();
            var   newStep = new TemplateStep(panel, stepTitle);

            newStep.Subtitle          = stepSubTitle;
            newStep.OnComponentAction = onComponentLoad;
            steps.Add(newStep);
            return(newStep);
        }
        public static IStep add_Control(this List <IStep> steps, Control control, string stepTitle, string stepSubTitle, Action <IStep> onComponentLoad)
        {
            control.AllowDrop = false;
            var newStep = new TemplateStep(control, 10, stepTitle);

            newStep.OnComponentAction = onComponentLoad;
            newStep.Subtitle          = stepSubTitle;
            steps.Add(newStep);
            return(newStep);
        }
        public static IStep createStepWithTextBox(string stepTitle, string message)
        {
            var textBox = new TextBox();

            textBox.Multiline  = true;
            textBox.ScrollBars = ScrollBars.Vertical;
            textBox.ReadOnly   = true;
            textBox.Text       = message;
            textBox.Select(0, 0);
            var newStep = new TemplateStep(textBox, 10, stepTitle);

            return(newStep);
        }
Exemple #5
0
        public static IStep add_SelectFolder(this List <IStep> steps, string stepTitle, string defaultFolder, Action <string> setResult)
        {
            // textbox
            var textBox = new TextBox();

            textBox.TextChanged += (sender, e) =>
            {
                setResult(textBox.Text);
                PublicDI.log.info("in TextChanged");
            };
            textBox.Text       = defaultFolder;
            textBox.Width      = 400;
            textBox.Anchor     = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
            textBox.AllowDrop  = true;
            textBox.DragDrop  += (sender, e) => textBox.set_Text(Dnd.tryToGetFileOrDirectoryFromDroppedObject(e));
            textBox.DragEnter += (sender, e) => e.Effect = DragDropEffects.Copy;

            // button
            var button = new Button();

            button.Text   = "Select Folder";
            button.Width += 20;
            button.Click += (sender, e) =>
            {
                var folderBrowserDialog = new FolderBrowserDialog();
                folderBrowserDialog.SelectedPath = defaultFolder;
                if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
                {
                    textBox.Text = folderBrowserDialog.SelectedPath;
                    folderBrowserDialog.Dispose();
                }
            };

            // panel
            var panel = new FlowLayoutPanel();

            panel.Dock = DockStyle.Fill;// AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;

            panel.Controls.Add(textBox);
            panel.Controls.Add(button);

            var newStep = new TemplateStep(panel, 10, stepTitle);

            steps.Add(newStep);
            return(newStep);
        }
Exemple #6
0
        private List <TemplateStepFixstepList> LoadNextStepOptions(InstanceStepDTO AInstanceStep)
        {
            List <TemplateStepFixstepList> vList = AInstanceStep.TemplateStep.TemplateStepFixstepLists.ConvertAll <TemplateStepFixstepList>(AItem => AItem.Clone() as TemplateStepFixstepList);

            //根据退回设置,加入发起步骤,作为退回的可选项
            if (AInstanceStep.TemplateStep.IsFormReturnFirst)
            {
                TemplateStep vStepModel = AInstanceStep.GerFirstTemplateStep();
                if (vStepModel != null)
                {
                    AddReturnOptions(vList, vStepModel, vStepModel.StepName + "(退回)");
                }
            }
            //根据退回设置,加入上一个有人员处理的完成步骤,作为退回的可选项
            if (AInstanceStep.TemplateStep.IsFormReturn)
            {
                TemplateStep vStepModel = AInstanceStep.GetPreviousHasUserDealTemplateStep();
                if (vStepModel != null)
                {
                    AddReturnOptions(vList, vStepModel, vStepModel.StepName + "(退回)");
                }
            }
            //根据退回设置,加入有人员处理的所有完成步骤,作为退回的可选项
            if (AInstanceStep.TemplateStep.IsFormReturnFinish)
            {
                //取得所有通过的步骤实例,且要有人处理
                List <InstanceStep> vEntityList = (from InstanceStep vEntity in AInstanceStep.InstanceFlow.InstanceSteps
                                                   where vEntity.Status.Equals(6) && vEntity.InstanceStepUsers.Exists(AItem => (AItem as InstanceStepUser).Status.Equals(1))
                                                   select vEntity).ToList();

                if (vEntityList.Any())
                {
                    //取得步骤实例对应的步骤模板
                    var vItems = from TemplateStep vModel in AInstanceStep.TemplateFlow.TemplateSteps
                                 where vEntityList.Exists(AItem => AItem.StepId.Equals(vModel.Fid))
                                 select vModel;

                    foreach (TemplateStep vStepModel in vItems)
                    {
                        AddReturnOptions(vList, vStepModel, vStepModel.StepName + "(退回)");
                    }
                }
            }
            return(vList);
        }
Exemple #7
0
        private void AddReturnOptions(List <TemplateStepFixstepList> AList, TemplateStep AStepModel, string AStepName = "")
        {
            if (AStepModel == null || AList == null)
            {
                return;
            }

            if (!CheckHasExistReturnOptions(AList, AStepModel))
            {
                TemplateStepFixstepList vModel = new TemplateStepFixstepList();
                vModel.Fid            = Guid.NewGuid().ToString();
                vModel.StepId         = AStepModel.Fid;
                vModel.SelectStepSeq  = AStepModel.Seq;
                vModel.SelectStepName = string.IsNullOrWhiteSpace(AStepName) ? AStepModel.StepName : AStepName;
                vModel.IsReturn       = true;
                vModel.Remark         = AStepModel.Seq.ToString() + "." + AStepModel.StepName;
                AList.Add(vModel);
            }
        }
        public static IStep add_WebBrowser(this List <IStep> steps, string stepTitle, string stepSubTitle, string defaultUrl, Action <IStep> OnComponentAction)
        {
            //control.AllowDrop = false;
            var newStep = new TemplateStep(new Panel(), 10, stepTitle);

            newStep.Subtitle        = stepSubTitle;
            newStep.OnComponentLoad =
                (step) =>
            {
                var webBrowser = new WebBrowser();
                step.UI = webBrowser;
                if (false == string.IsNullOrEmpty(defaultUrl))
                {
                    webBrowser.Navigate(defaultUrl);
                }
            };
            newStep.OnComponentAction = OnComponentAction;
            steps.Add(newStep);
            return(newStep);
        }
 /// <summary>
 /// 更新流程步骤表{流程步骤表}对象(即:一条记录
 /// </summary>
 public int Update(TemplateStep templateStep)
 {
     return(Update <TemplateStep>(templateStep));
 }
 /// <summary>
 /// 添加流程步骤表{流程步骤表}对象(即:一条记录
 /// </summary>
 public long Add(TemplateStep templateStep)
 {
     return(Add <TemplateStep>(templateStep));
 }
Exemple #11
0
        /// <summary>
        /// Runs the wizard.
        /// </summary>
        public void Run()
        {
            if (!(configuration.Security is InternalServerSecurity))
            {
                if (MessageBox.Show("Importing users is only valid for internal security, do you want to change to internal security now?",
                                    "Invalid security manager",
                                    MessageBoxButtons.YesNo,
                                    MessageBoxIcon.Warning) == DialogResult.No)
                {
                    return;
                }
                else
                {
                    changeManager = true;
                }
            }
            var steps = new List <IStep>();

            controller = new WizardController(steps);

            // Welcome text
            steps.Add(new TextDisplayStep("This wizard will guide you through the steps of importing users from a CSV file for this configuration", "Welcome"));

            // Display users step
            var users    = new UserDisplay();
            var userStep = new TemplateStep(users, 0, "Select Users to Import");

            userStep.NextHandler += () =>
            {
                settings.Clear();
                settings.Add(users.GenerateConfirmation());
                return(true);
            };

            // File selection step
            var fileStep = new FileSelectionStep("Select Import File", "What CSV file to you want to import:");

            fileStep.NextHandler += () =>
            {
                if (!File.Exists(fileStep.SelectedFullPath))
                {
                    MessageBox.Show("Unable to find the file '" + fileStep.SelectedFullPath + "'",
                                    "Invalid import file",
                                    MessageBoxButtons.OK,
                                    MessageBoxIcon.Error);
                    return(false);
                }
                else
                {
                    try
                    {
                        users.LoadCsv(fileStep.SelectedFullPath);
                        return(true);
                    }
                    catch (Exception error)
                    {
                        MessageBox.Show("Unable to load the file '" + fileStep.SelectedFullPath + "'" + Environment.NewLine + error.Message,
                                        "Invalid import file",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.Error);
                        return(false);
                    }
                }
            };
            steps.Add(fileStep);
            steps.Add(userStep);

            // Configuration mode step
            var confirmation = GenerateConfirmation();

            confirmation.NextHandler += () =>
            {
                if (changeManager)
                {
                    configuration.Security = new InternalServerSecurity();
                }
                users.ApplyConfiguration(configuration);
                configuration.Security = configuration.Security;    // Force a refresh
                return(true);
            };
            steps.Add(confirmation);
            steps.Add(new TextDisplayStep("Users have been imported", "Finished"));

            var result = controller.StartWizard("Security Configuration Wizard");
        }
Exemple #12
0
        /// <summary>
        /// 检查通过情况下一步处理人是否填写
        /// </summary>
        /// <param name="AStepEntity">步骤实例</param>
        /// <param name="ATempStep">模板步骤实例</param>
        /// <returns></returns>
        private R <string> CheckFixNextUser(DealStepDTO dto, InstanceStep AStepEntity, TemplateStep ATempStep)
        {
            R <string> vResMsg = new R <string>();

            vResMsg.Code = 1;


            //要求必须填写,但却未填写
            if (ATempStep.IsFormNextman && ATempStep.IsFormNextmanMust && AStepEntity.InstanceStepNextSelusers.Count > 0)
            {
                if (dto.NextUserList == null || dto.NextUserList.Count <= 0)
                {
                    vResMsg.Msg = "未接收到流程要求选择的下一步处理人!";
                    return(vResMsg);
                }
            }

            //要求非必填,但却填写了的
            if (ATempStep.IsFormNextman &&
                !ATempStep.IsFormNextmanMust &&
                AStepEntity.InstanceStepNextSelusers.Count > 0 &&
                dto.NextUserList != null &&
                dto.NextUserList.Count > 0)
            {
                var vItems = from USERINFO vSupplyUser in dto.NextUserList
                             where !AStepEntity.InstanceStepNextSelusers.Exists(AItem => AItem.UserCode.Equals(vSupplyUser.UserCode))
                             select vSupplyUser.UserCode;

                if (vItems.Any())
                {
                    vResMsg.Msg = string.Format("接收到下一步处理人与流程要求选择的不符(如:{0})!", vItems.FirstOrDefault());
                    return(vResMsg);
                }
            }

            vResMsg.Code = 0;
            return(vResMsg);
        }
        public static TemplateStep createStepWith_TextBox(string stepTitle, TextBox textBox)
        {
            var newStep = new TemplateStep(textBox, 10, stepTitle);

            return(newStep);
        }
Exemple #14
0
        /// <summary>
        /// Generate the steps required for internal security.
        /// </summary>
        /// <returns></returns>
        private List <IStep> GenerateInternalSteps()
        {
            var steps = new List <IStep>();

            // Cache
            var cacheConfig = new CacheConfiguration();
            var cacheStep   = new TemplateStep(cacheConfig, 0, "Session Caching");

            cacheStep.NextHandler += () =>
            {
                (security as InternalServerSecurity).Cache = cacheConfig.GenerateConfig();
                settings[1] = cacheConfig.GenerateDescription();
                return(true);
            };
            steps.Add(cacheStep);

            // XML logging
            var xmlConfig = new XmlAuditingConfiguration();
            var xmlStep   = new TemplateStep(xmlConfig, 0, "XML Auditing");

            xmlStep.StepReachedHandler += () =>
            {
                if (loggers.ContainsKey(typeof(FileXmlLogger)))
                {
                    loggers.Remove(typeof(FileXmlLogger));
                }
            };
            xmlStep.NextHandler += () =>
            {
                var newLogger = xmlConfig.GenerateConfig();
                if (newLogger != null)
                {
                    loggers.Add(typeof(FileXmlLogger), newLogger);
                }
                settings[2] = xmlConfig.GenerateDescription();
                return(true);
            };
            steps.Add(xmlStep);

            // Default server permission
            var defaultServerPermission = new SelectionStep("Default Server Permission",
                                                            "What do you want as the default permission at the server level:",
                                                            "None",
                                                            "Allow",
                                                            "Deny");

            defaultServerPermission.NextHandler += () =>
            {
                switch ((string)defaultServerPermission.Selected)
                {
                case "None":
                    (security as InternalServerSecurity).DefaultRight = null;
                    settings[3] = "No default server permission";
                    break;

                case "Allow":
                    (security as InternalServerSecurity).DefaultRight = SecurityRight.Allow;
                    settings[3] = "Default server permission is allow";
                    break;

                case "Deny":
                    (security as InternalServerSecurity).DefaultRight = SecurityRight.Deny;
                    settings[3] = "Default server permission is deny";
                    break;
                }
                return(true);
            };
            steps.Add(defaultServerPermission);

            // Default project permission
            var defaultProjectPermission = new SelectionStep("Default Project Permission",
                                                             "What do you want as the default permission at the project level:",
                                                             "None",
                                                             "Allow",
                                                             "Deny");

            defaultProjectPermission.NextHandler += () =>
            {
                SecurityRight?right = null;
                switch ((string)defaultProjectPermission.Selected)
                {
                case "None":
                    settings[4] = "No default project permission";
                    break;

                case "Allow":
                    right       = SecurityRight.Allow;
                    settings[4] = "Default project permission is allow";
                    break;

                case "Deny":
                    right       = SecurityRight.Deny;
                    settings[4] = "Default project permission is deny";
                    break;
                }
                configureProjects = () =>
                {
                    foreach (var project in configuration.Projects)
                    {
                        project.Security = new DefaultProjectSecurity
                        {
                            DefaultRight = right
                        };
                    }
                };
                return(true);
            };
            steps.Add(defaultProjectPermission);

            // Confirmation page
            steps.Add(GenerateConfirmation());
            steps.Add(new TextDisplayStep("Security settings have been updated", "Finished"));
            return(steps);
        }
Exemple #15
0
        /// <summary>
        /// 检测是否存在退回选项
        /// </summary>
        /// <param name="AList">选项列表</param>
        /// <param name="AStepModel">要检测的步骤对象</param>
        /// <returns></returns>
        private bool CheckHasExistReturnOptions(List <TemplateStepFixstepList> AList, TemplateStep AStepModel)
        {
            bool vRes = false;

            if (AList == null || AList.Count <= 0)
            {
                return(vRes);
            }

            if (AStepModel == null)
            {
                return(vRes);
            }

            return(AList.Exists(AItem => (AItem as TemplateStepFixstepList).IsReturn && (AItem as TemplateStepFixstepList).SelectStepSeq.Equals(AStepModel.Seq)));
        }
Exemple #16
0
        /// <summary>
        /// 检查通过情况下跳转步骤设置
        /// </summary>
        /// <param name="dto">步骤信息</param>
        /// <param name="AStepEntity">步骤实例</param>
        /// <param name="ATempStep">模板步骤实例</param>
        /// <returns></returns>
        private R <string> CheckTransferStepItem(DealStepDTO dto, InstanceStep AStepEntity, TemplateStep ATempStep)
        {
            R <string> vResMsg = new R <string>();

            //不可填写的,但却填写了的
            if ((!ATempStep.IsFormNextstep || ATempStep.IsFormNextstep && ATempStep.TemplateStepFixstepLists.Count <= 0) &&
                !string.IsNullOrWhiteSpace(dto.NextStepSeq))
            {
                vResMsg.Msg = "流程没有要求选择的下一个处理步骤,但此处却填写了!";
                return(vResMsg);
            }

            //要求必须填写的,但却没有填写的
            if (ATempStep.IsFormNextstep && ATempStep.IsFormNextstepMust && ATempStep.TemplateStepFixstepLists.Count > 0)
            {
                if (string.IsNullOrWhiteSpace(dto.NextStepSeq))
                {
                    vResMsg.Msg = "未接收到流程要求选择的下一个处理步骤!";
                    return(vResMsg);
                }
            }

            //填写过的
            if (!string.IsNullOrWhiteSpace(dto.NextStepSeq))
            {
                TemplateStepFixstepList vFindTempFixStep = (from TemplateStepFixstepList vItem in ATempStep.TemplateStepFixstepLists
                                                            where !vItem.IsReturn && vItem.SelectStepSeq.ToString().Equals(dto.NextStepSeq)
                                                            select vItem).FirstOrDefault();
                if (vFindTempFixStep == null)
                {
                    vResMsg.Msg = "接收到的下一个处理步骤与流程要求的跳转步骤不符!";
                    return(vResMsg);
                }

                //检查跳转下的处理人
                var vList = from InstanceStepFixSeluser vFixUser in AStepEntity.InstanceStepFixSelusers
                            where vFixUser.FixstepId.Equals(vFindTempFixStep.Fid)
                            select vFixUser;

                //必须填写处理人但却没有填写的
                if (vFindTempFixStep.IsFormNextman && vFindTempFixStep.IsFormNextmanMust && vList.Any())
                {
                    if (dto.NextUserList == null || dto.NextUserList.Count <= 0)
                    {
                        vResMsg.Msg = "未接收到流程要求选择的下一步处理人!";
                        return(vResMsg);
                    }
                }
                //可以填写处理人,且已填写了处理人的
                if (vFindTempFixStep.IsFormNextman && vList.Any() && dto.NextUserList != null && dto.NextUserList.Count > 0)
                {
                    List <InstanceStepFixSeluser> vNewLsit = vList.ToList();

                    var vItems = from USERINFO vSupplyUser in dto.NextUserList
                                 where !vNewLsit.Exists(AItem => AItem.UserCode.Equals(vSupplyUser.UserCode))
                                 select vSupplyUser.UserCode;

                    if (vItems.Any())
                    {
                        vResMsg.Msg = string.Format("接收到下一步处理人与流程要求选择的不符(如:{0})!", vItems.FirstOrDefault());
                        return(vResMsg);
                    }

                    vResMsg.Data = "HasCheckUser";
                }
            }

            vResMsg.Code = 0;
            return(vResMsg);
        }
Exemple #17
0
        private (bool success, string templateStepInputId, string inputValueString) ValidateTemplateStepInput(
            TemplateStep templateStep,
            TemplateStepInput templateStepInput,
            IDictionary <string, dynamic> inputValues,
            ModelErrorDictionary errors,
            bool isDefaultInput)
        {
            var templateStepInputId = templateStep.Id;

            if (!isDefaultInput)
            {
                templateStepInputId += Templates.Constants.TemplateComponentReferenceSeparator + templateStepInput.Key;
            }

            if (inputValues.TryGetValue(templateStepInputId, out dynamic inputValueDynamic)) // Id is a reference to a step
            {
                if (templateStepInput.Type == TemplateStepInputType.Text)
                {
                    try
                    {
                        var textValue = (string)inputValueDynamic;
                        return(true, templateStepInputId, textValue);
                    }
                    catch (RuntimeBinderException)
                    {
                        AddInputValueError(errors, $"Expected string for \"{templateStepInput.Name ?? templateStep.Name}\"", templateStepInputId);
                    }
                }
                else if (templateStepInput.Type == TemplateStepInputType.Radio)
                {
                    try
                    {
                        var radioValue = (string)inputValueDynamic;
                        try
                        {
                            var radioOptions = (IEnumerable <dynamic>)(templateStepInput.TypeData);
                            if (radioOptions.Any(r => r.Value == radioValue))
                            {
                                return(true, templateStepInputId, inputValueDynamic);
                            }
                            else
                            {
                                AddInputValueError(errors, $"Unexpected value; must be from the set of values {string.Join(", ", radioOptions.Select(r => $"\"{r.Value}\""))}", templateStepInputId);
                            }
                        }
                        catch (RuntimeBinderException ex)
                        {
                            throw new Exception("Internal error: invalid template", ex);
                        }
                    }
                    catch (RuntimeBinderException)
                    {
                        AddInputValueError(errors, $"Expected string for \"{templateStepInput.Name ?? templateStep.Name}\"", templateStepInputId);
                    }
                }
                else if (templateStepInput.Type == TemplateStepInputType.Checkbox)
                {
                    try
                    {
                        var checkboxValue = (bool)(bool.Parse(inputValueDynamic));
                        return(true, templateStepInputId, checkboxValue.ToString());
                    }
                    catch (RuntimeBinderException)
                    {
                        AddInputValueError(errors, $"Expected boolean for \"{templateStepInput.Name ?? templateStep.Name}\"", templateStepInputId);
                    }
                }
            }
            else
            {
                AddInputValueError(errors, $"Input \"{templateStepInput.Name ?? templateStep.Name}\" is required", templateStepInputId);
            }
            return(false, templateStepInputId, null);
        }
Exemple #18
0
        private R <string> ValidateDealStep(DealStepDTO dto, InstanceStepDTO AInstanceStep)
        {
            R <string> vResMsg = new R <string>();

            vResMsg.Code = 1;
            InstanceFlow vFlowEntity = AInstanceStep.InstanceFlow;
            InstanceStep vStepEntity = AInstanceStep.InstanceStep;
            TemplateFlow vTempFlow   = AInstanceStep.TemplateFlow;
            TemplateStep vTempStep   = AInstanceStep.TemplateStep;

            //检查工作组是否正确
            if (!vFlowEntity.GroupId.Equals(dto.GroupID))
            {
                vResMsg.Msg = "流程实例与用户的工作组不匹配!";
                return(vResMsg);
            }

            //检查流程实例状态是否合适
            if (new int[] { 4, 5, 6 }.Contains(vFlowEntity.Status) ||
                new int[] { 4, 5, 6, 7 }.Contains(vStepEntity.Status) ||
                !vStepEntity.Progress.Equals(7))
            {
                vResMsg.Msg = "流程实例的当前状态不适合完成此操作!";
                return(vResMsg);
            }

            //检查用户是否合法
            InstanceStepUser vStepUser = (from InstanceStepUser vItem in vStepEntity.InstanceStepUsers
                                          where vItem.UserCode.Equals(dto.UserCode)
                                          select vItem).FirstOrDefault();

            if (vStepUser == null)
            {
                vResMsg.Msg = "当前用户没有操作权限!";
                return(vResMsg);
            }

            //处理方式与身份是否匹配
            if (vStepUser.UserType.Equals(3) && !dto.Status.Equals(5))
            {
                vResMsg.Msg = "当前操作超过了用户的权限!";
                return(vResMsg);
            }

            //用户是否已提交
            if (new int[] { 1, 2, 3, 4 }.Contains(vStepUser.Status))
            {
                vResMsg.Msg = "当前步骤的操作已完成!";
                return(vResMsg);
            }

            //检查处理意见
            if (new int[] { 1, 2, 4 }.Contains(dto.Status) && vTempStep.IsFormSuggestion && string.IsNullOrWhiteSpace(dto.Content))
            {
                vResMsg.Msg = "未接收到流程要求填写的主办或汇签意见!";
                return(vResMsg);
            }

            //检查退回步骤设置
            if (dto.Status.Equals(2))
            {
                vResMsg = CheckReturnStepItem(dto, AInstanceStep);
                if (vResMsg.Code == 1)
                {
                    return(vResMsg);
                }
            }
            else if (dto.Status.Equals(1))
            {
                //检查跳转步骤设置
                vResMsg = CheckTransferStepItem(dto, vStepEntity, vTempStep);
                if (vResMsg.Code == 1)
                {
                    return(vResMsg);
                }

                //检查下一步处理人是否填写正确
                if (!vResMsg.Data.Equals("HasCheckUser"))
                {
                    vResMsg = CheckFixNextUser(dto, vStepEntity, vTempStep);
                    if (vResMsg.Code == 1)
                    {
                        return(vResMsg);
                    }
                }
            }
            vResMsg.Code = 0;
            return(vResMsg);
        }
Exemple #19
0
        /// <summary>
        /// Runs the wizard.
        /// </summary>
        public void Run()
        {
            if (!(configuration.Security is InternalServerSecurity))
            {
                if (MessageBox.Show("Setting permissions is only valid for internal security, do you want to change to internal security now?",
                                    "Invalid security manager",
                                    MessageBoxButtons.YesNo,
                                    MessageBoxIcon.Warning) == DialogResult.No)
                {
                    return;
                }
                else
                {
                    changeManager = true;
                }
            }
            var steps = new List <IStep>();

            controller = new WizardController(steps);

            // Welcome text
            steps.Add(new TextDisplayStep("This wizard will guide you through the steps of setting permissions for a project in this configuration.", "Welcome"));
            settings.AddRange(new string[] {
                "No project selected",
                "No default permission"
            });

            // Select the projec
            var projectSelection     = new SelectProjectStep(configuration);
            var projectSelectionStep = new TemplateStep(projectSelection, 0, "Select Project");

            projectSelectionStep.NextHandler += () =>
            {
                settings[0] = string.Format("Configuring project '{0}'", projectSelection.SelectedProject);
                return(true);
            };
            steps.Add(projectSelectionStep);

            // Default project permission
            var defaultProjectPermission = new SelectionStep("Default Project Permission",
                                                             "What do you want as the default project permission:",
                                                             "None",
                                                             "Allow",
                                                             "Deny",
                                                             "Inherit");

            defaultProjectPermission.NextHandler += () =>
            {
                switch ((string)defaultProjectPermission.Selected)
                {
                case "None":
                    settings[1] = "No default permission";
                    break;

                case "Allow":
                    settings[1] = "Default project permission is allow";
                    break;

                case "Deny":
                    settings[1] = "Default project permission is deny";
                    break;

                case "Inherit":
                    settings[1] = "Default project permission is inherit";
                    break;
                }
                return(true);
            };
            steps.Add(defaultProjectPermission);

            // Set the force/abort build permissions
            var defaultPermission = new SelectUsersStep(configuration);

            defaultPermission.Caption = "What are the default permissions:";
            var defaultPermissionStep = new TemplateStep(defaultPermission, 0, "Set force/abort build permissions");

            defaultPermissionStep.NextHandler += () =>
            {
                return(true);
            };
            steps.Add(defaultPermissionStep);

            // Set the force/abort build permissions
            var forceBuildPermission = new SelectUsersStep(configuration);

            forceBuildPermission.Caption = "What are the allowed permissions for force/abort build:";
            var forceBuildPermissionStep = new TemplateStep(forceBuildPermission, 0, "Set force/abort build permissions");

            forceBuildPermissionStep.NextHandler += () =>
            {
                return(true);
            };
            steps.Add(forceBuildPermissionStep);

            // Set the start/stop project permissions
            var startProjectPermission = new SelectUsersStep(configuration);

            startProjectPermission.Caption = "Which users are allowed to start/stop builds:";
            var startProjectPermissionStep = new TemplateStep(startProjectPermission, 0, "Set start/stop project permissions");

            startProjectPermissionStep.NextHandler += () =>
            {
                return(true);
            };
            steps.Add(startProjectPermissionStep);

            // Set the send message permissions
            var sendMessagePermission = new SelectUsersStep(configuration);

            sendMessagePermission.Caption = "What are the allowed permissions for sending messages:";
            var sendMessagePermissionStep = new TemplateStep(sendMessagePermission, 0, "Set send message permissions");

            sendMessagePermissionStep.NextHandler += () =>
            {
                return(true);
            };
            steps.Add(sendMessagePermissionStep);

            // Configuration mode step
            var confirmation = GenerateConfirmation();

            confirmation.NextHandler += () =>
            {
                if (changeManager)
                {
                    configuration.Security = new InternalServerSecurity();
                }
                configuration.Projects[projectSelection.SelectedProject].Security = GeneratePermissions(defaultPermission,
                                                                                                        forceBuildPermission,
                                                                                                        startProjectPermission,
                                                                                                        sendMessagePermission);
                configuration.Security = configuration.Security;    // Force a refresh
                return(true);
            };
            steps.Add(confirmation);
            steps.Add(new TextDisplayStep("Users have been imported", "Finished"));

            var result = controller.StartWizard("Security Configuration Wizard");
        }