public void MultiParaCopy() { var styles = new AssembledStyles(); var root = new RootBoxFdo(styles); var owner = new MockData1(23, 23); var mock1 = new MockData1(23, 23); var mock2 = new MockData1(23, 23); var mock3 = new MockData1(23, 23); owner.InsertIntoObjSeq1(0, mock1); owner.InsertIntoObjSeq1(1, mock2); owner.InsertIntoObjSeq1(2, mock3); mock1.SimpleThree = "This is the"; mock2.SimpleThree = "day that the"; mock3.SimpleThree = "Lord has made"; var engine = new FakeRenderEngine() { Ws = 23, SegmentHeight = 13 }; var factory = new FakeRendererFactory(); factory.SetRenderer(23, engine); var layoutInfo = HookupTests.MakeLayoutInfo(int.MaxValue / 2, m_gm.VwGraphics, 23); PaintTransform ptrans = new PaintTransform(2, 2, 96, 96, 0, 0, 96, 96); MockSite site = new MockSite(); site.m_transform = ptrans; site.m_vwGraphics = m_gm.VwGraphics; root.Site = site; var po = new MockReceiveParagraphOperations(); root.Builder.Show(Display.Of(() => owner.ObjSeq1).Using((bldr, md) => bldr.AddString(() => md.SimpleThree, 23)) .EditParagraphsUsing(po)); var layoutArgs = MakeLayoutInfo(Int32.MaxValue / 2, m_gm.VwGraphics, factory); root.Layout(layoutArgs); int x = FakeRenderEngine.SimulatedWidth("This ") + 2; var location = new Point(x, 8); Clipboard.SetDataObject(""); MouseEventArgs e = new MouseEventArgs(MouseButtons.Left, 1, location.X, location.Y, 0); root.OnMouseDown(e, Keys.None, site.m_vwGraphics, site.m_transform); Assert.That(root.CanCopy(), Is.EqualTo(false), "Should not be able to copy"); x = FakeRenderEngine.SimulatedWidth("Lord") + 2; location = new Point(x, 29); e = new MouseEventArgs(MouseButtons.Left, 1, location.X, location.Y, 0); root.OnMouseMove(e, Keys.None, site.m_vwGraphics, site.m_transform); Assert.That(root.CanCopy(), Is.EqualTo(true), "Should be able to copy"); root.OnEditCopy(); Assert.That(owner.ObjSeq1[0].SimpleThree + owner.ObjSeq1[1].SimpleThree + owner.ObjSeq1[2].SimpleThree, Is.EqualTo("This is the" + "day that the" + "Lord has made")); Assert.That(Clipboard.GetDataObject().GetData(DataFormats.StringFormat), Is.EqualTo("is the\r\nday that the\r\nLord"), "Selected String should be \"is the\nday that the\nLord \""); }
public void CombinedParaOperations() { // Set up a simple multi-para layout using the ObjSeq2 and SimpleThree properties of MockData1 AssembledStyles styles = new AssembledStyles(); RootBox root = new RootBoxFdo(styles); var owner = new MockData1(); var p1 = new MockData1(10, 11); var p2 = new MockData1(10, 11); p1.SimpleThree = "Hello World"; p2.SimpleThree = "This is a test"; owner.ObjSeq2.Add(p1); owner.ObjSeq2.Add(p2); var po = new MockReceiveParagraphOperations(); root.Builder.Show(Display.Of(() => owner.ObjSeq2) .Using((builder, para) => builder.AddString(() => para.SimpleThree, 10)) .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. ip.InsertLineBreak(); Assert.That(owner.ObjSeq2.Count, Is.EqualTo(3)); Assert.That(owner.ObjSeq2[0], Is.EqualTo(p1)); Assert.That(owner.ObjSeq2[2], Is.EqualTo(p2)); var p3 = owner.ObjSeq2[1]; // empty inserted paragraph. ((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 p3.SimpleThree = "First insert"; ip = (InsertionPoint)SelectionBuilder.In(rootHookup)[1].Offset(0).Install(); ip.InsertLineBreak(); Assert.That(owner.ObjSeq2.Count, Is.EqualTo(4)); Assert.That(owner.ObjSeq2[0], Is.EqualTo(p1)); Assert.That(owner.ObjSeq2[2], Is.EqualTo(p3)); Assert.That(owner.ObjSeq2[3], Is.EqualTo(p2)); var p4 = owner.ObjSeq2[1]; // empty inserted paragraph (before p3). Assert.That(root.FirstBox.Next.Next.Next, Is.Not.Null); ((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.ObjSeq2.ToArray(); ip = (InsertionPoint)SelectionBuilder.In(rootHookup)[2].Offset("First ".Length).Install(); ip.InsertLineBreak(); Assert.That(owner.ObjSeq2.Count, Is.EqualTo(5)); Assert.That(owner.ObjSeq2[1], Is.EqualTo(oldObjects[1])); Assert.That(owner.ObjSeq2[2], Is.EqualTo(oldObjects[2])); Assert.That(owner.ObjSeq2[4], Is.EqualTo(oldObjects[3])); // insert between 2 and 3 var p5 = owner.ObjSeq2[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(owner.ObjSeq2[2].SimpleThree, Is.EqualTo("First ")); Assert.That(owner.ObjSeq2[3].SimpleThree, Is.EqualTo("insert")); // Combine two paragraphs by backspace at start of line. oldObjects = owner.ObjSeq2.ToArray(); ip.Backspace(); Assert.That(owner.ObjSeq2.Count, Is.EqualTo(4)); Assert.That(owner.ObjSeq2[1], Is.EqualTo(oldObjects[1])); Assert.That(owner.ObjSeq2[2], Is.EqualTo(oldObjects[2])); Assert.That(owner.ObjSeq2[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(owner.ObjSeq2[2].SimpleThree, Is.EqualTo("First insert")); }