Inheritance: VMISelectableElement, ILogConfig
        public static VMLogServiceConfig CreateFrom( VMLogConfig holder, ILogServiceConfig s )
        {
            VMLogServiceConfig result = new VMLogServiceConfig( s.Name, false );

            result._holder = holder;
            result.Config = holder.Config;
            result._doLog = s.DoLog;

            foreach( ILogEventConfig e in s.Events )
            {
                VMLogEventConfig evVM = VMLogEventConfig.CreateFrom( result, e );
                evVM.LogConfigChanged += new EventHandler<PropertyChangedEventArgs>(
                    ( sndr, args ) =>
                    { result.IsDirty = true; }
                    );
                result.Events.Add( evVM );
            }

            foreach( ILogPropertyConfig p in s.Properties )
            {
                VMLogPropertyConfig propVM = VMLogPropertyConfig.CreateFrom( p );
                propVM.LogConfigChanged += new EventHandler<PropertyChangedEventArgs>(
                    ( sndr, args ) =>
                    { result.IsDirty = true; }
                    );
                result.Properties.Add( propVM );
            }

            foreach( ILogMethodConfig m in s.Methods )
            {
                VMLogMethodConfig mthdVM = VMLogMethodConfig.CreateFrom( result, m );
                mthdVM.LogConfigChanged += new EventHandler<PropertyChangedEventArgs>(
                ( sndr, args ) =>
                { result.IsDirty = true; }
                );
                result.Methods.Add( mthdVM );
            }

            return result;
        }
        public VMIContextViewModel( IContext context, IPluginConfigAccessor config, ILogService logService, IHelpService helpService )
        {
            DisplayName = "Object explorer";

            Context = context;
            Config = config;
            HelpService = helpService;

            InitializeCommands();

            _plugins = new Dictionary<IPluginInfo, VMIPlugin>();
            _allServices = new Dictionary<IServiceInfo, VMIService>();
            _dynamicServices = new Dictionary<IServiceInfo, VMIService>();
            _serviceRefs = new Dictionary<IServiceReferenceInfo, VMIService>();
            _assemblies = new Dictionary<IAssemblyInfo, VMIAssembly>();

            _pluginRunner = Context.GetService<PluginRunner>( true );
            _pluginRunner.ApplyDone += new EventHandler<ApplyDoneEventArgs>( OnApplyDone );

            NotificationService = context.GetService<INotificationService>();

            Assemblies = new VMCollection<VMIAssembly, IAssemblyInfo>( PluginRunner.Discoverer.AllAssemblies, FindOrCreate );
            Plugins = new VMCollection<VMIPlugin, IPluginInfo>( PluginRunner.Discoverer.AllPlugins.OrderBy( p => p.PublicName ), FindOrCreate );
            AllServices = new VMCollection<VMIService, IServiceInfo>( PluginRunner.Discoverer.AllServices, FindOrCreate );
            DynamicServices = new VMCollection<VMIService, IServiceInfo>( PluginRunner.Discoverer.AllServices.Where( p => p.IsDynamicService ), FindOrCreateDynamic );
            Categories = new ObservableCollection<VMIFolder>();

            _vmLogConfig = new VMLogConfig( this, logService );
            _vmLogConfig.Initialize();

            OsInfo = new VMOSInfo( this );

            VMApplicationInfo = new VMApplicationInfo( this );

            Dictionary<string, List<IPluginInfo>> categoryFolders = new Dictionary<string, List<IPluginInfo>>();
            foreach( IPluginInfo plugin in PluginRunner.Discoverer.AllPlugins )
            {
                foreach( string categ in plugin.Categories )
                {
                    List<IPluginInfo> col;
                    if( !categoryFolders.TryGetValue( categ, out col ) )
                    {
                        col = new List<IPluginInfo>();
                        col.Add( plugin );
                        categoryFolders.Add( categ, col );
                    }
                    else
                    {
                        col.Add( plugin );
                    }
                }
            }
            foreach( KeyValuePair<string, List<IPluginInfo>> item in categoryFolders )
            {
                VMCollection<VMAlias<VMIPlugin>, IPluginInfo> collection = new VMCollection<VMAlias<VMIPlugin>, IPluginInfo>( item.Value, ( info ) => { return new VMAlias<VMIPlugin>( FindOrCreate( info ), null ); } );
                VMIFolder folder = new VMIFolder( collection, item.Key );
                Categories.Add( folder );
            }
        }
        public static VMLogServiceConfig CreateFrom( VMLogConfig holder, IServiceInfo s )
        {
            VMLogServiceConfig result = new VMLogServiceConfig( s.ServiceFullName, true );
            result._holder = holder;
            result.Config = result._holder.Config;

            result.DoLog = result.Config.User.GetOrSet( result._doLogDataPath, true );

            foreach( ISimpleEventInfo e in s.EventsInfoCollection )
            {
                VMLogEventConfig evVM = VMLogEventConfig.CreateFrom( result, e );
                evVM.LogConfigChanged += new EventHandler<PropertyChangedEventArgs>(
                    ( sndr, args ) =>
                    { result.IsDirty = true; } //When an event's conf is modified, the service conf is set to dirty
                );
                result.Events.Add( evVM );
            }

            foreach( ISimplePropertyInfo p in s.PropertiesInfoCollection )
            {
                VMLogPropertyConfig propVM = VMLogPropertyConfig.CreateFrom( p );
                propVM.LogConfigChanged += new EventHandler<PropertyChangedEventArgs>(
                    ( sndr, args ) =>
                    { result.IsDirty = true; }//When a property's conf is modified, the service conf is set to dirty
                    );
                result.Properties.Add( propVM );
            }

            foreach( ISimpleMethodInfo m in s.MethodsInfoCollection )
            {
                VMLogMethodConfig mthdVM = VMLogMethodConfig.CreateFrom( result, m );
                mthdVM.LogConfigChanged += new EventHandler<PropertyChangedEventArgs>(
                ( sndr, args ) =>
                { result.IsDirty = true; } //When a method's conf is modified, the service conf is set to dirty
                );
                result.Methods.Add( mthdVM );
            }

            return result;
        }