using System.Linq; using Artemis.Core; using Artemis.Core.Services; using Artemis.UI.DefaultTypes.DataModel.Display; using Artemis.UI.DefaultTypes.DataModel.Input; using Artemis.UI.InputProviders; using Artemis.UI.Ninject; using Artemis.UI.PropertyInput; using Artemis.UI.Services.Interfaces; using Artemis.UI.Shared.Services; using Serilog; namespace Artemis.UI.Services { public class RegistrationService : IRegistrationService { private readonly ILogger _logger; private readonly IDataModelUIService _dataModelUIService; private readonly IProfileEditorService _profileEditorService; private readonly IPluginManagementService _pluginManagementService; private readonly ISurfaceService _surfaceService; private readonly IInputService _inputService; private bool _registeredBuiltInDataModelDisplays; private bool _registeredBuiltInDataModelInputs; private bool _registeredBuiltInPropertyEditors; public RegistrationService(ILogger logger, IDataModelUIService dataModelUIService, IProfileEditorService profileEditorService, IPluginManagementService pluginManagementService, ISurfaceService surfaceService, IInputService inputService) { _logger = logger; _dataModelUIService = dataModelUIService; _profileEditorService = profileEditorService; _pluginManagementService = pluginManagementService; _surfaceService = surfaceService; _inputService = inputService; LoadPluginModules(); pluginManagementService.PluginEnabling += PluginServiceOnPluginEnabling; } public void RegisterBuiltInDataModelDisplays() { if (_registeredBuiltInDataModelDisplays) return; _dataModelUIService.RegisterDataModelDisplay(Constants.CorePlugin); _registeredBuiltInDataModelDisplays = true; } public void RegisterBuiltInDataModelInputs() { if (_registeredBuiltInDataModelInputs) return; _dataModelUIService.RegisterDataModelInput(Constants.CorePlugin, Constants.FloatNumberTypes); _dataModelUIService.RegisterDataModelInput(Constants.CorePlugin, Constants.IntegralNumberTypes); _dataModelUIService.RegisterDataModelInput(Constants.CorePlugin, null); _dataModelUIService.RegisterDataModelInput(Constants.CorePlugin, null); _dataModelUIService.RegisterDataModelInput(Constants.CorePlugin, null); _dataModelUIService.RegisterDataModelInput(Constants.CorePlugin, null); _registeredBuiltInDataModelInputs = true; } public void RegisterBuiltInPropertyEditors() { if (_registeredBuiltInPropertyEditors) return; _profileEditorService.RegisterPropertyInput(Constants.CorePlugin); _profileEditorService.RegisterPropertyInput(Constants.CorePlugin); _profileEditorService.RegisterPropertyInput(Constants.CorePlugin); _profileEditorService.RegisterPropertyInput(Constants.CorePlugin); _profileEditorService.RegisterPropertyInput(Constants.CorePlugin); _profileEditorService.RegisterPropertyInput(Constants.CorePlugin); _profileEditorService.RegisterPropertyInput(Constants.CorePlugin); _profileEditorService.RegisterPropertyInput(typeof(EnumPropertyInputViewModel<>), Constants.CorePlugin); _profileEditorService.RegisterPropertyInput(Constants.CorePlugin); _profileEditorService.RegisterPropertyInput(Constants.CorePlugin); _profileEditorService.RegisterPropertyInput(Constants.CorePlugin); _registeredBuiltInPropertyEditors = true; } public void RegisterInputProvider() { _inputService.AddInputProvider(new NativeWindowInputProvider(_logger, _inputService)); } private void PluginServiceOnPluginEnabling(object sender, PluginEventArgs e) { e.Plugin.Kernel.Load(new[] {new PluginUIModule(e.Plugin)}); } private void LoadPluginModules() { foreach (Plugin plugin in _pluginManagementService.GetAllPlugins().Where(p => p.IsEnabled)) plugin.Kernel.Load(new[] {new PluginUIModule(plugin)}); } } public interface IRegistrationService : IArtemisUIService { void RegisterBuiltInDataModelDisplays(); void RegisterBuiltInDataModelInputs(); void RegisterBuiltInPropertyEditors(); void RegisterInputProvider(); } }