public object Convert( object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture ) { string folder = parameter as string ?? ""; List<string> folders = folder.Split( ',' ).Select( f => f.Trim() ).ToList(); //this is the collection that gets all top level items List<object> items = new List<object>(); for( int i = 0; i < values.Length; i++ ) { //make sure were working with collections from here... IEnumerable childs = values[i] as IEnumerable ?? new List<object> { values[i] }; if( childs.GetEnumerator().MoveNext() ) { string folderName = folders[i]; if( folderName != String.Empty ) { //create folder item and assign childs VMIFolder folderItem = new VMIFolder( childs, folderName ); items.Add( folderItem ); } else { //if no folder name was specified, move the item directly to the root item foreach( var child in childs ) { items.Add( child ); } } } } return items; }
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 ); } }