/// -----------------------------------------------------------------------------------
        /// <summary>
        /// Focus got set to the draft view
        /// </summary>
        /// <param name="e">The event data</param>
        /// -----------------------------------------------------------------------------------
        protected override void OnGotFocus(EventArgs e)
        {
            base.OnGotFocus(e);

            // Supposedly, m_ftMonitor should always be null, since it only gets set in OnGetFocus
            // and it gets cleared in OnLostFocus. However there have been odd cases. If we're already
            // tracking a change we don't want to lose it.
            // Enhance JohnT: we don't really need this unless we're doing segment BTs.
            if (m_ftMonitor == null)
            {
                m_ftMonitor = new FreeTransEditMonitor(Cache, BackTranslationWS);
                // Unfortunately, when the main window closes, both our Dispose() method and our OnLostFocus() method
                // get called during the Dispose() of the main window, which is AFTER the FdoCache gets disposed.
                // We need to dispose our FreeTransEditMonitor before the cache is disposed, so we can update the
                // CmTranslation if necessary.
                if (TopLevelControl is Form)
                {
                    (TopLevelControl as Form).FormClosing += new FormClosingEventHandler(FormClosing);
                }
            }
            if (m_cmtMonitor == null)
            {
                m_cmtMonitor = new CmTranslationEditMonitor(Cache, BackTranslationWS);
                // Unfortunately, when the main window closes, both our Dispose() method and our OnLostFocus() method
                // get called during the Dispose() of the main window, which is AFTER the FdoCache gets disposed.
                // We need to dispose our FreeTransEditMonitor before the cache is disposed, so we can update the
                // CmTranslation if necessary.
                if (TopLevelControl is Form)
                {
                    (TopLevelControl as Form).FormClosing += new FormClosingEventHandler(FormClosing);
                }
            }
        }
        public void CreateAndUpdateSingleFt()
        {
            string paraContents = "Das buch ist rot";
            string trans        = "The book is red";

            m_para.Contents.UnderlyingTsString = m_tsf.MakeString(paraContents, m_wsVern);
            ICmIndirectAnnotation ft      = MakeFt(m_para, trans, 0, paraContents.Length);
            FreeTransEditMonitor  monitor = new FreeTransEditMonitor(Cache, m_wsTrans);            // BEFORE propChanged!

            Cache.PropChanged(ft.Hvo, (int)CmAnnotation.CmAnnotationTags.kflidComment, 0, 0, 0);
            monitor.LoseFocus();
            Assert.AreEqual(1, m_para.TranslationsOC.Count, "monitor should have made a CmTranslation");
            Assert.AreEqual(trans, m_para.TranslationsOC.ToList()[0].Translation.GetAlternative(m_wsTrans).Text);
            string trans2 = "The book is green";

            ft.Comment.SetAlternative(trans2, m_wsTrans);
            monitor.Dispose();             // should trigger update.
            Assert.AreEqual(1, m_para.TranslationsOC.Count, "monitor should not have made another translation");
            Assert.AreEqual(trans2, m_para.TranslationsOC.ToList()[0].Translation.GetAlternative(m_wsTrans).Text);
        }
        public void NonScriptureText()
        {
            IText text = new Text();

            Cache.LangProject.TextsOC.Add(text);
            StText sttext = new StText();

            text.ContentsOA = sttext;
            m_para          = new StTxtPara();
            sttext.ParagraphsOS.Append(m_para);
            string paraContents = "Das buch ist rot";
            string trans        = "The book is red";

            m_para.Contents.UnderlyingTsString = m_tsf.MakeString(paraContents, m_wsVern);
            ICmIndirectAnnotation ft      = MakeFt(m_para, trans, 0, paraContents.Length);
            FreeTransEditMonitor  monitor = new FreeTransEditMonitor(Cache, m_wsTrans);            // BEFORE propChanged!

            Cache.PropChanged(ft.Hvo, (int)CmAnnotation.CmAnnotationTags.kflidComment, 0, 0, 0);
            monitor.LoseFocus();
            Assert.AreEqual(0, m_para.TranslationsOC.Count, "monitor should not make CmTranslation for non-Scripture");
        }
 private void DisposeFtMonitor()
 {
     if (m_ftMonitor != null)
     {
         if (TopLevelControl is Form)
         {
             (TopLevelControl as Form).FormClosing -= new FormClosingEventHandler(FormClosing);
         }
         m_ftMonitor.Dispose();
         m_ftMonitor = null;
     }
     if (m_cmtMonitor != null)
     {
         if (TopLevelControl is Form)
         {
             (TopLevelControl as Form).FormClosing -= new FormClosingEventHandler(FormClosing);
         }
         m_cmtMonitor.Dispose();
         m_cmtMonitor = null;
     }
 }
        public void CreateAndUpdateOneOfTwoFts()
        {
            string pc1    = "Das buch ist rot. ";
            string pc2    = "Das Madchen ist shon.";
            string verse1 = "9";

            m_para.Contents.UnderlyingTsString = m_tsf.MakeString(pc1 + verse1 + pc2, m_wsVern);
            string trans1                  = "The book is red.";
            string trans2                  = "The girl is beautiful";
            ICmIndirectAnnotation ft       = MakeFt(m_para, trans1, 0, pc1.Length);
            ICmBaseAnnotation     verseSeg = MakeVerseSegment(m_para, pc1.Length, verse1.Length);
            ICmIndirectAnnotation ft2      = MakeFt(m_para, trans2, pc1.Length + verse1.Length, pc2.Length);
            FreeTransEditMonitor  monitor  = new FreeTransEditMonitor(Cache, m_wsTrans);           // BEFORE propChanged!

            Cache.PropChanged(ft.Hvo, (int)CmAnnotation.CmAnnotationTags.kflidComment, 0, 0, 0);
            Cache.PropChanged(ft.Hvo, (int)CmAnnotation.CmAnnotationTags.kflidComment, 0, 0, 0);
            Assert.AreEqual(0, m_para.TranslationsOC.Count, "monitor should not have updated for change to same ft.");

            Cache.PropChanged(ft2.Hvo, (int)CmAnnotation.CmAnnotationTags.kflidComment, 0, 0, 0);

            Assert.AreEqual(1, m_para.TranslationsOC.Count, "monitor should have updated on changing another property");
            Assert.AreEqual(trans1 + " " + verse1 + trans2,
                            m_para.TranslationsOC.ToList()[0].Translation.GetAlternative(m_wsTrans).Text,
                            "translation should be correct after changing prop2");

            string trans2b = "The girl is pretty.";

            ft2.Comment.SetAlternative(trans2b, m_wsTrans);             // should generate propChanged for same prop.
            Assert.AreEqual(trans1 + " " + verse1 + trans2,
                            m_para.TranslationsOC.ToList()[0].Translation.GetAlternative(m_wsTrans).Text,
                            "Another change to same prop should not produce yet another update");
            monitor.Dispose();
            Assert.AreEqual(trans1 + " " + verse1 + trans2b,
                            m_para.TranslationsOC.ToList()[0].Translation.GetAlternative(m_wsTrans).Text,
                            "Should get final update on Dispose");
        }