Free cookie consent management tool by TermsFeed Policy Generator

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

Last change on this file since 2437 was 2437, checked in by mkommend, 15 years ago

implemented changes regarding detection of view types and default views as discussed with SWA (ticket #771)

File size: 4.8 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        List<Type> temp = defaultViews.Keys.Where(x => x.IsAssignableFrom(viewableType)).ToList();
101        if (temp.Count == 0)
102          return null;
103        else if (temp.Count == 1)
104          return defaultViews[temp[0]];
105        else {
106          temp.Sort(delegate(Type t1, Type t2) {
107            if (t1.IsAssignableFrom(t2))
108              return 1;
109            return -1;
110          }
111          );
112          if (!temp[0].IsAssignableFrom(temp[1]) && !temp[1].IsAssignableFrom(temp[0]))
113            throw new Exception("Could not determine which is the default view for type " + viewableType.ToString() + ".");
114          else
115            return defaultViews[temp[0]];
116        }
117      } else
118        return defaultViews[viewableType];
119    }
120
121    public static IView<T> CreateDefaultView<T>(T objectToView) {
122      Type t = GetDefaultViewType(objectToView.GetType());
123      if (t == null)
124        return null;
125      else
126        return (IView<T>)Activator.CreateInstance(t);
127    }
128  }
129}
Note: See TracBrowser for help on using the repository browser.