Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
11/04/09 17:16:39 (15 years ago)
Author:
mkommend
Message:

implemented ContentAttribute and adapted MainFormManager (ticket #771)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.MainForm/3.2/MainFormManager.cs

    r2458 r2466  
    2929    private static object locker;
    3030    private static IMainForm mainform;
    31     private static Dictionary<Type, List<Type>> views;
     31    private static HashSet<Type> views;
    3232    private static Dictionary<Type, Type> defaultViews;
    3333
    3434    static MainFormManager() {
    3535      locker = new object();
    36       views = new Dictionary<Type, List<Type>>();
     36      views = new HashSet<Type>();
    3737      defaultViews = new Dictionary<Type, Type>();
    3838    }
     
    4646          IEnumerable<Type> types =
    4747            from t in ds.GetTypes(typeof(IView))
    48             where !t.IsAbstract && !t.IsInterface && !t.IsGenericType
     48            where !t.IsAbstract && !t.IsInterface && !t.IsGenericType && ContentAttribute.HasContentAttribute(t)
    4949            select t;
    5050
    51           foreach (Type t in types) {
    52             foreach (Type viewableType in GetViewableType(t)) {
    53               if (viewableType != null) {
    54                 if (!views.ContainsKey(viewableType))
    55                   views[viewableType] = new List<Type>();
    56                 views[viewableType].Add(t);
    57 
    58                 if (DefaultViewAttribute.IsDefaultView(t)) {
    59                   if (defaultViews.ContainsKey(viewableType))
    60                     throw new ArgumentException("DefaultView for type " + viewableType + " is " + defaultViews[viewableType] +
    61                       ". Can't register additional DefaultView " + t + ".");
    62                   defaultViews[viewableType] = t;
    63                 }
    64               }
     51          foreach (Type viewType in types) {
     52            views.Add(viewType);
     53            foreach (Type contentType in ContentAttribute.GetTypesWhereViewTypeIsDefaultView(viewType)) {
     54              if (defaultViews.ContainsKey(contentType))
     55                throw new ArgumentException("DefaultView for type " + contentType + " is " + defaultViews[contentType] +
     56                  ". Can't register additional DefaultView " + viewType + ".");
     57              defaultViews[contentType] = viewType;
    6558            }
    6659          }
    6760        } else
    6861          throw new ArgumentException("A mainform was already associated with the mainform manager.");
    69       }
    70     }
    71 
    72     private static IEnumerable<Type> GetViewableType(Type t) {
    73       IEnumerable<Type> interfaceTypes =
    74        from type in t.GetInterfaces()
    75        where type.Namespace == "HeuristicLab.MainForm" && type.Name.StartsWith("IView") &&
    76              type.IsGenericType && !type.IsGenericTypeDefinition
    77        select type;
    78 
    79       foreach (Type interfaceType in interfaceTypes) {
    80         yield return interfaceType.GetGenericArguments()[0];
    8162      }
    8263    }
     
    9071    }
    9172
    92     public static IEnumerable<Type> GetViewTypes(Type viewableType) {
    93       List<Type> viewsForType = new List<Type>();
    94       foreach (KeyValuePair<Type, List<Type>> v in views) {
    95         if (v.Key.IsAssignableFrom(viewableType))
    96           viewsForType.AddRange(v.Value);
    97       }
    98       return viewsForType.Distinct();
     73    public static IEnumerable<Type> GetViewTypes(Type contentType) {
     74      return from v in views
     75             where ContentAttribute.CanViewType(v, contentType)
     76             select v;
    9977    }
    10078
    10179    public static bool ViewCanViewObject(IView view, object o) {
    102       return GetViewTypes(o.GetType()).Contains(view.GetType());
     80      return ContentAttribute.CanViewType(view.GetType(), o.GetType());
    10381    }
    10482
    105     public static Type GetDefaultViewType(Type viewableType) {
     83    public static Type GetDefaultViewType(Type contentType) {
    10684      //check if viewableType has a default view
    107       if (defaultViews.ContainsKey(viewableType))
    108         return defaultViews[viewableType];
     85      if (defaultViews.ContainsKey(contentType))
     86        return defaultViews[contentType];
    10987
    11088      //check base classes for default view
    111       Type type = viewableType;
     89      Type type = contentType;
    11290      while (type.BaseType != null && !defaultViews.ContainsKey(type)) {
    11391        type = type.BaseType;
     
    11896      //check if exact one implemented interface has a default view
    11997      List<Type> temp = (from t in defaultViews.Keys
    120                          where t.IsAssignableFrom(viewableType) && t.IsInterface
     98                         where t.IsAssignableFrom(contentType) && t.IsInterface
    12199                         select t).ToList();
    122100      if (temp.Count == 1)
     
    124102      //more than one default view for implemented interfaces are found
    125103      if (temp.Count > 1)
    126         throw new Exception("Could not determine which is the default view for type " + viewableType.ToString() + ". Because more than one implemented interfaces have a default view.");
     104        throw new Exception("Could not determine which is the default view for type " + contentType.ToString() + ". Because more than one implemented interfaces have a default view.");
    127105      return null;
    128106    }
    129107
    130     public static IView<T> CreateDefaultView<T>(T objectToView) {
     108    public static IView CreateDefaultView(object objectToView) {
    131109      Type t = GetDefaultViewType(objectToView.GetType());
    132110      if (t == null)
    133111        return null;
    134112      else
    135         return (IView<T>)Activator.CreateInstance(t);
     113        return (IView)Activator.CreateInstance(t, objectToView);
    136114    }
    137115  }
Note: See TracChangeset for help on using the changeset viewer.