private ClientBuilderViewModel()
        {
            _plugins =
                new ObservableCollection <PluginViewModel>(
                    PluginManager.Current.LoadedPlugins.Select(x =>
            {
                var buildPlugin = x as BuildPlugin;
                if (buildPlugin != null)
                {
                    return((PluginViewModel) new BuilderPluginViewModel(buildPlugin));
                }

                var clientPlugin = x as ClientPlugin;
                if (clientPlugin != null)
                {
                    return(new ClientPluginViewModel(clientPlugin));
                }

                var factoryCommandPlugin = x as FactoryCommandPlugin;
                if (factoryCommandPlugin != null)
                {
                    return(new FactoryPluginViewModel(factoryCommandPlugin));
                }

                return(null);
            }).Where(x => x != null));

            foreach (var pluginViewModel in _plugins)
            {
                pluginViewModel.OpenSettings    += PluginViewModelOnOpenSettings;
                pluginViewModel.SelectedChanged += PluginViewModelOnSelectedChanged;
            }

            Plugins = CollectionViewSource.GetDefaultView(_plugins);
            Plugins.GroupDescriptions.Add(new PropertyGroupDescription("IsBuildPlugin"));
            Plugins.SortDescriptions.Add(new SortDescription("IsBuildPlugin", ListSortDirection.Ascending));
            Plugins.Filter = FilterPlugins;

            BuilderSettingsManager = new BuilderSettingsManager();
            BuilderSettingsManager.BuilderSettingsOverwriteRequest +=
                BuilderSettingsManagerOnBuilderSettingsOverwriteRequest;

            BuildConfigurationManager = new BuildConfigurationManager();
        }
        private void PluginViewModelOnSelectedChanged(object sender, EventArgs eventArgs)
        {
            var pluginViewModel = (PluginViewModel)sender;

            if (pluginViewModel.IsSelected)
            {
                var overwriteBuilderProperties = pluginViewModel.PluginObject as IOverwriteBuilderProperties;
                if (overwriteBuilderProperties?.OverwrittenSettings?.Count > 0)
                {
                    BuilderSettingsManager.AddOverwritingPlugin(pluginViewModel.Plugin, overwriteBuilderProperties);
                }

                var provideBuilderSettings = pluginViewModel.PluginObject as IProvideBuilderSettings;
                if (provideBuilderSettings?.BuilderSettings?.Count > 0)
                {
                    BuilderSettingsManager.AddProvidingPlugin(pluginViewModel.Plugin, provideBuilderSettings);
                }
            }
            else if (pluginViewModel.PluginObject is IOverwriteBuilderProperties ||
                     pluginViewModel.PluginObject is IProvideBuilderSettings)
            {
                BuilderSettingsManager.RemovePlugin(pluginViewModel.Plugin);
            }
        }
        private void LoadSettings(IEnumerable <ClientSetting> clientSettings)
        {
            var settings = new List <IBuilderProperty>();

            foreach (var clientSetting in clientSettings)
            {
                var type = Type.GetType(clientSetting.SettingsType);
                if (type == null)
                {
                    continue;
                }

                var settingInstance = Activator.CreateInstance(type) as IBuilderProperty;
                if (settingInstance == null)
                {
                    continue;
                }

                BuilderPropertyHelper.ApplyProperties(settingInstance, clientSetting.Properties);
                settings.Add(settingInstance);
            }

            BuilderSettingsManager.InitializeSettings(settings);
        }