public static bool TryParseConfigEntry(string Text, out ArchiveSettings Settings)
        {
            ConfigObject Object = new ConfigObject(Text);

            string Type = Object.GetValue("Type", null);

            if (Type == null)
            {
                Settings = null;
                return(false);
            }
            else
            {
                string[] Order    = Object.GetValue("Order", "").Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                bool     bEnabled = Object.GetValue("Enabled", 0) != 0;

                Settings = new ArchiveSettings(bEnabled, Type, Order);
                return(true);
            }
        }
        public UserSettings(string InFileName)
        {
            FileName = InFileName;
            if (File.Exists(FileName))
            {
                ConfigFile.Load(FileName);
            }

            // General settings
            Version         = (UserSettingsVersion)ConfigFile.GetValue("General.Version", (int)UserSettingsVersion.Initial);
            bBuildAfterSync = (ConfigFile.GetValue("General.BuildAfterSync", "1") != "0");
            bRunAfterSync   = (ConfigFile.GetValue("General.RunAfterSync", "1") != "0");
            bool bSyncPrecompiledEditor = (ConfigFile.GetValue("General.SyncPrecompiledEditor", "0") != "0");

            bOpenSolutionAfterSync = (ConfigFile.GetValue("General.OpenSolutionAfterSync", "0") != "0");
            bShowLogWindow         = (ConfigFile.GetValue("General.ShowLogWindow", false));
            bAutoResolveConflicts  = (ConfigFile.GetValue("General.AutoResolveConflicts", "1") != "0");
            bShowUnreviewedChanges = ConfigFile.GetValue("General.ShowUnreviewed", true);
            bShowAutomatedChanges  = ConfigFile.GetValue("General.ShowAutomated", false);
            bShowLocalTimes        = ConfigFile.GetValue("General.ShowLocalTimes", false);
            bKeepInTray            = ConfigFile.GetValue("General.KeepInTray", true);
            int.TryParse(ConfigFile.GetValue("General.FilterIndex", "0"), out FilterIndex);

            string LastProjectString = ConfigFile.GetValue("General.LastProject", null);

            if (LastProjectString != null)
            {
                UserSelectedProjectSettings.TryParseConfigEntry(LastProjectString, out LastProject);
            }
            else
            {
                string LastProjectFileName = ConfigFile.GetValue("General.LastProjectFileName", null);
                if (LastProjectFileName != null)
                {
                    LastProject = new UserSelectedProjectSettings(null, null, UserSelectedProjectType.Local, null, LastProjectFileName);
                }
            }

            OpenProjects   = ReadProjectList("General.OpenProjects", "General.OpenProjectFileNames");
            RecentProjects = ReadProjectList("General.RecentProjects", "General.OtherProjectFileNames");
            SyncView       = ConfigFile.GetValues("General.SyncFilter", new string[0]);
            SyncCategories = GetCategorySettings(ConfigFile.FindSection("General"), "SyncIncludedCategories", "SyncExcludedCategories");

            bSyncAllProjects = ConfigFile.GetValue("General.SyncAllProjects", false);
            bIncludeAllProjectsInSolution = ConfigFile.GetValue("General.IncludeAllProjectsInSolution", false);
            if (!Enum.TryParse(ConfigFile.GetValue("General.SyncType", ""), out SyncType))
            {
                SyncType = LatestChangeType.Good;
            }

            // Build configuration
            string CompiledEditorBuildConfigName = ConfigFile.GetValue("General.BuildConfig", "");

            if (!Enum.TryParse(CompiledEditorBuildConfigName, true, out CompiledEditorBuildConfig))
            {
                CompiledEditorBuildConfig = BuildConfig.DebugGame;
            }

            // Tab names
            string TabLabelsValue = ConfigFile.GetValue("General.TabLabels", "");

            if (!Enum.TryParse(TabLabelsValue, true, out TabLabels))
            {
                TabLabels = TabLabels.Stream;
            }

            // Editor arguments
            string[] Arguments = ConfigFile.GetValues("General.EditorArguments", new string[] { "0:-log", "0:-fastload" });
            if (Version < UserSettingsVersion.XgeShaderCompilation)
            {
                Arguments = Enumerable.Concat(Arguments, new string[] { "0:-noxgeshadercompile" }).ToArray();
            }
            foreach (string Argument in Arguments)
            {
                if (Argument.StartsWith("0:"))
                {
                    EditorArguments.Add(new Tuple <string, bool>(Argument.Substring(2), false));
                }
                else if (Argument.StartsWith("1:"))
                {
                    EditorArguments.Add(new Tuple <string, bool>(Argument.Substring(2), true));
                }
                else
                {
                    EditorArguments.Add(new Tuple <string, bool>(Argument, true));
                }
            }
            bEditorArgumentsPrompt = ConfigFile.GetValue("General.EditorArgumentsPrompt", false);

            // Precompiled binaries
            string[] ArchiveValues = ConfigFile.GetValues("PrecompiledBinaries.Archives", new string[0]);
            foreach (string ArchiveValue in ArchiveValues)
            {
                ArchiveSettings Settings;
                if (ArchiveSettings.TryParseConfigEntry(ArchiveValue, out Settings))
                {
                    Archives.Add(Settings);
                }
            }

            if (bSyncPrecompiledEditor)
            {
                Archives.Add(new ArchiveSettings(true, "Editor", new string[0]));
            }

            // Window settings
            bWindowVisible = ConfigFile.GetValue("Window.Visible", true);
            if (!Enum.TryParse(ConfigFile.GetValue("Window.State", ""), true, out WindowState))
            {
                WindowState = FormWindowState.Normal;
            }
            WindowBounds = ParseRectangleValue(ConfigFile.GetValue("Window.Bounds", ""));

            // Schedule settings
            bScheduleEnabled = ConfigFile.GetValue("Schedule.Enabled", false);
            if (!TimeSpan.TryParse(ConfigFile.GetValue("Schedule.Time", ""), out ScheduleTime))
            {
                ScheduleTime = new TimeSpan(6, 0, 0);
            }
            if (!Enum.TryParse(ConfigFile.GetValue("Schedule.Change", ""), out ScheduleChange))
            {
                ScheduleChange = LatestChangeType.Good;
            }
            ScheduleAnyOpenProject = ConfigFile.GetValue("Schedule.AnyOpenProject", true);
            ScheduleProjects       = ReadProjectList("Schedule.Projects", "Schedule.ProjectFileNames");

            // Notification settings
            NotifyUnassignedMinutes     = ConfigFile.GetValue("Notifications.NotifyUnassignedMinutes", -1);
            NotifyUnacknowledgedMinutes = ConfigFile.GetValue("Notifications.NotifyUnacknowledgedMinutes", -1);
            NotifyUnresolvedMinutes     = ConfigFile.GetValue("Notifications.NotifyUnresolvedMinutes", -1);

            // Perforce settings
            if (!int.TryParse(ConfigFile.GetValue("Perforce.NumRetries", "0"), out SyncOptions.NumRetries))
            {
                SyncOptions.NumRetries = 0;
            }

            int NumThreads;

            if (int.TryParse(ConfigFile.GetValue("Perforce.NumThreads", "0"), out NumThreads) && NumThreads > 0)
            {
                if (Version >= UserSettingsVersion.DefaultNumberOfThreads || NumThreads > 1)
                {
                    SyncOptions.NumThreads = NumThreads;
                }
            }

            if (!int.TryParse(ConfigFile.GetValue("Perforce.TcpBufferSize", "0"), out SyncOptions.TcpBufferSize))
            {
                SyncOptions.TcpBufferSize = 0;
            }
        }