/// <summary> /// Change the affix to a stem (possibly) /// </summary> /// <param name="entry"></param> /// <param name="selectedHvo"></param> /// <param name="sUndo"></param> /// <param name="sRedo"></param> /// <returns>true if change made; false otherwise</returns> private bool ChangeAffixToStem(ILexEntry entry, int selectedHvo, string sUndo, string sRedo) { IMoAffixForm affix = m_obj as IMoAffixForm; if (affix == null) { throw new ApplicationException("Affix form is not defined"); } List <IMoMorphSynAnalysis> rgmsaOld = new List <IMoMorphSynAnalysis>(); if (m_obj.OwningFlid == (int)LexEntry.LexEntryTags.kflidLexemeForm) { foreach (IMoMorphSynAnalysis msa in entry.MorphoSyntaxAnalysesOC) { if (!(msa is IMoStemMsa)) { rgmsaOld.Add(msa); } } } if (CheckForAffixDataLoss(affix, rgmsaOld)) { return(false); } FdoCache cache = m_cache; cache.BeginUndoTask(sUndo, sRedo); IMoStemAllomorph stem = new MoStemAllomorph(); SwapValues(entry, affix, stem, selectedHvo, rgmsaOld); // may cause slice/button to be disposed... cache.EndUndoTask(); return(true); }
protected void CreateMorphInflectionClassesXmlElement(XmlDocument doc, XmlNode node, XmlNode morphNode) { XmlNode attr; attr = node.SelectSingleNode("@alloid"); if (attr != null) { XmlNode alloid = node.Attributes.GetNamedItem("alloid"); int hvo = Convert.ToInt32(alloid.InnerText); ICmObject obj = CmObject.CreateFromDBObject(m_cache, hvo); IMoAffixForm form = obj as IMoAffixForm; // only for affix forms if (form != null) { if (form.InflectionClassesRC.Count > 0) { XmlNode inflClasses = CreateXmlElement(doc, "inflClasses", morphNode); FdoReferenceCollection <IMoInflClass> inflectionClasses = form.InflectionClassesRC; CreateInflectionClassesAndSubclassesXmlElement(doc, inflectionClasses, inflClasses); } } } }
private bool CheckForAffixDataLoss(IMoAffixForm affix, List <IMoMorphSynAnalysis> rgmsaAffix) { bool fLoseInflCls = affix.InflectionClassesRC.Count > 0; bool fLoseInfixLoc = false; bool fLoseGramInfo = false; bool fLoseRule = false; switch (affix.ClassID) { case MoAffixProcessTags.kClassId: fLoseRule = true; break; case MoAffixAllomorphTags.kClassId: var allo = (IMoAffixAllomorph)affix; fLoseInfixLoc = allo.PositionRS.Count > 0; fLoseGramInfo = allo.MsEnvPartOfSpeechRA != null || allo.MsEnvFeaturesOA != null; break; } for (int i = 0; !fLoseGramInfo && i < rgmsaAffix.Count; ++i) { var msaInfl = rgmsaAffix[i] as IMoInflAffMsa; if (msaInfl != null) { if (msaInfl.AffixCategoryRA != null || msaInfl.FromProdRestrictRC.Count > 0 || msaInfl.SlotsRC.Count > 0 || msaInfl.InflFeatsOA != null) { fLoseGramInfo = true; } continue; } var msaDeriv = rgmsaAffix[i] as IMoDerivAffMsa; if (msaDeriv != null) { if (msaDeriv.AffixCategoryRA != null || msaDeriv.FromInflectionClassRA != null || msaDeriv.FromPartOfSpeechRA != null || msaDeriv.FromProdRestrictRC.Count > 0 || msaDeriv.FromStemNameRA != null || msaDeriv.StratumRA != null || msaDeriv.ToInflectionClassRA != null || msaDeriv.ToProdRestrictRC.Count > 0 || msaDeriv.FromMsFeaturesOA != null || msaDeriv.ToMsFeaturesOA != null) { fLoseGramInfo = true; } continue; } var msaStep = rgmsaAffix[i] as IMoDerivStepMsa; if (msaStep != null) { if (msaStep.InflectionClassRA != null || msaStep.ProdRestrictRC.Count > 0 || msaStep.InflFeatsOA != null || msaStep.MsFeaturesOA != null) { fLoseGramInfo = true; } } } if (fLoseInflCls || fLoseInfixLoc || fLoseGramInfo || fLoseRule) { string sMsg; if (fLoseInflCls && fLoseInfixLoc && fLoseGramInfo) { sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseInflClsInfixLocGramInfo", m_ksPath); } else if (fLoseRule && fLoseInflCls && fLoseGramInfo) { sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseRuleInflClsGramInfo", m_ksPath); } else if (fLoseInflCls && fLoseInfixLoc) { sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseInflClsInfixLoc", m_ksPath); } else if (fLoseInflCls && fLoseGramInfo) { sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseInflClsGramInfo", m_ksPath); } else if (fLoseInfixLoc && fLoseGramInfo) { sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseInfixLocGramInfo", m_ksPath); } else if (fLoseRule && fLoseInflCls) { sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseRuleInflCls", m_ksPath); } else if (fLoseRule) { sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseRule", m_ksPath); } else if (fLoseInflCls) { sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseInflCls", m_ksPath); } else if (fLoseInfixLoc) { sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseInfixLoc", m_ksPath); } else { sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseGramInfo", m_ksPath); } string sCaption = m_mediator.StringTbl.GetStringWithXPath("ChangeLexemeMorphTypeCaption", m_ksPath); DialogResult result = MessageBox.Show(sMsg, sCaption, MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (result == DialogResult.No) { return(true); } } return(false); }
private bool CheckForAffixDataLoss(IMoAffixForm affix, List<IMoMorphSynAnalysis> rgmsaAffix) { bool fLoseInflCls = affix.InflectionClassesRC.Count > 0; bool fLoseInfixLoc = false; bool fLoseGramInfo = false; bool fLoseRule = false; switch (affix.ClassID) { case MoAffixProcessTags.kClassId: fLoseRule = true; break; case MoAffixAllomorphTags.kClassId: var allo = (IMoAffixAllomorph) affix; fLoseInfixLoc = allo.PositionRS.Count > 0; fLoseGramInfo = allo.MsEnvPartOfSpeechRA != null || allo.MsEnvFeaturesOA != null; break; } for (int i = 0; !fLoseGramInfo && i < rgmsaAffix.Count; ++i) { var msaInfl = rgmsaAffix[i] as IMoInflAffMsa; if (msaInfl != null) { if (msaInfl.AffixCategoryRA != null || msaInfl.FromProdRestrictRC.Count > 0 || msaInfl.SlotsRC.Count > 0 || msaInfl.InflFeatsOA != null) { fLoseGramInfo = true; } continue; } var msaDeriv = rgmsaAffix[i] as IMoDerivAffMsa; if (msaDeriv != null) { if (msaDeriv.AffixCategoryRA != null || msaDeriv.FromInflectionClassRA != null || msaDeriv.FromPartOfSpeechRA != null || msaDeriv.FromProdRestrictRC.Count > 0 || msaDeriv.FromStemNameRA != null || msaDeriv.StratumRA != null || msaDeriv.ToInflectionClassRA != null || msaDeriv.ToProdRestrictRC.Count > 0 || msaDeriv.FromMsFeaturesOA != null || msaDeriv.ToMsFeaturesOA != null) { fLoseGramInfo = true; } continue; } var msaStep = rgmsaAffix[i] as IMoDerivStepMsa; if (msaStep != null) { if (msaStep.InflectionClassRA != null || msaStep.ProdRestrictRC.Count > 0 || msaStep.InflFeatsOA != null || msaStep.MsFeaturesOA != null) { fLoseGramInfo = true; } } } if (fLoseInflCls || fLoseInfixLoc || fLoseGramInfo || fLoseRule) { string sMsg; if (fLoseInflCls && fLoseInfixLoc && fLoseGramInfo) sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseInflClsInfixLocGramInfo", m_ksPath); else if (fLoseRule && fLoseInflCls && fLoseGramInfo) sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseRuleInflClsGramInfo", m_ksPath); else if (fLoseInflCls && fLoseInfixLoc) sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseInflClsInfixLoc", m_ksPath); else if (fLoseInflCls && fLoseGramInfo) sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseInflClsGramInfo", m_ksPath); else if (fLoseInfixLoc && fLoseGramInfo) sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseInfixLocGramInfo", m_ksPath); else if (fLoseRule && fLoseInflCls) sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseRuleInflCls", m_ksPath); else if (fLoseRule) sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseRule", m_ksPath); else if (fLoseInflCls) sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseInflCls", m_ksPath); else if (fLoseInfixLoc) sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseInfixLoc", m_ksPath); else sMsg = m_mediator.StringTbl.GetStringWithXPath("ChangeMorphTypeLoseGramInfo", m_ksPath); string sCaption = m_mediator.StringTbl.GetStringWithXPath("ChangeLexemeMorphTypeCaption", m_ksPath); DialogResult result = MessageBox.Show(sMsg, sCaption, MessageBoxButtons.YesNo, MessageBoxIcon.Warning); if (result == DialogResult.No) { return true; } } return false; }