public static void WireupStart(object ViewObj, Decal.Adapter.Wrappers.PluginHost Host) { if (VInfo.ContainsKey(ViewObj)) WireupEnd(ViewObj); ViewObjectInfo info = new ViewObjectInfo(); VInfo[ViewObj] = info; Type ObjType = ViewObj.GetType(); //Start views object[] viewattrs = ObjType.GetCustomAttributes(typeof(MVViewAttribute), true); foreach (MVViewAttribute a in viewattrs) { info.Views.Add(MyClasses.MetaViewWrappers.ViewSystemSelector.CreateViewResource(Host, a.Resource)); } //Wire up control references foreach (FieldInfo fi in ObjType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy)) { if (Attribute.IsDefined(fi, typeof(MVControlReferenceAttribute))) { MVControlReferenceAttribute attr = (MVControlReferenceAttribute)Attribute.GetCustomAttribute(fi, typeof(MVControlReferenceAttribute)); MetaViewWrappers.IControl mycontrol = null; //Try each view foreach (MyClasses.MetaViewWrappers.IView v in info.Views) { try { mycontrol = v[attr.Control]; } catch { } if (mycontrol != null) break; } if (mycontrol == null) throw new Exception("Invalid control reference \"" + attr.Control + "\""); if (!fi.FieldType.IsAssignableFrom(mycontrol.GetType())) throw new Exception("Control reference \"" + attr.Control + "\" is of wrong type"); fi.SetValue(ViewObj, mycontrol); } else if (Attribute.IsDefined(fi, typeof(MVControlReferenceArrayAttribute))) { MVControlReferenceArrayAttribute attr = (MVControlReferenceArrayAttribute)Attribute.GetCustomAttribute(fi, typeof(MVControlReferenceArrayAttribute)); //Only do the first view if (info.Views.Count == 0) throw new Exception("No views to which a control reference can attach"); Array controls = Array.CreateInstance(fi.FieldType.GetElementType(), attr.Controls.Count); IView view = info.Views[0]; for (int i = 0; i < attr.Controls.Count; ++i) { controls.SetValue(view[attr.Controls[i]], i); } fi.SetValue(ViewObj, controls); } } //Wire up events foreach (MethodInfo mi in ObjType.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy)) { if (!Attribute.IsDefined(mi, typeof(MVControlEventAttribute))) continue; Attribute[] attrs = Attribute.GetCustomAttributes(mi, typeof(MVControlEventAttribute)); foreach (MVControlEventAttribute attr in attrs) { MetaViewWrappers.IControl mycontrol = null; //Try each view foreach (MyClasses.MetaViewWrappers.IView v in info.Views) { try { mycontrol = v[attr.Control]; } catch { } if (mycontrol != null) break; } if (mycontrol == null) throw new Exception("Invalid control reference \"" + attr.Control + "\""); EventInfo ei = mycontrol.GetType().GetEvent(attr.EventName); ei.AddEventHandler(mycontrol, Delegate.CreateDelegate(ei.EventHandlerType, ViewObj, mi.Name)); } } }
public static void WireupStart(object ViewObj, Decal.Adapter.Wrappers.PluginHost Host) { if (VInfo.ContainsKey(ViewObj)) { WireupEnd(ViewObj); } ViewObjectInfo info = new ViewObjectInfo(); VInfo[ViewObj] = info; Type ObjType = ViewObj.GetType(); //Start views object[] viewattrs = ObjType.GetCustomAttributes(typeof(MVViewAttribute), true); foreach (MVViewAttribute a in viewattrs) { info.Views.Add(MyClasses.MetaViewWrappers.ViewSystemSelector.CreateViewResource(Host, a.Resource)); } //Wire up control references foreach (FieldInfo fi in ObjType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy)) { if (Attribute.IsDefined(fi, typeof(MVControlReferenceAttribute))) { MVControlReferenceAttribute attr = (MVControlReferenceAttribute)Attribute.GetCustomAttribute(fi, typeof(MVControlReferenceAttribute)); MetaViewWrappers.IControl mycontrol = null; //Try each view foreach (MyClasses.MetaViewWrappers.IView v in info.Views) { try { mycontrol = v[attr.Control]; } catch { } if (mycontrol != null) { break; } } if (mycontrol == null) { throw new Exception("Invalid control reference \"" + attr.Control + "\""); } if (!fi.FieldType.IsAssignableFrom(mycontrol.GetType())) { throw new Exception("Control reference \"" + attr.Control + "\" is of wrong type"); } fi.SetValue(ViewObj, mycontrol); } else if (Attribute.IsDefined(fi, typeof(MVControlReferenceArrayAttribute))) { MVControlReferenceArrayAttribute attr = (MVControlReferenceArrayAttribute)Attribute.GetCustomAttribute(fi, typeof(MVControlReferenceArrayAttribute)); //Only do the first view if (info.Views.Count == 0) { throw new Exception("No views to which a control reference can attach"); } Array controls = Array.CreateInstance(fi.FieldType.GetElementType(), attr.Controls.Count); IView view = info.Views[0]; for (int i = 0; i < attr.Controls.Count; ++i) { controls.SetValue(view[attr.Controls[i]], i); } fi.SetValue(ViewObj, controls); } } //Wire up events foreach (MethodInfo mi in ObjType.GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy)) { if (!Attribute.IsDefined(mi, typeof(MVControlEventAttribute))) { continue; } Attribute[] attrs = Attribute.GetCustomAttributes(mi, typeof(MVControlEventAttribute)); foreach (MVControlEventAttribute attr in attrs) { MetaViewWrappers.IControl mycontrol = null; //Try each view foreach (MyClasses.MetaViewWrappers.IView v in info.Views) { try { mycontrol = v[attr.Control]; } catch { } if (mycontrol != null) { break; } } if (mycontrol == null) { throw new Exception("Invalid control reference \"" + attr.Control + "\""); } EventInfo ei = mycontrol.GetType().GetEvent(attr.EventName); ei.AddEventHandler(mycontrol, Delegate.CreateDelegate(ei.EventHandlerType, ViewObj, mi.Name)); } } }