public PluginSettingsStorage()
        {
            Seri.Log.Here().Information("Инициализируем настройки приложения");
            Seri.Log.Here().Information("Расположение файл настроек: " + ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath);

            try
            {
                var JsonPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Git4PL2DefaultPreset.json");
                Seri.Log.Here().Debug("Пробуем загрузить Json файл с найстройками по умолчанию " + JsonPath);
                _DefaultConfiguration = JObject.Parse(File.ReadAllText(JsonPath));
                Seri.Log.Here().Information("Json файл загружен");
            }
            catch (Exception ex)
            {
                Seri.LogException(ex);
                throw ex;
            }

            FillGroups();
            FillSettings();

            Properties.Settings.Default.Save();

            NinjectCore.SetTeamCodingProvider((eTeamCodingProviderType)GetParamValue <int>(ePluginParameterID.TEAMCODING_PROVIDER));
        }
        private void FillSettings()
        {
            _ListSettings = new List <IPluginParameter>();

            #region Main group

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.GitRepositoryPath, @"D:\Repo")
            {
                Description    = "Репозиторий Git",
                DescriptionExt = "Необходимо указать расположение репозитрия Git с объектами DB",
                Group          = ePluginParameterGroupType.Main,
                ParamterUIType = ePluginParameterUIType.Path,
                OrderPosition  = 1
            });

            _ListSettings.Add(new PluginParameterList(ePluginParameterID.SaveEncodingType, 2, typeof(eSaveEncodingType))
            {
                Description    = "Кодировка по умолчанию",
                DescriptionExt = @"Файл в репозитории Git может иметь маркер кодировки UTF8 – BOM. BOM - Byte Order Mark, Маркер последовательности " +
                                 "байтов или метка порядка – специальный символ из стандарта Юникод, вставляемый в начало текстового файла или потока для обозначения того, " +
                                 "что в файле(потоке) используется Юникод, а также для косвенного указания кодировки и порядка байтов, " +
                                 "с помощью которых символы Юникода были закодированы. Рекомендуется не менять существующий формат.",
                Group          = ePluginParameterGroupType.Main,
                ParamterUIType = ePluginParameterUIType.List,
                OrderPosition  = 100
            });

            #endregion


            #region GitDiff group

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DiffAddSchema, true)
            {
                Description    = "Добавлять префикс схемы к названию объекта",
                DescriptionExt = "Эта настройка, дополняет предыдущую. При отсутствии схемы в названии объекта БД, она будет добавлена. (Такое встречается в файлах Git)",
                Group          = ePluginParameterGroupType.GitDiff,
                OrderPosition  = 30
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DiffChangeCor, true)
            {
                Description    = "Игнорировать изменения до названия объекта",
                DescriptionExt = "Касается переноса после ‘Create or replace’ а также лишних пробелов, которые могут встречаться в файле Git и " +
                                 "отсутствовать в PL/SQL Developer. При включенной настройке, вы не увидите этих изменений в первых строках файла.",
                Group         = ePluginParameterGroupType.GitDiff,
                OrderPosition = 10
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DiffChangeName, true)
            {
                Description    = "Сохранять название объекта, как в git",
                DescriptionExt = "Название объекта БД открытого в PL/SQL Developer может не всегда совпадать с названием того же объекта в Git. " +
                                 "Если опция включена, название объекта всегда будет соответствовать версии названия в файле в репозитории Git.",
                Group         = ePluginParameterGroupType.GitDiff,
                OrderPosition = 20
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DiffCRLF, true)
            {
                Description    = "Обрабатывать перенос строк LF",
                DescriptionExt = "В PL/SQL Developer применяется стандартный для Windows перенос строк в два символа CR-LF (“Carriage Return” и “Line Feed”). " +
                                 "Если в локальном файле репозитория Git, перенос строк реализован через один символ LF (пока такое встречается редко), то при включённой опции, " +
                                 "CR-LF в тексте объекта БД будет заменено на LF. Это позволит избежать конфликтов в каждой строчке текста. Так же эту проблему можно решить, " +
                                 "если в настрйоках Git установить переменную autocrlf в true(выполнить git config--global core.autocrlf true)",
                Group         = ePluginParameterGroupType.GitDiff,
                OrderPosition = 50
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DiffWorkWithSlash, true)
            {
                Description    = "Обрабатывать '/' в конце файла",
                DescriptionExt = "Текст в файлах в репозитории Git заканчивается на ‘/’. Обработка этого символа предотвращает его " +
                                 "затирание при операции сохранения текста. А также убирает этот символ при операции загрузки текста.",
                Group         = ePluginParameterGroupType.GitDiff,
                OrderPosition = 40
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DiffEndSpace, true)
            {
                Description    = "Игн. изменения пробелов в конце строк",
                DescriptionExt = "Изменения в виде пробелов на конце строк не будут отображаться при сравнении, но будут фиксироваться в комите, " +
                                 "если вы не загрузили исходный текст объекта перед работой. Настрйока повилась, после интеграции " +
                                 "конвейерной системы релизов, которая очевидно делает то же самое.",
                Group         = ePluginParameterGroupType.GitDiff,
                OrderPosition = 60
            });

            #endregion


            #region Warning group

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.UnexpectedBranch, true)
            {
                Description    = "Проверка ветки при сохранении текста в репозиторий",
                DescriptionExt = "При сохранении текста объекта в репозитории, если название ветки не совпадает с соответствующим регулярным выражением " +
                                 "– появится предупреждение, во избежание отправки изменений не в ту ветку.",
                Group         = ePluginParameterGroupType.Warning,
                OrderPosition = 10
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.UnexpectedServer, true)
            {
                Description    = "Проверка сервера при загрузки текста в PL/SQL Developer",
                DescriptionExt = "При загрузке текста в PL/SQL Developer, если название сервера не совпадает с соответствующим регулярным выражением – " +
                                 "появится предупреждение, во избежание изменения объекта БД не на том сервере",
                Group         = ePluginParameterGroupType.Warning,
                OrderPosition = 20
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.WarnInRegEx, string.Empty)
            {
                Description       = "Регулярное выражение, для проверки операции SaveText",
                DescriptionExt    = string.Empty,
                Group             = ePluginParameterGroupType.Warning,
                ParentParameterID = ePluginParameterID.UnexpectedBranch,
                OrderPosition     = 11
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.WarnOutRegEx, string.Empty)
            {
                Description       = "Регулярное выражение, для проверки операции LoadText",
                DescriptionExt    = string.Empty,
                Group             = ePluginParameterGroupType.Warning,
                ParentParameterID = ePluginParameterID.UnexpectedServer,
                OrderPosition     = 21
            });

            #endregion


            #region Blame Group

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.ShowGitBlameProperties, true)
            {
                Description    = "Запрашивать настройки для команды GitBlame",
                DescriptionExt = "Если опция включена, то перед операцией GitBlame можно будет выбрать кол-во строк которое будет обработано. Если же отклчить настройку, то по умолчанию обработаются только 10 строк",
                Group          = ePluginParameterGroupType.Blame,
                OrderPosition  = 10
            });

            var CommitViewURL = _DefaultConfiguration.SelectToken("CommitViewURL").ToString();
            if (string.IsNullOrEmpty(CommitViewURL))
            {
                CommitViewURL = "https://www.google.com/search?q=";
            }
            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.CommitViewURL, CommitViewURL)
            {
                Description    = "URL для запуска информации по коммиту",
                DescriptionExt = "В окне GitBlame при запросе информации по комиту будет переход по этой ссылки. (К этой ссылке в конце будет добавлен sha комита)",
                Group          = ePluginParameterGroupType.Blame,
                OrderPosition  = 20
            });

            #endregion


            #region Others group

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.ClassicButtonsPosition, false)
            {
                Description    = "Классическое расположение кнопок в окне Gitt Diff",
                DescriptionExt = string.Empty,
                Group          = ePluginParameterGroupType.Others,
                OrderPosition  = 10
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.DICTI_CHILDREN_LIMIT_ENABLE, true)
            {
                Description   = "Включить ограничение для отбора дочерних записей из Dicti",
                Group         = ePluginParameterGroupType.Others,
                OrderPosition = 20
            });

            _ListSettings.Add(new PluginParameter <int>(ePluginParameterID.DICTI_CHILDREN_LIMIT_VALUE, 20)
            {
                Description       = "Лимит на кол0во отобранных дочерних записей для Dicti",
                Group             = ePluginParameterGroupType.Others,
                ParentParameterID = ePluginParameterID.DICTI_CHILDREN_LIMIT_ENABLE,
                OrderPosition     = 20
            });

            #endregion


            #region SQL Group

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.SQL_DICTI_PARENT_COUNT, _DefaultConfiguration.SelectToken("SQL_DICTI_PARENT_COUNT").ToString())
            {
                Group = ePluginParameterGroupType.SQL
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.SQL_DICTI_PARENT, _DefaultConfiguration.SelectToken("SQL_DICTI_PARENT").ToString())
            {
                Group = ePluginParameterGroupType.SQL
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.SQL_DICTI_HIERARCHY, _DefaultConfiguration.SelectToken("SQL_DICTI_HIERARCHY").ToString())
            {
                Group = ePluginParameterGroupType.SQL
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.SQL_DICTIISN_BY_CONSTNAME, _DefaultConfiguration.SelectToken("SQL_DICTIISN_BY_CONSTNAME").ToString())
            {
                Group = ePluginParameterGroupType.SQL
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.SQL_SERVERNAME, _DefaultConfiguration.SelectToken("SQL_SERVERNAME").ToString())
            {
                Group = ePluginParameterGroupType.SQL
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.SQL_FTOGGLE, _DefaultConfiguration.SelectToken("SQL_FTOGGLE").ToString())
            {
                Group = ePluginParameterGroupType.SQL
            });


            #endregion


            #region TeamCoding Group

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.TEAMCODING_ENABLE, false)
            {
                Description        = "Вкл. TeamCoding",
                DescriptionExt     = "TeamCoding позволяет команде работать на одном сервере. Добавляет возможность делать CheckOut, CheckIn для объектов",
                Group              = ePluginParameterGroupType.TeamCoding,
                OrderPosition      = 10,
                OnParameterChanged = (x) =>
                {
                    var menu = NinjectCore.Get <IMenu>();
                    menu.RefreshMenu();
                }
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.TEAMCODING_LOGIN, string.Empty)
            {
                Description       = "Логин",
                DescriptionExt    = "Ваше имя под которым объекты БД будут браться в пользование",
                Group             = ePluginParameterGroupType.TeamCoding,
                ParentParameterID = ePluginParameterID.TEAMCODING_ENABLE,
                OrderPosition     = 20
            });

            _ListSettings.Add(new PluginParameter <bool>(ePluginParameterID.TEAMCODING_RESTRICT_COMPILE_WITHOUT_CHECKOUT, false)
            {
                Description    = "Запретить компиляцию без CheckOut",
                DescriptionExt = "Если объект в настоящий момет никем не занят, можно разрешить его компилировать без CheckOut. " +
                                 "Эта настройка общая, изменения распространится на всех участников TEAMCODING. " +
                                 "Пожалуйста договоритесь с командой о политиках работы на общей среде прежде чем менять настрйоку",
                Group              = ePluginParameterGroupType.TeamCoding,
                ParentParameterID  = ePluginParameterID.TEAMCODING_ENABLE,
                OrderPosition      = 25,
                OnParameterChanged = (x) =>
                {
                    ITeamCodingProvider provider            = NinjectCore.Get <ITeamCodingProvider>();
                    provider.RestrickCompileWithoutCheckOut = x;
                }
            });

            _ListSettings.Add(new PluginParameterList(ePluginParameterID.TEAMCODING_PROVIDER, 0, typeof(eTeamCodingProviderType))
            {
                Description    = "Провайдер для TeamCoding-а",
                DescriptionExt = "Вариант обмена информацией между несколькими пользователями PL/SQL Developer. Для того что-бы команды была в одной \"сети\", " +
                                 "У всех должны быть одинаковые настройки.\n" +
                                 "Общий файл на диске - файл размешенный в сетевой папке к которому есть доступ у каждого участника. " +
                                 "При операции CheckOut в этот файл добавится информация, что пользователь <Логин> взял в пользование такой объект БД. " +
                                 "Другие участники при обращении к этому объекту БД, будут видеть предупреждение, что объект в настоящий момент занят.",
                Group              = ePluginParameterGroupType.TeamCoding,
                ParentParameterID  = ePluginParameterID.TEAMCODING_ENABLE,
                OrderPosition      = 30,
                OnParameterChanged = (x) => NinjectCore.SetTeamCodingProvider((eTeamCodingProviderType)x)
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.TEAMCODING_FILEPROVIDER_PATH, string.Empty)
            {
                Description                = "Путь для общего файла",
                ParamterUIType             = ePluginParameterUIType.Path,
                Group                      = ePluginParameterGroupType.TeamCoding,
                ParentParameterID          = ePluginParameterID.TEAMCODING_PROVIDER,
                ParentParameterStringValue = "0",
                OrderPosition              = 40
            });

            _ListSettings.Add(new PluginParameter <string>(ePluginParameterID.TEAMCODING_SERVERNAME_REGEX, string.Empty)
            {
                Description       = "Название рабочего сервера",
                DescriptionExt    = "Регулярное выражение для имени сервера, который должен быть подключен к TeamCoding",
                Group             = ePluginParameterGroupType.TeamCoding,
                ParentParameterID = ePluginParameterID.TEAMCODING_ENABLE,
                OrderPosition     = 50
            });

            #endregion
        }