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); }
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); } } } } }
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; } } } } } } } }
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); } }