예제 #1
0
        public SettingsService(IDefaultValueProvider defaultValueProvider, ApplicationDataContainers containers)
        {
            _defaultValueProvider = defaultValueProvider;
            _localSettings        = containers.LocalSettings;
            _roamingSettings      = containers.RoamingSettings;

            _themes        = containers.Themes;
            _keyBindings   = containers.KeyBindings;
            _shellProfiles = containers.ShellProfiles;
            _sshProfiles   = containers.SshProfiles;


            foreach (var theme in _defaultValueProvider.GetPreInstalledThemes())
            {
                if (GetTheme(theme.Id) == null)
                {
                    _themes.WriteValueAsJson(theme.Id.ToString(), theme);
                }
            }

            foreach (var shellProfile in _defaultValueProvider.GetPreinstalledShellProfiles())
            {
                if (GetShellProfile(shellProfile.Id) == null)
                {
                    _shellProfiles.WriteValueAsJson(shellProfile.Id.ToString(), shellProfile);
                }
            }
        }
예제 #2
0
        public void SaveTheme_ThemeIsCurrentTheme_InvokesCurrentThemeChangedEvent()
        {
            var theme = _fixture.Create <TerminalTheme>();
            var defaultValueProvider = Mock.Of <IDefaultValueProvider>();
            var themesContainer      = new Mock <IApplicationDataContainer>();
            var roamingSettings      = new Mock <IApplicationDataContainer>();
            var currentThemeId       = (object)theme.Id;

            roamingSettings.Setup(x => x.TryGetValue(SettingsService.CurrentThemeKey, out currentThemeId)).Returns(true);
            var currentThemeChangedEventInvoked = false;
            var applicationDataContainers       = new ApplicationDataContainers
            {
                Themes          = themesContainer.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                RoamingSettings = roamingSettings.Object,
                ShellProfiles   = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            settingsService.CurrentThemeChanged += (s, e) => currentThemeChangedEventInvoked = true;

            settingsService.SaveTheme(theme);

            currentThemeChangedEventInvoked.Should().BeTrue();
        }
예제 #3
0
        public void GetDefaultShellProfileId_ValueDoesNotExistInRoamingSettings_ReturnsDefaultShellProfileIdFromDefaultValueProvider()
        {
            var defaultValueProvider  = new Mock <IDefaultValueProvider>();
            var defaultShellProfileId = _fixture.Create <Guid>();

            defaultValueProvider.Setup(x => x.GetDefaultShellProfileId()).Returns(defaultShellProfileId);
            var localSettings = new Mock <IApplicationDataContainer>();
            var currentDefaultShellProfileId = (object)_fixture.Create <Guid>();

            localSettings.Setup(x => x.TryGetValue(SettingsService.DefaultShellProfileKey, out currentDefaultShellProfileId)).Returns(false);
            var applicationDataContainers = new ApplicationDataContainers
            {
                LocalSettings   = localSettings.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                RoamingSettings = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider.Object, applicationDataContainers);

            var result = settingsService.GetDefaultShellProfileId();

            result.Should().Be(defaultShellProfileId);
            defaultValueProvider.Verify(x => x.GetDefaultShellProfileId(), Times.Once);
            localSettings.Verify(x => x.TryGetValue(SettingsService.DefaultShellProfileKey, out currentDefaultShellProfileId), Times.Once);
        }
        public void SaveKeyBindings_Default_InvokesKeyBindingsChangedEvent()
        {
            var command                        = _fixture.Create <Command>();
            var keyBindings                    = _fixture.Create <Collection <KeyBinding> >();
            var defaultValueProvider           = Mock.Of <IDefaultValueProvider>();
            var keyBindingsContainer           = new Mock <IApplicationDataContainer>();
            var keyBindingsChangedEventInvoked = false;
            var applicationDataContainers      = new ApplicationDataContainers
            {
                KeyBindings     = keyBindingsContainer.Object,
                RoamingSettings = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>(),
                SshProfiles     = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            WeakReferenceMessenger.Default.Register <KeyBindingsChangedMessage>(this,
                                                                                (r, m) => keyBindingsChangedEventInvoked = true);

            settingsService.SaveKeyBindings(command.ToString(), keyBindings);

            keyBindingsChangedEventInvoked.Should().BeTrue();
        }
예제 #5
0
        public void GetKeyBindings_KeyBindingsInKeyBindingsContainer_ReturnsKeyBindingsFromKeyBindingsContainer()
        {
            var commands             = _fixture.CreateMany <Command>(5);
            var defaultValueProvider = Mock.Of <IDefaultValueProvider>();
            var keyBindingsContainer = new Mock <IApplicationDataContainer>();

            foreach (var command in commands)
            {
                keyBindingsContainer.Setup(x => x.ReadValueFromJson <Collection <KeyBinding> >(command.ToString(), null)).Returns(new Collection <KeyBinding> {
                });
            }
            var applicationDataContainers = new ApplicationDataContainers
            {
                KeyBindings     = keyBindingsContainer.Object,
                RoamingSettings = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            var result = settingsService.GetCommandKeyBindings();

            foreach (var command in commands)
            {
                keyBindingsContainer.Verify(x => x.ReadValueFromJson <Collection <KeyBinding> >(command.ToString(), null), Times.Once);
            }
        }
        public void Constructor_Default_WritesAllPreinstalledShellProfilesInShellProfilesContainer()
        {
            var shellProfiles        = _fixture.CreateMany <ShellProfile>(3);
            var defaultValueProvider = new Mock <IDefaultValueProvider>();

            defaultValueProvider.Setup(x => x.GetPreinstalledShellProfiles()).Returns(shellProfiles);
            var shellProfilesContainer    = new Mock <IApplicationDataContainer>();
            var applicationDataContainers = new ApplicationDataContainers
            {
                ShellProfiles   = shellProfilesContainer.Object,
                SshProfiles     = Mock.Of <IApplicationDataContainer>(),
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                RoamingSettings = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>()
            };

            new SettingsService(defaultValueProvider.Object, applicationDataContainers);

            defaultValueProvider.Verify(x => x.GetPreinstalledShellProfiles(), Times.Once);
            foreach (var shellProfile in shellProfiles)
            {
                shellProfilesContainer.Verify(x => x.WriteValueAsJson(shellProfile.Id.ToString(), shellProfile), Times.Once);
            }
        }
예제 #7
0
        public void GetCurrentTheme_ThemeNotFound_CurrentThemeIdGetsResetToDefault()
        {
            var currentThemeId       = (object)_fixture.Create <Guid>();
            var defaultTheme         = _fixture.Create <TerminalTheme>();
            var defaultValueProvider = new Mock <IDefaultValueProvider>();

            defaultValueProvider.Setup(x => x.GetDefaultThemeId()).Returns(defaultTheme.Id);
            var themesContainer           = new Mock <IApplicationDataContainer>();
            var roamingSettings           = new Mock <IApplicationDataContainer>();
            var applicationDataContainers = new ApplicationDataContainers
            {
                ShellProfiles   = Mock.Of <IApplicationDataContainer>(),
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                RoamingSettings = roamingSettings.Object,
                Themes          = themesContainer.Object
            };

            themesContainer.Setup(x => x.ReadValueFromJson(currentThemeId.ToString(), default(TerminalTheme))).Returns(value: null);
            themesContainer.Setup(x => x.ReadValueFromJson(defaultTheme.Id.ToString(), default(TerminalTheme))).Returns(defaultTheme);
            roamingSettings.Setup(x => x.TryGetValue(SettingsService.CurrentThemeKey, out currentThemeId)).Returns(true);
            var settingsService = new SettingsService(defaultValueProvider.Object, applicationDataContainers);

            var result = settingsService.GetCurrentTheme();

            result.Should().Be(defaultTheme);
            roamingSettings.Verify(x => x.SetValue(SettingsService.CurrentThemeKey, defaultTheme.Id), Times.Once);
        }
        public void GetKeyBindings_KeyBindingsNotInKeyBindingsContainer_ReturnsKeyBindingsFromDefaultValueProvider()
        {
            var keyBindings          = _fixture.CreateMany <KeyBinding>(5);
            var defaultValueProvider = new Mock <IDefaultValueProvider>();
            var keyBindingsContainer = new Mock <IApplicationDataContainer>();

            foreach (var keyBinding in keyBindings)
            {
                keyBindingsContainer.Setup(x => x.ReadValueFromJson <Collection <KeyBinding> >(keyBinding.Command.ToString(), null)).Returns(new Collection <KeyBinding> {
                    keyBinding
                });
            }
            var applicationDataContainers = new ApplicationDataContainers
            {
                KeyBindings     = keyBindingsContainer.Object,
                RoamingSettings = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider.Object, applicationDataContainers);

            var result = settingsService.GetKeyBindings();

            foreach (Command command in Enum.GetValues(typeof(Command)))
            {
                if (keyBindings.Select(x => x.Command).Contains(command))
                {
                    continue;
                }
                defaultValueProvider.Verify(x => x.GetDefaultKeyBindings(command), Times.Once);
            }
        }
예제 #9
0
        public App()
        {
            _mainViewModels = new List <MainViewModel>();

            InitializeComponent();

            UnhandledException += OnUnhandledException;

            var applicationDataContainers = new ApplicationDataContainers
            {
                LocalSettings   = new ApplicationDataContainerAdapter(ApplicationData.Current.LocalSettings),
                RoamingSettings = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings),
                KeyBindings     = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.KeyBindingsContainerName, ApplicationDataCreateDisposition.Always)),
                ShellProfiles   = new ApplicationDataContainerAdapter(ApplicationData.Current.LocalSettings.CreateContainer(Constants.ShellProfilesContainerName, ApplicationDataCreateDisposition.Always)),
                Themes          = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.ThemesContainerName, ApplicationDataCreateDisposition.Always))
            };

            var builder = new ContainerBuilder();

            builder.RegisterType <SettingsService>().As <ISettingsService>().SingleInstance();
            builder.RegisterType <DefaultValueProvider>().As <IDefaultValueProvider>().SingleInstance();
            builder.RegisterType <TrayProcessCommunicationService>().As <ITrayProcessCommunicationService>().SingleInstance();
            builder.RegisterType <DialogService>().As <IDialogService>().SingleInstance();
            builder.RegisterType <KeyboardCommandService>().As <IKeyboardCommandService>().InstancePerDependency();
            builder.RegisterType <NotificationService>().As <INotificationService>().InstancePerDependency();
            builder.RegisterType <UpdateService>().As <IUpdateService>().InstancePerDependency();
            builder.RegisterType <MainViewModel>().InstancePerDependency();
            builder.RegisterType <SettingsViewModel>().InstancePerDependency();
            builder.RegisterType <ThemeParserFactory>().As <IThemeParserFactory>().SingleInstance();
            builder.RegisterType <ITermThemeParser>().As <IThemeParser>().SingleInstance();
            builder.RegisterType <FluentTerminalThemeParser>().As <IThemeParser>().SingleInstance();
            builder.RegisterType <ClipboardService>().As <IClipboardService>().SingleInstance();
            builder.RegisterType <FileSystemService>().As <IFileSystemService>().SingleInstance();
            builder.RegisterType <SystemFontService>().As <ISystemFontService>().SingleInstance();
            builder.RegisterType <ShellProfileSelectionDialog>().As <IShellProfileSelectionDialog>().InstancePerDependency();
            builder.RegisterType <CreateKeyBindingDialog>().As <ICreateKeyBindingDialog>().InstancePerDependency();
            builder.RegisterType <InputDialog>().As <IInputDialog>().InstancePerDependency();
            builder.RegisterType <MessageDialogAdapter>().As <IMessageDialog>().InstancePerDependency();
            builder.RegisterType <ApplicationViewAdapter>().As <IApplicationView>().InstancePerDependency();
            builder.RegisterType <DispatcherTimerAdapter>().As <IDispatcherTimer>().InstancePerDependency();
            builder.RegisterType <StartupTaskService>().As <IStartupTaskService>().SingleInstance();
            builder.RegisterInstance(applicationDataContainers);

            _container = builder.Build();

            _settingsService = _container.Resolve <ISettingsService>();
            _settingsService.ApplicationSettingsChanged += OnApplicationSettingsChanged;

            _trayProcessCommunicationService = _container.Resolve <ITrayProcessCommunicationService>();

            _applicationSettings = _settingsService.GetApplicationSettings();

            _commandLineParser = new Parser(settings =>
            {
                settings.CaseSensitive             = false;
                settings.CaseInsensitiveEnumValues = true;
            });
        }
예제 #10
0
        public static void Main(string[] args)
        {
            if (!Mutex.TryOpenExisting(MutexName, out Mutex mutex))
            {
                mutex = new Mutex(false, MutexName);

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                var applicationDataContainers = new ApplicationDataContainers
                {
                    LocalSettings   = new ApplicationDataContainerAdapter(ApplicationData.Current.LocalSettings),
                    RoamingSettings = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings),
                    KeyBindings     = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.KeyBindingsContainerName, ApplicationDataCreateDisposition.Always)),
                    ShellProfiles   = new ApplicationDataContainerAdapter(ApplicationData.Current.LocalSettings.CreateContainer(Constants.ShellProfilesContainerName, ApplicationDataCreateDisposition.Always)),
                    Themes          = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.ThemesContainerName, ApplicationDataCreateDisposition.Always))
                };

                var containerBuilder = new ContainerBuilder();

                containerBuilder.RegisterInstance(applicationDataContainers);
                containerBuilder.RegisterType <NotificationService>().As <INotificationService>().InstancePerDependency();
                containerBuilder.RegisterType <TerminalsManager>().SingleInstance();
                containerBuilder.RegisterType <ToggleWindowService>().SingleInstance();
                containerBuilder.RegisterType <HotKeyManager>().SingleInstance();
                containerBuilder.RegisterType <SystemTrayApplicationContext>().SingleInstance();
                containerBuilder.RegisterType <AppCommunicationService>().SingleInstance();
                containerBuilder.RegisterType <DefaultValueProvider>().As <IDefaultValueProvider>();
                containerBuilder.RegisterType <SettingsService>().As <ISettingsService>();
                containerBuilder.RegisterType <UpdateService>().As <IUpdateService>();
                containerBuilder.RegisterInstance(Dispatcher.CurrentDispatcher).SingleInstance();

                var container = containerBuilder.Build();

                var appCommunicationService = container.Resolve <AppCommunicationService>();

                if (args.Length > 0 && args[2] == "appLaunched")
                {
                    appCommunicationService.StartAppServiceConnection();
                }

                Task.Run(() => container.Resolve <IUpdateService>().CheckForUpdate());

                Application.Run(container.Resolve <SystemTrayApplicationContext>());

                mutex.Close();
            }
            else
            {
                var eventWaitHandle = EventWaitHandle.OpenExisting(AppCommunicationService.EventWaitHandleName, System.Security.AccessControl.EventWaitHandleRights.Modify);
                eventWaitHandle.Set();
            }
        }
예제 #11
0
        public void SaveCurrentThemeId_Default_SetsValueOnRoamingSettings()
        {
            var currentThemeId            = _fixture.Create <Guid>();
            var defaultValueProvider      = Mock.Of <IDefaultValueProvider>();
            var roamingSettings           = new Mock <IApplicationDataContainer>();
            var applicationDataContainers = new ApplicationDataContainers
            {
                RoamingSettings = roamingSettings.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            settingsService.SaveCurrentThemeId(currentThemeId);

            roamingSettings.Verify(x => x.SetValue(SettingsService.CurrentThemeKey, currentThemeId), Times.Once);
        }
예제 #12
0
        public void DeleteShellProfile_Default_CallsDeleteOnShellProfilesContainer()
        {
            var shellProfileId            = _fixture.Create <Guid>();
            var defaultValueProvider      = Mock.Of <IDefaultValueProvider>();
            var shellProfilesContainer    = new Mock <IApplicationDataContainer>();
            var applicationDataContainers = new ApplicationDataContainers
            {
                ShellProfiles   = shellProfilesContainer.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                RoamingSettings = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            settingsService.DeleteShellProfile(shellProfileId);

            shellProfilesContainer.Verify(x => x.Delete(shellProfileId.ToString()), Times.Once);
        }
예제 #13
0
        public SshInfoDialog(ISettingsService settingsService, IApplicationView applicationView,
                             IFileSystemService fileSystemService, ITrayProcessCommunicationService trayProcessCommunicationService,
                             ApplicationDataContainers containers)
        {
            _settingsService   = settingsService;
            _applicationView   = applicationView;
            _fileSystemService = fileSystemService;
            _trayProcessCommunicationService = trayProcessCommunicationService;
            _historyContainer = containers.HistoryContainer;

            InitializeComponent();

            PrimaryButtonText   = I18N.Translate("OK");
            SecondaryButtonText = I18N.Translate("Cancel");

            var currentTheme = settingsService.GetCurrentTheme();

            RequestedTheme = ContrastHelper.GetIdealThemeForBackgroundColor(currentTheme.Colors.Background);
        }
예제 #14
0
        public void SaveShellProfile_Default_WritesToShellProfilesContainer()
        {
            var shellProfile              = _fixture.Create <ShellProfile>();
            var defaultValueProvider      = Mock.Of <IDefaultValueProvider>();
            var shellProfilesContainer    = new Mock <IApplicationDataContainer>();
            var applicationDataContainers = new ApplicationDataContainers
            {
                ShellProfiles   = shellProfilesContainer.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                RoamingSettings = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            settingsService.SaveShellProfile(shellProfile);

            shellProfilesContainer.Verify(x => x.WriteValueAsJson(shellProfile.Id.ToString(), shellProfile), Times.Once);
        }
예제 #15
0
        public void SaveApplicationSettings_Default_WritesToRoamingSettings()
        {
            var applicationSettings       = _fixture.Create <ApplicationSettings>();
            var defaultValueProvider      = Mock.Of <IDefaultValueProvider>();
            var roamingSettings           = new Mock <IApplicationDataContainer>();
            var applicationDataContainers = new ApplicationDataContainers
            {
                RoamingSettings = roamingSettings.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            settingsService.SaveApplicationSettings(applicationSettings);

            roamingSettings.Verify(x => x.WriteValueAsJson(nameof(ApplicationSettings), applicationSettings), Times.Once);
        }
예제 #16
0
        public void SaveKeyBindings_Default_WritesToKeyBindingsContainer()
        {
            var command                   = _fixture.Create <Command>();
            var keyBindings               = _fixture.Create <ICollection <KeyBinding> >();
            var defaultValueProvider      = Mock.Of <IDefaultValueProvider>();
            var keyBindingsContainer      = new Mock <IApplicationDataContainer>();
            var applicationDataContainers = new ApplicationDataContainers
            {
                KeyBindings     = keyBindingsContainer.Object,
                RoamingSettings = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            settingsService.SaveKeyBindings(command.ToString(), keyBindings);

            keyBindingsContainer.Verify(x => x.WriteValueAsJson(command.ToString(), keyBindings), Times.Once);
        }
예제 #17
0
        public void ResetKeyBindings_Default_InvokesKeyBindingsChangedEvent()
        {
            var defaultValueProvider           = Mock.Of <IDefaultValueProvider>();
            var keyBindingsContainer           = new Mock <IApplicationDataContainer>();
            var keyBindingsChangedEventInvoked = false;
            var applicationDataContainers      = new ApplicationDataContainers
            {
                KeyBindings     = keyBindingsContainer.Object,
                RoamingSettings = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            settingsService.KeyBindingsChanged += (s, e) => keyBindingsChangedEventInvoked = true;

            settingsService.ResetKeyBindings();

            keyBindingsChangedEventInvoked.Should().BeTrue();
        }
예제 #18
0
        public void GetTheme_UnknownThemeId_ReturnsNull()
        {
            var themeId = _fixture.Create <Guid>();
            var defaultValueProvider = Mock.Of <IDefaultValueProvider>();
            var themesContainer      = new Mock <IApplicationDataContainer>();

            themesContainer.Setup(x => x.ReadValueFromJson(themeId.ToString(), default(TerminalTheme))).Returns(value: null);
            var applicationDataContainers = new ApplicationDataContainers
            {
                Themes          = themesContainer.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                RoamingSettings = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            var result = settingsService.GetTheme(themeId);

            result.Should().BeNull();
            themesContainer.Verify(x => x.ReadValueFromJson(themeId.ToString(), default(TerminalTheme)), Times.Once);
        }
예제 #19
0
        public void ResetKeyBindings_Default_WritesToKeyBindingsContainerFromDefaultValueProvider()
        {
            var defaultValueProvider      = new Mock <IDefaultValueProvider>();
            var keyBindingsContainer      = new Mock <IApplicationDataContainer>();
            var applicationDataContainers = new ApplicationDataContainers
            {
                KeyBindings     = keyBindingsContainer.Object,
                RoamingSettings = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider.Object, applicationDataContainers);

            settingsService.ResetKeyBindings();

            foreach (Command command in Enum.GetValues(typeof(Command)))
            {
                keyBindingsContainer.Verify(x => x.WriteValueAsJson(command.ToString(), It.IsAny <ICollection <KeyBinding> >()), Times.Once);
                defaultValueProvider.Verify(x => x.GetDefaultKeyBindings(command), Times.Once);
            }
        }
예제 #20
0
        public void GetKeyBindings_KeyBindingsNotInKeyBindingsContainer_ReturnsKeyBindingsFromDefaultValueProvider()
        {
            var commands                  = _fixture.CreateMany <Command>(5);
            var defaultValueProvider      = new Mock <IDefaultValueProvider>();
            var keyBindingsContainer      = new Mock <IApplicationDataContainer>();
            var applicationDataContainers = new ApplicationDataContainers
            {
                KeyBindings     = keyBindingsContainer.Object,
                RoamingSettings = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider.Object, applicationDataContainers);

            var result = settingsService.GetCommandKeyBindings();

            foreach (Command command in Enum.GetValues(typeof(Command)))
            {
                defaultValueProvider.Verify(x => x.GetDefaultKeyBindings(command), Times.Once);
            }
        }
예제 #21
0
        public void GetShellProfiles_Default_CallsGetAllOnShellProfilesContainer()
        {
            var shellProfiles          = _fixture.CreateMany <ShellProfile>(3);
            var defaultValueProvider   = Mock.Of <IDefaultValueProvider>();
            var shellProfilesContainer = new Mock <IApplicationDataContainer>();

            shellProfilesContainer.Setup(x => x.GetAll()).Returns(shellProfiles.Select(JsonConvert.SerializeObject));
            var applicationDataContainers = new ApplicationDataContainers
            {
                ShellProfiles   = shellProfilesContainer.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                RoamingSettings = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            var result = settingsService.GetShellProfiles();

            result.Should().BeEquivalentTo(shellProfiles);
            shellProfilesContainer.Verify(x => x.GetAll(), Times.Once);
        }
예제 #22
0
        public void GetApplicationSettings_Default_ReturnsApplicationSettingsFromRoamingSettings()
        {
            var applicationSettings  = _fixture.Create <ApplicationSettings>();
            var defaultValueProvider = Mock.Of <IDefaultValueProvider>();
            var roamingSettings      = new Mock <IApplicationDataContainer>();

            roamingSettings.Setup(x => x.ReadValueFromJson(nameof(ApplicationSettings), It.IsAny <ApplicationSettings>())).Returns(applicationSettings);
            var applicationDataContainers = new ApplicationDataContainers
            {
                RoamingSettings = roamingSettings.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            var result = settingsService.GetApplicationSettings();

            result.Should().BeEquivalentTo(applicationSettings);
            roamingSettings.Verify(x => x.ReadValueFromJson(nameof(ApplicationSettings), It.IsAny <ApplicationSettings>()), Times.Once);
        }
예제 #23
0
        public void SaveApplicationSettings_Default_InvokesApplicationSettingsChangedEvent()
        {
            var applicationSettings  = _fixture.Create <ApplicationSettings>();
            var defaultValueProvider = Mock.Of <IDefaultValueProvider>();
            var roamingSettings      = new Mock <IApplicationDataContainer>();
            var applicationSettingsChangedEventInvoked = false;
            var applicationDataContainers = new ApplicationDataContainers
            {
                RoamingSettings = roamingSettings.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            settingsService.ApplicationSettingsChanged += (s, e) => applicationSettingsChangedEventInvoked = true;

            settingsService.SaveApplicationSettings(applicationSettings);

            applicationSettingsChangedEventInvoked.Should().BeTrue();
        }
예제 #24
0
        public void GetCurrentThemeId_ValueExistsInRoamingSettings_ReturnsCurrentThemeId()
        {
            var defaultValueProvider = Mock.Of <IDefaultValueProvider>();
            var roamingSettings      = new Mock <IApplicationDataContainer>();
            var currentThemeId       = (object)_fixture.Create <Guid>();

            roamingSettings.Setup(x => x.TryGetValue(SettingsService.CurrentThemeKey, out currentThemeId)).Returns(true);
            var applicationDataContainers = new ApplicationDataContainers
            {
                RoamingSettings = roamingSettings.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            var result = settingsService.GetCurrentThemeId();

            result.Should().Be((Guid)currentThemeId);
            roamingSettings.Verify(x => x.TryGetValue(SettingsService.CurrentThemeKey, out currentThemeId), Times.Once);
        }
예제 #25
0
        public void SaveTerminalOptions_Default_InvokesTerminalOptionsChangedEvent()
        {
            var terminalOptions      = _fixture.Create <TerminalOptions>();
            var defaultValueProvider = Mock.Of <IDefaultValueProvider>();
            var roamingSettings      = new Mock <IApplicationDataContainer>();
            var terminalOptionsChangedEventInvoked = false;
            var applicationDataContainers          = new ApplicationDataContainers
            {
                RoamingSettings = roamingSettings.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            Messenger.Default.Register <TerminalOptionsChangedMessage>(this,
                                                                       message => terminalOptionsChangedEventInvoked = true);

            settingsService.SaveTerminalOptions(terminalOptions);

            terminalOptionsChangedEventInvoked.Should().BeTrue();
        }
        public void SaveApplicationSettings_Default_InvokesApplicationSettingsChangedEvent()
        {
            var applicationSettings  = _fixture.Create <ApplicationSettings>();
            var defaultValueProvider = Mock.Of <IDefaultValueProvider>();
            var roamingSettings      = new Mock <IApplicationDataContainer>();
            var applicationSettingsChangedEventInvoked = false;
            var applicationDataContainers = new ApplicationDataContainers
            {
                RoamingSettings = roamingSettings.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>(),
                SshProfiles     = Mock.Of <IApplicationDataContainer>()
            };
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            WeakReferenceMessenger.Default.Register <ApplicationSettingsChangedMessage>(this, (r, m) => applicationSettingsChangedEventInvoked = true);

            settingsService.SaveApplicationSettings(applicationSettings);

            applicationSettingsChangedEventInvoked.Should().BeTrue();
        }
예제 #27
0
        public void SaveCurrentThemeId_Default_InvokesCurrentThemeChangedEvent()
        {
            var currentThemeId            = _fixture.Create <Guid>();
            var defaultValueProvider      = Mock.Of <IDefaultValueProvider>();
            var roamingSettings           = new Mock <IApplicationDataContainer>();
            var applicationDataContainers = new ApplicationDataContainers
            {
                RoamingSettings = roamingSettings.Object,
                KeyBindings     = Mock.Of <IApplicationDataContainer>(),
                LocalSettings   = Mock.Of <IApplicationDataContainer>(),
                ShellProfiles   = Mock.Of <IApplicationDataContainer>(),
                SshProfiles     = Mock.Of <IApplicationDataContainer>(),
                Themes          = Mock.Of <IApplicationDataContainer>()
            };
            var currentThemeChangedEventInvoked = false;
            var settingsService = new SettingsService(defaultValueProvider, applicationDataContainers);

            Messenger.Default.Register <CurrentThemeChangedMessage>(this,
                                                                    message => currentThemeChangedEventInvoked = true);

            settingsService.SaveCurrentThemeId(currentThemeId);

            currentThemeChangedEventInvoked.Should().BeTrue();
        }
예제 #28
0
 public SettingsViewModel(ISettingsService settingsService, IDefaultValueProvider defaultValueProvider, IDialogService dialogService,
                          ITrayProcessCommunicationService trayProcessCommunicationService, IThemeParserFactory themeParserFactory, ISystemFontService systemFontService,
                          IFileSystemService fileSystemService, IStartupTaskService startupTaskService, IApplicationView applicationView,
                          IApplicationLanguageService applicationLanguageService, ApplicationDataContainers containers)
 {
     KeyBindings = new KeyBindingsPageViewModel(settingsService, dialogService, trayProcessCommunicationService);
     General     = new GeneralPageViewModel(settingsService, dialogService, defaultValueProvider, startupTaskService, applicationLanguageService, trayProcessCommunicationService, fileSystemService);
     Profiles    = new ProfilesPageViewModel(settingsService, dialogService, defaultValueProvider, fileSystemService, applicationView);
     Terminal    = new TerminalPageViewModel(settingsService, dialogService, defaultValueProvider, systemFontService);
     Themes      = new ThemesPageViewModel(settingsService, dialogService, defaultValueProvider, themeParserFactory, fileSystemService);
     Mouse       = new MousePageViewModel(settingsService, dialogService, defaultValueProvider);
     SshProfiles = new SshProfilesPageViewModel(settingsService, dialogService, fileSystemService,
                                                applicationView, trayProcessCommunicationService, containers.HistoryContainer);
 }
예제 #29
0
        public App()
        {
            _mainViewModels = new List <MainViewModel>();

            InitializeComponent();

            UnhandledException += OnUnhandledException;

            var applicationDataContainers = new ApplicationDataContainers
            {
                LocalSettings    = new ApplicationDataContainerAdapter(ApplicationData.Current.LocalSettings),
                RoamingSettings  = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings),
                KeyBindings      = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.KeyBindingsContainerName, ApplicationDataCreateDisposition.Always)),
                ShellProfiles    = new ApplicationDataContainerAdapter(ApplicationData.Current.LocalSettings.CreateContainer(Constants.ShellProfilesContainerName, ApplicationDataCreateDisposition.Always)),
                Themes           = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.ThemesContainerName, ApplicationDataCreateDisposition.Always)),
                SshProfiles      = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.SshProfilesContainerName, ApplicationDataCreateDisposition.Always)),
                HistoryContainer = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.ExecutedCommandsContainerName, ApplicationDataCreateDisposition.Always))
            };
            var builder = new ContainerBuilder();

            builder.RegisterType <SettingsService>().As <ISettingsService>().SingleInstance();
            builder.RegisterType <DefaultValueProvider>().As <IDefaultValueProvider>().SingleInstance();
            builder.RegisterType <TrayProcessCommunicationService>().As <ITrayProcessCommunicationService>().SingleInstance();
            builder.RegisterType <DialogService>().As <IDialogService>().SingleInstance();
            builder.RegisterType <KeyboardCommandService>().As <IKeyboardCommandService>().InstancePerDependency();
            builder.RegisterType <NotificationService>().As <INotificationService>().InstancePerDependency();
            builder.RegisterType <UpdateService>().As <IUpdateService>().InstancePerDependency();
            builder.RegisterType <MainViewModel>().InstancePerDependency();
            builder.RegisterType <SettingsViewModel>().InstancePerDependency();
            builder.RegisterType <ThemeParserFactory>().As <IThemeParserFactory>().SingleInstance();
            builder.RegisterType <ITermThemeParser>().As <IThemeParser>().SingleInstance();
            builder.RegisterType <FluentTerminalThemeParser>().As <IThemeParser>().SingleInstance();
            builder.RegisterType <ClipboardService>().As <IClipboardService>().SingleInstance();
            builder.RegisterType <FileSystemService>().As <IFileSystemService>().SingleInstance();
            builder.RegisterType <SystemFontService>().As <ISystemFontService>().SingleInstance();
            builder.RegisterType <ShellProfileSelectionDialog>().As <IShellProfileSelectionDialog>().InstancePerDependency();
            builder.RegisterType <SshProfileSelectionDialog>().As <ISshProfileSelectionDialog>().InstancePerDependency();
            builder.RegisterType <CreateKeyBindingDialog>().As <ICreateKeyBindingDialog>().InstancePerDependency();
            builder.RegisterType <InputDialog>().As <IInputDialog>().InstancePerDependency();
            builder.RegisterType <AboutDialog>().As <IAboutDialog>().InstancePerDependency();
            builder.RegisterType <MessageDialogAdapter>().As <IMessageDialog>().InstancePerDependency();
            builder.RegisterType <SshInfoDialog>().As <ISshConnectionInfoDialog>().InstancePerDependency();
            builder.RegisterType <CustomCommandDialog>().As <ICustomCommandDialog>().InstancePerDependency();
            builder.RegisterType <ApplicationViewAdapter>().As <IApplicationView>().InstancePerDependency();
            builder.RegisterType <DispatcherTimerAdapter>().As <IDispatcherTimer>().InstancePerDependency();
            builder.RegisterType <StartupTaskService>().As <IStartupTaskService>().SingleInstance();
            builder.RegisterType <ApplicationLanguageService>().As <IApplicationLanguageService>().SingleInstance();
            builder.RegisterType <ShellProfileMigrationService>().As <IShellProfileMigrationService>().SingleInstance();
            builder.RegisterInstance(applicationDataContainers);

            _container = builder.Build();

            Messenger.Default.Register <ApplicationSettingsChangedMessage>(this, OnApplicationSettingsChanged);

            _settingsService = _container.Resolve <ISettingsService>();

            var shellProfileMigrationService = _container.Resolve <IShellProfileMigrationService>();

            foreach (var profile in _settingsService.GetShellProfiles())
            {
                shellProfileMigrationService.Migrate(profile);
                _settingsService.SaveShellProfile(profile);
            }

            foreach (var profile in _settingsService.GetSshProfiles())
            {
                shellProfileMigrationService.Migrate(profile);
                _settingsService.SaveSshProfile(profile);
            }

            _trayProcessCommunicationService = _container.Resolve <ITrayProcessCommunicationService>();

            _dialogService = _container.Resolve <IDialogService>();

            _applicationSettings = _settingsService.GetApplicationSettings();

            JsonConvert.DefaultSettings = () =>
            {
                var settings = new JsonSerializerSettings
                {
                    ContractResolver = new CamelCasePropertyNamesContractResolver(),
                };
                settings.Converters.Add(new StringEnumConverter(typeof(CamelCaseNamingStrategy)));

                return(settings);
            };

            _commandLineParser = new Parser(settings =>
            {
                settings.CaseSensitive             = false;
                settings.CaseInsensitiveEnumValues = true;
            });
        }
예제 #30
0
        public static void Main(string[] args)
        {
            if (!Mutex.TryOpenExisting(MutexName, out Mutex mutex))
            {
                mutex = new Mutex(false, MutexName);

                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                JsonConvert.DefaultSettings = () =>
                {
                    var settings = new JsonSerializerSettings
                    {
                        ContractResolver = new CamelCasePropertyNamesContractResolver(),
                    };
                    settings.Converters.Add(new StringEnumConverter(typeof(CamelCaseNamingStrategy)));

                    return(settings);
                };

                var applicationDataContainers = new ApplicationDataContainers
                {
                    LocalSettings   = new ApplicationDataContainerAdapter(ApplicationData.Current.LocalSettings),
                    RoamingSettings = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings),
                    KeyBindings     = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.KeyBindingsContainerName, ApplicationDataCreateDisposition.Always)),
                    ShellProfiles   = new ApplicationDataContainerAdapter(ApplicationData.Current.LocalSettings.CreateContainer(Constants.ShellProfilesContainerName, ApplicationDataCreateDisposition.Always)),
                    Themes          = new ApplicationDataContainerAdapter(ApplicationData.Current.RoamingSettings.CreateContainer(Constants.ThemesContainerName, ApplicationDataCreateDisposition.Always))
                };

                var containerBuilder = new ContainerBuilder();

                containerBuilder.RegisterInstance(applicationDataContainers);
                containerBuilder.RegisterType <NotificationService>().As <INotificationService>().InstancePerDependency();
                containerBuilder.RegisterType <TerminalsManager>().SingleInstance();
                containerBuilder.RegisterType <ToggleWindowService>().SingleInstance();
                containerBuilder.RegisterInstance(new HotKeyManager()).SingleInstance();
                containerBuilder.RegisterType <SystemTrayApplicationContext>().SingleInstance();
                containerBuilder.RegisterType <AppCommunicationService>().SingleInstance();
                containerBuilder.RegisterType <DefaultValueProvider>().As <IDefaultValueProvider>();
                containerBuilder.RegisterType <SettingsService>().As <ISettingsService>();
                containerBuilder.RegisterType <UpdateService>().As <IUpdateService>();
                containerBuilder.RegisterInstance(Dispatcher.CurrentDispatcher).SingleInstance();

                var container = containerBuilder.Build();

                Task.Run(async() =>
                {
                    var logDirectory  = await ApplicationData.Current.LocalCacheFolder.CreateFolderAsync("Logs", CreationCollisionOption.OpenIfExists).AsTask().ConfigureAwait(true);
                    var logFile       = Path.Combine(logDirectory.Path, "fluentterminal.systemtray.log");
                    var configFile    = await logDirectory.CreateFileAsync("config.json", CreationCollisionOption.OpenIfExists).AsTask().ConfigureAwait(true);
                    var configContent = await FileIO.ReadTextAsync(configFile).AsTask().ConfigureAwait(true);
                    var config        = JsonConvert.DeserializeObject <Logger.Configuration>(configContent) ?? new Logger.Configuration();
                    Logger.Instance.Initialize(logFile, config);

                    AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
                });

                var appCommunicationService = container.Resolve <AppCommunicationService>();

                if (args.Length > 0 && args[2] == "appLaunched")
                {
                    appCommunicationService.StartAppServiceConnection();
                }

                Task.Run(() => container.Resolve <IUpdateService>().CheckForUpdate());

                var settingsService = container.Resolve <ISettingsService>();
                if (settingsService.GetApplicationSettings().EnableTrayIcon)
                {
                    Application.Run(container.Resolve <SystemTrayApplicationContext>());
                }
                else
                {
                    Application.Run();
                }

                mutex.Close();
            }
            else
            {
                var eventWaitHandle = EventWaitHandle.OpenExisting(AppCommunicationService.EventWaitHandleName, System.Security.AccessControl.EventWaitHandleRights.Modify);
                eventWaitHandle.Set();
            }
        }