void link_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { RuleInsertType type = (RuleInsertType)e.Link.LinkData; string optStr = GetOptionString(type); var undo = string.Format(MEStrings.ksRuleUndoInsert, optStr); var redo = string.Format(MEStrings.ksRuleRedoInsert, optStr); object data = null; switch (type) { case RuleInsertType.PHONEME: var phonemes = m_cache.LangProject.PhonologicalDataOA.PhonemeSetsOS[0].PhonemesOC.Cast <ICmObject>(); data = DisplayChooser(MEStrings.ksRulePhonemeOpt, MEStrings.ksRulePhonemeChooserLink, "phonemeEdit", "RulePhonemeFlatList", phonemes); break; case RuleInsertType.NATURAL_CLASS: var natClasses = m_cache.LangProject.PhonologicalDataOA.NaturalClassesOS.Cast <ICmObject>(); data = DisplayChooser(MEStrings.ksRuleNCOpt, MEStrings.ksRuleNCChooserLink, "naturalClassedit", "RuleNaturalClassFlatList", natClasses); break; case RuleInsertType.FEATURES: using (var featChooser = new PhonologicalFeatureChooserDlg()) { featChooser.SetDlgInfo(m_cache, m_mediator); if (this.Parent is SIL.FieldWorks.XWorks.MorphologyEditor.RegRuleFormulaControl) { featChooser.SetHelpTopic("khtpChoose-Grammar-PhonFeats-RegRuleFormulaControl"); } else if (this.Parent is SIL.FieldWorks.XWorks.MorphologyEditor.MetaRuleFormulaControl) { featChooser.SetHelpTopic("khtpChoose-Grammar-PhonFeats-MetaRuleFormulaControl"); } else if (this.Parent is SIL.FieldWorks.XWorks.MorphologyEditor.AffixRuleFormulaControl) { featChooser.SetHelpTopic("khtpChoose-LexiconEdit-PhonFeats-AffixRuleFormulaControl"); } DialogResult res = featChooser.ShowDialog(); if (res == DialogResult.OK) { UndoableUnitOfWorkHelper.Do(undo, redo, m_cache.ActionHandlerAccessor, () => { var featNC = m_cache.ServiceLocator.GetInstance <IPhNCFeaturesFactory>().Create(); m_cache.LangProject.PhonologicalDataOA.NaturalClassesOS.Add(featNC); featNC.Name.SetUserWritingSystem(string.Format(MEStrings.ksRuleNCFeatsName, m_ruleName)); featNC.FeaturesOA = m_cache.ServiceLocator.GetInstance <IFsFeatStrucFactory>().Create(); featChooser.FS = featNC.FeaturesOA; featChooser.UpdateFeatureStructure(); data = featNC; }); } else if (res != DialogResult.Cancel) { featChooser.HandleJump(); } } break; case RuleInsertType.WORD_BOUNDARY: data = m_cache.ServiceLocator.GetInstance <IPhBdryMarkerRepository>().GetObject(LangProjectTags.kguidPhRuleWordBdry); break; case RuleInsertType.MORPHEME_BOUNDARY: data = m_cache.ServiceLocator.GetInstance <IPhBdryMarkerRepository>().GetObject(LangProjectTags.kguidPhRuleMorphBdry); break; case RuleInsertType.INDEX: // put the clicked index in the data field data = (int)e.Link.Tag; break; } // Some cases will do nothing (and so make an empty UOW) if data is empty. However, other cases // (such as inserting X Variable, LT-11136) need the event even if data is empty, and the empty UOW // is discarded harmlessly. Insert(this, new RuleInsertEventArgs(type, data, undo, redo)); }
/// <summary> /// Handles the Insert event of the m_insertionControl control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="InsertEventArgs"/> instance containing the event data.</param> private void m_insertionControl_Insert(object sender, InsertEventArgs e) { var option = (InsertOption) e.Option; var undo = string.Format(MEStrings.ksRuleUndoInsert, option); var redo = string.Format(MEStrings.ksRuleRedoInsert, option); SelectionHelper sel = SelectionHelper.Create(m_view); int cellId = -1; int cellIndex = -1; switch (option.Type) { case RuleInsertType.Phoneme: IEnumerable<IPhPhoneme> phonemes = m_cache.LangProject.PhonologicalDataOA.PhonemeSetsOS[0].PhonemesOC.OrderBy(ph => ph.ShortName); ICmObject phonemeObj = DisplayChooser(MEStrings.ksRulePhonemeOpt, MEStrings.ksRulePhonemeChooserLink, "phonemeEdit", "RulePhonemeFlatList", phonemes); var phoneme = phonemeObj as IPhPhoneme; if (phoneme == null) return; UndoableUnitOfWorkHelper.Do(undo, redo, m_cache.ActionHandlerAccessor, () => { cellId = InsertPhoneme(phoneme, sel, out cellIndex); }); break; case RuleInsertType.NaturalClass: IEnumerable<IPhNaturalClass> natClasses = m_cache.LangProject.PhonologicalDataOA.NaturalClassesOS.OrderBy(natc => natc.ShortName); ICmObject ncObj = DisplayChooser(MEStrings.ksRuleNCOpt, MEStrings.ksRuleNCChooserLink, "naturalClassedit", "RuleNaturalClassFlatList", natClasses); var nc = ncObj as IPhNaturalClass; if (nc == null) return; UndoableUnitOfWorkHelper.Do(undo, redo, m_cache.ActionHandlerAccessor, () => { cellId = InsertNC(nc, sel, out cellIndex); }); break; case RuleInsertType.Features: using (var featChooser = new PhonologicalFeatureChooserDlg()) { SetupPhonologicalFeatureChoooserDlg(featChooser); featChooser.SetHelpTopic(FeatureChooserHelpTopic); DialogResult res = featChooser.ShowDialog(); if (res == DialogResult.OK) { UndoableUnitOfWorkHelper.Do(undo, redo, m_cache.ActionHandlerAccessor, () => { IPhNCFeatures featNC = m_cache.ServiceLocator.GetInstance<IPhNCFeaturesFactory>().Create(); m_cache.LangProject.PhonologicalDataOA.NaturalClassesOS.Add(featNC); featNC.Name.SetUserWritingSystem(string.Format(MEStrings.ksRuleNCFeatsName, RuleName)); featNC.FeaturesOA = m_cache.ServiceLocator.GetInstance<IFsFeatStrucFactory>().Create(); IPhSimpleContextNC ctxt; cellId = InsertNC(featNC, sel, out cellIndex, out ctxt); featChooser.Context = ctxt; featChooser.UpdateFeatureStructure(); }); } else if (res != DialogResult.Cancel) { featChooser.HandleJump(); } } break; case RuleInsertType.WordBoundary: IPhBdryMarker wordBdry = m_cache.ServiceLocator.GetInstance<IPhBdryMarkerRepository>().GetObject(LangProjectTags.kguidPhRuleWordBdry); UndoableUnitOfWorkHelper.Do(undo, redo, m_cache.ActionHandlerAccessor, () => { cellId = InsertBdry(wordBdry, sel, out cellIndex); }); break; case RuleInsertType.MorphemeBoundary: IPhBdryMarker morphBdry = m_cache.ServiceLocator.GetInstance<IPhBdryMarkerRepository>().GetObject(LangProjectTags.kguidPhRuleMorphBdry); UndoableUnitOfWorkHelper.Do(undo, redo, m_cache.ActionHandlerAccessor, () => { cellId = InsertBdry(morphBdry, sel, out cellIndex); }); break; case RuleInsertType.Index: // put the clicked index in the data field UndoableUnitOfWorkHelper.Do(undo, redo, m_cache.ActionHandlerAccessor, () => { cellId = InsertIndex((int) e.Suboption, sel, out cellIndex); }); break; case RuleInsertType.Column: UndoableUnitOfWorkHelper.Do(undo, redo, m_cache.ActionHandlerAccessor, () => { cellId = InsertColumn(sel); }); break; case RuleInsertType.Variable: UndoableUnitOfWorkHelper.Do(undo, redo, m_cache.ActionHandlerAccessor, () => { cellId = InsertVariable(sel, out cellIndex); }); break; } m_view.Select(); if (cellId != -1) { // reconstruct the view and place the cursor after the newly added item ReconstructView(cellId, cellIndex, false); } }
void link_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { RuleInsertType type = (RuleInsertType)e.Link.LinkData; string optStr = GetOptionString(type); using (new UndoRedoTaskHelper(m_cache, string.Format(MEStrings.ksRuleUndoInsert, optStr), string.Format(MEStrings.ksRuleRedoInsert, optStr))) { int data = -1; switch (type) { case RuleInsertType.PHONEME: Set <int> phonemes = new Set <int>(m_cache.LangProject.PhonologicalDataOA.PhonemeSetsOS[0].PhonemesOC.HvoArray); int phonemeHvo = DisplayChooser(MEStrings.ksRulePhonemeOpt, MEStrings.ksRulePhonemeChooserLink, "phonemeEdit", "RulePhonemeFlatList", phonemes); if (phonemeHvo != 0) { data = phonemeHvo; } break; case RuleInsertType.NATURAL_CLASS: Set <int> natClasses = new Set <int>(m_cache.LangProject.PhonologicalDataOA.NaturalClassesOS.HvoArray); int ncHvo = DisplayChooser(MEStrings.ksRuleNCOpt, MEStrings.ksRuleNCChooserLink, "naturalClassedit", "RuleNaturalClassFlatList", natClasses); if (ncHvo != 0) { data = ncHvo; } break; case RuleInsertType.FEATURES: using (PhonologicalFeatureChooserDlg featChooser = new PhonologicalFeatureChooserDlg()) { featChooser.SetDlgInfo(m_cache, m_mediator); if (this.Parent is SIL.FieldWorks.XWorks.MorphologyEditor.RegRuleFormulaControl) { featChooser.SetHelpTopic("khtpChoose-Grammar-PhonFeats-RegRuleFormulaControl"); } else if (this.Parent is SIL.FieldWorks.XWorks.MorphologyEditor.MetaRuleFormulaControl) { featChooser.SetHelpTopic("khtpChoose-Grammar-PhonFeats-MetaRuleFormulaControl"); } else if (this.Parent is SIL.FieldWorks.XWorks.MorphologyEditor.AffixRuleFormulaControl) { featChooser.SetHelpTopic("khtpChoose-LexiconEdit-PhonFeats-AffixRuleFormulaControl"); } DialogResult res = featChooser.ShowDialog(); if (res == DialogResult.OK) { PhNCFeatures featNC = new PhNCFeatures(); m_cache.LangProject.PhonologicalDataOA.NaturalClassesOS.Append(featNC); featNC.Name.UserDefaultWritingSystem = string.Format(MEStrings.ksRuleNCFeatsName, m_ruleName); featNC.FeaturesOA = new FsFeatStruc(); featChooser.FS = featNC.FeaturesOA; featChooser.UpdateFeatureStructure(); featNC.FeaturesOA.NotifyNew(); featNC.NotifyNew(); data = featNC.Hvo; } else if (res != DialogResult.Cancel) { featChooser.HandleJump(); } } break; case RuleInsertType.WORD_BOUNDARY: data = m_cache.GetIdFromGuid(LangProject.kguidPhRuleWordBdry); break; case RuleInsertType.MORPHEME_BOUNDARY: data = m_cache.GetIdFromGuid(LangProject.kguidPhRuleMorphBdry); break; case RuleInsertType.INDEX: // put the clicked index in the data field data = (int)e.Link.Tag; break; default: data = 0; break; } Insert(this, new RuleInsertEventArgs(type, data)); } }
public void SetMappingFeatures() { SelectionHelper sel = SelectionHelper.Create(m_view); bool reconstruct = false; int index = -1; using (new UndoRedoTaskHelper(m_cache, MEStrings.ksAffixRuleUndoSetMappingFeatures, MEStrings.ksAffixRuleRedoSetMappingFeatures)) { using (PhonologicalFeatureChooserDlg featChooser = new PhonologicalFeatureChooserDlg()) { int hvo = CurrentHvo; switch (m_cache.GetClassOfObject(hvo)) { case MoCopyFromInput.kclsidMoCopyFromInput: featChooser.SetDlgInfo(m_cache, m_mediator); if (featChooser.ShowDialog() == DialogResult.OK) { // create a new natural class behind the scenes PhNCFeatures featNC = new PhNCFeatures(); m_cache.LangProject.PhonologicalDataOA.NaturalClassesOS.Append(featNC); featNC.Name.UserDefaultWritingSystem = string.Format(MEStrings.ksRuleNCFeatsName, Rule.Form.BestVernacularAnalysisAlternative.Text); featNC.FeaturesOA = new FsFeatStruc(); featChooser.FS = featNC.FeaturesOA; featChooser.UpdateFeatureStructure(); featNC.FeaturesOA.NotifyNew(); featNC.NotifyNew(); IMoCopyFromInput copy = new MoCopyFromInput(m_cache, hvo); IMoModifyFromInput newModify = new MoModifyFromInput(); Rule.OutputOS.InsertAt(newModify, copy.IndexInOwner); newModify.ModificationRAHvo = featNC.Hvo; newModify.ContentRAHvo = copy.ContentRAHvo; index = newModify.IndexInOwner; newModify.NotifyNew(); copy.DeleteUnderlyingObject(); reconstruct = true; } break; case MoModifyFromInput.kclsidMoModifyFromInput: IMoModifyFromInput modify = new MoModifyFromInput(m_cache, hvo); featChooser.SetDlgInfo(m_cache, m_mediator, modify.ModificationRA.FeaturesOA); if (featChooser.ShowDialog() == DialogResult.OK) { if (modify.ModificationRA.FeaturesOA.FeatureSpecsOC.Count == 0) { IMoCopyFromInput newCopy = new MoCopyFromInput(); Rule.OutputOS.InsertAt(newCopy, modify.IndexInOwner); newCopy.ContentRAHvo = modify.ContentRAHvo; index = newCopy.IndexInOwner; newCopy.NotifyNew(); modify.DeleteUnderlyingObject(); } else { index = modify.IndexInOwner; } reconstruct = true; } break; } } } m_view.Select(); if (reconstruct) ReconstructView((int)MoAffixProcess.MoAffixProcessTags.kflidOutput, index, true); }