private static void FactOrganizerFromPublic(ref FactOrganizer set, PublicFactOrganizer exposed, bool invoke, out Dictionary<string, string> old_to_new) { // TODO: other strategy needed when MMT save/load supported // map old URIs to new ones old_to_new = new Dictionary<string, string>(); // combine T:Fact to Fact Dictionary<string, Fact> old_FactDict = new Dictionary<string, Fact>(); /* FieldInfo[] finfos = typeof(PublicFactOrganizer).GetFields(); foreach(string type in PublicFactOrganizer.WatchedFacts) AddListToDict( finfos.First(x => x.Name.Remove(x.Name.Length-1) == type) .GetValue(exposed) as List<Fact>); */ AddListToDict(exposed.PointFacts); AddListToDict(exposed.LineFacts); AddListToDict(exposed.RayFacts); AddListToDict(exposed.AngleFacts); AddListToDict(exposed.OnLineFacts); // initiate set.invoke = invoke; set.MaxLabelId = exposed.MaxLabelId; set.UnusedLabelIds = exposed.UnusedLabelIds; set.FactDict = new Dictionary<string, Fact>(); // work Workflow foreach (var sn in exposed.Workflow) { if (sn.creation) // Add { Fact add; if (old_to_new.ContainsKey(sn.Id)) add = set.FactDict[old_to_new[sn.Id]]; else { Fact old_Fact = old_FactDict[sn.Id]; add = old_Fact.GetType() .GetConstructor(new Type[] { old_Fact.GetType(), old_to_new.GetType(), typeof(FactOrganizer) }) .Invoke(new object[] { old_Fact, old_to_new, set }) as Fact; old_to_new.Add(sn.Id, add.Id); } set.Add(add, out _, sn.samestep); } else if(old_to_new.ContainsKey(sn.Id)) // Remove { Fact remove = set.FactDict[old_to_new[sn.Id]]; set.Remove(remove, sn.samestep); } } // set un-redo state while (set.backlog < exposed.backlog) set.undo(); set.soft_resetted = exposed.soft_resetted; // === local functions === void AddListToDict<T>(List<T> list) where T:Fact { foreach (T ft in list) old_FactDict.Add(ft.Id, ft); } }