- Timestamp:
- 10/15/09 14:01:15 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/Mainform refactoring/HeuristicLab.MainForm/3.2/MainFormManager.cs
r2426 r2433 1 using System; 1 #region License Information 2 /* HeuristicLab 3 * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL) 4 * 5 * This file is part of HeuristicLab. 6 * 7 * HeuristicLab is free software: you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License as published by 9 * the Free Software Foundation, either version 3 of the License, or 10 * (at your option) any later version. 11 * 12 * HeuristicLab is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>. 19 */ 20 #endregion 21 using System; 2 22 using System.Collections.Generic; 3 23 using System.Linq; 4 24 using System.Text; 25 using HeuristicLab.PluginInfrastructure; 5 26 6 27 namespace HeuristicLab.MainForm { 7 public class MainFormManager { 8 private MainFormManager() { 9 MainFormManager.mainform = null; 28 public static class MainFormManager { 29 private static object locker; 30 private static IMainForm mainform; 31 private static Dictionary<Type, List<Type>> views; 32 private static Dictionary<Type, Type> defaultViews; 33 34 static MainFormManager() { 35 locker = new object(); 36 views = new Dictionary<Type, List<Type>>(); 37 defaultViews = new Dictionary<Type, Type>(); 10 38 } 11 39 12 private static IMainForm mainform;13 40 public static void RegisterMainForm(IMainForm mainform) { 14 if (MainFormManager.mainform == null) 15 MainFormManager.mainform = mainform; 16 else 17 throw new ArgumentException("A mainform was already associated with the mainform manager."); 41 lock (locker) { 42 if (MainFormManager.mainform == null) { 43 MainFormManager.mainform = mainform; 44 45 DiscoveryService ds = new DiscoveryService(); 46 Type[] types = ds.GetTypes(typeof(IView)); 47 48 foreach (Type t in types.Where(t => !t.IsAbstract && !t.IsInterface && !t.IsGenericType)) { 49 foreach (Type viewableType in GetViewableType(t)) { 50 if (viewableType != null) { 51 if (!views.ContainsKey(viewableType)) 52 views[viewableType] = new List<Type>(); 53 views[viewableType].Add(t); 54 55 object[] attributes = t.GetCustomAttributes(typeof(DefaultView), false); 56 if (attributes != null && attributes.Length == 1) { 57 if (defaultViews.ContainsKey(viewableType)) 58 throw new ArgumentException("DefaultView for type " + viewableType + " is " + defaultViews[viewableType] + 59 ". Can't register additional DefaultView " + t + "."); 60 defaultViews[viewableType] = t; 61 } 62 } 63 } 64 } 65 } else 66 throw new ArgumentException("A mainform was already associated with the mainform manager."); 67 } 18 68 } 19 69 20 public static IMainForm Instance { 70 private static IEnumerable<Type> GetViewableType(Type t) { 71 foreach (Type interfaceType in t.GetInterfaces().Where(i => i.Namespace == "HeuristicLab.MainForm" && i.Name.StartsWith("IView"))) { 72 if (interfaceType.IsGenericType && !interfaceType.IsGenericTypeDefinition) 73 yield return interfaceType.GetGenericArguments()[0]; 74 } 75 } 76 77 public static IMainForm MainForm { 21 78 get { return mainform; } 22 79 } 23 80 24 public static T Get Instance<T>() where T : IMainForm {81 public static T GetMainForm<T>() where T : IMainForm { 25 82 return (T)mainform; 83 } 84 85 public static IEnumerable<Type> GetViewTypes(Type viewableType) { 86 List<Type> viewsForType; 87 if (!views.ContainsKey(viewableType)) 88 viewsForType = new List<Type>(); 89 else 90 viewsForType = views[viewableType]; 91 92 if (viewableType.BaseType != null) 93 viewsForType.AddRange(GetViewTypes(viewableType.BaseType)); 94 return viewsForType.Distinct(); 95 } 96 97 public static bool ViewCanViewObject(IView view, object o) { 98 return GetViewTypes(o.GetType()).Contains(view.GetType()); 99 } 100 101 public static Type GetDefaultViewType(Type viewableType) { 102 if (!defaultViews.ContainsKey(viewableType)) 103 return null; 104 return defaultViews[viewableType]; 105 } 106 107 public static IView<T> CreateDefaultView<T>(T objectToView) { 108 Type t = GetDefaultViewType(objectToView.GetType()); 109 if (t == null) 110 return null; 111 else 112 return (IView<T>) Activator.CreateInstance(t); 26 113 } 27 114 }
Note: See TracChangeset
for help on using the changeset viewer.