//TODO: fix the relection copying reference types void applyToAllNodesMenuItem_Click(object sender, TomShane.Neoforce.Controls.EventArgs e) { List<InspectorInfo> itemspath = new List<InspectorInfo>(); InspectorInfo item = (InspectorInfo)inspectorArea.InsBox.Items.ElementAt(inspectorArea.InsBox.ItemIndex); object value = item.GetValue(); BuildItemsPath(item, itemspath); Group activeGroup = GetActiveGroup(); if (activeGroup == null) return; activeGroup.ForEachAllSets(delegate(Node o) { Node n = (Node)o; if (n == itemspath.ElementAt(0).obj) return; InspectorInfo temp = new InspectorInfo(null, n, this); int count = 0; foreach (InspectorInfo pathitem in itemspath) { if (temp.obj.GetType() != pathitem.obj.GetType()) { Console.WriteLine("The paths did not match while applying to all. {0} != {1}", temp.obj.GetType(), pathitem.obj.GetType()); break; } if (count == itemspath.Count - 1) //last item { if (pathitem.membertype == member_type.dictentry) { dynamic dict = temp.parentItem.obj; dynamic key = pathitem.key; if (!dict.ContainsKey(key)) break; if (dict[key] is Component) { dict[key].active = ((Component)value).active; } else if (temp.IsPanelType()) { dict[key] = value; } } else { if (value is Component) { ((Component)temp.obj).active = ((Component)value).active; } else if (temp.IsPanelType()) { temp.fpinfo.SetValue(value, temp.parentItem.obj); } } } else { InspectorInfo next = itemspath.ElementAt(count + 1); if (next.membertype == member_type.dictentry) { dynamic dict = temp.obj; dynamic key = next.key; if (!dict.ContainsKey(key)) break; temp = new InspectorInfo(null, temp, dict[key], key); } //else if (next.membertype == member_type.collectionentry) //{ // dynamic coll = temp.obj; // //} else { if (next.fpinfo.propertyInfo == null) { temp = new InspectorInfo(null, temp, next.fpinfo.GetValue(temp.obj), next.fpinfo.fieldInfo); } else { temp = new InspectorInfo(null, temp, next.fpinfo.GetValue(temp.obj), next.fpinfo.propertyInfo); } } } count++; } }); }
public void ApplyToAllNodes(Group group) { if (group == null) return; List<InspectorInfo> itemspath = new List<InspectorInfo>(); InspectorInfo item = (InspectorInfo)InsBox.Items.ElementAt(InsBox.ItemIndex); object value = item.GetValue(); BuildItemsPath(item, itemspath); group.ForEachAllSets(delegate(Node n) { if (n == itemspath.ElementAt(0).obj) return; InspectorInfo temp = new InspectorInfo(null, n, sidebar); int count = 0; foreach (InspectorInfo pathitem in itemspath) { if (temp.obj.GetType() != pathitem.obj.GetType()) { Console.WriteLine("The paths did not match while applying to all. {0} != {1}", temp.obj.GetType(), pathitem.obj.GetType()); break; } if (count == itemspath.Count - 1) //last item { if (pathitem.membertype == member_type.dictentry) { dynamic dict = temp.parentItem.obj; dynamic key = pathitem.key; if (!dict.ContainsKey(key)) break; if (dict[key] is Component) { dict[key].active = ((Component)value).active; } else if (temp.IsPanelType()) { dict[key] = value; } } else { if (value is Component) { ((Component)temp.obj).active = ((Component)value).active; } else if (temp.IsPanelType()) { temp.fpinfo.SetValue(value, temp.parentItem.obj); } } } else { InspectorInfo next = itemspath.ElementAt(count + 1); if (next.membertype == member_type.dictentry) { dynamic dict = temp.obj; dynamic key = next.key; if (!dict.ContainsKey(key)) break; temp = new InspectorInfo(null, temp, dict[key], key); } else { temp = new InspectorInfo(null, temp, next.fpinfo.GetValue(temp.obj), next.fpinfo.propertyInfo); } } count++; } }); }