コード例 #1
0
        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));
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: Form1.cs プロジェクト: vkarthim/FieldWorks
        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();
        }
コード例 #4
0
 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.
 }
コード例 #5
0
        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");
        }
コード例 #6
0
ファイル: Form1.cs プロジェクト: vkarthim/FieldWorks
        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();
        }
コード例 #7
0
ファイル: Form1.cs プロジェクト: vkarthim/FieldWorks
        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();
        }
コード例 #8
0
ファイル: Form1.cs プロジェクト: vkarthim/FieldWorks
        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();
        }
コード例 #9
0
        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);
        }
コード例 #10
0
		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));
		}
コード例 #11
0
        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.
        }