diff --git a/ANX.Framework/NonXNA/AddInSystemFactory.cs b/ANX.Framework/NonXNA/AddInSystemFactory.cs index 1eb0d9ce..a769b9fb 100644 --- a/ANX.Framework/NonXNA/AddInSystemFactory.cs +++ b/ANX.Framework/NonXNA/AddInSystemFactory.cs @@ -26,7 +26,7 @@ namespace ANX.Framework.NonXNA private Dictionary creators; private static AddInSystemFactory instance; private bool initialized; - private Dictionary addinSystems; + private Dictionary addInSystems; #endregion #region Public @@ -57,10 +57,10 @@ namespace ANX.Framework.NonXNA private AddInSystemFactory() { creators = new Dictionary(); - addinSystems = new Dictionary(); + addInSystems = new Dictionary(); foreach (AddInType type in Enum.GetValues(typeof(AddInType))) - addinSystems.Add(type, new AddInTypeCollection()); + addInSystems.Add(type, new AddInTypeCollection()); } #endregion @@ -89,7 +89,7 @@ namespace ANX.Framework.NonXNA AddIn addin = new AddIn(creatorType, matchingSupportedPlatformsType); if (addin.IsSupported) { - addinSystems[addin.Type].Add(addin); + addInSystems[addin.Type].Add(addin); Logger.Info("[ANX] successfully loaded AddIn (" + addin.Type + ") " + creatorType.FullName + "."); } else @@ -173,20 +173,45 @@ namespace ANX.Framework.NonXNA } #endregion - #region GetDefaultCreator - public T GetDefaultCreator() where T : class, ICreator + #region GetAvailableCreators + public IEnumerable GetAvailableCreators() where T : class, ICreator + { + AddInType type = GetAddInType(typeof(T)); + + if (type != AddInType.Unknown) + { + AddInTypeCollection addIns = addInSystems[type]; + + foreach (AddIn addIn in addIns) + { + T instance = addIn.Instance as T; + if (instance != null && instance.IsSupported) + { + yield return instance; + } + } + } + else + { + throw new Exception("couldn't resolve AddInType of '" + typeof(T).FullName + "'"); + } + } + #endregion + + #region GetDefaultCreator + public T GetDefaultCreator() where T : class, ICreator { Initialize(); AddInType addInType = GetAddInType(typeof(T)); - return addinSystems[addInType].GetDefaultCreator(addInType); + return addInSystems[addInType].GetDefaultCreator(addInType); } #endregion #region SortAddIns public void SortAddIns() { - foreach (AddInTypeCollection info in addinSystems.Values) + foreach (AddInTypeCollection info in addInSystems.Values) info.Sort(); creators = creators.OrderBy(x => x.Value.Priority).ToDictionary(x => x.Key, x => x.Value); @@ -196,24 +221,24 @@ namespace ANX.Framework.NonXNA #region GetPreferredSystem public string GetPreferredSystem(AddInType addInType) { - return addinSystems[addInType].PreferredName; + return addInSystems[addInType].PreferredName; } #endregion #region SetPreferredSystem public void SetPreferredSystem(AddInType addInType, string preferredName) { - if (addinSystems[addInType].PreferredLocked) + if (addInSystems[addInType].PreferredLocked) throw new AddInLoadingException(String.Format("Can't set preferred {0} because a {0} is alread in use.", addInType)); - addinSystems[addInType].PreferredName = preferredName; + addInSystems[addInType].PreferredName = preferredName; } #endregion #region PreventSystemChange public void PreventSystemChange(AddInType addInType) { - addinSystems[addInType].Lock(); + addInSystems[addInType].Lock(); } #endregion diff --git a/ANX.Framework/NonXNA/AddInTypeCollection.cs b/ANX.Framework/NonXNA/AddInTypeCollection.cs index b980b3db..87669ffc 100644 --- a/ANX.Framework/NonXNA/AddInTypeCollection.cs +++ b/ANX.Framework/NonXNA/AddInTypeCollection.cs @@ -7,9 +7,9 @@ using System.Collections.Generic; namespace ANX.Framework.NonXNA { - internal class AddInTypeCollection + internal class AddInTypeCollection : IEnumerable { - private List AvailableSystems; + private List availableSystems; #region Public public string PreferredName @@ -28,21 +28,21 @@ namespace ANX.Framework.NonXNA #region Constructor public AddInTypeCollection() { - AvailableSystems = new List(); + availableSystems = new List(); } #endregion #region Add public void Add(AddIn addIn) { - AvailableSystems.Add(addIn); + availableSystems.Add(addIn); } #endregion #region Sort public void Sort() { - AvailableSystems.Sort(); + availableSystems.Sort(); } #endregion @@ -56,19 +56,27 @@ namespace ANX.Framework.NonXNA #region GetDefaultCreator public T GetDefaultCreator(AddInType addInType) where T : class, ICreator { + Sort(); + if (String.IsNullOrEmpty(PreferredName)) { - if (AvailableSystems.Count > 0) - return AvailableSystems[0].Instance as T; + for (int i = 0; i < availableSystems.Count; i++) + { + T candidate = availableSystems[i].Instance as T; + if (candidate != null && candidate.IsSupported) + { + return candidate; + } + } throw new AddInLoadingException(String.Format( "Couldn't get default {0} because there are no " + - "registered {0}s available! Make sure you referenced a {0} library " + + "registered and supported {0}s available! Make sure you referenced a {0} library " + "in your project or one is laying in your output folder!", addInType)); } else { - foreach (AddIn addin in AvailableSystems) + foreach (AddIn addin in availableSystems) if (addin.Name.Equals(PreferredName, StringComparison.CurrentCultureIgnoreCase)) return addin.Instance as T; @@ -80,5 +88,15 @@ namespace ANX.Framework.NonXNA throw new AddInLoadingException(String.Format("Couldn't find a DefaultCreator of type '{0}'!", typeof(T).FullName)); } #endregion - } + + public IEnumerator GetEnumerator() + { + return availableSystems.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return availableSystems.GetEnumerator(); + } + } } diff --git a/Samples/WindowsGame/AddInSelector.cs b/Samples/WindowsGame/AddInSelector.cs index c4880dd4..576042b4 100644 --- a/Samples/WindowsGame/AddInSelector.cs +++ b/Samples/WindowsGame/AddInSelector.cs @@ -24,23 +24,23 @@ namespace WindowsGame1 { AddInSystemFactory.Instance.SortAddIns(); - foreach (IRenderSystemCreator renderSystemCreator in AddInSystemFactory.Instance.GetCreators()) + foreach (IRenderSystemCreator renderSystemCreator in AddInSystemFactory.Instance.GetAvailableCreators()) { cbRenderSystem.Items.Add(renderSystemCreator.Name); } - cbRenderSystem.SelectedIndex = 0; + cbRenderSystem.SelectedItem = AddInSystemFactory.Instance.GetDefaultCreator().Name; - foreach (IInputSystemCreator inputSystemCreator in AddInSystemFactory.Instance.GetCreators()) + foreach (IInputSystemCreator inputSystemCreator in AddInSystemFactory.Instance.GetAvailableCreators()) { cbInputSystem.Items.Add(inputSystemCreator.Name); } - cbInputSystem.SelectedIndex = 0; + cbInputSystem.SelectedItem = AddInSystemFactory.Instance.GetDefaultCreator().Name; - foreach (ISoundSystemCreator soundSystemCreator in AddInSystemFactory.Instance.GetCreators()) + foreach (ISoundSystemCreator soundSystemCreator in AddInSystemFactory.Instance.GetAvailableCreators()) { cbAudioSystem.Items.Add(soundSystemCreator.Name); } - cbAudioSystem.SelectedIndex = 0; + cbAudioSystem.SelectedItem = AddInSystemFactory.Instance.GetDefaultCreator().Name; } private void button1_Click(object sender, EventArgs e) diff --git a/build/ANX.Framework.build b/build/ANX.Framework.build index a50a3a5a..c14905f6 100644 --- a/build/ANX.Framework.build +++ b/build/ANX.Framework.build @@ -484,7 +484,24 @@ - + +