コード例 #1
0
        public void NonIntersectingRegionSet_RemoveRegionTest()
        {
            var target             = new NonIntersectingMergingRegionsSet <int, RectangularRegion <int> >();
            var rectangularRegions = this.GetNonIntersectionFlower();

            target.Add(rectangularRegions.Item1);
            for (int i = 0; i < rectangularRegions.Item2.Count; ++i)
            {
                target.Add(rectangularRegions.Item2[i]);
            }

            var targetCount = target.Count;

            Assert.IsFalse(target.RemoveRegion(new RectangularRegion <int>(0, 0, 2, 2)));
            target.AssertIntegrity();
            Assert.IsTrue(target.RemoveRegion(rectangularRegions.Item1));
            target.AssertIntegrity();
            --targetCount;
            Assert.AreEqual(targetCount, target.Count);
            for (int i = 0; i < rectangularRegions.Item2.Count; ++i)
            {
                Assert.IsTrue(target.RemoveRegion(rectangularRegions.Item2[i]));
                target.AssertIntegrity();
                --targetCount;
                Assert.AreEqual(targetCount, target.Count);
            }
        }
コード例 #2
0
 /// <summary>
 /// Instancia uma nova instância de objectos do tipo <see cref="HtmlTableWriter"/>.
 /// </summary>
 /// <param name="indent">Valor que indica se se pretende identar o html.</param>
 public HtmlTableWriter(bool indent = false)
     : base(indent)
 {
     this.headerMergingRegions      = new NonIntersectingMergingRegionsSet <int, MergingRegion <int> >();
     this.bodyMergingRegions        = new NonIntersectingMergingRegionsSet <int, MergingRegion <int> >();
     this.headerRowAttributesSetter = (i, s) => { };
     this.headerCellElement         = (i, j, o, e) =>
     {
         if (o != null)
         {
             e.InnerText = o.ToString();
         }
     };
 }
コード例 #3
0
        /// <summary>
        /// Obtém uma matriz de regiões rectangulares que não se intersectam.
        /// </summary>
        /// <returns>A matriz de regiões.</returns>
        private NonIntersectingMergingRegionsSet <int, RectangularRegion <int> > GetMatrixRegion()
        {
            var result = new NonIntersectingMergingRegionsSet <int, RectangularRegion <int> >();

            for (int i = 0; i < 15; i += 4)
            {
                for (int j = 0; j < 15; j += 4)
                {
                    result.Add(new RectangularRegion <int>(i, j, i + 1, j + 1));
                }
            }

            return(result);
        }
コード例 #4
0
        public void NonIntersectingMergingRegionSet_AddAndCountTest()
        {
            var target             = new NonIntersectingMergingRegionsSet <int, RectangularRegion <int> >();
            var rectangularRegions = this.GetNonIntersectionFlower();

            target.Add(rectangularRegions.Item1);
            target.AssertIntegrity();
            for (int i = 0; i < rectangularRegions.Item2.Count; ++i)
            {
                target.Add(rectangularRegions.Item2[i]);
                target.AssertIntegrity();
            }

            Assert.AreEqual(rectangularRegions.Item2.Count + 1, target.Count);
        }
コード例 #5
0
        public void NonIntersectiongRegionSet_TryAddCrossBorderIntersectingRegionTest()
        {
            var target             = new NonIntersectingMergingRegionsSet <int, RectangularRegion <int> >();
            var rectangularRegions = this.GetNonIntersectionFlower();

            target.Add(rectangularRegions.Item1);
            for (int i = 0; i < rectangularRegions.Item2.Count; ++i)
            {
                target.Add(rectangularRegions.Item2[i]);
            }

            // Tenta adicionar uma região que se intersecte com as anteriores
            var addingRegion = new RectangularRegion <int>(2, 2, 3, 3);

            target.Add(addingRegion);
        }
コード例 #6
0
        public void NonIntersectingRegionSet_GetMergingRegionForCellTest()
        {
            var target             = new NonIntersectingMergingRegionsSet <int, RectangularRegion <int> >();
            var rectangularRegions = this.GetNonIntersectionFlower();

            target.Add(rectangularRegions.Item1);
            for (int i = 0; i < rectangularRegions.Item2.Count; ++i)
            {
                target.Add(rectangularRegions.Item2[i]);
            }

            var actual = target.GetMergingRegionForCell(0, 0);

            Assert.IsNull(actual);
            actual = target.GetMergingRegionForCell(12, 12);
            Assert.IsNull(actual);
            for (int i = 3; i < 9; ++i)
            {
                for (int j = 3; j < 9; ++j)
                {
                    actual = target.GetMergingRegionForCell(i, j);
                    Assert.AreEqual(rectangularRegions.Item1, actual);
                }
            }

            for (int i = 0; i < rectangularRegions.Item2.Count; ++i)
            {
                var currentRectangularRegion = rectangularRegions.Item2[i];
                for (int j = currentRectangularRegion.TopLeftX; j <= currentRectangularRegion.BottomRightX; ++j)
                {
                    for (int k = currentRectangularRegion.TopLeftY; k < currentRectangularRegion.BottomRightY; ++k)
                    {
                        actual = target.GetMergingRegionForCell(j, k);
                        Assert.AreEqual(currentRectangularRegion, actual);
                    }
                }
            }
        }
コード例 #7
0
        /// <summary>
        /// Imprime um item tabular para o elemento da tabela.
        /// </summary>
        /// <typeparam name="R">O tipo dos objectos que constituem as linhas do item tabular.</typeparam>
        /// <typeparam name="L">O tipo dos objectos que constituem as células do item tabular.</typeparam>
        /// <param name="cellElementName">O nome do elemento da célula.</param>
        /// <param name="element">O elemento da tabela que irá conter as linhas.</param>
        /// <param name="columnsNumber">O número de colunas esperado.</param>
        /// <param name="tabularItem">O item tabular.</param>
        /// <param name="mergingRegions">O conjunto de regiões de células fundidas.</param>
        /// <param name="attributessSetter">A função responsável pela adição de atributos.</param>
        /// <param name="elementsSetter">A função responsável pelo processamento de elementos.</param>
        private void PrintTabularItem <R, L>(
            string cellElementName,
            XmlElement element,
            int columnsNumber,
            IGeneralTabularItem <R> tabularItem,
            NonIntersectingMergingRegionsSet <int, MergingRegion <int> > mergingRegions,
            Action <int, AttributeSetter> attributessSetter,
            Action <int, int, object, ElementSetter> elementsSetter)
            where R : IGeneralTabularRow <L>
            where L : IGeneralTabularCell
        {
            var attributeSetter            = new AttributeSetter();
            var validatedCellElementSetter = new ValidatedCellElementSetter();
            var linesNumber = tabularItem.LastRowNumber + 1;
            var linePointer = 0;

            foreach (var tabularLine in tabularItem)
            {
                var currentLine = tabularLine.RowNumber;
                for (; linePointer < currentLine; ++linePointer)
                {
                    var rowElement = element.OwnerDocument.CreateElement("tr");
                    attributeSetter.CurrentElement = rowElement;
                    attributessSetter.Invoke(
                        linePointer,
                        attributeSetter);
                    this.AppendEmptyCells(
                        cellElementName,
                        rowElement,
                        linePointer,
                        columnsNumber,
                        linesNumber,
                        columnsNumber,
                        validatedCellElementSetter,
                        mergingRegions,
                        elementsSetter);
                    element.AppendChild(rowElement);
                }

                var lineElement = element.OwnerDocument.CreateElement("tr");
                attributeSetter.CurrentElement = lineElement;
                attributessSetter.Invoke(
                    linePointer,
                    attributeSetter);
                var currentCellNumber = 0;
                foreach (var tabularCell in tabularLine)
                {
                    if (currentCellNumber <= tabularCell.ColumnNumber)
                    {
                        var emptyCellsCount = tabularCell.ColumnNumber - currentCellNumber;
                        this.AppendEmptyCells(
                            cellElementName,
                            lineElement,
                            linePointer,
                            emptyCellsCount,
                            linesNumber,
                            columnsNumber,
                            validatedCellElementSetter,
                            mergingRegions,
                            elementsSetter);

                        var mergingRegion = mergingRegions.GetMergingRegionForCell(
                            tabularCell.ColumnNumber,
                            currentLine);
                        if (mergingRegion == null)
                        {
                            var tableCellElement = lineElement.OwnerDocument.CreateElement(cellElementName);
                            validatedCellElementSetter.CurrentElement = tableCellElement;
                            lineElement.AppendChild(tableCellElement);

                            elementsSetter.Invoke(
                                currentLine,
                                tabularCell.ColumnNumber,
                                tabularCell.GetCellValue <object>(),
                                validatedCellElementSetter);
                            lineElement.AppendChild(tableCellElement);
                            currentCellNumber = tabularCell.ColumnNumber + 1;
                        }
                        else if (mergingRegion.TopLeftX == tabularCell.ColumnNumber)
                        {
                            var colDifference = mergingRegion.BottomRightX - mergingRegion.TopLeftX;
                            if (mergingRegion.TopLeftY == currentLine)
                            {
                                var tableCellElement = lineElement.OwnerDocument.CreateElement(cellElementName);
                                validatedCellElementSetter.CurrentElement = tableCellElement;
                                lineElement.AppendChild(tableCellElement);
                                elementsSetter.Invoke(
                                    currentLine,
                                    tabularCell.ColumnNumber,
                                    tabularCell.GetCellValue <object>(),
                                    validatedCellElementSetter);

                                if (colDifference > 0)
                                {
                                    var colSpan = Math.Min(
                                        colDifference + 1,
                                        columnsNumber - tabularCell.ColumnNumber);
                                    if (colSpan > 1)
                                    {
                                        tableCellElement.SetAttribute("colspan", colSpan.ToString());
                                    }
                                }

                                var rowDifference = mergingRegion.BottomRightY - mergingRegion.TopLeftY;
                                if (rowDifference > 0)
                                {
                                    var rowSpan = Math.Min(
                                        rowDifference + 1,
                                        linesNumber - currentLine);
                                    if (rowSpan > 1)
                                    {
                                        tableCellElement.SetAttribute("rowspan", rowSpan.ToString());
                                    }
                                }
                            }

                            currentCellNumber = tabularCell.ColumnNumber + colDifference + 1;
                        }
                    }
                }

                var finalEmptyCellsCount = columnsNumber - currentCellNumber;
                this.AppendEmptyCells(
                    cellElementName,
                    lineElement,
                    linePointer,
                    finalEmptyCellsCount,
                    linesNumber,
                    columnsNumber,
                    validatedCellElementSetter,
                    mergingRegions,
                    elementsSetter);

                element.AppendChild(lineElement);
                ++linePointer;
            }

            // Inserção das restantes linhas vazias
            for (; linePointer < linesNumber; ++linePointer)
            {
                var rowElement = element.OwnerDocument.CreateElement("th");
                attributeSetter.CurrentElement = rowElement;
                this.headerRowAttributesSetter.Invoke(
                    linePointer,
                    attributeSetter);
                this.AppendEmptyCells(
                    cellElementName,
                    rowElement,
                    linePointer,
                    columnsNumber,
                    linesNumber,
                    columnsNumber,
                    validatedCellElementSetter,
                    mergingRegions,
                    elementsSetter);
            }
        }
コード例 #8
0
        /// <summary>
        /// Adenda células do vazias a uma linha do cabeçalho.
        /// </summary>
        /// <param name="cellElementName">O nome da célula.</param>
        /// <param name="lineElement">A linha à qual serão adicionadas células vazias.</param>
        /// <param name="currentLine">O número da linha de inserção.</param>
        /// <param name="count">O número de elementos a inserir.</param>
        /// <param name="linesNumber">O número de linhas na tabela.</param>
        /// <param name="columnsNumber">O número de colunas.</param>
        /// <param name="elementSetter">O objecto responsável pela alteração do elemento.</param>
        /// <param name="mergingRegions">As regiões de fusão de células.</param>
        /// <param name="elementsSetter">A função responsável pelo processamento dos elementos.</param>
        private void AppendEmptyCells(
            string cellElementName,
            XmlElement lineElement,
            int currentLine,
            int count,
            int linesNumber,
            int columnsNumber,
            ValidatedCellElementSetter elementSetter,
            NonIntersectingMergingRegionsSet <int, MergingRegion <int> > mergingRegions,
            Action <int, int, object, ElementSetter> elementsSetter)
        {
            for (int i = 0; i < count; ++i)
            {
                var mergingRegion = mergingRegions.GetMergingRegionForCell(
                    i,
                    currentLine);
                if (mergingRegion == null)
                {
                    var tableCellElement = lineElement.OwnerDocument.CreateElement(cellElementName);
                    elementSetter.CurrentElement = tableCellElement;
                    lineElement.AppendChild(tableCellElement);

                    elementsSetter.Invoke(
                        currentLine,
                        i,
                        null,
                        elementSetter);
                    lineElement.AppendChild(tableCellElement);
                }
                else if (mergingRegion.TopLeftX == i)
                {
                    var colDifference = mergingRegion.BottomRightX - mergingRegion.TopLeftY;
                    if (mergingRegion.TopLeftY == currentLine)
                    {
                        var tableCellElement = lineElement.OwnerDocument.CreateElement(cellElementName);
                        elementSetter.CurrentElement = tableCellElement;
                        lineElement.AppendChild(tableCellElement);
                        elementsSetter.Invoke(
                            currentLine,
                            i,
                            null,
                            elementSetter);

                        if (colDifference > 0)
                        {
                            var colSpan = Math.Min(
                                colDifference + 1,
                                columnsNumber - i);
                            if (colSpan > 1)
                            {
                                tableCellElement.SetAttribute("colspan", colSpan.ToString());
                            }
                        }

                        var rowDifference = mergingRegion.BottomRightY - mergingRegion.TopLeftY;
                        if (rowDifference > 0)
                        {
                            var rowSpan = Math.Min(
                                rowDifference + 1,
                                linesNumber - currentLine);
                            if (rowSpan > 1)
                            {
                                tableCellElement.SetAttribute("rowspan", rowSpan.ToString());
                            }
                        }
                    }

                    i += colDifference;
                }
            }
        }