public void CombinedParaOperationsFdo() { // Set up a simple multi-para layout using the ObjSeq2 and SimpleThree properties of MockData1 AssembledStyles styles = new AssembledStyles(); var root = new RootBoxFdo(styles); var text = Cache.ServiceLocator.GetInstance <ITextFactory>().Create(); //Cache.LangProject.TextsOC.Add(text); var owner = Cache.ServiceLocator.GetInstance <IStTextFactory>().Create(); text.ContentsOA = owner; IStTxtPara p1 = MakePara(owner, "Hello World"); var p2 = MakePara(owner, "This is a test"); m_actionHandler.EndUndoTask(); // Finish settin up data, we want to control from now on. var po = new StTextParagraphOperations(owner); root.Builder.Show(Display.Of(() => owner.ParagraphsOS).Using((builder, para) => builder.AddString(() => ((IStTxtPara)para).Contents)).EditParagraphsUsing(po)); SetupFakeRootSite(root); var layoutInfo = HookupTests.MakeLayoutInfo(int.MaxValue / 2, m_gm.VwGraphics, 55); root.Layout(layoutInfo); var ip = root.FirstBox.SelectAtEnd(); // Insert at end of paragraph. m_actionHandler.BeginUndoTask("undo insert line break", "redo insert"); ip.InsertLineBreak(); m_actionHandler.EndUndoTask(); Assert.That(owner.ParagraphsOS.Count, Is.EqualTo(3)); Assert.That(owner.ParagraphsOS[0], Is.EqualTo(p1)); Assert.That(owner.ParagraphsOS[2], Is.EqualTo(p2)); var p3 = (IStTxtPara)owner.ParagraphsOS[1]; // empty inserted paragraph. Assert.That(p3.Contents.Length, Is.EqualTo(0)); Assert.That(p3.Contents.get_WritingSystem(0), Is.EqualTo(Cache.DefaultVernWs)); ((MockSite)root.Site).DoPendingAfterNotificationTasks(); ip = (InsertionPoint)root.Selection; Assert.That(root.FirstBox.Next.Next, Is.Not.Null); Assert.That(ip.StringPosition, Is.EqualTo(0)); Assert.That(ip.Para, Is.EqualTo(root.FirstBox.Next)); // Insert at start of paragraph. To make it unambiguously the start, give p3 some data, // and since that might eventually destroy the selection, reset it. var rootHookup = ip.Hookup.ParentHookup.ParentHookup; // StringHookup, ItemHookup, Sequence UndoableUnitOfWorkHelper.Do("adjust contents", "redo", m_actionHandler, () => p3.Contents = Cache.TsStrFactory.MakeString("First insert", Cache.DefaultVernWs)); ip = (InsertionPoint)SelectionBuilder.In(rootHookup)[1].Offset(0).Install(); m_actionHandler.BeginUndoTask("undo insert line break", "redo insert"); ip.InsertLineBreak(); m_actionHandler.EndUndoTask(); Assert.That(owner.ParagraphsOS.Count, Is.EqualTo(4)); Assert.That(owner.ParagraphsOS[0], Is.EqualTo(p1)); Assert.That(owner.ParagraphsOS[2], Is.EqualTo(p3)); Assert.That(owner.ParagraphsOS[3], Is.EqualTo(p2)); var p4 = (IStTxtPara)owner.ParagraphsOS[1]; // empty inserted paragraph (before p3). Assert.That(root.FirstBox.Next.Next.Next, Is.Not.Null); Assert.That(p4.Contents.get_WritingSystem(0), Is.EqualTo(Cache.DefaultVernWs)); ((MockSite)root.Site).DoPendingAfterNotificationTasks(); ip = (InsertionPoint)root.Selection; Assert.That(ip.StringPosition, Is.EqualTo(0)); Assert.That(ip.Para, Is.EqualTo(root.FirstBox.Next.Next)); // Split a paragraph. var oldObjects = owner.ParagraphsOS.ToArray(); ip = (InsertionPoint)SelectionBuilder.In(rootHookup)[2].Offset("First ".Length).Install(); m_actionHandler.BeginUndoTask("undo insert line break", "redo insert"); ip.InsertLineBreak(); m_actionHandler.EndUndoTask(); Assert.That(owner.ParagraphsOS.Count, Is.EqualTo(5)); Assert.That(owner.ParagraphsOS[1], Is.EqualTo(oldObjects[1])); Assert.That(owner.ParagraphsOS[2], Is.EqualTo(oldObjects[2])); Assert.That(owner.ParagraphsOS[4], Is.EqualTo(oldObjects[3])); // insert between 2 and 3 var p5 = (IStTxtPara)owner.ParagraphsOS[3]; // inserted paragraph. ((MockSite)root.Site).DoPendingAfterNotificationTasks(); ip = (InsertionPoint)root.Selection; Assert.That(ip.StringPosition, Is.EqualTo(0)); Assert.That(ip.Para, Is.EqualTo(root.FirstBox.Next.Next.Next)); Assert.That(((IStTxtPara)owner.ParagraphsOS[2]).Contents.Text, Is.EqualTo("First ")); Assert.That(((IStTxtPara)owner.ParagraphsOS[3]).Contents.Text, Is.EqualTo("insert")); // Combine two paragraphs by backspace at start of line. oldObjects = owner.ParagraphsOS.ToArray(); m_actionHandler.BeginUndoTask("undo backspace", "redo backspace"); ip.Backspace(); m_actionHandler.EndUndoTask(); Assert.That(owner.ParagraphsOS.Count, Is.EqualTo(4)); Assert.That(owner.ParagraphsOS[1], Is.EqualTo(oldObjects[1])); Assert.That(owner.ParagraphsOS[2], Is.EqualTo(oldObjects[2])); Assert.That(owner.ParagraphsOS[3], Is.EqualTo(oldObjects[4])); // delete item 3 ((MockSite)root.Site).DoPendingAfterNotificationTasks(); ip = (InsertionPoint)root.Selection; Assert.That(ip.StringPosition, Is.EqualTo("First ".Length)); Assert.That(ip.Para, Is.EqualTo(root.FirstBox.Next.Next)); Assert.That(((IStTxtPara)owner.ParagraphsOS[2]).Contents.Text, Is.EqualTo("First insert")); }
public void CombinedParaOperationsFdo() { // Set up a simple multi-para layout using the ObjSeq2 and SimpleThree properties of MockData1 AssembledStyles styles = new AssembledStyles(); var root = new RootBoxFdo(styles); var text = Cache.ServiceLocator.GetInstance<ITextFactory>().Create(); //Cache.LangProject.TextsOC.Add(text); var owner = Cache.ServiceLocator.GetInstance<IStTextFactory>().Create(); text.ContentsOA = owner; IStTxtPara p1 = MakePara(owner, "Hello World"); var p2 = MakePara(owner,"This is a test"); m_actionHandler.EndUndoTask(); // Finish settin up data, we want to control from now on. var po = new StTextParagraphOperations(owner); root.Builder.Show(Display.Of(() => owner.ParagraphsOS).Using((builder, para) => builder.AddString(() => ((IStTxtPara)para).Contents)).EditParagraphsUsing(po)); SetupFakeRootSite(root); var layoutInfo = HookupTests.MakeLayoutInfo(int.MaxValue / 2, m_gm.VwGraphics, 55); root.Layout(layoutInfo); var ip = root.FirstBox.SelectAtEnd(); // Insert at end of paragraph. m_actionHandler.BeginUndoTask("undo insert line break", "redo insert"); ip.InsertLineBreak(); m_actionHandler.EndUndoTask(); Assert.That(owner.ParagraphsOS.Count, Is.EqualTo(3)); Assert.That(owner.ParagraphsOS[0], Is.EqualTo(p1)); Assert.That(owner.ParagraphsOS[2], Is.EqualTo(p2)); var p3 = (IStTxtPara)owner.ParagraphsOS[1]; // empty inserted paragraph. Assert.That(p3.Contents.Length, Is.EqualTo(0)); Assert.That(p3.Contents.get_WritingSystem(0), Is.EqualTo(Cache.DefaultVernWs)); ((MockSite)root.Site).DoPendingAfterNotificationTasks(); ip = (InsertionPoint)root.Selection; Assert.That(root.FirstBox.Next.Next, Is.Not.Null); Assert.That(ip.StringPosition, Is.EqualTo(0)); Assert.That(ip.Para, Is.EqualTo(root.FirstBox.Next)); // Insert at start of paragraph. To make it unambiguously the start, give p3 some data, // and since that might eventually destroy the selection, reset it. var rootHookup = ip.Hookup.ParentHookup.ParentHookup; // StringHookup, ItemHookup, Sequence UndoableUnitOfWorkHelper.Do("adjust contents", "redo", m_actionHandler, () => p3.Contents = Cache.TsStrFactory.MakeString("First insert", Cache.DefaultVernWs)); ip = (InsertionPoint)SelectionBuilder.In(rootHookup)[1].Offset(0).Install(); m_actionHandler.BeginUndoTask("undo insert line break", "redo insert"); ip.InsertLineBreak(); m_actionHandler.EndUndoTask(); Assert.That(owner.ParagraphsOS.Count, Is.EqualTo(4)); Assert.That(owner.ParagraphsOS[0], Is.EqualTo(p1)); Assert.That(owner.ParagraphsOS[2], Is.EqualTo(p3)); Assert.That(owner.ParagraphsOS[3], Is.EqualTo(p2)); var p4 = (IStTxtPara)owner.ParagraphsOS[1]; // empty inserted paragraph (before p3). Assert.That(root.FirstBox.Next.Next.Next, Is.Not.Null); Assert.That(p4.Contents.get_WritingSystem(0), Is.EqualTo(Cache.DefaultVernWs)); ((MockSite)root.Site).DoPendingAfterNotificationTasks(); ip = (InsertionPoint)root.Selection; Assert.That(ip.StringPosition, Is.EqualTo(0)); Assert.That(ip.Para, Is.EqualTo(root.FirstBox.Next.Next)); // Split a paragraph. var oldObjects = owner.ParagraphsOS.ToArray(); ip = (InsertionPoint)SelectionBuilder.In(rootHookup)[2].Offset("First ".Length).Install(); m_actionHandler.BeginUndoTask("undo insert line break", "redo insert"); ip.InsertLineBreak(); m_actionHandler.EndUndoTask(); Assert.That(owner.ParagraphsOS.Count, Is.EqualTo(5)); Assert.That(owner.ParagraphsOS[1], Is.EqualTo(oldObjects[1])); Assert.That(owner.ParagraphsOS[2], Is.EqualTo(oldObjects[2])); Assert.That(owner.ParagraphsOS[4], Is.EqualTo(oldObjects[3])); // insert between 2 and 3 var p5 = (IStTxtPara)owner.ParagraphsOS[3]; // inserted paragraph. ((MockSite)root.Site).DoPendingAfterNotificationTasks(); ip = (InsertionPoint)root.Selection; Assert.That(ip.StringPosition, Is.EqualTo(0)); Assert.That(ip.Para, Is.EqualTo(root.FirstBox.Next.Next.Next)); Assert.That(((IStTxtPara)owner.ParagraphsOS[2]).Contents.Text, Is.EqualTo("First ")); Assert.That(((IStTxtPara)owner.ParagraphsOS[3]).Contents.Text, Is.EqualTo("insert")); // Combine two paragraphs by backspace at start of line. oldObjects = owner.ParagraphsOS.ToArray(); m_actionHandler.BeginUndoTask("undo backspace", "redo backspace"); ip.Backspace(); m_actionHandler.EndUndoTask(); Assert.That(owner.ParagraphsOS.Count, Is.EqualTo(4)); Assert.That(owner.ParagraphsOS[1], Is.EqualTo(oldObjects[1])); Assert.That(owner.ParagraphsOS[2], Is.EqualTo(oldObjects[2])); Assert.That(owner.ParagraphsOS[3], Is.EqualTo(oldObjects[4])); // delete item 3 ((MockSite)root.Site).DoPendingAfterNotificationTasks(); ip = (InsertionPoint)root.Selection; Assert.That(ip.StringPosition, Is.EqualTo("First ".Length)); Assert.That(ip.Para, Is.EqualTo(root.FirstBox.Next.Next)); Assert.That(((IStTxtPara)owner.ParagraphsOS[2]).Contents.Text, Is.EqualTo("First insert")); }