Пример #1
0
        CellOverflowLayout BuildTrailingCellOverflowLayoutModel(int rowIndex, ColumnLayoutModel columnLayoutModel, CellOverflowLayoutModel existed, object textFormattingMode, bool useLayoutRounding)
        {
            ColumnLayout layout = Enumerable.LastOrDefault <ColumnLayout>(columnLayoutModel, delegate(ColumnLayout clm)
            {
                return(clm.Width > 0.0);
            });

            if (layout == null)
            {
                if (columnLayoutModel.Count == 0)
                {
                    return(null);
                }
                layout = columnLayoutModel[0];
            }
            if (!existed.Contains(layout.Column))
            {
                CellOverflowLayout layout2     = new CellOverflowLayout(layout.Column, 0.0);
                ICellsSupport      dataContext = Viewport.GetDataContext();
                SheetSpanModelBase spanModel   = Viewport.GetSpanModel();
                for (int i = 1; i < _maxCellOverflowDistance; i++)
                {
                    int column = layout.Column + i;
                    if (column >= dataContext.Columns.Count)
                    {
                        return(null);
                    }
                    if (dataContext.Columns[column].ActualWidth > 0.0)
                    {
                        if ((spanModel != null) && (spanModel.Find(rowIndex, column) != null))
                        {
                            return(null);
                        }
                        Cell cachedCell = Viewport.CellCache.GetCachedCell(rowIndex, column);
                        if (!string.IsNullOrEmpty(cachedCell.Text))
                        {
                            if (cachedCell.ActualWordWrap)
                            {
                                return(null);
                            }
                            if (cachedCell.ActualShrinkToFit)
                            {
                                return(null);
                            }
                            switch (cachedCell.ToHorizontalAlignment())
                            {
                            case HorizontalAlignment.Left:
                            case HorizontalAlignment.Stretch:
                                return(null);

                            case HorizontalAlignment.Center:
                            {
                                int deadColumnIndex = columnLayoutModel[0].Column - 1;
                                layout2 = BuildCellOverflowLayoutModelForRight(cachedCell, rowIndex, existed, true, deadColumnIndex, textFormattingMode, useLayoutRounding);
                                if ((layout2 == null) || (layout2.StartingColumn > ViewportRightColumn))
                                {
                                    return(null);
                                }
                                layout2.BackgroundWidth += (dataContext.Columns[column].ActualWidth * Viewport.Excel.ZoomFactor) / 2.0;
                                return(layout2);
                            }

                            case HorizontalAlignment.Right:
                            {
                                int num5 = columnLayoutModel[0].Column - 1;
                                layout2 = BuildCellOverflowLayoutModelForRight(cachedCell, rowIndex, existed, false, num5, textFormattingMode, useLayoutRounding);
                                if ((layout2 == null) || (layout2.StartingColumn > ViewportRightColumn))
                                {
                                    return(null);
                                }
                                return(layout2);
                            }
                            }
                            break;
                        }
                    }
                }
            }
            return(null);
        }
Пример #2
0
        protected override Size ArrangeOverride(Size finalSize)
        {
            Rect rc = new Rect(0.0, 0.0, finalSize.Width, finalSize.Height);

            _rowsLayer.Arrange(rc);
            _borderLayer.Arrange(rc);
            _selectionLayer.Arrange(rc);
            _dragFillLayer.Arrange(_cachedDragFillRect);
            _decorationLayer?.Arrange(rc);

#if !IOS
            // 正在编辑时滚动页面若不重新布局会造成编辑框没跟着滚动
            // iOS始终重新布局,再调用 InvalidateArrange 会死循环!
            if (IsEditing())
            {
                _editorLayer.InvalidateArrange();
            }
#endif
            _editorLayer.Arrange(rc);

            _floatingLayer.Arrange(rc);
            _floatingEditLayer.Arrange(rc);

            Size viewportSize = GetViewportSize(finalSize);
            if (Excel.IsTouching)
            {
                if (Clip == null)
                {
                    Clip = new RectangleGeometry {
                        Rect = new Rect(new Point(), viewportSize)
                    }
                }
                ;
            }
            else
            {
                Clip = new RectangleGeometry {
                    Rect = new Rect(new Point(), viewportSize)
                };
            }

            if (Clip != null)
            {
                _borderLayer.Clip = new RectangleGeometry {
                    Rect = Clip.Rect
                }
            }
            ;
            return(finalSize);
        }

        void BuildSpanGraph()
        {
            _cachedSpanGraph.Reset();
            SheetSpanModelBase spanModel = GetSpanModel();

            if ((spanModel != null) && !spanModel.IsEmpty())
            {
                int rowStart    = Excel.GetViewportTopRow(RowViewportIndex);
                int rowEnd      = Excel.GetViewportBottomRow(RowViewportIndex);
                int columnStart = Excel.GetViewportLeftColumn(ColumnViewportIndex);
                int columnEnd   = Excel.GetViewportRightColumn(ColumnViewportIndex);

                if ((rowStart <= rowEnd) && (columnStart <= columnEnd))
                {
                    int num5 = -1;
                    for (int i = rowStart - 1; i > -1; i--)
                    {
                        if (Excel.ActiveSheet.GetActualRowVisible(i, SheetArea.Cells))
                        {
                            num5 = i;
                            break;
                        }
                    }
                    rowStart = num5;
                    int count = GetDataContext().Rows.Count;
                    for (int j = rowEnd + 1; j < count; j++)
                    {
                        if (Excel.ActiveSheet.GetActualRowVisible(j, SheetArea.Cells))
                        {
                            rowEnd = j;
                            break;
                        }
                    }
                    int num9 = -1;
                    for (int k = columnStart - 1; k > -1; k--)
                    {
                        if (Excel.ActiveSheet.GetActualColumnVisible(k, SheetArea.Cells))
                        {
                            num9 = k;
                            break;
                        }
                    }
                    columnStart = num9;
                    int num11 = GetDataContext().Columns.Count;
                    for (int m = columnEnd + 1; m < num11; m++)
                    {
                        if (Excel.ActiveSheet.GetActualColumnVisible(m, SheetArea.Cells))
                        {
                            columnEnd = m;
                            break;
                        }
                    }
                    _cachedSpanGraph.BuildGraph(columnStart, columnEnd, rowStart, rowEnd, GetSpanModel(), CellCache);
                }
            }
        }
    }
}
Пример #3
0
        public void BuildGraph(int columnStart, int columnEnd, int rowStart, int rowEnd, SheetSpanModelBase spanModel, ICellSupport cellsPool)
        {
            _cachedLeftColumn  = columnStart;
            _cachedRightColumn = columnEnd;
            _cachedTopRow      = rowStart;
            _cachedBottomRow   = rowEnd;
            int rowCount    = (_cachedBottomRow - _cachedTopRow) + 1;
            int columnCount = (_cachedRightColumn - _cachedLeftColumn) + 1;

            if ((rowCount > 0) && (columnCount > 0))
            {
                _cahcedSpanGraph = new byte[rowCount, columnCount];
                IEnumerator enumerator = spanModel.GetEnumerator(_cachedTopRow, _cachedLeftColumn, rowCount, columnCount);
                while (enumerator.MoveNext())
                {
                    CellRange current = (CellRange)enumerator.Current;
                    Cell      cell    = cellsPool.GetCell(current.Row, current.Column);
                    byte      num3    = 0;
                    if ((cell != null) && (cell.ActualBackground != null))
                    {
                        num3 = 0x20;
                    }
                    for (int i = 0; i < current.RowCount; i++)
                    {
                        int num5 = i + current.Row;
                        if ((num5 <= _cachedBottomRow) && (num5 >= _cachedTopRow))
                        {
                            for (int j = 0; j < current.ColumnCount; j++)
                            {
                                int num7 = j + current.Column;
                                if ((num7 >= _cachedLeftColumn) && (num7 <= _cachedRightColumn))
                                {
                                    _cahcedSpanGraph[num5 - _cachedTopRow, num7 - _cachedLeftColumn] += num3;
                                    if ((j == 0) && (i == 0))
                                    {
                                        _cahcedSpanGraph[num5 - _cachedTopRow, num7 - _cachedLeftColumn] += 0x40;
                                    }
                                    if (j == 0)
                                    {
                                        _cahcedSpanGraph[num5 - _cachedTopRow, num7 - _cachedLeftColumn]++;
                                    }
                                    if (j == (current.ColumnCount - 1))
                                    {
                                        _cahcedSpanGraph[num5 - _cachedTopRow, num7 - _cachedLeftColumn] += 4;
                                    }
                                    if (i == 0)
                                    {
                                        _cahcedSpanGraph[num5 - _cachedTopRow, num7 - _cachedLeftColumn] += 2;
                                    }
                                    if (i == (current.RowCount - 1))
                                    {
                                        _cahcedSpanGraph[num5 - _cachedTopRow, num7 - _cachedLeftColumn] += 8;
                                    }
                                    if (((j > 0) && (j < (current.ColumnCount - 1))) && ((i > 0) && (i < (current.RowCount - 1))))
                                    {
                                        _cahcedSpanGraph[num5 - _cachedTopRow, num7 - _cachedLeftColumn] += 0x10;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #4
0
        void BuildSpanGraph()
        {
            CachedSpanGraph.Reset();
            SheetSpanModelBase spanModel = GetSpanModel();

            if (spanModel == null || spanModel.IsEmpty())
            {
                return;
            }

            int rowStart    = -1;
            int rowEnd      = -1;
            int columnStart = -1;
            int columnEnd   = -1;

            switch (Area)
            {
            case (SheetArea.CornerHeader | SheetArea.RowHeader):
                rowStart    = Excel.GetViewportTopRow(RowViewportIndex);
                rowEnd      = Excel.GetViewportBottomRow(RowViewportIndex);
                columnStart = 0;
                columnEnd   = Excel.ActiveSheet.RowHeader.ColumnCount - 1;
                break;

            case SheetArea.ColumnHeader:
                rowStart    = 0;
                rowEnd      = Excel.ActiveSheet.ColumnHeader.RowCount - 1;
                columnStart = Excel.GetViewportLeftColumn(ColumnViewportIndex);
                columnEnd   = Excel.GetViewportRightColumn(ColumnViewportIndex);
                break;
            }
            if ((rowStart <= rowEnd) && (columnStart <= columnEnd))
            {
                int num5 = -1;
                for (int i = rowStart - 1; i > -1; i--)
                {
                    if (Excel.ActiveSheet.GetActualRowVisible(i, Area))
                    {
                        num5 = i;
                        break;
                    }
                }
                rowStart = num5;
                int count = GetDataContext().Rows.Count;
                for (int j = rowEnd + 1; j < count; j++)
                {
                    if (Excel.ActiveSheet.GetActualRowVisible(j, Area))
                    {
                        rowEnd = j;
                        break;
                    }
                }
                int num9 = -1;
                for (int k = columnStart - 1; k > -1; k--)
                {
                    if (Excel.ActiveSheet.GetActualColumnVisible(k, Area))
                    {
                        num9 = k;
                        break;
                    }
                }
                columnStart = num9;
                int num11 = GetDataContext().Columns.Count;
                for (int m = columnEnd + 1; m < num11; m++)
                {
                    if (Excel.ActiveSheet.GetActualColumnVisible(m, Area))
                    {
                        columnEnd = m;
                        break;
                    }
                }
                CachedSpanGraph.BuildGraph(columnStart, columnEnd, rowStart, rowEnd, GetSpanModel(), CellCache);
            }
        }