private void FixLexRelationTypeList(LayoutTreeNode ltn) { // Get the canonical list from the project. if (m_rgRelationTypes == null) { m_rgRelationTypes = m_cache.LangProject.LexDbOA.ReferencesOA.PossibilitiesOS.ToList(); m_rgRelationTypes.Sort(ComparePossibilitiesByName); } // Add any new types to our ordered list (or fill in an empty list). var setSortedGuids = new Set<GuidAndSubClass>(); foreach (var lri in ltn.RelTypeList) setSortedGuids.Add(new GuidAndSubClass(lri.ItemGuid, lri.SubClass)); foreach (var poss in m_rgRelationTypes) { var lrt = (ILexRefType)poss; if (ltn.LexRelType == "sense") { if (lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryAsymmetricPair || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryCollection || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryPair || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtEntrySequence || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryTree) { continue; } } else { if (lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtSenseAsymmetricPair || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtSenseCollection || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtSensePair || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtSenseSequence || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtSenseTree) { continue; } } var gsc = new GuidAndSubClass(poss.Guid, LexReferenceInfo.TypeSubClass.Normal); if (lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryAsymmetricPair || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryOrSenseAsymmetricPair || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtSenseAsymmetricPair || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryTree || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryOrSenseTree || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtSenseTree) { gsc.SubClass = LexReferenceInfo.TypeSubClass.Forward; } if (!setSortedGuids.Contains(gsc)) { var lri = new LexReferenceInfo(true, poss.Guid) { SubClass = gsc.SubClass }; ltn.RelTypeList.Add(lri); } if (gsc.SubClass == LexReferenceInfo.TypeSubClass.Forward) { gsc.SubClass = LexReferenceInfo.TypeSubClass.Reverse; if (!setSortedGuids.Contains(gsc)) { var lri = new LexReferenceInfo(true, poss.Guid) { SubClass = gsc.SubClass }; ltn.RelTypeList.Add(lri); } } } // Remove any obsolete types from our ordered list. var mapGuidType = new Dictionary<GuidAndSubClass, ILexRefType>(); foreach (var poss in m_rgRelationTypes) { var lrt = (ILexRefType)poss; var gsc = new GuidAndSubClass(lrt.Guid, LexReferenceInfo.TypeSubClass.Normal); if (lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryAsymmetricPair || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryOrSenseAsymmetricPair || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtSenseAsymmetricPair || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryTree || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtEntryOrSenseTree || lrt.MappingType == (int)LexRefTypeTags.MappingTypes.kmtSenseTree) { gsc.SubClass = LexReferenceInfo.TypeSubClass.Forward; } mapGuidType.Add(gsc, lrt); if (gsc.SubClass == LexReferenceInfo.TypeSubClass.Forward) { var gsc2 = new GuidAndSubClass(lrt.Guid, LexReferenceInfo.TypeSubClass.Reverse); mapGuidType.Add(gsc2, lrt); } } var obsoleteItems = ltn.RelTypeList.Where( lri => !mapGuidType.ContainsKey(new GuidAndSubClass(lri.ItemGuid, lri.SubClass))).ToList(); foreach (var lri in obsoleteItems) ltn.RelTypeList.Remove(lri); // Add the names to the items in the ordered list. foreach (var lri in ltn.RelTypeList) { var lrt = mapGuidType[new GuidAndSubClass(lri.ItemGuid, lri.SubClass)]; if (lri.SubClass == LexReferenceInfo.TypeSubClass.Reverse) lri.Name = lrt.ReverseName.BestAnalysisVernacularAlternative.Text; else lri.Name = lrt.Name.BestAnalysisVernacularAlternative.Text; } }
internal GuidAndSubClass(Guid guid, LexReferenceInfo.TypeSubClass sub) { ItemGuid = guid; SubClass = sub; }