source: branches/Mainform refactoring/HeuristicLab.MainForm/3.2/MainFormManager.cs @ 2443

Last change on this file since 2443 was 2443, checked in by mkommend, 13 years ago

refactored mainform (ticket #771)

File size: 5.1 KB
Line 
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
21using System;
22using System.Collections.Generic;
23using System.Linq;
24using System.Text;
25using HeuristicLab.PluginInfrastructure;
26
27namespace HeuristicLab.MainForm {
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>();
38    }
39
40    public static void RegisterMainForm(IMainForm mainform) {
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      }
68    }
69
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 {
78      get { return mainform; }
79    }
80
81    public static T GetMainForm<T>() where T : IMainForm {
82      return (T)mainform;
83    }
84
85    public static IEnumerable<Type> GetViewTypes(Type viewableType) {
86      List<Type> viewsForType = new List<Type>();
87      foreach (KeyValuePair<Type, List<Type>> v in views) {
88        if (v.Key.IsAssignableFrom(viewableType))
89          viewsForType.AddRange(v.Value);
90      }
91      return viewsForType.Distinct();
92    }
93
94    public static bool ViewCanViewObject(IView view, object o) {
95      return GetViewTypes(o.GetType()).Contains(view.GetType());
96    }
97
98    public static Type GetDefaultViewType(Type viewableType) {
99      if (defaultViews.ContainsKey(viewableType))
100        return defaultViews[viewableType];
101      else {
102        List<Type> temp = defaultViews.Keys.Where(x => x.IsAssignableFrom(viewableType)).ToList();
103        //no assignable type found
104        if (temp.Count == 0)
105          return null;
106        //only one assignable type found => return this one
107        else if (temp.Count == 1)
108          return defaultViews[temp[0]];
109        //more assignable types found => sort the types according to their assignable types
110        //and return most specific type => except there is a conflict
111        else {
112          temp.Sort(delegate(Type t1, Type t2) {
113            if (t1.IsAssignableFrom(t2))
114              return 1;
115            else if (t2.IsAssignableFrom(t1))
116              return -1;
117            else
118              return 0;
119          }
120          );
121          if (temp[1].IsAssignableFrom(temp[0]))
122            return defaultViews[temp[0]];
123          else
124            throw new Exception("Could not determine which is the default view for type " + viewableType.ToString() + ".");
125        }
126      }
127    }
128
129    public static IView<T> CreateDefaultView<T>(T objectToView) {
130      Type t = GetDefaultViewType(objectToView.GetType());
131      if (t == null)
132        return null;
133      else
134        return (IView<T>)Activator.CreateInstance(t);
135    }
136  }
137}
Note: See TracBrowser for help on using the repository browser.