Example #1
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// A helper method for book merger tests-
        /// Verifies the contents of the given sub-difference
        /// for a two-sided subDiff representing a text comparison. This overload does not
        /// check for the starting and ending references for sub-diffs that are created without
        /// that information.
        /// </summary>
        /// <param name="rootDiff">The root difference.</param>
        /// <param name="iSubDiff">The sub difference to verify.</param>
        /// <param name="subDiffType">Type of the sub difference.</param>
        /// <param name="footnoteCurr">The footnote curr.</param>
        /// <param name="ichMinCurr">The beginning character offset of the difference in the
        /// current.</param>
        /// <param name="ichLimCurr">The ending character offset of the difference in the
        /// current.</param>
        /// <param name="footnoteRev">The footnote rev.</param>
        /// <param name="ichMinRev">The beginning character offset of the difference in the
        /// revision.</param>
        /// <param name="ichLimRev">The ending character offset of the difference in the
        /// current.</param>
        /// <remarks>char styles are not verified here; test code should just check
        /// those directly if relevant</remarks>
        /// ------------------------------------------------------------------------------------
        public static void VerifySubDiffFootnote(Difference rootDiff, int iSubDiff,
                                                 DifferenceType subDiffType,
                                                 IScrFootnote footnoteCurr, int ichMinCurr, int ichLimCurr,
                                                 IScrFootnote footnoteRev, int ichMinRev, int ichLimRev)
        {
            Difference subDiff = rootDiff.SubDiffsForORCs[iSubDiff];

            // the Current para stuff
            Assert.AreEqual((footnoteCurr != null) ? footnoteCurr.ParagraphsOS[0] : null, subDiff.ParaCurr);
            Assert.AreEqual(ichMinCurr, subDiff.IchMinCurr);
            Assert.AreEqual(ichLimCurr, subDiff.IchLimCurr);

            // the Revision para stuff
            Assert.AreEqual((footnoteRev != null) ? footnoteRev.ParagraphsOS[0] : null, subDiff.ParaRev);
            Assert.AreEqual(ichMinRev, subDiff.IchMinRev);
            Assert.AreEqual(ichLimRev, subDiff.IchLimRev);

            // section stuff should be null
            Assert.IsNull(subDiff.SectionsRev);
            Assert.IsNull(subDiff.SectionsCurr);

            // subDiffs may not have subDiffs, so far
            Assert.IsNull(subDiff.SubDiffsForORCs);
            Assert.IsNull(subDiff.SubDiffsForParas);

            Assert.AreEqual(subDiffType, subDiff.DiffType);
        }
        /// ------------------------------------------------------------------------------------
        /// <summary>
        ///
        /// </summary>
        /// ------------------------------------------------------------------------------------
        protected override void CreateTestData()
        {
            ITsStrFactory strfact = TsStrFactoryClass.Create();

            //Jude
            IScrBook jude = AddBookToMockedScripture(65, "Jude");

            AddTitleToMockedBook(jude, "Jude");

            // Jude Scripture section
            IScrSection section = AddSectionToMockedBook(jude);

            AddSectionHeadParaToSection(section, "First section", "Section Head");
            IStTxtPara judePara = AddParaToMockedSectionContent(section, "Paragraph");

            AddRunToMockedPara(judePara, "1", ScrStyleNames.ChapterNumber);
            AddRunToMockedPara(judePara, "1", ScrStyleNames.VerseNumber);
            AddRunToMockedPara(judePara, "This is the first verse", null);

            // Insert footnote into para 1 of Jude
            ITsStrBldr   bldr     = judePara.Contents.GetBldr();
            IScrFootnote foot     = jude.InsertFootnoteAt(0, bldr, 10);
            IScrTxtPara  footPara = Cache.ServiceLocator.GetInstance <IScrTxtParaFactory>().CreateWithStyle(
                foot, ScrStyleNames.NormalFootnoteParagraph);

            footPara.Contents = strfact.MakeString("This is text for the footnote.", Cache.DefaultVernWs);
            judePara.Contents = bldr.GetString();
        }
Example #3
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// A helper method for book merger tests-
        /// Verifies the contents of the given difference
        /// for a one-sided subDiff representing a footnote in the Revision.
        /// </summary>
        /// ------------------------------------------------------------------------------------
        public static void VerifySubDiffFootnoteRev(Difference rootDiff, int iSubDiff,
                                                    IScrFootnote footnoteRev)
        {
            Difference subDiff = rootDiff.SubDiffsForORCs[iSubDiff];

            // verify the basics
            Assert.AreEqual(0, subDiff.RefStart);
            Assert.AreEqual(0, subDiff.RefEnd);
            Assert.AreEqual(DifferenceType.NoDifference, subDiff.DiffType);

            // the Current para stuff
            Assert.AreEqual(null, subDiff.ParaCurr);
            Assert.AreEqual(0, subDiff.IchMinCurr);
            Assert.AreEqual(0, subDiff.IchLimCurr);

            // the Revision para stuff
            Assert.AreEqual(((IScrTxtPara)footnoteRev.ParagraphsOS[0]), subDiff.ParaRev);
            Assert.AreEqual(0, subDiff.IchMinRev);
            Assert.AreEqual(((IScrTxtPara)footnoteRev.ParagraphsOS[0]).Contents.Length, subDiff.IchLimRev);

            // style names should be null
            Assert.IsNull(subDiff.StyleNameCurr);
            Assert.IsNull(subDiff.StyleNameRev);

            // section stuff should be null
            Assert.IsNull(subDiff.SectionsRev);
            Assert.IsNull(subDiff.SectionsCurr);

            // subDiffs may not have subDiffs, so far
            Assert.IsNull(subDiff.SubDiffsForORCs);

            //check the root difference for consistency with this subDiff
            Assert.IsTrue(rootDiff.DiffType == DifferenceType.TextDifference ||
                          rootDiff.DiffType == DifferenceType.FootnoteMissingInCurrent);
        }
        public void DeleteFootnoteWithoutORC()
        {
            IScrBook book = (IScrBook)m_scr.ScriptureBooksOS[0];
            int      originalFootnoteCount = book.FootnotesOS.Count;
            // Insert a new footnote into the collection and view
            IScrFootnote footnote = Cache.ServiceLocator.GetInstance <IScrFootnoteFactory>().Create();

            book.FootnotesOS.Insert(0, footnote);

            IScrTxtPara para = Cache.ServiceLocator.GetInstance <IScrTxtParaFactory>().CreateWithStyle(
                footnote, ScrStyleNames.CrossRefFootnoteParagraph);

            para.Contents = TsStringHelper.MakeTSS("My footnote", Cache.DefaultVernWs);
            m_footnoteView.RefreshDisplay();
            MakeFootnoteSelection(0, 0, 0);

            // verify that a footnote was added to the collection
            Assert.AreEqual(originalFootnoteCount + 1, book.FootnotesOS.Count);

            m_footnoteView.DeleteFootnote();

            // verify that the footnote was deleted
            Assert.AreEqual(originalFootnoteCount, book.FootnotesOS.Count);
            Assert.IsFalse(footnote.IsValidObject);
        }
        public void DeleteFootnoteFromContextMenuRangeSelection()
        {
            SelectionHelper selHelper = new SelectionHelper();

            selHelper.AssocPrev      = true;
            selHelper.NumberOfLevels = 3;

            SelLevInfo[] anchorLevInfo = new SelLevInfo[3];
            anchorLevInfo[2].tag  = m_footnoteView.BookFilter.Tag;
            anchorLevInfo[2].ihvo = 1;
            anchorLevInfo[1].tag  = ScrBookTags.kflidFootnotes;
            anchorLevInfo[1].ihvo = 2;
            anchorLevInfo[0].tag  = StTextTags.kflidParagraphs;
            anchorLevInfo[0].ihvo = 0;
            selHelper.SetLevelInfo(SelectionHelper.SelLimitType.Anchor, anchorLevInfo);
            selHelper.IchAnchor = 1;
            selHelper.SetTextPropId(SelectionHelper.SelLimitType.Anchor, StTxtParaTags.kflidContents);

            SelLevInfo[] endLevInfo = new SelLevInfo[3];
            endLevInfo[2].tag  = m_footnoteView.BookFilter.Tag;
            endLevInfo[2].ihvo = 1;
            endLevInfo[1].tag  = ScrBookTags.kflidFootnotes;
            endLevInfo[1].ihvo = 6;
            endLevInfo[0].tag  = StTextTags.kflidParagraphs;
            endLevInfo[0].ihvo = 0;
            selHelper.SetLevelInfo(SelectionHelper.SelLimitType.End, endLevInfo);
            selHelper.IchEnd = 7;
            selHelper.SetTextPropId(SelectionHelper.SelLimitType.End, StTxtParaTags.kflidContents);

            // Now that all the preparation to set the selection is done, set it.
            selHelper.SetSelection(m_footnoteView, true, true);
            Application.DoEvents();

            // First get the footnotes we're deleting.
            IScrFootnote[] footnotes     = new IScrFootnote[5];
            Guid[]         guidFootnotes = new Guid[5];
            IStTxtPara[]   paras         = new IStTxtPara[5];
            for (int i = 0; i < 5; i++)
            {
                footnotes[i]     = Cache.ServiceLocator.GetInstance <IScrFootnoteRepository>().GetObject(m_Jude.FootnotesOS[i + 2].Hvo);
                guidFootnotes[i] = footnotes[i].Guid;
                paras[i]         = footnotes[i].ParaContainingOrcRA;
            }

            m_footnoteView.DeleteFootnote();

            foreach (IScrFootnote footnote in footnotes)
            {
                Assert.IsFalse(footnote.IsValidObject);
            }

            // now make sure that we don't find the footnote markers
            for (int i = 0; i < 5; i++)
            {
                VerifyRemovedFootnoteMarker(paras[i], guidFootnotes[i]);
                VerifyRemovedFootnoteMarker(paras[i], guidFootnotes[i], m_wsEn);
                VerifyRemovedFootnoteMarker(paras[i], guidFootnotes[i], m_wsDe);
            }
        }
Example #6
0
 /// ------------------------------------------------------------------------------------
 /// <summary>
 /// Initializes a new instance of the <see cref="FootnoteLocationInfo"/> class.
 /// </summary>
 /// ------------------------------------------------------------------------------------
 public FootnoteLocationInfo(IScrFootnote footnote, int iBook, int iSection, int iPara,
                             int ich, int tag)
 {
     m_footnote = footnote;
     m_iBook    = iBook;
     m_iSection = iSection;
     m_iPara    = iPara;
     m_ich      = ich;
     m_tag      = tag;
 }
Example #7
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Displays the footnote reference.
        /// </summary>
        /// <param name="vwenv">The view environment.</param>
        /// <param name="hvoFootnote">The HVO of the footnote.</param>
        /// ------------------------------------------------------------------------------------
        internal void DisplayFootnoteReference(IVwEnv vwenv, int hvoFootnote)
        {
            IScrFootnote footnote = m_cache.ServiceLocator.GetInstance <IScrFootnoteRepository>().GetObject(hvoFootnote);
            ITsString    tssRef   = TsStringUtils.MakeTss(footnote.GetReference(m_wsDefault),
                                                          m_wsDefault, ScrStyleNames.FootnoteTargetRef);

            vwenv.set_IntProperty((int)FwTextPropType.ktptEditable,
                                  (int)FwTextPropVar.ktpvEnum, (int)TptEditable.ktptNotEditable);
            vwenv.AddString(tssRef);
        }
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Initializes a new instance of the <see cref="FootnoteLocationInfo"/> class.
		/// </summary>
		/// ------------------------------------------------------------------------------------
		public FootnoteLocationInfo(IScrFootnote footnote, int iBook, int iSection, int iPara,
			int ich, int tag)
		{
			m_footnote = footnote;
			m_iBook = iBook;
			m_iSection = iSection;
			m_iPara = iPara;
			m_ich = ich;
			m_tag = tag;
		}
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Scrolls a footnote paragraph into view.
        /// </summary>
        /// <param name="diff">The sub-diff, which contains the id of the paragraph in the
        /// footnote which is to be scrolled into view. Or null if no footnote is specified.</param>
        /// ------------------------------------------------------------------------------------
        public void ScrollToFootnotePara(Difference diff)
        {
            CheckDisposed();

            // TODO:  TE-4610 temporary? ignore scrolling when no footnote in this diff
            //Debug.Assert(diff != null);
            if (diff == null)
            {
                return;
            }

            // Get the paragraph which contains the difference.
            IScrTxtPara para = diff.ParaCurr != null ? diff.ParaCurr : diff.ParaRev;

            // Get the footnote which contains the paragraph.
            IScrFootnote footnote = (IScrFootnote)para.Owner;

            // Find the index of the paragraph.
            int iPara = para.IndexInOwner;

            if (iPara < 0)
            {
                return;
            }

            // Find index of the footnote.
            int iFootnote = footnote.IndexInOwner;

            if (iFootnote < 0)
            {
                return;
            }

            // Create selection pointing to this footnote.
            SelectionHelper selHelper = new SelectionHelper();

            selHelper.AssocPrev         = false;
            selHelper.NumberOfLevels    = 2;
            selHelper.TextPropId        = StTxtParaTags.kflidContents;
            selHelper.LevelInfo[0].tag  = StTextTags.kflidParagraphs;
            selHelper.LevelInfo[0].ihvo = iPara;
            selHelper.LevelInfo[1].tag  = ScrBookTags.kflidFootnotes;
            selHelper.LevelInfo[1].ihvo = iFootnote;
            // note: We don't care about seting the ich stuff for this temporary selection.
            // (The view constructor takes care of highlighting the proper ich range.)
            // Our mission here is only to scroll to the paragraph.
            selHelper.IchAnchor = 0;
            selHelper.IchEnd    = 0;

            // Set the selection.
            selHelper.SetSelection(this, true, true);
            ScrollSelectionIntoView(null, VwScrollSelOpts.kssoNearTop);
        }
Example #10
0
        public void InsertFootnote_InBt()
        {
            IScrBook book = AddBookToMockedScripture(1, "Genesis");

            AddTitleToMockedBook(book, "Genesis");
            m_draftView.BookFilter.Add(book);
            IScrSection section = AddSectionToMockedBook(book);

            AddSectionHeadParaToSection(section, "The first section",
                                        ScrStyleNames.SectionHead);

            // Construct a parent paragraph in the vernacular.
            IScrTxtPara parentPara = AddParaToMockedSectionContent(section, ScrStyleNames.NormalParagraph);

            AddVerse(parentPara, 1, 1, "uno");
            AddVerse(parentPara, 0, 2, "dos");
            IScrFootnote footnote1 = AddFootnote(book, parentPara, 5);

            AddParaToMockedText(footnote1, ScrStyleNames.NormalFootnoteParagraph);
            IScrFootnote footnote2 = AddFootnote(book, parentPara, 10);

            AddParaToMockedText(footnote2, ScrStyleNames.NormalFootnoteParagraph);
            Assert.AreEqual(2, book.FootnotesOS.Count);

            // Construct the initial back translation
            int            wsBt  = Cache.DefaultAnalWs;
            ICmTranslation trans = AddBtToMockedParagraph(parentPara, wsBt);

            AddRunToMockedTrans(trans, wsBt, "one two", null);
            ITsStrBldr btTssBldr = trans.Translation.get_String(wsBt).GetBldr();

            trans.Translation.set_String(wsBt, btTssBldr.GetString());
            m_draftView.RefreshDisplay();

            m_draftView.SetInsertionPoint(0, 0, 0, 3, false);             //set the IP after the word "one"
            int iBtFootnote1;

            m_draftView.TeEditingHelper.InsertFootnote(ScrStyleNames.NormalFootnoteParagraph, out iBtFootnote1);
            VerifyRequestedBTSelection(0, 0, ScrSectionTags.kflidContent, 0, 4);
            m_draftView.RefreshDisplay();

            m_draftView.SetInsertionPoint(0, 0, 0, 8, false);             // set the IP after the word "two"
            int iBtFootnote2;

            m_draftView.TeEditingHelper.InsertFootnote(ScrStyleNames.NormalFootnoteParagraph, out iBtFootnote2);
            VerifyRequestedBTSelection(0, 0, ScrSectionTags.kflidContent, 0, 9);

            // Confirm that the footnote callers were inserted in the correct locations.
            Assert.AreEqual("one" + StringUtils.kChObject + " two" + StringUtils.kChObject,
                            trans.Translation.get_String(wsBt).Text);
            FdoTestHelper.VerifyBtFootnote(footnote1, parentPara, wsBt, 3);
            FdoTestHelper.VerifyBtFootnote(footnote2, parentPara, wsBt, 8);
        }
        public void GoToNextFootnote_AtLastFootnote()
        {
            IScrBook    philemon;
            IStFootnote footnote1, footnote2;

            CreateBookWithTwoFootnotes(out philemon, out footnote1, out footnote2);

            m_editingHelper.SetupSelectionInFootnote(footnote2, philemon, 0, 0, 0);
            IScrFootnote nextfootnote = m_editingHelper.GoToNextFootnote();

            Assert.IsNull(nextfootnote, "Footnote was found when it should not have been");
        }
Example #12
0
        public void SpaceAfterFootnoteMarker()
        {
            IScrBook     book     = m_scr.ScriptureBooksOS[0];
            IScrFootnote footnote = AddFootnote(book, (IStTxtPara)book.TitleOA.ParagraphsOS[0], 0, "This is a footnote");

            footnote.FootnoteMarker = Cache.TsStrFactory.MakeString("a", Cache.WritingSystemFactory.GetWsFromStr("en"));
            // Prepare the test by creating a footnote view
            FwStyleSheet styleSheet = new FwStyleSheet();

            styleSheet.Init(Cache, m_scr.Hvo, ScriptureTags.kflidStyles);

            using (DummyFootnoteView footnoteView = new DummyFootnoteView(Cache))
            {
                footnoteView.StyleSheet = styleSheet;
                footnoteView.Visible    = false;

                // We don't actually want to show it, but we need to force the view to create the root
                // box and lay it out so that various test stuff can happen properly.
                footnoteView.MakeRoot();
                footnoteView.CallLayout();

                // Select the footnote marker and some characters of the footnote paragraph
                footnoteView.RootBox.MakeSimpleSel(true, false, false, true);
                SelectionHelper selHelper = SelectionHelper.GetSelectionInfo(null, footnoteView);
                selHelper.IchAnchor = 0;
                selHelper.IchEnd    = 5;
                SelLevInfo[] selLevInfo = new SelLevInfo[3];
                Assert.AreEqual(4, selHelper.GetNumberOfLevels(SelectionHelper.SelLimitType.End));
                Array.Copy(selHelper.GetLevelInfo(SelectionHelper.SelLimitType.End), 1, selLevInfo, 0, 3);
                selHelper.SetLevelInfo(SelectionHelper.SelLimitType.End, selLevInfo);
                selHelper.SetTextPropId(SelectionHelper.SelLimitType.End,
                                        StTxtParaTags.kflidContents);
                selHelper.SetSelection(true);

                // Now the real test:
                IVwSelection sel = footnoteView.RootBox.Selection;
                ITsString    tss;
                sel.GetSelectionString(out tss, string.Empty);
                Assert.AreEqual("a ", tss.Text.Substring(0, 2));

                // make sure the marker and the space are read-only (maybe have to select each run
                // separately to make this test truly correct)
                ITsTextProps[]     vttp;
                IVwPropertyStore[] vvps;
                int cttp;
                SelectionHelper.GetSelectionProps(sel, out vttp, out vvps, out cttp);
                Assert.IsTrue(cttp >= 2);
                Assert.IsFalse(SelectionHelper.IsEditable(vttp[0], vvps[0]),
                               "Footnote marker is not read-only");
                Assert.IsFalse(SelectionHelper.IsEditable(vttp[1], vvps[1]),
                               "Space after marker is not read-only");
            }
        }
        public void GoToNextFootnote_FirstFootnote()
        {
            IScrBook    philemon;
            IStFootnote footnote1, footnote2;

            CreateBookWithTwoFootnotes(out philemon, out footnote1, out footnote2);

            m_editingHelper.SetupSelectionInFootnote(footnote1, philemon, 0, 0, 0);
            IScrFootnote nextfootnote = m_editingHelper.GoToNextFootnote();

            Assert.IsNotNull(nextfootnote, "Couldn't find footnote");
            Assert.AreEqual(philemon.FootnotesOS[1], nextfootnote);
        }
        public void InsertFootnote()
        {
            IScrBook book = AddBookToMockedScripture(1, "Genesis");

            AddTitleToMockedBook(book, "Genesis");
            m_draftView.BookFilter.Add(book);
            IScrSection section = AddSectionToMockedBook(book);

            // Construct a paragraph in the vernacular.
            IScrTxtPara para = AddParaToMockedSectionContent(section, ScrStyleNames.NormalParagraph);

            // Footnote goes here:   |
            AddVerse(para, 1, 1, "uno");
            // Footnote goes here:   |
            AddVerse(para, 0, 2, "dos");
            IScrFootnote footnote1 = AddFootnote(book, para, 5);

            AddParaToMockedText(footnote1, ScrStyleNames.NormalFootnoteParagraph);
            IScrFootnote footnote2 = AddFootnote(book, para, 10);

            AddParaToMockedText(footnote2, ScrStyleNames.NormalFootnoteParagraph);
            Assert.AreEqual(2, book.FootnotesOS.Count);

            // Construct the initial back translation
            AddSegmentFt(para, 1, "one", Cache.DefaultAnalWs);
            AddSegmentFt(para, 3, "two", Cache.DefaultAnalWs);
            m_draftView.RefreshDisplay();

            m_draftView.TeEditingHelper.SelectRangeOfChars(0, 0, ScrSectionTags.kflidContent, 0, 1, 3, 3,
                                                           true, false, true, VwScrollSelOpts.kssoDefault); //set the IP after the word "one"
            int iBtFootnote1;

            m_draftView.TeEditingHelper.InsertFootnote(ScrStyleNames.NormalFootnoteParagraph, out iBtFootnote1);
            Assert.AreEqual(0, iBtFootnote1);
            VerifyRequestedSegmentedBTSelection(0, 0, ScrSectionTags.kflidContent, 0, 1, 4);
            m_draftView.RefreshDisplay();

            m_draftView.TeEditingHelper.SelectRangeOfChars(0, 0, ScrSectionTags.kflidContent, 0, 3, 3, 3,
                                                           true, false, true, VwScrollSelOpts.kssoDefault); //set the IP after the word "two"
            int iBtFootnote2;

            m_draftView.TeEditingHelper.InsertFootnote(ScrStyleNames.NormalFootnoteParagraph, out iBtFootnote2);
            Assert.AreEqual(1, iBtFootnote2);
            VerifyRequestedSegmentedBTSelection(0, 0, ScrSectionTags.kflidContent, 0, 3, 4);

            // Confirm that the footnote callers were inserted in the correct locations.
            VerifySegment(para, 1, "one" + StringUtils.kChObject, Cache.DefaultAnalWs);
            VerifySegment(para, 3, "two" + StringUtils.kChObject, Cache.DefaultAnalWs);
            FdoTestHelper.VerifyFootnoteInSegmentFt(footnote1, para, 1, Cache.DefaultAnalWs, 3);
            FdoTestHelper.VerifyFootnoteInSegmentFt(footnote2, para, 3, Cache.DefaultAnalWs, 3);
        }
        public void GoToPreviousFootnote_AtFirstFootnote()
        {
            IScrBook    philemon;
            IStFootnote footnote1, footnote2;

            CreateBookWithTwoFootnotes(out philemon, out footnote1, out footnote2);

            // set the selection to the first footnote and go to previous. There are
            // none so it should return null
            m_editingHelper.SetupSelectionInFootnote(footnote1, philemon, 0, 0, 0);
            IScrFootnote prevfootnote = m_editingHelper.GoToPreviousFootnote();

            Assert.IsNull(prevfootnote);
        }
        public void GoToPreviousFootnote_LastFootnote()
        {
            IScrBook    philemon;
            IStFootnote footnote1, footnote2;

            CreateBookWithTwoFootnotes(out philemon, out footnote1, out footnote2);

            // set the selection to the second footnote and go to previous. The footnote
            // should be the first footnote.
            m_editingHelper.SetupSelectionInFootnote(footnote2, philemon, 0, 0, 0);
            IScrFootnote prevfootnote = m_editingHelper.GoToPreviousFootnote();

            Assert.AreEqual(footnote1.Hvo, prevfootnote.Hvo);
        }
Example #17
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Constructor for the FootnoteInfo structure
        /// </summary>
        /// <param name="scrFootnote">given footnote</param>
        /// ------------------------------------------------------------------------------------
        public FootnoteInfo(IScrFootnote scrFootnote)
        {
            footnote = scrFootnote;
            IStPara para = footnote.ParagraphsOS[0];

            if (para.StyleRules != null)
            {
                paraStylename = para.StyleRules.GetStrPropValue((int)FwTextPropType.ktptNamedStyle);
            }
            else
            {
                paraStylename = null;
                Debug.Fail("StyleRules should never be null.");
            }
        }
Example #18
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Make the DispPropOverrides we need to give the specified run of characters the
        /// display properties defined by the initializer.
        /// </summary>
        /// <param name="para">The paragraph.</param>
        /// <param name="paraMinHighlight">The index (in logical characters, relative to
        /// para.Contents) of the first character whose properties will be overridden.</param>
        /// <param name="paraLimHighlight">The character "limit" (in logical characters,
        /// relative to para.Contents) of the text whose properties will be overridden.</param>
        /// <param name="initializer">A delegate that modifies the display props of characters
        /// between ichMin and ichLim.</param>
        /// ------------------------------------------------------------------------------------
        protected void MakeDispPropOverrides(IScrTxtPara para, int paraMinHighlight,
                                             int paraLimHighlight, DispPropInitializer initializer)
        {
            if (paraLimHighlight < paraMinHighlight)
            {
                throw new ArgumentOutOfRangeException("paraLimHighlight", "ParaLimHighlight must be greater or equal to paraMinHighlight");
            }

            int offsetToStartOfParaContents = 0;

            if (para.Owner is IScrFootnote && para.IndexInOwner == 0)
            {
                IScrFootnote footnote = (IScrFootnote)para.Owner;
                string       sMarker  = footnote.MarkerAsString;
                if (sMarker != null)
                {
                    offsetToStartOfParaContents += sMarker.Length + OneSpaceString.Length;
                }
                offsetToStartOfParaContents += footnote.RefAsString.Length;
            }

            // Add the needed properties to each run, within our range
            ITsString tss = para.Contents;
            TsRunInfo runInfo;
            int       ichOverrideLim;
            int       ichOverrideMin = Math.Min(Math.Max(paraMinHighlight, 0), tss.Length);
            int       prevLim        = 0;

            do
            {
                tss.FetchRunInfoAt(ichOverrideMin, out runInfo);
                ichOverrideLim = Math.Min(paraLimHighlight, runInfo.ichLim);
                Debug.Assert(ichOverrideLim <= tss.Length, "If we get a run it should be in the bounds of the paragraph");

                // Prevent infinite loop in case of bad data in difference
                if (ichOverrideLim == prevLim)
                {
                    break;
                }
                prevLim = ichOverrideLim;
                DispPropOverride prop = DispPropOverrideFactory.Create(
                    ichOverrideMin + offsetToStartOfParaContents, ichOverrideLim + offsetToStartOfParaContents);
                initializer(ref prop);
                m_DispPropOverrides.Add(prop);
                // advance Min for next run
                ichOverrideMin = ichOverrideLim;
            }while (ichOverrideLim < paraLimHighlight);
        }
Example #19
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Creates and initializes a footnote.
		/// </summary>
		/// ------------------------------------------------------------------------------------
		protected override void CreateTestData()
		{
			m_vernWs = Cache.DefaultVernWs;
			// create footnote
			IFdoServiceLocator servloc = Cache.ServiceLocator;
			m_footnote = servloc.GetInstance<IScrFootnoteFactory>().Create();
			m_book = AddBookToMockedScripture(1, "Genesis");
			m_book.FootnotesOS.Add(m_footnote);
			m_footnote.FootnoteMarker = TsStringUtils.MakeTss("a", m_vernWs);
			m_scr.DisplaySymbolInFootnote = true;
			m_scr.DisplayFootnoteReference = false;

			// create one empty footnote para
			m_footnotePara = m_footnote.AddNewTextPara(ScrStyleNames.NormalFootnoteParagraph);
			m_footnotePara.Contents = TsStringUtils.MakeTss(string.Empty, m_vernWs);
		}
        public void InsertFootnote_BeforeExistingFootnoteInBt()
        {
            IScrBook book = AddBookToMockedScripture(1, "Genesis");

            AddTitleToMockedBook(book, "Genesis");
            m_draftView.BookFilter.Add(book);
            IScrSection section = AddSectionToMockedBook(book);

            // Construct a paragraph in the vernacular.
            IScrTxtPara para = AddParaToMockedSectionContent(section, ScrStyleNames.NormalParagraph);

            AddVerse(para, 1, 1, "uno");
            // Footnote goes here:   |
            AddVerse(para, 0, 2, "dos");
            IScrFootnote footnote1 = AddFootnote(book, para, para.Contents.Length);

            AddParaToMockedText(footnote1, ScrStyleNames.CrossRefFootnoteParagraph);
            Assert.AreEqual(1, book.FootnotesOS.Count);

            // Construct the initial back translation
            int wsBt = Cache.DefaultAnalWs;

            AddSegmentFt(para, 1, "one", wsBt);
            const int kiSegmentWithFn = 3;

            AddSegmentFt(para, kiSegmentWithFn, "two", wsBt);
            ISegment   segment    = para.SegmentsOS[kiSegmentWithFn];
            ITsString  tssSegment = segment.FreeTranslation.get_String(wsBt);
            ITsStrBldr bldr       = tssSegment.GetBldr();

            TsStringUtils.InsertOrcIntoPara(footnote1.Guid, FwObjDataTypes.kodtNameGuidHot, bldr,
                                            bldr.Length, bldr.Length, wsBt);
            segment.FreeTranslation.set_String(wsBt, bldr.GetString());
            m_draftView.RefreshDisplay();

            m_draftView.TeEditingHelper.SelectRangeOfChars(0, 0, ScrSectionTags.kflidContent, 0, kiSegmentWithFn, 0, 0,
                                                           true, false, true, VwScrollSelOpts.kssoDefault); //set the IP after the cross-reference footnote

            int iDummy;

            Assert.IsNull(m_draftView.TeEditingHelper.InsertFootnote(ScrStyleNames.NormalFootnoteParagraph, out iDummy));

            // Confirm that nothing else was inserted.
            VerifySegment(para, 1, "one", wsBt);
            VerifySegment(para, kiSegmentWithFn, "two" + StringUtils.kChObject, wsBt);
            FdoTestHelper.VerifyFootnoteInSegmentFt(footnote1, para, kiSegmentWithFn, wsBt, bldr.Length - 1);
        }
Example #21
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Deletes footnotes when there is a range selection.
        /// </summary>
        /// <param name="helper"></param>
        /// ------------------------------------------------------------------------------------
        private void DeleteFootnoteRange(SelectionHelper helper)
        {
            int nTopLevels    = helper.GetNumberOfLevels(SelectionHelper.SelLimitType.Top);
            int nBottomLevels = helper.GetNumberOfLevels(SelectionHelper.SelLimitType.Bottom);

            // Get the index of the book containing the first footnote in the selection.
            // Then get the index of the footnote within that book.
            int iFirstBook =
                helper.GetLevelInfo(SelectionHelper.SelLimitType.Top)[nTopLevels - 1].ihvo;
            int iFirstFootnote =
                helper.GetLevelInfo(SelectionHelper.SelLimitType.Top)[nTopLevels - 2].ihvo;

            // Get the index of the book containing the last footnote in the selection.
            // Then get the index of the footnote within that book.
            int iLastBook =
                helper.GetLevelInfo(SelectionHelper.SelLimitType.Bottom)[nBottomLevels - 1].ihvo;
            int iLastFootnote =
                helper.GetLevelInfo(SelectionHelper.SelLimitType.Bottom)[nBottomLevels - 2].ihvo;

            // Loop through the books containing footnotes in the selection.
            for (int iBook = iFirstBook; iBook <= iLastBook; iBook++)
            {
                IScrBook book = BookFilter.GetBook(iBook);

                int iBeg = iFirstFootnote;
                if (iFirstBook != iLastBook && iBook > iFirstBook)
                {
                    iBeg = 0;
                }

                int iEnd = iLastFootnote;
                if (iFirstBook != iLastBook && iBook < iLastBook)
                {
                    iEnd = book.FootnotesOS.Count - 1;
                }

                // Loop through the footnotes from the selection that are in the
                // current book. Go in reverse order through the collection.
                for (int i = iEnd; i >= iBeg; i--)
                {
                    // TODO: check filter for each HVO
                    IScrFootnote footnote =
                        Cache.ServiceLocator.GetInstance <IScrFootnoteRepository>().GetObject(book.FootnotesOS[i].Hvo);
                    book.FootnotesOS.Remove(footnote);
                }
            }
        }
Example #22
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Creates and initializes a footnote.
        /// </summary>
        /// ------------------------------------------------------------------------------------
        protected override void CreateTestData()
        {
            m_vernWs = Cache.DefaultVernWs;
            // create footnote
            ILcmServiceLocator servloc = Cache.ServiceLocator;

            m_footnote = servloc.GetInstance <IScrFootnoteFactory>().Create();
            m_book     = AddBookToMockedScripture(1, "Genesis");
            m_book.FootnotesOS.Add(m_footnote);
            m_footnote.FootnoteMarker      = TsStringUtils.MakeString("a", m_vernWs);
            m_scr.DisplaySymbolInFootnote  = true;
            m_scr.DisplayFootnoteReference = false;

            // create one empty footnote para
            m_footnotePara          = m_footnote.AddNewTextPara(ScrStyleNames.NormalFootnoteParagraph);
            m_footnotePara.Contents = TsStringUtils.MakeString(string.Empty, m_vernWs);
        }
Example #23
0
        public void InsertFootnote_AtEndBtWithLongCallers()
        {
            m_scr.FootnoteMarkerSymbol = "@#$";
            m_scr.FootnoteMarkerType   = FootnoteMarkerTypes.SymbolicFootnoteMarker;

            IScrBook book = AddBookToMockedScripture(1, "Genesis");

            AddTitleToMockedBook(book, "Genesis");
            m_draftView.BookFilter.Add(book);
            IScrSection section = AddSectionToMockedBook(book);

            AddSectionHeadParaToSection(section, "The first section",
                                        ScrStyleNames.SectionHead);

            // Construct a parent paragraph in the vernacular.
            IScrTxtPara parentPara = AddParaToMockedSectionContent(section, ScrStyleNames.NormalParagraph);

            AddVerse(parentPara, 1, 1, "uno");
            AddVerse(parentPara, 0, 2, "dos");
            IScrFootnote footnote1 = AddFootnote(book, parentPara, parentPara.Contents.Length);

            AddParaToMockedText(footnote1, ScrStyleNames.NormalFootnoteParagraph);
            Assert.AreEqual(1, book.FootnotesOS.Count);

            // Construct the initial back translation
            int            wsBt  = Cache.DefaultAnalWs;
            ICmTranslation trans = AddBtToMockedParagraph(parentPara, wsBt);

            AddRunToMockedTrans(trans, wsBt, "a", null);
            ITsStrBldr btTssBldr = trans.Translation.get_String(wsBt).GetBldr();

            TsStringUtils.InsertOrcIntoPara(footnote1.Guid, FwObjDataTypes.kodtNameGuidHot, btTssBldr,
                                            btTssBldr.Length, btTssBldr.Length, wsBt);
            trans.Translation.set_String(wsBt, btTssBldr.GetString());
            m_draftView.RefreshDisplay();

            m_draftView.SetInsertionPoint(0, 0, 0, btTssBldr.Length, false);             //set the IP after the footnote
            int iBtFootnote2;

            m_draftView.TeEditingHelper.InsertFootnote(ScrStyleNames.NormalFootnoteParagraph, out iBtFootnote2);
            m_draftView.RefreshDisplay();

            // Confirm that the footnote callers were inserted in the correct locations.
            Assert.AreEqual("a" + StringUtils.kChObject, trans.Translation.get_String(wsBt).Text);
            FdoTestHelper.VerifyBtFootnote(footnote1, parentPara, wsBt, btTssBldr.Length - 1);
        }
        public void ExportRtfBtFootnotes()
        {
            // Set up the vernacular text.
            AddTitleToMockedBook(m_book, "Genesis");
            AddRunToMockedPara(m_para, "1", ScrStyleNames.ChapterNumber);
            AddRunToMockedPara(m_para, "1", ScrStyleNames.VerseNumber);
            AddRunToMockedPara(m_para, "yi kuch batchit he.", null);
            IScrFootnote footnote1 = AddFootnote(
                m_book, m_para, 2, "pehla pao wala note");

            // Set up back translation.
            int            wsBt       = Cache.DefaultAnalWs;
            ICmTranslation transPara1 = AddBtToMockedParagraph(m_para, wsBt);

            AddRunToMockedTrans(transPara1, wsBt, "1", ScrStyleNames.ChapterNumber);
            AddRunToMockedTrans(transPara1, wsBt, "1", ScrStyleNames.VerseNumber);
            AddRunToMockedTrans(transPara1, wsBt, "This is some text.", null);
            AddBtFootnote(transPara1, 4, wsBt, footnote1, "First footnote");

            m_scr.DisplaySymbolInFootnote = true;

            // Export the back translation of the footnote.
            m_exporter = new DummyExportRtf(m_fileName, Cache, m_styleSheet, wsBt);
            m_exporter.CallExportFootnote(footnote1, wsBt);
            m_exporter.CloseOutputFile();

            int markerStyleNumber =
                m_styleSheet.FindStyle(ScrStyleNames.FootnoteMarker).IndexInOwner + 1;
            int footnoteStyleNumber =
                m_styleSheet.FindStyle(ScrStyleNames.NormalFootnoteParagraph).IndexInOwner + 1;

            using (TextReader file = FileUtils.OpenFileForRead(m_fileName, Encoding.ASCII))
            {
                string line1 = file.ReadLine();
                string line2 = file.ReadLine();

                // the first line is the marker emitted into the text stream.
                // Footnote markers now have the footnote marker style applied
                Assert.AreEqual(@"\*\cs" + markerStyleNumber + @" a}", line1);
                Assert.AreEqual(@"{\footnote \pard\plain \s" + footnoteStyleNumber +
                                @"\f1\fs20{" + @"\*\cs" + markerStyleNumber + @" a" + @"}{ }{First footnote}", line2);
            }
        }
        public void ExportFootnote_Unicode()
        {
            int markerStyleNumber =
                m_styleSheet.FindStyle(ScrStyleNames.FootnoteMarker).IndexInOwner + 1;
            int footnoteStyleNumber =
                m_styleSheet.FindStyle(ScrStyleNames.NormalFootnoteParagraph).IndexInOwner + 1;

            ITsStrFactory stringFactory = TsStrFactoryClass.Create();

            // Create a book with a section that has a paragraph with some text and a footnote!
            AddRunToMockedPara(m_para, "My text for footnotes", string.Empty);
            IScrFootnote footnote = AddFootnote(m_book, m_para, 2);

            m_scr.FootnoteMarkerType      = FootnoteMarkerTypes.SymbolicFootnoteMarker;
            m_scr.FootnoteMarkerSymbol    = "¶";
            m_scr.DisplaySymbolInFootnote = true;
            footnote.FootnoteMarker       = stringFactory.MakeString(null, Cache.DefaultVernWs);
            IScrTxtPara footnotePara = Cache.ServiceLocator.GetInstance <IScrTxtParaFactory>().CreateWithStyle(
                footnote, ScrStyleNames.NormalFootnoteParagraph);
            string footnoteText = "C\u00f2\u00f3\u013a footnot\u0113";

            footnotePara.Contents = stringFactory.MakeString(footnoteText, Cache.DefaultVernWs);

            m_exporter = new DummyExportRtf(m_fileName, Cache, m_styleSheet);
            m_exporter.CallExportFootnote(footnote);

            // Verify the contents of the temp file
            m_exporter.CloseOutputFile();
            using (TextReader file = FileUtils.OpenFileForRead(m_fileName, Encoding.ASCII))
            {
                string line1 = file.ReadLine();
                string line2 = file.ReadLine();

                // the first line is the marker emitted into the text stream.
                // Footnote markers now have the footnote marker style applied
                Assert.AreEqual(@"\*\cs" + markerStyleNumber + @" \uc0\u182 }", line1);
                Assert.AreEqual(@"{\footnote \pard\plain \s" + footnoteStyleNumber +
                                @"\f1\fs20{" + @"\*\cs" + markerStyleNumber + @" \uc0\u182 " +
                                @"}{ }{Co\uc0\u768 o\uc0\u769 l\uc0\u769  footnote\uc0\u772 }",
                                line2);
            }
        }
Example #26
0
        public void GetFootnoteMarkerFromGuid()
        {
            IScrFootnote footnote = Cache.ServiceLocator.GetInstance <IScrFootnoteFactory>().Create();

            m_scr.ScriptureBooksOS[0].FootnotesOS.Add(footnote);
            footnote.FootnoteMarker = Cache.TsStrFactory.MakeString("a", Cache.WritingSystemFactory.GetWsFromStr("en"));

            // Add the guid property so we can get it out as a string.
            ITsPropsBldr propsBldr = TsPropsBldrClass.Create();

            byte[] objData = TsStringUtils.GetObjData(footnote.Guid, 1);
            propsBldr.SetStrPropValueRgch(1, objData, objData.Length);

            // Get the guid property as a string.
            string sObjData;

            propsBldr.GetStrPropValue(1, out sObjData);

            StVc vc = new StVc(Cache.WritingSystemFactory.UserWs)
            {
                Cache = Cache
            };
            ITsString footnoteMarker = vc.GetStrForGuid(sObjData.Substring(1));

            // Call to GetStrForGuid doesn't generate a footnote marker based on the
            // Scripture Footnote properties since the method to do that is in TeStVc.
            int dummy;

            Assert.AreEqual(StringUtils.kszObject, footnoteMarker.Text);
            ITsTextProps props = footnoteMarker.get_Properties(0);

            Assert.AreEqual(2, props.IntPropCount);
            Assert.AreEqual(Cache.DefaultUserWs, props.GetIntPropValues((int)FwTextPropType.ktptWs, out dummy));
            Assert.AreEqual(0, props.GetIntPropValues((int)FwTextPropType.ktptEditable, out dummy));
            Assert.AreEqual(1, props.StrPropCount);

            FwObjDataTypes odt;
            Guid           footnoteGuid = TsStringUtils.GetGuidFromProps(props, null, out odt);

            Assert.IsTrue(odt == FwObjDataTypes.kodtPictEvenHot || odt == FwObjDataTypes.kodtPictOddHot);
            Assert.AreEqual(footnote.Guid, footnoteGuid);
        }
Example #27
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Find the next footnote starting from the given paragraph and position.
        /// </summary>
        /// <param name="iPara">Index of paragraph to start search.</param>
        /// <param name="ich">Character index to start search.</param>
        /// <param name="fSkipCurrentPosition">If <c>true</c> we search forwards starting with the
        /// run after ich, otherwise we start with the current run.</param>
        /// <returns>Next footnote in string, or <c>null</c> if footnote can't be found.</returns>
        /// ------------------------------------------------------------------------------------
        public IScrFootnote FindNextFootnote(ref int iPara, ref int ich,
                                             bool fSkipCurrentPosition)
        {
            if (ParagraphsOS.Count == 0)
            {
                return(null);
            }

            IScrTxtPara  para     = (IScrTxtPara)ParagraphsOS[iPara];
            IScrFootnote footnote = para.FindNextFootnoteInContents(ref ich, fSkipCurrentPosition);

            while (footnote == null && iPara < ParagraphsOS.Count - 1)
            {
                iPara++;
                ich      = 0;
                para     = (IScrTxtPara)ParagraphsOS[iPara];
                footnote = para.FindNextFootnoteInContents(ref ich, false);
            }
            return(footnote);
        }
Example #28
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Deletes a footnote or footnotes within a text selection.
        /// </summary>
        /// ------------------------------------------------------------------------------------
        protected void DeleteFootnoteAux()
        {
            SelectionHelper helper = SelectionHelper.Create(this);

            if (helper == null)
            {
                return;                 // Better then crashing :)
            }
            int fnLevel = helper.GetLevelForTag(ScrBookTags.kflidFootnotes);

            if (helper.Selection.IsRange)
            {
                DeleteFootnoteRange(helper);
            }
            else
            {
                // There's no range selection, so delete only one footnote
                IScrFootnote footnote =
                    Cache.ServiceLocator.GetInstance <IScrFootnoteRepository>().GetObject(helper.LevelInfo[fnLevel].hvo);
                ((IScrBook)footnote.Owner).FootnotesOS.Remove(footnote);
            }

            if (RootBox.Height <= 0)
            {
                DraftView.Focus();
            }
            else
            {
                int      iBook     = helper.LevelInfo[fnLevel + 1].ihvo;
                IScrBook book      = m_bookFilter.GetBook(iBook);
                int      iFootnote = helper.LevelInfo[fnLevel].ihvo;

                // If the last footnote in the book was deleted find a footnote to move to
                if (iFootnote >= book.FootnotesOS.Count)
                {
                    FindNearestFootnote(ref iBook, ref iFootnote);
                }

                FootnoteEditingHelper.ScrollToFootnote(iBook, iFootnote, 0);
            }
        }
Example #29
0
        public void FixOrcsWithoutProps_OrphanedFootnotesWithNoOrcs()
        {
            IScrBook exodus = CreateExodusData();

            CreateFootnote(exodus, 0, 0, 0, 4, ScrStyleNames.NormalFootnoteParagraph, false);
            IScrFootnote footnote = Cache.ServiceLocator.GetInstance <IScrFootnoteFactory>().Create();

            exodus.FootnotesOS.Add(footnote);
            //IStTxtPara para = (IStTxtPara)footnote.ParagraphsOS.Append(new StTxtPara());
            //para.Contents = TsStringUtils.MakeTss("Poor orphaned footnote 1")

            TeScrInitializer scrInit = new TestTeScrInitializer(Cache);
            List <string>    report  = (List <string>)ReflectionHelper.GetResult(scrInit, "FixOrcsWithoutProps");

            VerifyResourceForFixedOrphans();

            Assert.AreEqual(1, report.Count);
            Assert.AreEqual("EXO - Footnote 2 has no corresponding marker in the vernacular text", report[0]);

            Assert.AreEqual(2, exodus.FootnotesOS.Count);
        }
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Create test data in a right-to-left script.
        /// </summary>
        /// ------------------------------------------------------------------------------------
        protected override void CreateTestData()
        {
            IWritingSystem defWs = Cache.ServiceLocator.WritingSystems.DefaultVernacularWritingSystem;

            // Add basic data for Genesis
            m_genesis = AddBookToMockedScripture(1, "Genesis");
            AddTitleToMockedBook(m_genesis, m_StartText);
            IScrSection section = AddSectionToMockedBook(m_genesis);
            IStTxtPara  para    = AddParaToMockedSectionContent(section, ScrStyleNames.NormalParagraph);

            AddFormatTextToMockedPara(m_genesis, para,
                                      @"\c12\v13-14\*" + m_WordsText, m_UrWsHvo);

            // Add footnote
            IScrFootnote footnote = AddFootnote(m_genesis, para, 10);
            IScrTxtPara  footPara = Cache.ServiceLocator.GetInstance <IScrTxtParaFactory>().CreateWithStyle(
                footnote, ScrStyleNames.NormalFootnoteParagraph);
            ITsStrFactory strfact = TsStrFactoryClass.Create();

            footPara.Contents = strfact.MakeString(m_WordsText, m_UrWsHvo);
        }
Example #31
0
        public void DeleteFootnoteInRangeSelectionAcrossMultipleBooks()
        {
            SetupSelectionForRangeAcrossBooks();
            IScripture scr = Cache.LangProject.TranslatedScriptureOA;

            IScrFootnote[] footnotes     = new IScrFootnote[4];
            Guid[]         guidFootnotes = new Guid[4];
            IScrTxtPara[]  paras         = new IScrTxtPara[4];

            // First get the footnotes we're deleting from JAMES.
            IScrBook book = scr.ScriptureBooksOS[1];

            footnotes[0] = book.FootnotesOS[31];
            footnotes[1] = book.FootnotesOS[32];

            // First get the footnotes we're deleting from JUDE.
            book         = (IScrBook)scr.ScriptureBooksOS[2];
            footnotes[2] = book.FootnotesOS[0];
            footnotes[3] = book.FootnotesOS[1];

            for (int i = 0; i < 4; i++)
            {
                guidFootnotes[i] = footnotes[i].Guid;
                paras[i]         = footnotes[i].ContainingParagraph;
            }

            m_footnoteView.DeleteFootnote();

            foreach (IScrFootnote footnote in footnotes)
            {
                Assert.IsFalse(footnote.IsValidObject);
            }

            // now make sure that we don't find the footnote markers
            for (int i = 0; i < 4; i++)
            {
                Assert.IsFalse(IsFootnoteMarkerInText(paras[i], guidFootnotes[i]),
                               "Footnote marker didn't get deleted from text");
            }
        }
Example #32
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Find the previous footnote starting from the given paragraph and character position.
        /// </summary>
        /// <param name="iPara">Index of paragraph to start search, or -1 to start search in
        /// last paragraph.</param>
        /// <param name="ich">Character index to start search, or -1 to start at the end of
        /// the paragraph.</param>
        /// <param name="fSkipCurrentPosition">If <c>true</c> we search backwards starting with the
        /// run before ich, otherwise we start with the run ich is in.</param>
        /// <returns>Last footnote in string, or <c>null</c> if footnote can't be found.</returns>
        /// ------------------------------------------------------------------------------------
        public IScrFootnote FindPreviousFootnote(ref int iPara, ref int ich,
                                                 bool fSkipCurrentPosition)
        {
            if (ParagraphsOS.Count <= iPara)
            {
                return(null);
            }
            if (iPara == -1)
            {
                iPara = ParagraphsOS.Count - 1;
            }
            IScrTxtPara  para     = (IScrTxtPara)ParagraphsOS[iPara];
            IScrFootnote footnote = para.FindPrevFootnoteInContents(ref ich, fSkipCurrentPosition);

            while (footnote == null && iPara > 0)
            {
                para     = (IScrTxtPara)ParagraphsOS[--iPara];
                ich      = para.Contents.Length;
                footnote = para.FindPrevFootnoteInContents(ref ich, false);
            }
            return(footnote);
        }
Example #33
0
        public void DeleteFootnoteInRangeSelectionAcrossMultipleBooks()
        {
            SetupSelectionForRangeAcrossBooks();
            IScripture scr = Cache.LangProject.TranslatedScriptureOA;

            IScrFootnote[] footnotes = new IScrFootnote[4];
            Guid[] guidFootnotes = new Guid[4];
            IScrTxtPara[] paras = new IScrTxtPara[4];

            // First get the footnotes we're deleting from JAMES.
            IScrBook book = scr.ScriptureBooksOS[1];
            footnotes[0] = book.FootnotesOS[31];
            footnotes[1] = book.FootnotesOS[32];

            // First get the footnotes we're deleting from JUDE.
            book = (IScrBook)scr.ScriptureBooksOS[2];
            footnotes[2] = book.FootnotesOS[0];
            footnotes[3] = book.FootnotesOS[1];

            for (int i = 0; i < 4; i++)
            {
                guidFootnotes[i] = footnotes[i].Guid;
                paras[i] = footnotes[i].ContainingParagraph;
            }

            m_footnoteView.DeleteFootnote();

            foreach (IScrFootnote footnote in footnotes)
                Assert.IsFalse(footnote.IsValidObject);

            // now make sure that we don't find the footnote markers
            for (int i = 0; i < 4; i++)
            {
                Assert.IsFalse(IsFootnoteMarkerInText(paras[i], guidFootnotes[i]),
                    "Footnote marker didn't get deleted from text");
            }
        }
Example #34
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Get the Chapter Verse Reference representation for a footnote (ie. sectionCV-CV Footnote(footnoteCV))
		/// Or Title representation (ie. Title Footnote(OwnOrd))
		/// </summary>
		/// ------------------------------------------------------------------------------------
		public string ContainingRefAsString(IScrFootnote footnote)
		{
			footnote.IgnoreDisplaySettings = true; // so we can access GetReference.
			string parentContext = "";
			string footnoteRef = "";
			IScrSection containingSection;
			IStText containingTitle;
			if (footnote.TryGetContainingSection(out containingSection))
			{
				parentContext = ChapterVerseBridgeAsString(containingSection);
				footnoteRef = footnote.GetReference(m_cache.DefaultUserWs).Trim();
			}
			else if (footnote.TryGetContainingTitle(out containingTitle))
			{
				parentContext = Strings.ksScriptureTitle;
				footnoteRef = footnote.OwnOrd.ToString(CultureInfo.InvariantCulture);
			}
			return String.Format("{0} {1}({2})", parentContext, Strings.ksScriptureFootnote, footnoteRef);
		}
Example #35
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Delete all footnotes between firstFootnoteToDelete and lastFootnoteToDelete.
		/// </summary>
		/// <remarks>Use this version of DeleteFootnotes() when there is no need to clean up
		/// ORCs in corresponding BTs, such as when the deletion being performed is deleting
		/// only entire paragraphs.</remarks>
		/// <param name="book">Book that contains the sections to delete</param>
		/// <param name="firstFootnoteToDelete">First footnote that will be deleted
		/// (might be null).</param>
		/// <param name="lastFootnoteToDelete">Last footnote that will be deleted
		/// (might be null).</param>
		/// ------------------------------------------------------------------------------------
		private void DeleteFootnotes(IScrBook book, IScrFootnote firstFootnoteToDelete,
			IScrFootnote lastFootnoteToDelete)
		{
			DeleteFootnotes(book, firstFootnoteToDelete, lastFootnoteToDelete, null, null);
		}
Example #36
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Delete all footnotes between firstFootnoteToDelete and lastFootnoteToDelete. Clean
		/// up BT ORCs for the paragraphs specified.
		/// </summary>
		/// <param name="book">Book that contains the sections to delete</param>
		/// <param name="firstFootnoteToDelete">First footnote that will be deleted
		/// (might be null).</param>
		/// <param name="lastFootnoteToDelete">Last footnote that will be deleted
		/// (might be null).</param>
		/// <param name="firstPara">First (possibly partial) paragraph being deleted that
		/// might contain ORCs for the first footnotes. Any footnotes being deleted whose ORCs
		/// are in this paragraph will have their corresponding BT ORCs removed as well.
		/// If zero, we don't bother to remove any corresponding BT ORCs in the first para.</param>
		/// <param name="lastPara">Last (possibly partial) paragraph being deleted that
		/// might contain ORCs for the last footnotes. Any footnotes being deleted whose ORCs
		/// are in this paragraph will have their corresponding BT ORCs removed as well.
		/// If zero, we don't bother to remove any corresponding BT ORCs in the last para.</param>
		/// ------------------------------------------------------------------------------------
		private void DeleteFootnotes(IScrBook book, IScrFootnote firstFootnoteToDelete,
			IScrFootnote lastFootnoteToDelete, IStTxtPara firstPara, IStTxtPara lastPara)
		{
			Debug.Assert((firstFootnoteToDelete == null && lastFootnoteToDelete == null)
				|| (firstFootnoteToDelete != null && lastFootnoteToDelete != null));

			if (firstFootnoteToDelete != null)
			{
				int lastFootnote = lastFootnoteToDelete.IndexInOwner;
				int firstFootnote = firstFootnoteToDelete.IndexInOwner;
				for (int i = lastFootnote; i >= firstFootnote; i--)
				{
					// This code fixes TE-4882.
					IScrFootnote footnote = book.FootnotesOS[i];
					book.FootnotesOS.Remove(footnote);
				}
			}
		}
Example #37
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Constructor for the FootnoteInfo structure
		/// </summary>
		/// <param name="scrFootnote">given footnote</param>
		/// ------------------------------------------------------------------------------------
		public FootnoteInfo(IScrFootnote scrFootnote)
		{
			footnote = scrFootnote;
			IStPara para = footnote.ParagraphsOS[0];
			if (para.StyleRules != null)
			{
				paraStylename = para.StyleRules.GetStrPropValue((int)FwTextPropType.ktptNamedStyle);
			}
			else
			{
				paraStylename = null;
				Debug.Fail("StyleRules should never be null.");
			}
		}
Example #38
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Constructor for the FootnoteInfo structure
		/// </summary>
		/// <param name="scrFootnote">given footnote</param>
		/// <param name="sParaStylename">paragraph style of the footnote</param>
		/// ------------------------------------------------------------------------------------
		public FootnoteInfo(IScrFootnote scrFootnote, string sParaStylename)
		{
			footnote = scrFootnote;
			paraStylename = sParaStylename;
		}
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Create a paragraph with the given text, and append it to the given footnote's
		/// content.
		/// </summary>
		/// <param name="footnote">footnote to append to</param>
		/// <param name="format">(See CreateText for the definition of the format string)</param>
		/// <param name="ws">writing system for the paragraph text</param>
		/// <returns>the new paragraph</returns>
		/// ------------------------------------------------------------------------------------
		private IScrTxtPara AppendParagraph(IScrFootnote footnote, string format, int ws)
		{
			// insert a new para in the footnote
			IScrTxtPara para = (IScrTxtPara)AddParaToMockedText(footnote, "Note General Paragraph");
			para.Contents = CreateFormatText(null, para.Contents.GetBldr(), format, ws);
			return para;
		}
Example #40
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Write all the paragraphs in the given footnote.
		/// </summary>
		/// ------------------------------------------------------------------------------------
		private void ExportFootnote(IScrFootnote scrFootnote)
		{
			m_footnoteIndex = scrFootnote.IndexInOwner + 1;
			// TE allows only one paragraph in a footnote!
			Debug.Assert(scrFootnote.ParagraphsOS.Count < 2);
			foreach (IStTxtPara para in scrFootnote.ParagraphsOS)
				ExportParagraph(para, null, false);
			m_footnoteIndex = -1;
		}
Example #41
0
		/// <summary>
		/// Executes in two distinct scenarios.
		///
		/// 1. If disposing is true, the method has been called directly
		/// or indirectly by a user's code via the Dispose method.
		/// Both managed and unmanaged resources can be disposed.
		///
		/// 2. If disposing is false, the method has been called by the
		/// runtime from inside the finalizer and you should not reference (access)
		/// other managed objects, as they already have been garbage collected.
		/// Only unmanaged resources can be disposed.
		/// </summary>
		/// <param name="disposing"></param>
		/// <remarks>
		/// If any exceptions are thrown, that is fine.
		/// If the method is being done in a finalizer, it will be ignored.
		/// If it is thrown by client code calling Dispose,
		/// it needs to be handled by fixing the bug.
		///
		/// If subclasses override this method, they should call the base implementation.
		/// </remarks>
		protected virtual void Dispose(bool disposing)
		{
			Debug.WriteLineIf(!disposing, "****** Missing Dispose() call for " + GetType().Name + ". ****** ");
			// Must not be run more than once.
			if (m_isDisposed)
				return;

			if (disposing)
			{
				// Dispose managed resources here.
				var disposable = m_pauseEvent as IDisposable;
				if (disposable != null)
					disposable.Dispose();
			}

			// Dispose unmanaged resources here, whether disposing is true or false.
			m_ParaBldr = null;
			m_cache = null;
			m_styleSheet = null;
			m_scr = null;
			m_undoManager = null;
			m_importCallbacks = null;
			m_ScrSectionHeadParaProxy = null;
			m_DefaultIntroSectionHeadParaProxy = null;
			m_DefaultScrParaProxy = null;
			m_DefaultIntroParaProxy = null;
			m_BTStrBldrs = null;
			m_SavedParaBldr = null;
			m_CurrFootnote = null;
			m_ttpChapterNumber = null;
			m_sPrevBook = null;
			m_scrBook = null;
			m_currSection = null;

			m_isDisposed = true;
		}
Example #42
0
		public void DeleteFootnoteFromContextMenuRangeSelection()
		{
			SelectionHelper selHelper = new SelectionHelper();
			selHelper.AssocPrev = true;
			selHelper.NumberOfLevels = 3;

			SelLevInfo[] anchorLevInfo = new SelLevInfo[3];
			anchorLevInfo[2].tag = m_footnoteView.BookFilter.Tag;
			anchorLevInfo[2].ihvo = 1;
			anchorLevInfo[1].tag = ScrBookTags.kflidFootnotes;
			anchorLevInfo[1].ihvo = 2;
			anchorLevInfo[0].tag = StTextTags.kflidParagraphs;
			anchorLevInfo[0].ihvo = 0;
			selHelper.SetLevelInfo(SelectionHelper.SelLimitType.Anchor, anchorLevInfo);
			selHelper.IchAnchor = 1;
			selHelper.SetTextPropId(SelectionHelper.SelLimitType.Anchor, StTxtParaTags.kflidContents);

			SelLevInfo[] endLevInfo = new SelLevInfo[3];
			endLevInfo[2].tag = m_footnoteView.BookFilter.Tag;
			endLevInfo[2].ihvo = 1;
			endLevInfo[1].tag = ScrBookTags.kflidFootnotes;
			endLevInfo[1].ihvo = 6;
			endLevInfo[0].tag = StTextTags.kflidParagraphs;
			endLevInfo[0].ihvo = 0;
			selHelper.SetLevelInfo(SelectionHelper.SelLimitType.End, endLevInfo);
			selHelper.IchEnd = 7;
			selHelper.SetTextPropId(SelectionHelper.SelLimitType.End, StTxtParaTags.kflidContents);

			// Now that all the preparation to set the selection is done, set it.
			selHelper.SetSelection(m_footnoteView, true, true);
			Application.DoEvents();

			// First get the footnotes we're deleting.
			IScrFootnote[] footnotes = new IScrFootnote[5];
			Guid[] guidFootnotes = new Guid[5];
			IStTxtPara[] paras = new IStTxtPara[5];
			for (int i = 0; i < 5; i++)
			{
				footnotes[i] = Cache.ServiceLocator.GetInstance<IScrFootnoteRepository>().GetObject(m_Jude.FootnotesOS[i + 2].Hvo);
				guidFootnotes[i] = footnotes[i].Guid;
				paras[i] = footnotes[i].ParaContainingOrcRA;
			}

			m_footnoteView.DeleteFootnote();

			foreach (IScrFootnote footnote in footnotes)
				Assert.IsFalse(footnote.IsValidObject);

			// now make sure that we don't find the footnote markers
			for (int i = 0; i < 5; i++)
			{
				VerifyRemovedFootnoteMarker(paras[i], guidFootnotes[i]);
				VerifyRemovedFootnoteMarker(paras[i], guidFootnotes[i], m_wsEn);
				VerifyRemovedFootnoteMarker(paras[i], guidFootnotes[i], m_wsDe);
			}
		}
Example #43
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Call the ExportFootnote method
		/// </summary>
		/// <param name="footnote">The footnote.</param>
		/// <param name="wsBt">The writing system of the back translation to export.</param>
		/// ------------------------------------------------------------------------------------
		public void CallExportFootnote(IScrFootnote footnote, int wsBt)
		{
			m_rtfStyleTable.ConnectStyles();
			base.ExportFootnote(footnote, wsBt);
		}
Example #44
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// A helper method for book merger tests-
		/// Verifies the contents of the given difference
		/// for a one-sided subDiff representing a footnote in the Revision.
		/// </summary>
		/// ------------------------------------------------------------------------------------
		public static void VerifySubDiffFootnoteRev(Difference rootDiff, int iSubDiff,
			IScrFootnote footnoteRev)
		{
			Difference subDiff = rootDiff.SubDiffsForORCs[iSubDiff];
			// verify the basics
			Assert.AreEqual(0, subDiff.RefStart);
			Assert.AreEqual(0, subDiff.RefEnd);
			Assert.AreEqual(DifferenceType.NoDifference, subDiff.DiffType);

			// the Current para stuff
			Assert.AreEqual(null, subDiff.ParaCurr);
			Assert.AreEqual(0, subDiff.IchMinCurr);
			Assert.AreEqual(0, subDiff.IchLimCurr);

			// the Revision para stuff
			Assert.AreEqual(((IScrTxtPara)footnoteRev.ParagraphsOS[0]), subDiff.ParaRev);
			Assert.AreEqual(0, subDiff.IchMinRev);
			Assert.AreEqual(((IScrTxtPara)footnoteRev.ParagraphsOS[0]).Contents.Length, subDiff.IchLimRev);

			// style names should be null
			Assert.IsNull(subDiff.StyleNameCurr);
			Assert.IsNull(subDiff.StyleNameRev);

			// section stuff should be null
			Assert.IsNull(subDiff.SectionsRev);
			Assert.IsNull(subDiff.SectionsCurr);

			// subDiffs may not have subDiffs, so far
			Assert.IsNull(subDiff.SubDiffsForORCs);

			//check the root difference for consistency with this subDiff
			Assert.IsTrue(rootDiff.DiffType == DifferenceType.TextDifference ||
				rootDiff.DiffType == DifferenceType.FootnoteMissingInCurrent);
		}
Example #45
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// A helper method for book merger tests-
		/// Verifies the contents of the given sub-difference
		/// for a two-sided subDiff representing a text comparison. This overload does not
		/// check for the starting and ending references for sub-diffs that are created without
		/// that information.
		/// </summary>
		/// <param name="rootDiff">The root difference.</param>
		/// <param name="iSubDiff">The sub difference to verify.</param>
		/// <param name="subDiffType">Type of the sub difference.</param>
		/// <param name="footnoteCurr">The footnote curr.</param>
		/// <param name="ichMinCurr">The beginning character offset of the difference in the
		/// current.</param>
		/// <param name="ichLimCurr">The ending character offset of the difference in the
		/// current.</param>
		/// <param name="footnoteRev">The footnote rev.</param>
		/// <param name="ichMinRev">The beginning character offset of the difference in the
		/// revision.</param>
		/// <param name="ichLimRev">The ending character offset of the difference in the
		/// current.</param>
		/// <remarks>char styles are not verified here; test code should just check
		/// those directly if relevant</remarks>
		/// ------------------------------------------------------------------------------------
		public static void VerifySubDiffFootnote(Difference rootDiff, int iSubDiff,
			DifferenceType subDiffType,
			IScrFootnote footnoteCurr, int ichMinCurr, int ichLimCurr,
			IScrFootnote footnoteRev, int ichMinRev, int ichLimRev)
		{
			Difference subDiff = rootDiff.SubDiffsForORCs[iSubDiff];
			// the Current para stuff
			Assert.AreEqual((footnoteCurr != null) ? footnoteCurr.ParagraphsOS[0] : null, subDiff.ParaCurr);
			Assert.AreEqual(ichMinCurr, subDiff.IchMinCurr);
			Assert.AreEqual(ichLimCurr, subDiff.IchLimCurr);

			// the Revision para stuff
			Assert.AreEqual((footnoteRev != null) ? footnoteRev.ParagraphsOS[0] : null, subDiff.ParaRev);
			Assert.AreEqual(ichMinRev, subDiff.IchMinRev);
			Assert.AreEqual(ichLimRev, subDiff.IchLimRev);

			// section stuff should be null
			Assert.IsNull(subDiff.SectionsRev);
			Assert.IsNull(subDiff.SectionsCurr);

			// subDiffs may not have subDiffs, so far
			Assert.IsNull(subDiff.SubDiffsForORCs);
			Assert.IsNull(subDiff.SubDiffsForParas);

			Assert.AreEqual(subDiffType, subDiff.DiffType);
		}
Example #46
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Write the first paragraph in the given footnote.  (TE allows only 1 paragraph in
		/// footnotes!)
		/// </summary>
		/// ------------------------------------------------------------------------------------
		private void ExportFootnote(IScrFootnote foot)
		{
			IStTxtPara para = foot.ParagraphsOS[0] as IStTxtPara;
			string sStyle = para.StyleName;
			if (String.IsNullOrEmpty(sStyle))
				sStyle = "scrFootnote";
			else
				sStyle = m_xhtml.GetValidCssClassName(sStyle);
			ITsStrBldr bldr = foot.MakeFootnoteMarker(m_cache.DefaultVernWs);
			string sFootnoteMarker = bldr.Text;
			ITsString tssPara = para.Contents;
			m_writer.WriteLine("<span class=\"{0}\" id=\"{1}\" title=\"{2}\">",
				sStyle, "F" + foot.Guid.ToString().ToUpperInvariant(), sFootnoteMarker);
			m_xhtml.MapCssToLang(sStyle, LanguageCode(TsStringUtils.GetWsAtOffset(tssPara, 0)));
			WriteTsStringAsXml(tssPara, 4);
			m_writer.WriteLine("</span>");
			// The following class is inserted by the XSLT processing.
			m_xhtml.MapCssToLang("scrFootnoteMarker", LanguageCode(m_cache.DefaultVernWs));
		}
Example #47
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Export a footnote object.
		/// </summary>
		/// <param name="footnote">the footnote</param>
		/// <param name="exportMode">The export mode.</param>
		/// <param name="iWs">index into the available analysis writing systems (should be -1 if
		/// exportMode is ExportMode.VernacularOnly</param>
		/// ------------------------------------------------------------------------------------
		private void ExportFootnote(IScrFootnote footnote, ExportMode exportMode, int iWs)
		{
			int nParas = footnote.ParagraphsOS.Count;
			Debug.Assert(nParas > 0);

			string paraStyleName = null;
			string footnoteMarker = null;
			ITsString tss;
			bool fNormalCharStyle = false; // whether previous run was a normal character style

			// Eventually we might support multiple paragraphs...
			for (int iPara = 0; iPara < nParas; iPara++)
			{
				// Get the footnote paragraph
				IStTxtPara para = (IStTxtPara)footnote.ParagraphsOS[iPara];
				if (iWs == -1) // get the vernacular para
					tss = para.Contents;
				else
				{
					// get the specified back translation
					ICmTranslation trans = para.GetBT();
					int wsAlt = m_requestedAnalWS[iWs];
					tss = (trans != null) ? trans.Translation.get_String(wsAlt) : null;
				}

				if (iPara == 0)
				{
					// Map the style name to a marker.
					paraStyleName = footnote.ParaStyleId;

					// Output the opening sf marker for the footnote.
					string fm = GetMarkerForStyle(paraStyleName).Substring(1);
					if (exportMode == ExportMode.InterleavedVernAndBt && iWs != -1)
						footnoteMarker = kBackTransMarkerPrefix + fm + GetIcuSuffix(iWs);
					else
						footnoteMarker = @"\" + fm;
					string footnoteField = footnoteMarker + " ";

					// Output the footnote caller (footnote marker type or literal marker)
					string sCaller;
					switch (m_scr.DetermineFootnoteMarkerType(paraStyleName))
					{
						// output character specified by USFM 2.0 standard
						case FootnoteMarkerTypes.AutoFootnoteMarker:
							sCaller = "+";
							break;
						case FootnoteMarkerTypes.NoFootnoteMarker:
							sCaller = "-";
							break;
						case FootnoteMarkerTypes.SymbolicFootnoteMarker:
						default:
							sCaller = m_scr.DetermineFootnoteMarkerSymbol(paraStyleName);
							break;
					}
					footnoteField += sCaller + " ";
					if (MarkupSystem == MarkupType.Paratext)
						m_file.Write(footnoteField);
					else
					{
						m_file.WriteLine();
						m_file.WriteLine(footnoteField);
					}
					// Output the chapter/verse reference if the footnote displays it.
					// But never output the ref for footnotes in a title or section heading.
					// And never output the ref for footnotes in an intro paragraph (which will
					// be the case when the verse number is zero).
					string reference = footnote.RefAsString;
					if (footnote.DisplayFootnoteReference && reference != null && reference != string.Empty)
					{
						bool dummy = false;
						OutputFootnoteCharStyleRun(footnote.ParaStyleId, true,
							ScrStyleNames.FootnoteTargetRef, reference, exportMode, iWs, ref dummy,
							ref fNormalCharStyle);
					}
					// ENHANCE: First run of footnote paragraph may not be normal footnote text; If it is
					// a general character style (or default para chars), we want to precede it with an \ft;
					// but if it's a footnote character style, we don't. In order to know the difference,
					// we would need to access the stylesheet to get the context, so for now we'll just
					// output the \ft all the time since it doesn't seem to cause any problems in Paratext.
					//if (MarkupSystem == MarkupType.Paratext)
					//    OutputFootnoteCharStyleRun(footnote.ParaStyleId, ksDefaultFootnoteCharacters, string.Empty);
				}

				if (tss == null)
				{
					Debug.Assert(iWs != -1, "tss can only be null if this is a BT export (this footnote never had a BT created)");
					continue;
				}

				// Flag indicating whether we're already in the context of an \ft, \fk, fqa, \xt, etc. field
				bool fInFootnoteContentField = false;

				// Output all of the runs in the footnote string.
				for (int iRun = 0; iRun < tss.RunCount; iRun++)
				{
					ITsTextProps runProps = tss.get_Properties(iRun);
					string runText = tss.get_RunText(iRun);
					if (runText == null)
						continue;
					string styleName = runProps.GetStrPropValue(
						(int)FwTextPropType.ktptNamedStyle);

					// Output the run text within char style markers
					if (styleName == null)
					{
						if (fInFootnoteContentField)
						{
							// If we are in a footnote content field in Paratext format and
							// the previous run was not a standard character style,
							// then we need to insert a marker to indicate the next content field.
							if (MarkupSystem == MarkupType.Paratext && !fNormalCharStyle)
							{
								Debug.Assert(paraStyleName != null);
								Debug.Assert(m_markerMappings.ContainsKey(paraStyleName + "\uffff" +
									ksDefaultFootnoteCharacters));
								m_file.Write(m_markerMappings[paraStyleName + "\uffff" +
									ksDefaultFootnoteCharacters] + " ");
							}
							m_file.Write(runText);
						}
						else
						{
							OutputFootnoteCharStyleRun(footnote.ParaStyleId, true,
								ksDefaultFootnoteCharacters, runText, exportMode, iWs,
								ref fInFootnoteContentField, ref fNormalCharStyle);
						}
					}
					else
					{
						// if the style has a customized mapping based on the type of the
						// note (either General Footnote or Cross-Reference), use it.
						bool fLookupBasedOnParaStyleContext = m_markerMappings.ContainsKey(
							paraStyleName + "\uffff" + styleName);
						OutputFootnoteCharStyleRun(footnote.ParaStyleId, fLookupBasedOnParaStyleContext,
							styleName, runText, exportMode, iWs, ref fInFootnoteContentField,
							ref fNormalCharStyle);
					}
				}
			}

			// if there were no paragraphs for the footnote, bail out, nothing happened
			if (nParas == 0)
				return;

			// Close the footnote - Paratext markup needs an end marker
			if (MarkupSystem == MarkupType.Paratext)
				m_file.Write(footnoteMarker + "*");
		}
Example #48
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Gets the referenced footnote given the properties of a back translation text run
		/// containing an Object Replacement Character (ORC).
		/// </summary>
		/// <param name="ttp">The text properties of the footnote.</param>
		/// <param name="footnote">[out] footnote referenced in the text properties or null
		/// if footnote is not found.</param>
		/// <returns><c>true</c> if the footnote was located; <c>false</c> otherwise</returns>
		/// ------------------------------------------------------------------------------------
		private bool GetReferencedFootnote(ITsTextProps ttp, out IScrFootnote footnote)
		{
			FwObjDataTypes odt;
			Guid footnoteRef = TsStringUtils.GetGuidFromProps(ttp,
				new FwObjDataTypes[] { FwObjDataTypes.kodtNameGuidHot }, out odt);
			Debug.Assert(footnoteRef != Guid.Empty, "Unable to find referenced footnote.");
			return m_cache.ServiceLocator.GetInstance<IScrFootnoteRepository>().TryGetFootnote(
				footnoteRef, out footnote);
		}