loleaflet/src/control/Control.ColumnHeader.js | 41 +++++---- loleaflet/src/control/Control.Header.js | 13 ++- loleaflet/src/control/Control.RowHeader.js | 42 +++++----- loleaflet/src/control/Control.Scroll.js | 107 +++++++++++++++++++++++--- loleaflet/src/control/Parts.js | 3 loleaflet/src/layer/tile/CalcTileLayer.js | 37 ++------ loleaflet/src/layer/tile/TileLayer.js | 14 +-- 7 files changed, 174 insertions(+), 83 deletions(-)
New commits: commit 66da85e0c866afb2374aafb0e7a5cffc74f1e93d Author: Marco Cecchetti <marco.cecche...@collabora.com> Date: Wed Nov 30 14:23:42 2016 +0100 Calc: Raise the row limit to 10.000 rows. Change-Id: I5fe99f9d88f80cd9abbcf64d73a4b244739a0310 diff --git a/loleaflet/src/control/Control.ColumnHeader.js b/loleaflet/src/control/Control.ColumnHeader.js index dc7c2d2..d700742 100644 --- a/loleaflet/src/control/Control.ColumnHeader.js +++ b/loleaflet/src/control/Control.ColumnHeader.js @@ -17,7 +17,6 @@ L.Control.ColumnHeader = L.Control.Header.extend({ this._initialized = true; this._map.on('scrolloffset', this.offsetScrollPosition, this); this._map.on('updatescrolloffset', this.setScrollPosition, this); - this._map.on('updateviewport', this.setViewPort, this); this._map.on('viewrowcolumnheaders', this.viewRowColumnHeaders, this); this._map.on('updateselectionheader', this._onUpdateSelection, this); this._map.on('clearselectionheader', this._onClearSelection, this); @@ -28,9 +27,8 @@ L.Control.ColumnHeader = L.Control.Header.extend({ var headersContainer = L.DomUtil.create('div', 'spreadsheet-header-columns-container', rowColumnFrame); this._columns = L.DomUtil.create('div', 'spreadsheet-header-columns', headersContainer); + this._leftOffset = 0; this._position = 0; - this._totalWidth = 0; - this._viewPort = 0; var colHeaderObj = this; $.contextMenu({ @@ -99,6 +97,7 @@ L.Control.ColumnHeader = L.Control.Header.extend({ this._selectColumn(colAlpha, 0); } this._map.sendUnoCommand('.uno:InsertColumns'); + this._updateColumnHeader(); }, deleteColumn: function(colAlpha) { @@ -106,6 +105,7 @@ L.Control.ColumnHeader = L.Control.Header.extend({ this._selectColumn(colAlpha, 0); } this._map.sendUnoCommand('.uno:DeleteColumns'); + this._updateColumnHeader(); }, hideColumn: function(colAlpha) { @@ -113,6 +113,7 @@ L.Control.ColumnHeader = L.Control.Header.extend({ this._selectColumn(colAlpha, 0); } this._map.sendUnoCommand('.uno:HideColumn'); + this._updateColumnHeader(); }, showColumn: function(colAlpha) { @@ -120,25 +121,17 @@ L.Control.ColumnHeader = L.Control.Header.extend({ this._selectColumn(colAlpha, 0); } this._map.sendUnoCommand('.uno:ShowColumn'); - }, - - setViewPort: function(e) { - this._viewPort = e.columns.viewPort; - this._totalWidth = e.columns.totalWidth; + this._updateColumnHeader(); }, setScrollPosition: function (e) { var position = -e.x; this._position = Math.min(0, position); - L.DomUtil.setStyle(this._columns, 'left', this._position + 'px'); }, offsetScrollPosition: function (e) { var offset = e.x; - this._position = Math.min(0, - Math.max(this._position - offset, - -(this._totalWidth - this._viewPort))); - L.DomUtil.setStyle(this._columns, 'left', this._position + 'px'); + this._position = Math.min(0, this._position- offset); }, _onClearSelection: function (e) { @@ -153,16 +146,27 @@ L.Control.ColumnHeader = L.Control.Header.extend({ this.updateCurrent(this._columns, e.x); }, + _updateColumnHeader: function () { + this._map.fire('updaterowcolumnheaders', {x: this._map._getTopLeftPoint().x, y: 0, offset: {x: undefined, y: 0}}); + }, + viewRowColumnHeaders: function (e) { - this.fillColumns(e.data.columns, e.converter, e.context); + if (e.data.columns && e.data.columns.length > 0) { + this.fillColumns(e.data.columns, e.converter, e.context); + L.DomUtil.setStyle(this._columns, 'left', (this._position + this._leftOffset) + 'px'); + } }, fillColumns: function (columns, converter, context) { var iterator, twip, width, column, text, resize; L.DomUtil.empty(this._columns); - for (iterator = 0; iterator < columns.length; iterator++) { - width = columns[iterator].size - (iterator > 0 ? columns[iterator - 1].size : 0); + var leftOffset = new L.Point(columns[0].size, columns[0].size); + // column[0] is a dummy column header whose text attribute is set to the column index + var leftmostCol = parseInt(columns[0].text); + this._leftOffset = Math.round(converter.call(context, leftOffset).x); + for (iterator = 1; iterator < columns.length; iterator++) { + width = columns[iterator].size - columns[iterator - 1].size; twip = new L.Point(width, width); column = L.DomUtil.create('div', 'spreadsheet-header-column', this._columns); text = L.DomUtil.create('div', 'spreadsheet-header-column-text', column); @@ -175,7 +179,7 @@ L.Control.ColumnHeader = L.Control.Header.extend({ if (width <= 0) { L.DomUtil.setStyle(column, 'display', 'none'); } else if (width < 10) { - text.column = iterator + 1; + text.column = iterator + leftmostCol; text.width = width; L.DomUtil.setStyle(column, 'width', width + 'px'); L.DomUtil.setStyle(column, 'cursor', 'col-resize'); @@ -183,7 +187,7 @@ L.Control.ColumnHeader = L.Control.Header.extend({ L.DomUtil.setStyle(resize, 'display', 'none'); this.mouseInit(text); } else { - resize.column = iterator + 1; + resize.column = iterator + leftmostCol; resize.width = width; L.DomUtil.setStyle(column, 'width', width + 'px'); L.DomUtil.setStyle(text, 'width', width - 3 + 'px'); @@ -303,6 +307,7 @@ L.Control.ColumnHeader = L.Control.Header.extend({ }; this._map.sendUnoCommand('.uno:ColumnWidth', command); + this._updateColumnHeader(); } this._map.removeLayer(this._vertLine); diff --git a/loleaflet/src/control/Control.Header.js b/loleaflet/src/control/Control.Header.js index 8d19ec6..13bcd94 100644 --- a/loleaflet/src/control/Control.Header.js +++ b/loleaflet/src/control/Control.Header.js @@ -30,10 +30,18 @@ L.Control.Header = L.Control.extend({ }, clearSelection: function (element) { + if (this._selection.start === -1 && this._selection.end === -1) + return; var childs = element.children; - for (var iterator = this._selection.start; iterator <= this._selection.end; iterator++) { + // if the selection is cleared when the end selection cell is not in the current viewport, + // we have _selection.end === -1, since only a portion of the header is fetched; + // so, without the following hack, the selection would not be cleared correctly + var start = (this._selection.start === -1) ? 0 : this._selection.start; + var end = (this._selection.end === -1) ? childs.length : this._selection.end + 1; + for (var iterator = start; iterator < end; iterator++) { this.unselect(childs[iterator]); } + this._selection.start = this._selection.end = -1; // after clearing selection, we need to select the header entry for the current cursor position, // since we can't be sure that the selection clearing is due to click on a cell @@ -50,7 +58,8 @@ L.Control.Header = L.Control.extend({ for (var len = childs.length; iterator < len; iterator++) { x0 = (iterator > 0 ? childs[iterator - 1].size : 0); x1 = childs[iterator].size; - if (x0 <= start && start <= x1) { + // 'start < x1' not '<=' or we get highlighted also the `start-row - 1` and `start-column - 1` headers + if (x0 <= start && start < x1) { selected = true; itStart = iterator; } diff --git a/loleaflet/src/control/Control.RowHeader.js b/loleaflet/src/control/Control.RowHeader.js index 4152a4d..a53eab7 100644 --- a/loleaflet/src/control/Control.RowHeader.js +++ b/loleaflet/src/control/Control.RowHeader.js @@ -17,7 +17,6 @@ L.Control.RowHeader = L.Control.Header.extend({ this._initialized = true; this._map.on('scrolloffset', this.offsetScrollPosition, this); this._map.on('updatescrolloffset', this.setScrollPosition, this); - this._map.on('updateviewport', this.setViewPort, this); this._map.on('viewrowcolumnheaders', this.viewRowColumnHeaders, this); this._map.on('updateselectionheader', this._onUpdateSelection, this); this._map.on('clearselectionheader', this._onClearSelection, this); @@ -26,9 +25,8 @@ L.Control.RowHeader = L.Control.Header.extend({ var headersContainer = L.DomUtil.create('div', 'spreadsheet-header-rows-container', rowColumnFrame); this._rows = L.DomUtil.create('div', 'spreadsheet-header-rows', headersContainer); + this._topOffset = 0; this._position = 0; - this._totalHeight = 0; - this._viewPort = 0; var rowHeaderObj = this; $.contextMenu({ @@ -95,6 +93,7 @@ L.Control.RowHeader = L.Control.Header.extend({ this._selectRow(row, 0); } this._map.sendUnoCommand('.uno:InsertRows'); + this._updateRowHeader(); }, deleteRow: function(row) { @@ -102,6 +101,7 @@ L.Control.RowHeader = L.Control.Header.extend({ this._selectRow(row, 0); } this._map.sendUnoCommand('.uno:DeleteRows'); + this._updateRowHeader(); }, hideRow: function(row) { @@ -109,32 +109,25 @@ L.Control.RowHeader = L.Control.Header.extend({ this._selectRow(row, 0); } this._map.sendUnoCommand('.uno:HideRow'); + this._updateRowHeader(); }, showRow: function(row) { if (this._map._docLayer._selections.getLayers().length === 0) { - this._selectColumn(row, 0); + this._selectRow(row, 0); } this._map.sendUnoCommand('.uno:ShowRow'); - }, - - setViewPort: function(e) { - this._viewPort = e.rows.viewPort; - this._totalHeight = e.rows.totalHeight; + this._updateRowHeader(); }, setScrollPosition: function (e) { var position = -e.y; this._position = Math.min(0, position); - L.DomUtil.setStyle(this._rows, 'top', this._position + 'px'); }, offsetScrollPosition: function (e) { var offset = e.y; - this._position = Math.min(0, - Math.max(this._position - offset, - -(this._totalHeight - this._viewPort))); - L.DomUtil.setStyle(this._rows, 'top', this._position + 'px'); + this._position = Math.min(0, this._position - offset); }, _onClearSelection: function (e) { @@ -149,16 +142,26 @@ L.Control.RowHeader = L.Control.Header.extend({ this.updateCurrent(this._rows, e.y); }, + _updateRowHeader: function () { + this._map.fire('updaterowcolumnheaders', {x: 0, y: this._map._getTopLeftPoint().y, offset: {x: 0, y: undefined}}); + }, + viewRowColumnHeaders: function (e) { - this.fillRows(e.data.rows, e.converter, e.context); + if (e.data.rows && e.data.rows.length) { + this.fillRows(e.data.rows, e.converter, e.context); + L.DomUtil.setStyle(this._rows, 'top', (this._position + this._topOffset) + 'px'); + } }, fillRows: function (rows, converter, context) { var iterator, twip, height, row, text, resize; L.DomUtil.empty(this._rows); - for (iterator = 0; iterator < rows.length; iterator++) { - height = rows[iterator].size - (iterator > 0 ? rows[iterator - 1].size : 0); + var topOffset = new L.Point(rows[0].size, rows[0].size); + var topRow = parseInt(rows[0].text); + this._topOffset = Math.round(converter.call(context, topOffset).y); + for (iterator = 1; iterator < rows.length; iterator++) { + height = rows[iterator].size - rows[iterator - 1].size; twip = new L.Point(height, height); row = L.DomUtil.create('div', 'spreadsheet-header-row', this._rows); text = L.DomUtil.create('div', 'spreadsheet-header-row-text', row); @@ -171,7 +174,7 @@ L.Control.RowHeader = L.Control.Header.extend({ if (height <= 0) { L.DomUtil.setStyle(row, 'display', 'none'); } else if (height < 10) { - text.row = iterator + 1; + text.row = iterator + topRow; text.height = height; L.DomUtil.setStyle(row, 'height', height + 'px'); L.DomUtil.setStyle(row, 'cursor', 'row-resize'); @@ -180,7 +183,7 @@ L.Control.RowHeader = L.Control.Header.extend({ L.DomUtil.setStyle(resize, 'display', 'none'); this.mouseInit(text); } else { - resize.row = iterator + 1; + resize.row = iterator + topRow; resize.height = height; L.DomUtil.setStyle(row, 'height', height + 'px'); L.DomUtil.setStyle(text, 'line-height', height - 3 + 'px'); @@ -283,6 +286,7 @@ L.Control.RowHeader = L.Control.Header.extend({ }; this._map.sendUnoCommand('.uno:RowHeight', command); + this._updateRowHeader(); } this._map.removeLayer(this._horzLine); diff --git a/loleaflet/src/control/Control.Scroll.js b/loleaflet/src/control/Control.Scroll.js index 8728d88..f59c393 100644 --- a/loleaflet/src/control/Control.Scroll.js +++ b/loleaflet/src/control/Control.Scroll.js @@ -10,12 +10,16 @@ L.Control.Scroll = L.Control.extend({ this._mockDoc = L.DomUtil.create('div', '', this._scrollContainer); this._mockDoc.id = 'mock-doc'; + this._prevScrollX = 0; + this._prevScrollY = 0; + map.on('scrollto', this._onScrollTo, this); map.on('scrollby', this._onScrollBy, this); map.on('scrollvelocity', this._onScrollVelocity, this); map.on('handleautoscroll', this._onHandleAutoScroll, this); map.on('docsize', this._onUpdateSize, this); map.on('updatescrolloffset', this._onUpdateScrollOffset, this); + map.on('updaterowcolumnheaders', this._onUpdateRowColumnHeaders, this); var control = this; $('.scroll-container').mCustomScrollbar({ @@ -34,7 +38,53 @@ L.Control.Scroll = L.Control.extend({ }); }, + _onCalcScroll: function (e) { + if (!this._map._enabled) { + return; + } + + var newLeft = -e.mcs.left; + if (newLeft > this._prevScrollX) { + var viewportWidth = this._map.getSize().x; + var docWidth = this._map._docLayer._docPixelSize.x; + newLeft = Math.min(newLeft, docWidth - viewportWidth); + } + else { + newLeft = Math.max(newLeft, 0); + } + + var newTop = -e.mcs.top; + if (newTop > this._prevScrollY) { + var viewportHeight = this._map.getSize().y; + var docHeight = Math.round(this._map._docLayer._docPixelSize.y); + newTop = Math.min(newTop, docHeight - viewportHeight); + } + else { + newTop = Math.max(newTop, 0); + } + + var offset = new L.Point( + newLeft - this._prevScrollX, + newTop - this._prevScrollY); + + if (offset.equals(new L.Point(0, 0))) { + return; + } + + this._onUpdateRowColumnHeaders({ x: newLeft, y: newTop, offset: offset}); + + this._prevScrollY = newTop; + this._prevScrollX = newLeft; + this._map.fire('scrolloffset', offset); + this._map.scroll(offset.x, offset.y); + }, + _onScroll: function (e) { + if (this._map._docLayer._docType === 'spreadsheet') { + this._onCalcScroll(e); + return; + } + if (!this._map._enabled) { return; } @@ -43,15 +93,9 @@ L.Control.Scroll = L.Control.extend({ this._ignoreScroll = null; return; } - if (this._prevScrollY === undefined) { - this._prevScrollY = 0; - } - if (this._prevScrollX === undefined) { - this._prevScrollX = 0; - } var offset = new L.Point( - -e.mcs.left - this._prevScrollX, - -e.mcs.top - this._prevScrollY); + -e.mcs.left - this._prevScrollX, + -e.mcs.top - this._prevScrollY); if (!offset.equals(new L.Point(0, 0))) { this._prevScrollY = -e.mcs.top; @@ -62,6 +106,10 @@ L.Control.Scroll = L.Control.extend({ }, _onScrollEnd: function (e) { + // needed in order to keep the row/column header correctly aligned + if (this._map._docLayer._docType === 'spreadsheet') { + return; + } this._prevScrollY = -e.mcs.top; this._prevScrollX = -e.mcs.left; }, @@ -118,16 +166,20 @@ L.Control.Scroll = L.Control.extend({ }, _onUpdateSize: function (e) { + if (!this._mockDoc) { + return; + } + // we need to avoid precision issues in comparison (in the end values are pixels) var prevDocWidth = Math.ceil(parseFloat(L.DomUtil.getStyle(this._mockDoc, 'width'))); var prevDocHeight = Math.ceil(parseFloat(L.DomUtil.getStyle(this._mockDoc, 'height'))); var newDocWidth = Math.ceil(e.x); var newDocHeight = Math.ceil(e.y); + // for writer documents, ignore scroll while document size is being reduced if (this._map.getDocType() === 'text' && newDocHeight < prevDocHeight) { this._ignoreScroll = true; } - L.DomUtil.setStyle(this._mockDoc, 'width', e.x + 'px'); L.DomUtil.setStyle(this._mockDoc, 'height', e.y + 'px'); @@ -140,11 +192,48 @@ L.Control.Scroll = L.Control.extend({ }, _onUpdateScrollOffset: function (e) { + // used on window resize + if (this._map._docLayer._docType === 'spreadsheet') { + var offset = new L.Point(e.x - this._prevScrollX, e.y - this._prevScrollY); + if (!offset.equals(new L.Point(0, 0))) { + this._onUpdateRowColumnHeaders({x: e.x, y: e.y, offset: offset}); + } + } this._ignoreScroll = null; $('.scroll-container').mCustomScrollbar('stop'); this._prevScrollY = e.y; this._prevScrollX = e.x; $('.scroll-container').mCustomScrollbar('scrollTo', [e.y, e.x], {callbacks: false, timeout:0}); + }, + + _onUpdateRowColumnHeaders: function(e) { + var offset = e.offset || {}; + + var topLeftPoint = new L.Point(e.x, e.y); + var sizePx = this._map.getSize(); + + if (topLeftPoint.x === undefined) { + topLeftPoint.x = this._map._getTopLeftPoint().x; + } + if (topLeftPoint.y === undefined) { + topLeftPoint.y = this._map._getTopLeftPoint().y; + } + + if (offset.x === 0) { + topLeftPoint.x = -1; + sizePx.x = 0; + } + if (offset.y === 0) { + topLeftPoint.y = -1; + sizePx.y = 0; + } + + var pos = this._map._docLayer._pixelsToTwips(topLeftPoint); + var size = this._map._docLayer._pixelsToTwips(sizePx); + var payload = 'commandvalues command=.uno:ViewRowColumnHeaders?x=' + Math.round(pos.x) + '&y=' + Math.round(pos.y) + + '&width=' + Math.round(size.x) + '&height=' + Math.round(size.y); + + this._map._socket.sendMessage(payload); } }); diff --git a/loleaflet/src/control/Parts.js b/loleaflet/src/control/Parts.js index 691942f..a7e4fd5 100644 --- a/loleaflet/src/control/Parts.js +++ b/loleaflet/src/control/Parts.js @@ -42,9 +42,6 @@ L.Map.include({ if (docLayer._invalidatePreview) { docLayer._invalidatePreview(); } - if (docLayer._docType === 'spreadsheet') { - this._socket.sendMessage('commandvalues command=.uno:ViewRowColumnHeaders'); - } docLayer._drawSearchResults(); if (!this._searchRequested) { this.focus(); diff --git a/loleaflet/src/layer/tile/CalcTileLayer.js b/loleaflet/src/layer/tile/CalcTileLayer.js index 02747de..61638b6 100644 --- a/loleaflet/src/layer/tile/CalcTileLayer.js +++ b/loleaflet/src/layer/tile/CalcTileLayer.js @@ -15,7 +15,6 @@ L.CalcTileLayer = L.TileLayer.extend({ beforeAdd: function (map) { map._addZoomLimit(this); map.on('zoomend', this._onZoomRowColumns, this); - map.on('resize', this._onUpdateViewPort, this); }, _onInvalidateTilesMsg: function (textMsg) { @@ -139,7 +138,8 @@ L.CalcTileLayer = L.TileLayer.extend({ if (part !== this._selectedPart) { this._map.setPart(part); this._map.fire('setpart', {selectedPart: this._selectedPart}); - this._map._socket.sendMessage('commandvalues command=.uno:ViewRowColumnHeaders'); + // TODO: test it! + this._map.fire('updaterowcolumnheaders'); } }, @@ -149,22 +149,16 @@ L.CalcTileLayer = L.TileLayer.extend({ this._map._socket.sendMessage('clientzoom ' + this._clientZoom); this._clientZoom = null; } - this._map._socket.sendMessage('commandvalues command=.uno:ViewRowColumnHeaders'); + // TODO: test it! + this._map.fire('updaterowcolumnheaders'); }, - _onUpdateViewPort: function () { - var width = parseInt(L.DomUtil.getStyle(this._map._container, 'width')); - var height = parseInt(L.DomUtil.getStyle(this._map._container, 'height')); - this._map.fire('updateviewport', { - rows: { - totalHeight: this._docPixelSize.y, - viewPort: height - }, - columns: { - totalWidth: this._docPixelSize.x, - viewPort: width - } - }); + _onUpdateCurrentHeader: function() { + var pos = new L.Point(-1, -1); + if (this._cellCursor && !this._isEmptyRectangle(this._cellCursor)) { + pos = this._cellCursorTwips.min.add([1, 1]); + } + this._map.fire('updatecurrentheader', pos); }, _onUpdateSelectionHeader: function () { @@ -221,9 +215,6 @@ L.CalcTileLayer = L.TileLayer.extend({ this._preFetchBorder = null; } } - - // Force fetching of row/column headers - this._onZoomRowColumns(); }, _onCommandValuesMsg: function (textMsg) { @@ -234,7 +225,7 @@ L.CalcTileLayer = L.TileLayer.extend({ converter: this._twipsToPixels, context: this }); - this._onUpdateViewPort(); + this._onUpdateCurrentHeader(); this._onUpdateSelectionHeader(); } else { @@ -248,11 +239,7 @@ L.CalcTileLayer = L.TileLayer.extend({ }, _onCellCursorMsg: function (textMsg) { - var pos = new L.Point(-1, -1); L.TileLayer.prototype._onCellCursorMsg.call(this, textMsg); - if (this._cellCursor && !this._isEmptyRectangle(this._cellCursor)) { - pos = this._cellCursorTwips.min.add([1, 1]); - } - this._map.fire('updatecurrentheader', pos); + this._onUpdateCurrentHeader(); } }); diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js index 6e3ae9c..62180dd 100644 --- a/loleaflet/src/layer/tile/TileLayer.js +++ b/loleaflet/src/layer/tile/TileLayer.js @@ -1199,8 +1199,7 @@ L.TileLayer = L.GridLayer.extend({ }, _postKeyboardEvent: function(type, charcode, keycode) { - if (this._docType === 'spreadsheet' && this._prevCellCursor && type === 'input') - { + if (this._docType === 'spreadsheet' && this._prevCellCursor && type === 'input') { if (keycode === 1030) { // PgUp if (this._cellCursorOnPgUp) { return; @@ -1542,17 +1541,18 @@ L.TileLayer = L.GridLayer.extend({ scrollY = (this._cellCursor.getNorth() - mapBounds.getNorth()) + mapHalfHeight; } } - else { + else if (horizontalDirection !== 0 || verticalDirection != 0) { var spacingX = Math.abs(this._cellCursor.getEast() - this._cellCursor.getWest()) / 4.0; var spacingY = Math.abs((this._cellCursor.getSouth() - this._cellCursor.getNorth())) / 4.0; - if (horizontalDirection === -1 && this._cellCursor.getWest() < mapBounds.getWest()) { + + if (this._cellCursor.getWest() < mapBounds.getWest()) { scrollX = this._cellCursor.getWest() - mapBounds.getWest() - spacingX; - } else if (horizontalDirection === 1 && this._cellCursor.getEast() > mapBounds.getEast()) { + } else if (this._cellCursor.getEast() > mapBounds.getEast()) { scrollX = this._cellCursor.getEast() - mapBounds.getEast() + spacingX; } - if (verticalDirection === 1 && this._cellCursor.getNorth() > mapBounds.getNorth()) { + if (this._cellCursor.getNorth() > mapBounds.getNorth()) { scrollY = this._cellCursor.getNorth() - mapBounds.getNorth() + spacingY; - } else if (verticalDirection === -1 && this._cellCursor.getSouth() < mapBounds.getSouth()) { + } else if (this._cellCursor.getSouth() < mapBounds.getSouth()) { scrollY = this._cellCursor.getSouth() - mapBounds.getSouth() - spacingY; } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits