76
78
initialized -= value;
82
private Dictionary<DynamicItemSource, UniverseCollection> dynamicUniverses;
83
private IEnumerable<Item> DynamicItems {
85
return dynamicUniverses.Values.SelectMany (collection => collection.Values);
89
private void OnItemsAvailable (object sender, ItemsAvailableEventArgs args)
91
DynamicItemSource source = sender as DynamicItemSource;
93
Log<UniverseManager>.Error ("OnItemsAvailable called from a non-DynamicItemSource.");
96
lock (universe_lock) {
97
foreach (Item item in args.newItems) {
99
dynamicUniverses[source].Add (item.UniqueId, item);
100
} catch (ArgumentException) {
101
Log<UniverseManager>.Error ("DynamicItemSource {0} attmpted to add duplicate Item {1}", source.Name, item.UniqueId);
107
private void OnItemsUnavailable (object sender, ItemsUnavailableEventArgs args)
109
DynamicItemSource source = sender as DynamicItemSource;
110
if (source == null) {
111
Log<UniverseManager>.Error ("OnItemsUnavailable called from a non-DynamicItemSource.");
114
lock (universe_lock) {
115
foreach (Item item in args.unavailableItems) {
116
dynamicUniverses[source].Remove (item.UniqueId);
121
private void OnPluginChanged (object sender, ExtensionNodeEventArgs args)
123
DynamicItemSource source = args.ExtensionObject as DynamicItemSource;
124
switch (args.Change) {
125
case ExtensionChange.Add:
126
lock (universe_lock) {
127
dynamicUniverses[source] = new UniverseCollection ();
129
source.ItemsAvailable += OnItemsAvailable;
130
source.ItemsUnavailable += OnItemsUnavailable;
131
Log<UniverseManager>.Debug ("Added new DynamicItemSource: {0}", source.Name);
133
case ExtensionChange.Remove:
134
source.ItemsAvailable -= OnItemsAvailable;
135
source.ItemsUnavailable -= OnItemsUnavailable;
136
lock (universe_lock) {
137
dynamicUniverses.Remove (source);
139
Log<UniverseManager>.Debug ("Removed DynamicItemSource: {0}", source.Name);
80
144
public UniverseManager ()
82
146
universe = new UniverseCollection ();
147
dynamicUniverses = new Dictionary<DynamicItemSource, Dictionary<string, Item>> ();
83
148
universe_lock = new object ();
84
149
reload_requested = new ManualResetEvent (false);
106
171
// Do the initial load of the universe.
107
172
ReloadUniverse ();
174
// Hook up to DynamicItemSource notifications
175
AddinManager.AddExtensionNodeHandler ("/Do/DynamicItemSource", OnPluginChanged);
109
177
// Notify subscribers that the universe has been loaded.
110
178
Services.Application.RunOnMainThread (() => {
111
179
BuildCompleted = true;
125
193
public IEnumerable<Item> Search (string query, IEnumerable<Type> filter, Item other)
128
return Search (query, filter, universe.Values, other);
196
return Search (query, filter, universe.Values.Concat (DynamicItems), other);
131
199
public IEnumerable<Item> Search (string query, IEnumerable<Type> filter, IEnumerable<Item> objects)
133
201
return Search (query, filter, objects, null);
136
204
public IEnumerable<Item> Search (string query, IEnumerable<Type> filter, IEnumerable<Item> elements, Item other)
138
206
Item text = new ImplicitTextItem (query);