Exemplo n.º 1
0
        void BuildBordersInternal(ref int rIndex, ref int cIndex, int row, int column, int lineDirection, ref LineItem previousLineItem, ref BorderLine previousLine, ref BorderLine previousBreaker1, ref BorderLine previousBreaker2)
        {
            if ((row == -1) && (lineDirection == 1))
            {
                // 垂直线
                previousBreaker1 = GetBorderLine(rIndex, cIndex, 0, column, Borders.TOP);
                previousBreaker2 = GetBorderLine(rIndex, cIndex, 0, NextColumn(cIndex), Borders.TOP);
            }
            else if ((column != -1) || (lineDirection != 0))
            {
                BorderLine line;
                if (column == -1)
                {
                    line = GetBorderLine(rIndex, cIndex, row, 0, Borders.LEFT);
                }
                else if (row == -1)
                {
                    line = GetBorderLine(rIndex, cIndex, 0, column, Borders.TOP);
                }
                else
                {
                    Borders borderIndex = (lineDirection == 0) ? Borders.BOTTOM : Borders.RIGHT;
                    line = GetBorderLine(rIndex, cIndex, row, column, borderIndex);
                }

                bool flag = !BorderLineLayoutEngine.IsDoubleLine(line) && object.Equals(line, previousLine);
                if (flag)
                {
                    flag = BorderLine.Max(previousBreaker1, previousBreaker2) < line ||
                           BorderLine.Max(previousBreaker1, previousBreaker2) == line;
                }

                if (flag && (IsDoubleLine(previousBreaker1) || IsDoubleLine(previousBreaker2)))
                {
                    flag = false;
                }

                LineItem item;
                if (flag)
                {
                    // 等同上一线
                    item = previousLineItem;
                    switch (lineDirection)
                    {
                    case 0:
                        previousLineItem.ColumnEnd = column;
                        break;

                    case 1:
                        previousLineItem.RowEnd = row;
                        break;
                    }
                }
                else
                {
                    item = new LineItem
                    {
                        Direction        = lineDirection,
                        RowFrom          = row,
                        RowEnd           = row,
                        ColumnFrom       = column,
                        ColumnEnd        = column,
                        Line             = line,
                        PreviousLine     = previousLine,
                        PreviousBreaker1 = previousBreaker1,
                        PreviousBreaker2 = previousBreaker2
                    };

                    if (((item.Line != BorderLine.Empty) &&
                         (item.Line != BorderLine.NoBorder)) &&
                        (!item.IsGridLine || (line.Color.A != 0)))
                    {
                        ((IThemeContextSupport)line).SetContext(_owner.Excel.ActiveSheet);
                        CreateLine(item);
                        ((IThemeContextSupport)line).SetContext(null);
                    }
                }

                switch (lineDirection)
                {
                case 0:
                    if (row != -1)
                    {
                        item.NextLine     = GetBorderLine(rIndex, cIndex, row, NextColumn(cIndex), Borders.BOTTOM);
                        item.NextBreaker1 = GetBorderLine(rIndex, cIndex, row, column, Borders.RIGHT);
                        item.NextBreaker2 = GetBorderLine(rIndex, cIndex, NextRow(rIndex), column, Borders.RIGHT);
                        break;
                    }
                    item.NextLine     = GetBorderLine(rIndex, cIndex, 0, NextColumn(cIndex), Borders.TOP);
                    item.NextBreaker1 = _gridLine;
                    item.NextBreaker2 = GetBorderLine(rIndex, cIndex, 0, column, Borders.RIGHT);
                    break;

                case 1:
                    if (column != -1)
                    {
                        item.NextLine     = GetBorderLine(rIndex, cIndex, NextRow(rIndex), column, Borders.RIGHT);
                        item.NextBreaker1 = GetBorderLine(rIndex, cIndex, row, column, Borders.BOTTOM);
                        item.NextBreaker2 = GetBorderLine(rIndex, cIndex, row, NextColumn(cIndex), Borders.BOTTOM);
                        break;
                    }
                    item.NextLine     = GetBorderLine(rIndex, cIndex, NextRow(rIndex), column, Borders.LEFT);
                    item.NextBreaker1 = _gridLine;
                    item.NextBreaker2 = GetBorderLine(rIndex, cIndex, row, 0, Borders.BOTTOM);
                    break;
                }

                ulong num = (ulong)row;
                num  = num << 0x20;
                num |= (uint)column;

                Rect empty;
                if (!_cellBoundsCache.TryGetValue(num, out empty))
                {
                    empty = GetCellBounds(row, column);
                    _cellBoundsCache.Add(num, empty);
                }
                item.Bounds.Add(empty);

                previousLine     = line;
                previousLineItem = item;
                previousBreaker1 = item.NextBreaker1;
                previousBreaker2 = item.NextBreaker2;
            }
        }
Exemplo n.º 2
0
 static bool IsDoubleLine(BorderLine line)
 {
     return(BorderLineLayoutEngine.IsDoubleLine(line));
 }
Exemplo n.º 3
0
        void LinkBorders(Size availableSize)
        {
            foreach (var l in _lines)
            {
                var borderLine = l.Item.Line;
                if (borderLine.Style == BorderLineStyle.Double)
                {
                    if (l.Item.Direction == 0)
                    {
                        // 水平线
                        BorderLineLayoutEngine.CalcDoubleLayout(l.Item, -_location.X, -_location.Y, 0, out double num, out double num2, out double num3, out double num4, out double num5, out double num6, out double num7, out double num8, out double num9, out double num10, out double num11, out double num12);
                        l.Line1.X1 = num5;
                        l.Line1.X2 = num7;
                        l.Line2.X1 = num6;
                        l.Line2.X2 = num8;
                        l.Line1.Y1 = num3 - 1.0;
                        l.Line1.Y2 = num4 - 1.0;
                        l.Line2.Y1 = num3 + 1.0;
                        l.Line2.Y2 = num4 + 1.0;
                    }
                    else
                    {
                        BorderLineLayoutEngine.CalcDoubleLayout(l.Item, -_location.X, -_location.Y, 1, out double num, out double num2, out double num3, out double num4, out double num5, out double num6, out double num7, out double num8, out double num9, out double num10, out double num11, out double num12);
                        l.Line1.Y1 = num9;
                        l.Line1.Y2 = num11;
                        l.Line2.Y1 = num10;
                        l.Line2.Y2 = num12;
                        l.Line1.X1 = num - 1.0;
                        l.Line1.X2 = num2 - 1.0;
                        l.Line2.X1 = num + 1.0;
                        l.Line2.X2 = num2 + 1.0;
                    }
                }
                else if (borderLine.Style == BorderLineStyle.SlantedDashDot)
                {
                    if (l.Item.Direction == 0)
                    {
                        // 水平线
                        BorderLineLayoutEngine.CalcNormalLayout(l.Item, -_location.X, -_location.Y, 0, out double num, out double num2, out double num3, out double num4);
                        l.Line1.X1 = num;
                        l.Line1.X2 = num2;
                        l.Line1.Y1 = num3 - 1.0;
                        l.Line1.Y2 = num4 - 1.0;
                        l.Line2.X1 = num;
                        l.Line2.X2 = num2;
                        l.Line2.Y1 = num3;
                        l.Line2.Y2 = num4;
                        l.Line1.StrokeDashOffset = ((borderLine.StyleData.StrokeDashOffset + l.Line1.StrokeThickness) == 0.0) ? 0.0 : (((num - _location.X) / l.Line1.StrokeThickness) - 1.0);
                        l.Line2.StrokeDashOffset = ((borderLine.StyleData.StrokeDashOffset + l.Line2.StrokeThickness) == 0.0) ? 0.0 : ((num - _location.X) / l.Line2.StrokeThickness);
                    }
                    else
                    {
                        BorderLineLayoutEngine.CalcNormalLayout(l.Item, -_location.X, -_location.Y, 1, out double num, out double num2, out double num3, out double num4);
                        l.Line1.X1 = num - 1.0;
                        l.Line1.X2 = num2 - 1.0;
                        l.Line1.Y1 = num3;
                        l.Line1.Y2 = num4;
                        l.Line2.X1 = num;
                        l.Line2.X2 = num2;
                        l.Line2.Y1 = num3;
                        l.Line2.Y2 = num4;
                        l.Line1.StrokeDashOffset = ((borderLine.StyleData.StrokeDashOffset + l.Line1.StrokeThickness) == 0.0) ? 0.0 : (((num3 - _location.Y) / l.Line1.StrokeThickness) - 1.0);
                        l.Line2.StrokeDashOffset = ((borderLine.StyleData.StrokeDashOffset + l.Line2.StrokeThickness) == 0.0) ? 0.0 : ((num3 - _location.Y) / l.Line2.StrokeThickness);
                    }
                }
                else
                {
                    if (l.Item.Direction == 0)
                    {
                        // 水平线
                        BorderLineLayoutEngine.CalcNormalLayout(l.Item, -_location.X, -_location.Y, 0, out double num, out double num2, out double num3, out double num4);
                        l.Line1.X1 = num;
                        l.Line1.X2 = num2;
                        l.Line1.Y1 = num3;
                        l.Line1.Y2 = num4;
                        l.Line1.StrokeDashOffset = ((borderLine.StyleData.StrokeDashOffset + l.Line1.StrokeThickness) == 0.0) ? 0.0 : ((num - _location.X) / l.Line1.StrokeThickness);
                    }
                    else
                    {
                        BorderLineLayoutEngine.CalcNormalLayout(l.Item, -_location.X, -_location.Y, 1, out double num, out double num2, out double num3, out double num4);
                        l.Line1.X1 = num;
                        l.Line1.X2 = num2;
                        num3      += 0.0001;
                        l.Line1.Y1 = num3;
                        l.Line1.Y2 = num4;
                        l.Line1.StrokeDashOffset = ((borderLine.StyleData.StrokeDashOffset + l.Line1.StrokeThickness) == 0.0) ? 0.0 : ((num3 - _location.Y) / l.Line1.StrokeThickness);
                    }
                }

                l.Line1.Measure(availableSize);
                l.Line2?.Measure(availableSize);
            }
        }