public void CommonContainerTests() { var styles = new AssembledStyles(); var columnWidths = new FixedColumnWidths(new[] { 10 }); var root1 = new RootBox(styles); var root2 = new RootBox(styles); VerifyCC(root1, root1, root1, root1, root1); VerifyCC(root2, root2, root2, root2, root2); var row1 = new RowBox(styles, columnWidths, false); var div1 = new DivBox(styles); root2.AddBox(row1); root1.AddBox(div1); VerifyCC(row1, row1, row1, row1, row1); VerifyCC(div1, div1, div1, div1, div1); VerifyCC(root1, div1, root1, root1, div1); VerifyCC(root2, row1, root2, root2, row1); var row2 = new RowBox(styles, columnWidths, false); var div2 = new DivBox(styles); root2.AddBox(row2); root1.AddBox(div2); VerifyCC(row1, row2, root2, row1, row2); VerifyCC(div1, div2, root1, div1, div2); var row3 = new RowBox(styles, columnWidths, false); var div3 = new DivBox(styles); row1.AddBox(row3); div1.AddBox(div3); VerifyCC(row1, row3, row1, row1, row3); VerifyCC(row2, row3, root2, row2, row1); VerifyCC(div1, div3, div1, div1, div3); VerifyCC(div2, div3, root1, div2, div1); var row4 = new RowBox(styles, columnWidths, false); var div4 = new DivBox(styles); row2.AddBox(row4); div2.AddBox(div4); VerifyCC(row3, row4, root2, row1, row2); VerifyCC(row1, row4, root2, row1, row2); VerifyCC(div3, div4, root1, div1, div2); VerifyCC(div1, div4, root1, div1, div2); }
public void NestedRowsLayout() { var styles = new AssembledStyles(); var box1 = new LayoutInfoRecorderBox(styles, Color.Red, 72000, 36000); var box2 = new LayoutInfoRecorderBox(styles, Color.Blue, 108000, 18000); var box3 = new LayoutInfoRecorderBox(styles, Color.Orange, 72000, 18000); var box4 = new LayoutInfoRecorderBox(styles, Color.Orange, 72000, 18000); var widths = new FixedColumnWidths(new[] {34, 67, 99}); // pass widths to RowBox constructor var row1 = new RowBox(styles, widths, false); var row2 = new RowBox(styles, widths, false); row1.AddBox(box1); row1.AddBox(box2); row2.AddBox(box3); row2.AddBox(box4); RootBox root = new RootBox(styles); root.AddBox(row1); root.AddBox(row2); LayoutInfo layoutArgs = MakeLayoutInfo(); root.Layout(layoutArgs); Assert.That(box1.LastLayoutInfo.MaxWidth, Is.EqualTo(34)); Assert.That(box1.Height, Is.EqualTo(48)); Assert.That(box2.Height, Is.EqualTo(24)); Assert.That(box3.Height, Is.EqualTo(24)); Assert.That(box4.Height, Is.EqualTo(24)); Assert.That(root.Height, Is.EqualTo(48 + 24)); Assert.That(box1.Left, Is.EqualTo(0)); Assert.That(box2.Left, Is.EqualTo(96)); Assert.That(box3.Left, Is.EqualTo(0)); Assert.That(box4.Left, Is.EqualTo(96)); Assert.That(row1.Top, Is.EqualTo(0)); Assert.That(box1.Top, Is.EqualTo(0)); Assert.That(box2.Top, Is.EqualTo(0)); Assert.That(row2.Top, Is.EqualTo(48)); Assert.That(box3.Top, Is.EqualTo(0)); Assert.That(box4.Top, Is.EqualTo(0)); Assert.That(box1.Width, Is.EqualTo(96)); Assert.That(box2.Width, Is.EqualTo(144)); Assert.That(box3.Width, Is.EqualTo(96)); Assert.That(box4.Width, Is.EqualTo(96)); Assert.That(root.Width, Is.EqualTo(96 + 144)); // Now try changing the size of a block. MockSite site = new MockSite(); root.Site = site; PaintTransform ptrans = new PaintTransform(2, 4, 96, 96, 0, 10, 120, 128); site.m_transform = ptrans; site.m_vwGraphics = m_gm.VwGraphics; box2.UpdateSize(144000, 36000); Assert.That(box2.Width, Is.EqualTo(96 * 2)); Assert.That(box2.Height, Is.EqualTo(48)); Assert.That(row1.Height, Is.EqualTo(48)); Assert.That(root.Height, Is.EqualTo(72)); Assert.That(root.Width, Is.EqualTo(96 * 3)); // Since it got both wider and higher, we should invalidate at least the whole current size. var bigInvalidate = root.InvalidateRect; Assert.That(site.RectsInvalidatedInRoot, Has.Member(bigInvalidate)); site.RectsInvalidated.Clear(); box2.UpdateSize(108000, 18000); Assert.That(root.Height, Is.EqualTo(48 + 24)); // unchanged this time Assert.That(root.Width, Is.EqualTo(96 + 144)); // narrower box2 still determines it // Got narrower, at least the whole old invalidate rectangle should be invalidated. Assert.That(site.RectsInvalidatedInRoot, Has.Member(bigInvalidate)); site.RectsInvalidated.Clear(); box2.UpdateSize(72000, 18000); Assert.That(root.Height, Is.EqualTo(48 + 24)); // unchanged this time Assert.That(root.Width, Is.EqualTo(144 + 48)); // new smaller value // It got thinner. We want an optimized invalidate rectangle that does not // include the left boxes. But it must include the space at the right that the root box used to occupy. // There are other possible implementations, but currently, we expect the old rectangle of box2 // to be invalidated (it's in the fixmap so its own Relayout does this); // the shrinkage area at the right of row2; // and the area computed because row2 moved. //VerifyExpectedRectangle(site.RectsInvalidatedInRoot, 0, 48, 48, 144); // old box2 //VerifyExpectedRectangle(site.RectsInvalidatedInRoot, 0, 48 + 24, 144, 24); // shrinkage of row1 // This is from the new left of div2 to its old right (old right was 48 + 48 + 24 + 24) //VerifyExpectedRectangle(site.RectsInvalidatedInRoot, 0, 48 + 24, 144, 48 + 24); site.RectsInvalidated.Clear(); box2.UpdateSize(144000, 18000); Assert.That(root.Height, Is.EqualTo(48 + 24)); // unchanged this time Assert.That(root.Width, Is.EqualTo(144 + 144)); // new larger value // It got wider. We want an optimized invalidate rectangle that does not // include the left boxes. But it must include the space at the right where the root box grew. // There are other possible implementations, but currently, we expect the old rectangle of box2 // to be invalidated (it returns true from Relayout); // the growth area at the right of div2; // and the area computed because div2 moved. //VerifyExpectedRectangle(site.RectsInvalidatedInRoot, 0, 48, 144, 96); // new box2 //VerifyExpectedRectangle(site.RectsInvalidatedInRoot, 0, 48 + 24, 144, 96 - 24); // new part of div1 occupied by box2 // This is from the old left of div2 to its new right (48 + 96 + 24 + 24) //VerifyExpectedRectangle(site.RectsInvalidatedInRoot, 0, 48 + 24, 144, 96 + 24); }
public void RowClippedPaint() { var styles = new AssembledStyles(); var box1 = new FgBlockBox(styles, Color.Red, 36000, 72000); var box2 = new FgBlockBox(styles, Color.Blue, 18000, 108000); var box3 = new FgBlockBox(styles, Color.Orange, 18000, 72000); var box4 = new FgBlockBox(styles, Color.Orange, 18000, 72000); var widths = new FixedColumnWidths(new[] { 34, 67, 99, 46 }); var row1 = new RowBox(styles, widths, false); row1.AddBox(box1); row1.AddBox(box2); row1.AddBox(box3); row1.AddBox(box4); RootBox root = new RootBox(styles); root.AddBox(row1); LayoutInfo layoutArgs = MakeLayoutInfo(); root.Layout(layoutArgs); var rect1 = new Rectangle(0, 0, 48, 96); var rect2 = new Rectangle(0, 0, 24, 144); rect2.Offset(rect1.Right, 0); var rect3 = new Rectangle(0, 0, 24, 96); rect3.Offset(rect2.Right, 0); var rect4 = new Rectangle(0, 0, 24, 96); rect4.Offset(rect3.Right, 0); var paintRects = new[] { rect1, rect2, rect3, rect4 }; VerifyPaint(root, new Rectangle(-1000, -1000, 2000, 2000), 0, 0, paintRects); // Clipping off the left part, but not the whole, of a box does not prevent drawing it. VerifyPaint(root, new Rectangle(10, -1000, -10 + rect4.Right - 10, 2000), 0, 0, paintRects); // Even clipping all but one pixel does not prevent drawing. VerifyPaint(root, new Rectangle(47, -1000, -47 + rect3.Right + 1, 2000), 0, 0, paintRects); // However if we clip a bit more we should draw less var middleTwo = new[] { rect2, rect3 }; VerifyPaint(root, new Rectangle(48, -1000, -48 + rect3.Right - 2, 2000), 0, 0, middleTwo); // If the clip covers just a bit of the first box we paint just that. var firstOne = new[] { rect1 }; VerifyPaint(root, new Rectangle(-1000, -1000, 1000 + 10, 2000), 0, 0, firstOne); // If the clip covers just a bit of the last box we paint just that. var lastOne = new[] { rect4 }; VerifyPaint(root, new Rectangle(rect4.Right - 2, -1000, 1000, 2000), 0, 0, lastOne); // If the clip is entirely above the pile we draw nothing. VerifyPaint(root, new Rectangle(-1000, -1000, 990, 2000), 0, 0, null); // Likewise if entirely below. VerifyPaint(root, new Rectangle(rect4.Right + 10, -1000, 10, 2000), 0, 0, null); // Now try with simulated scrolling. Use a normal clip rectangle, but pretend the first two // and a bit boxes are scrolled off. var offset = rect2.Right + 10; var rect3Offset = rect3; rect3Offset.Offset(-offset, 0); var rect4Offset = rect4; rect4Offset.Offset(-offset, 0); var lastTwoOffset = new[] { rect3Offset, rect4Offset }; VerifyPaint(root, new Rectangle(0, -1000, 200, 2000), offset, 0, lastTwoOffset); }
public void NestedRowsLayout() { var styles = new AssembledStyles(); var box1 = new LayoutInfoRecorderBox(styles, Color.Red, 72000, 36000); var box2 = new LayoutInfoRecorderBox(styles, Color.Blue, 108000, 18000); var box3 = new LayoutInfoRecorderBox(styles, Color.Orange, 72000, 18000); var box4 = new LayoutInfoRecorderBox(styles, Color.Orange, 72000, 18000); var widths = new FixedColumnWidths(new[] { 34, 67, 99 }); // pass widths to RowBox constructor var row1 = new RowBox(styles, widths, false); var row2 = new RowBox(styles, widths, false); row1.AddBox(box1); row1.AddBox(box2); row2.AddBox(box3); row2.AddBox(box4); RootBox root = new RootBox(styles); root.AddBox(row1); root.AddBox(row2); LayoutInfo layoutArgs = MakeLayoutInfo(); root.Layout(layoutArgs); Assert.That(box1.LastLayoutInfo.MaxWidth, Is.EqualTo(34)); Assert.That(box1.Height, Is.EqualTo(48)); Assert.That(box2.Height, Is.EqualTo(24)); Assert.That(box3.Height, Is.EqualTo(24)); Assert.That(box4.Height, Is.EqualTo(24)); Assert.That(root.Height, Is.EqualTo(48 + 24)); Assert.That(box1.Left, Is.EqualTo(0)); Assert.That(box2.Left, Is.EqualTo(96)); Assert.That(box3.Left, Is.EqualTo(0)); Assert.That(box4.Left, Is.EqualTo(96)); Assert.That(row1.Top, Is.EqualTo(0)); Assert.That(box1.Top, Is.EqualTo(0)); Assert.That(box2.Top, Is.EqualTo(0)); Assert.That(row2.Top, Is.EqualTo(48)); Assert.That(box3.Top, Is.EqualTo(0)); Assert.That(box4.Top, Is.EqualTo(0)); Assert.That(box1.Width, Is.EqualTo(96)); Assert.That(box2.Width, Is.EqualTo(144)); Assert.That(box3.Width, Is.EqualTo(96)); Assert.That(box4.Width, Is.EqualTo(96)); Assert.That(root.Width, Is.EqualTo(96 + 144)); // Now try changing the size of a block. MockSite site = new MockSite(); root.Site = site; PaintTransform ptrans = new PaintTransform(2, 4, 96, 96, 0, 10, 120, 128); site.m_transform = ptrans; site.m_vwGraphics = m_gm.VwGraphics; box2.UpdateSize(144000, 36000); Assert.That(box2.Width, Is.EqualTo(96 * 2)); Assert.That(box2.Height, Is.EqualTo(48)); Assert.That(row1.Height, Is.EqualTo(48)); Assert.That(root.Height, Is.EqualTo(72)); Assert.That(root.Width, Is.EqualTo(96 * 3)); // Since it got both wider and higher, we should invalidate at least the whole current size. var bigInvalidate = root.InvalidateRect; Assert.That(site.RectsInvalidatedInRoot, Has.Member(bigInvalidate)); site.RectsInvalidated.Clear(); box2.UpdateSize(108000, 18000); Assert.That(root.Height, Is.EqualTo(48 + 24)); // unchanged this time Assert.That(root.Width, Is.EqualTo(96 + 144)); // narrower box2 still determines it // Got narrower, at least the whole old invalidate rectangle should be invalidated. Assert.That(site.RectsInvalidatedInRoot, Has.Member(bigInvalidate)); site.RectsInvalidated.Clear(); box2.UpdateSize(72000, 18000); Assert.That(root.Height, Is.EqualTo(48 + 24)); // unchanged this time Assert.That(root.Width, Is.EqualTo(144 + 48)); // new smaller value // It got thinner. We want an optimized invalidate rectangle that does not // include the left boxes. But it must include the space at the right that the root box used to occupy. // There are other possible implementations, but currently, we expect the old rectangle of box2 // to be invalidated (it's in the fixmap so its own Relayout does this); // the shrinkage area at the right of row2; // and the area computed because row2 moved. //VerifyExpectedRectangle(site.RectsInvalidatedInRoot, 0, 48, 48, 144); // old box2 //VerifyExpectedRectangle(site.RectsInvalidatedInRoot, 0, 48 + 24, 144, 24); // shrinkage of row1 // This is from the new left of div2 to its old right (old right was 48 + 48 + 24 + 24) //VerifyExpectedRectangle(site.RectsInvalidatedInRoot, 0, 48 + 24, 144, 48 + 24); site.RectsInvalidated.Clear(); box2.UpdateSize(144000, 18000); Assert.That(root.Height, Is.EqualTo(48 + 24)); // unchanged this time Assert.That(root.Width, Is.EqualTo(144 + 144)); // new larger value // It got wider. We want an optimized invalidate rectangle that does not // include the left boxes. But it must include the space at the right where the root box grew. // There are other possible implementations, but currently, we expect the old rectangle of box2 // to be invalidated (it returns true from Relayout); // the growth area at the right of div2; // and the area computed because div2 moved. //VerifyExpectedRectangle(site.RectsInvalidatedInRoot, 0, 48, 144, 96); // new box2 //VerifyExpectedRectangle(site.RectsInvalidatedInRoot, 0, 48 + 24, 144, 96 - 24); // new part of div1 occupied by box2 // This is from the old left of div2 to its new right (48 + 96 + 24 + 24) //VerifyExpectedRectangle(site.RectsInvalidatedInRoot, 0, 48 + 24, 144, 96 + 24); }
public void CommonContainerTests() { var styles = new AssembledStyles(); var columnWidths = new FixedColumnWidths(new[] {10}); var root1 = new RootBox(styles); var root2 = new RootBox(styles); VerifyCC(root1, root1, root1, root1, root1); VerifyCC(root2, root2, root2, root2, root2); var row1 = new RowBox(styles, columnWidths, false); var div1 = new DivBox(styles); root2.AddBox(row1); root1.AddBox(div1); VerifyCC(row1, row1, row1, row1, row1); VerifyCC(div1, div1, div1, div1, div1); VerifyCC(root1, div1, root1, root1, div1); VerifyCC(root2, row1, root2, root2, row1); var row2 = new RowBox(styles, columnWidths, false); var div2 = new DivBox(styles); root2.AddBox(row2); root1.AddBox(div2); VerifyCC(row1, row2, root2, row1, row2); VerifyCC(div1, div2, root1, div1, div2); var row3 = new RowBox(styles, columnWidths, false); var div3 = new DivBox(styles); row1.AddBox(row3); div1.AddBox(div3); VerifyCC(row1, row3, row1, row1, row3); VerifyCC(row2, row3, root2, row2, row1); VerifyCC(div1, div3, div1, div1, div3); VerifyCC(div2, div3, root1, div2, div1); var row4 = new RowBox(styles, columnWidths, false); var div4 = new DivBox(styles); row2.AddBox(row4); div2.AddBox(div4); VerifyCC(row3, row4, root2, row1, row2); VerifyCC(row1, row4, root2, row1, row2); VerifyCC(div3, div4, root1, div1, div2); VerifyCC(div1, div4, root1, div1, div2); }