public void InsertCharInEmptyLine() { string contents = ""; var engine = new FakeRenderEngine() { Ws = 34, SegmentHeight = 13 }; var factory = new FakeRendererFactory(); factory.SetRenderer(34, engine); var styles = new AssembledStyles().WithWs(34); var clientRuns = new List <IClientRun>(); var run = new StringClientRun(contents, styles); clientRuns.Add(run); var data1 = new MockData1(34, 35); data1.SimpleThree = contents; var source = new TextSource(clientRuns, null); var para = new ParaBox(styles, source); var hookup = new StringHookup(this, () => data1.SimpleThree, hook => data1.SimpleThreeChanged += hook.StringPropChanged, hook => data1.SimpleThreeChanged -= hook.StringPropChanged, para); hookup.Writer = newVal => data1.SimpleThree = newVal; run.Hookup = hookup; var root = new RootBox(styles); var block = new BlockBox(styles, Color.Red, 20000, 10000); root.AddBox(block); root.AddBox(para); var layoutArgs = MakeLayoutInfo(Int32.MaxValue / 2, m_gm.VwGraphics, factory); root.Layout(layoutArgs); Assert.That(root.Height, Is.EqualTo(13 + block.Height)); Assert.That(para.Width, Is.EqualTo(FakeRenderEngine.SimulatedWidth(contents))); Assert.That(root.Width, Is.EqualTo(block.Width)); int simulatedWidth = FakeRenderEngine.SimulatedWidth("x"); Assert.That(root.Width, Is.GreaterThan(para.Width + simulatedWidth)); PaintTransform ptrans = new PaintTransform(2, 4, 96, 100, 0, 10, 120, 128); MockSite site = new MockSite(); site.m_transform = ptrans; site.m_vwGraphics = m_gm.VwGraphics; root.Site = site; var oldRootWidth = root.Width; var ip = root.SelectAtEnd(); ip.InsertText("x"); Assert.That(root.Height, Is.EqualTo(13 + block.Height)); Assert.That(root.Width, Is.EqualTo(oldRootWidth)); Assert.That(para.Width, Is.EqualTo(simulatedWidth)); var expectedInvalidate = new Rectangle(-RootBox.InvalidateMargin, -RootBox.InvalidateMargin + block.Height, simulatedWidth + RootBox.InvalidateMargin * 2, 13 + 2 * RootBox.InvalidateMargin); Assert.That(site.RectsInvalidatedInRoot, Has.Member(expectedInvalidate)); }
public void MakeSimpleRange() { ParaBox para; RootBox root = ParaBuilderTests.MakeTestParaSimpleString(m_gm.VwGraphics, ParaBuilderTests.MockBreakOption.ThreeFullLines, out para); InsertionPoint ip = root.SelectAtEnd(); InsertionPoint ip2 = new InsertionPoint(ip.Hookup, ip.StringPosition - 2, false); RangeSelection range = new RangeSelection(ip, ip2); Assert.AreEqual(ip, range.Anchor); Assert.AreEqual(ip2, range.DragEnd); Assert.That(range.EndBeforeAnchor, Is.True); Assert.That(range.Start, Is.EqualTo(ip2)); Assert.That(range.End, Is.EqualTo(ip)); StringBox first = para.FirstBox as StringBox; StringBox second = para.FirstBox.Next as StringBox; StringBox third = second.Next as StringBox; MockSegment seg3 = third.Segment as MockSegment; seg3.DrawRangeLeft = 17; seg3.DrawRangeRight = 23; PaintTransform ptrans = new PaintTransform(2, 4, 96, 100, 0, 10, 120, 128); range.Draw(m_gm.VwGraphics, ptrans); // All three segments should be invited to draw it, though only one will. // The top of rsSrc gets more negative each line; the destination rectangle where we actually draw keeps getting lower. // Remember the effect of 10 pixels of scroll offset. VerifyRangeSegmentDrawing(para, first, first.Segment as MockSegment, range, -4, -6, 4); VerifyRangeSegmentDrawing(para, second, second.Segment as MockSegment, range, -14, 4, 14); VerifyRangeSegmentDrawing(para, third, seg3, range, -24, 14, 24); }
private void InitLongText() { AssembledStyles styles = new AssembledStyles(); RootBox root = new RootBox(styles); var owner = new ParagraphOwnerDemo(); var words = "This is a bit of text from which we can extract substrings of increasing length to populate various paragraphs in different ways".Split(' '); var sb = new StringBuilder(); for (int i = 0; i < 20; i++) { var para = new ParagraphDemo(); if (i < words.Length) { sb.Append(words[i]); } para.Contents = sb.ToString(); if (i < words.Length) { sb.Append(" "); } owner.InsertParagraph(0, para); } int ws = 1; // arbitrary with default renderer factory. root.Builder.Show(Display.Of(() => owner.Paragraphs).Using( (builder, para) => builder.AddString(() => para.Contents, ws)) .EditParagraphsUsing(new ParagraphOpsDemo(owner))); theSharpView.Root = root; root.SelectAtEnd().Install(); theSharpView.Focus(); }
public void MoveLeft() { ParaBox para; RootBox root = ParaBuilderTests.MakeTestParaSimpleString(m_gm.VwGraphics, ParaBuilderTests.MockBreakOption.ThreeFullLines, out para); InsertionPoint ip = root.SelectAtEnd(); // Todo: try moving left. Eventualy cover various options, such as from start of paragraph, over diacritics, etc. }
public void DrawIP() { ParaBox para; RootBox root = ParaBuilderTests.MakeTestParaSimpleString(m_gm.VwGraphics, ParaBuilderTests.MockBreakOption.ThreeFullLines, out para); InsertionPoint ip = root.SelectAtEnd(); ip.Install(); Assert.AreEqual(ip, root.Selection); Assert.AreEqual(para, ip.Para, "IP should know about the paragraph it is in"); Assert.AreEqual(para.Source.Length, ip.StringPosition, "the IP should be at the end of the paragraph"); Assert.AreEqual(true, ip.AssociatePrevious, "selection at end should always associate previous in non-empty para"); StringBox third = para.FirstBox.Next.Next as StringBox; Assert.IsNotNull(third, "para with three simple lines should have three string boxes"); MockSegment seg3 = third.Segment as MockSegment; Assert.IsNotNull(seg3); PaintTransform ptrans = new PaintTransform(2, 4, 96, 100, 0, -10, 120, 128); ip.Draw(m_gm.VwGraphics, ptrans); StringBox first = para.FirstBox as StringBox; StringBox second = para.FirstBox.Next as StringBox; // All three segments should be invited to draw it, though only one will. var seg1 = first.Segment as MockSegment; VerifySegmentDrawing(para, first, seg1, -4); var seg2 = second.Segment as MockSegment; VerifySegmentDrawing(para, second, seg2, -14); VerifySegmentDrawing(para, third, seg3, -24); seg1.NextPosIpResult = new MockSegment.PositionsOfIpResults(); seg1.NextPosIpResult.PrimaryHere = false; seg2.NextPosIpResult = new MockSegment.PositionsOfIpResults(); seg2.NextPosIpResult.PrimaryHere = false; seg3.NextPosIpResult = new MockSegment.PositionsOfIpResults(); seg3.NextPosIpResult.RectPrimary = new Rect(5, 6, 7, 9); seg3.NextPosIpResult.PrimaryHere = true; Rectangle selRect = ip.GetSelectionLocation(m_gm.VwGraphics, ptrans); // All three should be asked for the position, though only the third returns a useful one. VerifySelLocation(para, first, seg1, -4); VerifySelLocation(para, second, seg2, -14); VerifySelLocation(para, third, seg3, -24); Assert.AreEqual(new Rectangle(5, 6, 2, 3), selRect); // The final thing that goes into drawing IPs is the Invalidate call. MockSite site = new MockSite(); site.m_transform = ptrans; site.m_vwGraphics = m_gm.VwGraphics; root.Site = site; ip.Invalidate(); Assert.IsNotNull(site.GraphicsHolder, "Invalidate should have created a Graphics holder"); Assert.IsTrue(site.GraphicsHolder.WasDisposed, "invalidate should have disposed of the Graphics Holder"); Assert.AreEqual(1, site.RectsInvalidated.Count, "invalidate should have invalidated one rectangle"); Assert.AreEqual(new Rectangle(5, 6, 2, 3), site.RectsInvalidated[0], "invalidate should have invalidated the selection rectangle"); }
private void InitStyledText() { AssembledStyles styles = new AssembledStyles(); RootBox root = new RootBox(styles); root.RendererFactory = theSharpView.RendererFactory; var obj0 = new ParagraphDemo() { Contents = "plain " }; var obj1 = new ParagraphDemo() { Contents = "bold " }; var obj2 = new ParagraphDemo() { Contents = "italic " }; var obj3 = new ParagraphDemo() { Contents = "bold italic " }; var obj4 = new ParagraphDemo() { Contents = "red on yellow" }; int ws = 1; // arbitrary with default renderer factory. root.Builder.Show( Paragraph.Containing( Display.Of(() => obj0.Contents, ws).FaceName("Times New Roman"), Display.Of(() => obj1.Contents, ws).FaceName("Times New Roman").Bold, Display.Of(() => obj2.Contents, ws).FaceName("Times New Roman").Italic, Display.Of(() => obj3.Contents, ws).FaceName("Times New Roman").Bold.Italic, Display.Of(() => obj4.Contents, ws).ForeColor(Color.Red).BackColor(Color.Yellow) ).Border(1.Points(), Color.Red).Pads(2.Points(), 3.Points(), 2.Points(), 3.Points()) ); root.Builder.Show( Paragraph.Containing( Display.Of("plain"), Display.Of("underOnYellow").Underline(FwUnderlineType.kuntSingle).BackColor(Color.Yellow).FaceName("Times New Roman") ).Margins(3.Points(), 2.Points(), 5.Points(), 2.Points()) .Borders(1.Points(), 2.Points(), 3.Points(), 4.Points(), Color.Green) .BackColor(Color.Pink).Pads(2.Points(), 2.Points(), 2.Points(), 2.Points()), Paragraph.Containing( Display.Of("doubleRedOnPink").Underline(FwUnderlineType.kuntDouble, Color.Red).BackColor(Color.Pink), Display.Of("dotted").Underline(FwUnderlineType.kuntDotted), Display.Of("dottedOnYellow").Underline(FwUnderlineType.kuntDotted).BackColor(Color.Yellow) ), Paragraph.Containing( Display.Of("dashed").Underline(FwUnderlineType.kuntDashed), Display.Of("dashedRed").Underline(FwUnderlineType.kuntDashed).ForeColor(Color.Red), Display.Of("squiggle").Underline(FwUnderlineType.kuntSquiggle, Color.Red) ) ); theSharpView.Root = root; root.SelectAtEnd().Install(); theSharpView.Focus(); }
private void InitSimpleTextPara() { AssembledStyles styles = new AssembledStyles(); RootBox root = new RootBox(styles); int ws = 1; // arbitrary with default renderer factory. AddSimpleTextPara(styles, ws, root); theSharpView.Root = root; root.SelectAtEnd().Install(); theSharpView.Focus(); }
private void InitMultiPara() { AssembledStyles styles = new AssembledStyles(); RootBox root = new RootBox(styles); var owner = new ParagraphOwnerDemo(); owner.InsertParagraph(0, new ParagraphDemo()); int ws = 1; // arbitrary with default renderer factory. root.Builder.Show(Display.Of(() => owner.Paragraphs).Using( (builder, para) => builder.AddString(() => para.Contents, ws)) .EditParagraphsUsing(new ParagraphOpsDemo(owner))); theSharpView.Root = root; root.SelectAtEnd().Install(); theSharpView.Focus(); }
public void SimpleTyping() { ParaBox para; RootBox root = ParaBuilderTests.MakeTestParaSimpleString(m_gm.VwGraphics, ParaBuilderTests.MockBreakOption.ThreeFullLines, out para); string oldContents = para.Source.RenderText; var data1 = HookDataToClientRun(para, oldContents, 0); InsertionPoint ip = root.SelectAtEnd(); ip.Install(); MockSite site = new MockSite(); root.Site = site; PaintTransform ptrans = new PaintTransform(2, 4, 96, 100, 0, 10, 120, 128); site.m_transform = ptrans; site.m_vwGraphics = m_gm.VwGraphics; var engine = root.LastLayoutInfo.RendererFactory.GetRenderer(ParaBuilderTests.s_simpleStringWs, m_gm.VwGraphics) as MockRenderEngine; var modWords = new string[ParaBuilderTests.s_simpleStringWords.Length]; Array.Copy(ParaBuilderTests.s_simpleStringWords, modWords, modWords.Length); modWords[modWords.Length - 1] = modWords[modWords.Length - 1] + "x"; var modContents = ParaBuilderTests.AssembleStrings(modWords); ParaBuilderTests.SetupMockEngineForThreeLines(modContents, engine, modWords); ip.InsertText("x"); string expected = oldContents + "x"; Assert.AreEqual(expected, para.Source.RenderText); Assert.AreEqual(expected, data1.SimpleThree); Assert.AreEqual(expected.Length, ip.StringPosition); ip.Backspace(); Assert.AreEqual(oldContents, para.Source.RenderText); Assert.AreEqual(oldContents, data1.SimpleThree); Assert.AreEqual(oldContents.Length, ip.StringPosition); }
public void InsertCharInEmptyLine() { string contents = ""; var engine = new FakeRenderEngine() { Ws = 34, SegmentHeight = 13 }; var factory = new FakeRendererFactory(); factory.SetRenderer(34, engine); var styles = new AssembledStyles().WithWs(34); var clientRuns = new List<IClientRun>(); var run = new StringClientRun(contents, styles); clientRuns.Add(run); var data1 = new MockData1(34, 35); data1.SimpleThree = contents; var source = new TextSource(clientRuns, null); var para = new ParaBox(styles, source); var hookup = new StringHookup(this, () => data1.SimpleThree, hook => data1.SimpleThreeChanged += hook.StringPropChanged, hook => data1.SimpleThreeChanged -= hook.StringPropChanged, para); hookup.Writer = newVal => data1.SimpleThree = newVal; run.Hookup = hookup; var root = new RootBox(styles); var block = new BlockBox(styles, Color.Red, 20000, 10000); root.AddBox(block); root.AddBox(para); var layoutArgs = MakeLayoutInfo(Int32.MaxValue / 2, m_gm.VwGraphics, factory); root.Layout(layoutArgs); Assert.That(root.Height, Is.EqualTo(13 + block.Height)); Assert.That(para.Width, Is.EqualTo(FakeRenderEngine.SimulatedWidth(contents))); Assert.That(root.Width, Is.EqualTo(block.Width)); int simulatedWidth = FakeRenderEngine.SimulatedWidth("x"); Assert.That(root.Width, Is.GreaterThan(para.Width + simulatedWidth)); PaintTransform ptrans = new PaintTransform(2, 4, 96, 100, 0, 10, 120, 128); MockSite site = new MockSite(); site.m_transform = ptrans; site.m_vwGraphics = m_gm.VwGraphics; root.Site = site; var oldRootWidth = root.Width; var ip = root.SelectAtEnd(); ip.InsertText("x"); Assert.That(root.Height, Is.EqualTo(13 + block.Height)); Assert.That(root.Width, Is.EqualTo(oldRootWidth)); Assert.That(para.Width, Is.EqualTo(simulatedWidth)); var expectedInvalidate = new Rectangle(-RootBox.InvalidateMargin, - RootBox.InvalidateMargin + block.Height, simulatedWidth + RootBox.InvalidateMargin * 2, 13 + 2 * RootBox.InvalidateMargin); Assert.That(site.RectsInvalidatedInRoot, Has.Member(expectedInvalidate)); }
public void ScrollToShowSelection() { ParaBox para; RootBox root = ParaBuilderTests.MakeTestParaSimpleString(m_gm.VwGraphics, ParaBuilderTests.MockBreakOption.ThreeFullLines, out para); PaintTransform ptrans = new PaintTransform(2, 4, 96, 96, 0, 0, 96, 96); int dx, dy; // If there is no selection we should not move. root.ScrollToShowSelection(m_gm.VwGraphics, ptrans, new Rectangle(10, 10, 30, 50), out dx, out dy); Assert.That(dx, Is.EqualTo(0)); Assert.That(dy, Is.EqualTo(0)); InsertionPoint ip = root.SelectAtEnd(); ip.Install(); // Take control of where the selection thinks it is. var seg = ((StringBox)para.FirstBox).Segment as MockSegment; seg.NextPosIpResult = new MockSegment.PositionsOfIpResults() { PrimaryHere = true, RectPrimary = new Rect(20, 30, 22, 40) }; var rect = ip.GetSelectionLocation(m_gm.VwGraphics, ptrans); Assert.That(rect.Top, Is.EqualTo(30)); Assert.That(rect.Bottom, Is.EqualTo(40)); // Todo JohnT: all current tests pass without horizontal scrolling. Eventually implement that. // It's entirely inside the rectangle: don't scroll. root.ScrollToShowSelection(m_gm.VwGraphics, ptrans, new Rectangle(10, 10, 30, 50), out dx, out dy); Assert.That(dx, Is.EqualTo(0)); Assert.That(dy, Is.EqualTo(0)); // a special case of entirely inside: not by the desired margin: still don't scroll. root.ScrollToShowSelection(m_gm.VwGraphics, ptrans, new Rectangle(10, 28, 30, 14), out dx, out dy); Assert.That(dx, Is.EqualTo(0)); Assert.That(dy, Is.EqualTo(0)); // It's above a rectangle that can easily hold it: should end 10 pixels inside. Scrolling down 15 pixels will do that. root.ScrollToShowSelection(m_gm.VwGraphics, ptrans, new Rectangle(10, 35, 30, 70), out dx, out dy); Assert.That(dx, Is.EqualTo(0)); Assert.That(dy, Is.EqualTo(15)); // It's below a rectangle that can easily hold it: should end 10 pixels inside. Scrolling up 25 pixels will do that. // (The bottom of the rectangle is at 25, 15 pix above the bottom of the selection rectangle.) root.ScrollToShowSelection(m_gm.VwGraphics, ptrans, new Rectangle(10, -20, 30, 45), out dx, out dy); Assert.That(dx, Is.EqualTo(0)); Assert.That(dy, Is.EqualTo(-25)); // It's above a rectangle that can not hold it comfortably: should end just inside. Scrolling down 5 pixels will do that. root.ScrollToShowSelection(m_gm.VwGraphics, ptrans, new Rectangle(10, 35, 30, 20), out dx, out dy); Assert.That(dx, Is.EqualTo(0)); Assert.That(dy, Is.EqualTo(5)); // It's below a rectangle that can not hold it comfortably: should end just inside. Scrolling up 15 pixels will do that. // (The bottom of the rectangle is at 25, 15 pix above the bottom of the selection rectangle.) root.ScrollToShowSelection(m_gm.VwGraphics, ptrans, new Rectangle(10, 0, 30, 25), out dx, out dy); Assert.That(dx, Is.EqualTo(0)); Assert.That(dy, Is.EqualTo(-15)); // Pathologically, it may not be possible to display all of it at all. It's currently 12 pixels below the // target rectangle. We move it so its top is one pixel above, that is, 12 plus 9 pixels. root.ScrollToShowSelection(m_gm.VwGraphics, ptrans, new Rectangle(10, 10, 30, 8), out dx, out dy); Assert.That(dx, Is.EqualTo(0)); Assert.That(dy, Is.EqualTo(-21)); // A similar case moving up. 10 pixels would align the tops; we move 2 less. root.ScrollToShowSelection(m_gm.VwGraphics, ptrans, new Rectangle(10, 40, 30, 6), out dx, out dy); Assert.That(dx, Is.EqualTo(0)); Assert.That(dy, Is.EqualTo(8)); // Todo JohnT: cases involving ranges. Mostly these work the same, when things fit. There are special cases // when the range is not entirely visible, but its DragEnd is; also when the range doesn't entirely fit, // but possibly its dragEnd does. }