[Libreoffice-commits] online.git: loleaflet/src

Dennis Francis (via logerrit) logerrit at kemper.freedesktop.org
Wed Jul 8 15:04:57 UTC 2020


 loleaflet/src/layer/tile/CalcTileLayer.js |  113 ++++++++++++++++++++++++++++++
 loleaflet/src/layer/tile/TileLayer.js     |   39 +---------
 2 files changed, 119 insertions(+), 33 deletions(-)

New commits:
commit 8c1b87462fa759aafb864cc953acb87e963beabf
Author:     Dennis Francis <dennis.francis at collabora.com>
AuthorDate: Tue Jul 7 17:21:35 2020 +0530
Commit:     Dennis Francis <dennis.francis at collabora.com>
CommitDate: Wed Jul 8 17:04:38 2020 +0200

    integrate SplitPanesContext with CalcTileLayer...
    
    and take split-panes into account when switching views on the arrival
    of a new cursor message.
    
    Change-Id: If97b06ceefd15335555d77b4074fd6991e21b7ab
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/98358
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Tested-by: Jenkins
    Reviewed-by: Dennis Francis <dennis.francis at collabora.com>

diff --git a/loleaflet/src/layer/tile/CalcTileLayer.js b/loleaflet/src/layer/tile/CalcTileLayer.js
index 9d711b48f..70fbe3dd0 100644
--- a/loleaflet/src/layer/tile/CalcTileLayer.js
+++ b/loleaflet/src/layer/tile/CalcTileLayer.js
@@ -56,6 +56,7 @@ L.CalcTileLayer = L.TileLayer.extend({
 		map.on('AnnotationCancel', this._onAnnotationCancel, this);
 		map.on('AnnotationReply', this._onAnnotationReply, this);
 		map.on('AnnotationSave', this._onAnnotationSave, this);
+		map.on('splitposchanged', this._calcSplitCell, this);
 
 		map.uiManager.initializeSpecializedUI('spreadsheet');
 	},
@@ -68,6 +69,7 @@ L.CalcTileLayer = L.TileLayer.extend({
 	},
 
 	onAdd: function (map) {
+		this._switchSplitPanesContext();
 		map.addControl(L.control.tabs());
 		map.addControl(L.control.columnHeader());
 		map.addControl(L.control.rowHeader());
@@ -437,6 +439,7 @@ L.CalcTileLayer = L.TileLayer.extend({
 		var part = parseInt(textMsg.match(/\d+/g)[0]);
 		if (!this.isHiddenPart(part)) {
 			this._clearMsgReplayStore();
+			this._switchSplitPanesContext();
 			this.refreshViewData(undefined, false /* compatDataSrcOnly */, true /* sheetGeometryChanged */);
 		}
 	},
@@ -449,6 +452,7 @@ L.CalcTileLayer = L.TileLayer.extend({
 		}
 		this._restrictDocumentSize();
 		this._replayPrintTwipsMsgs();
+		this._updateSplitPos();
 		this._map.fire('zoomchanged');
 		this.refreshViewData();
 		this._map._socket.sendMessage('commandvalues command=.uno:ViewAnnotationsPosition');
@@ -721,9 +725,55 @@ L.CalcTileLayer = L.TileLayer.extend({
 		this._updateHeadersGridLines(undefined, true /* updateCols */,
 			true /* updateRows */);
 
+		this._updateSplitPos();
+
 		this._map.fire('sheetgeometrychanged');
 	},
 
+	_updateSplitPos: function () {
+		if (this._splitPanesContext) {
+			if (this._splitPanesContext._splitCell) {
+				var splitCell = this._splitPanesContext._splitCell;
+				var newSplitPos = this.sheetGeometry.getCellRect(splitCell.x, splitCell.y).min;
+				this._splitPanesContext.setSplitPos(newSplitPos.x, newSplitPos.y); // will update the splitters.
+			}
+			else {
+				// Can happen only on load.
+				this._splitPanesContext.alignSplitPos();
+				this._calcSplitCell();
+			}
+		}
+	},
+
+	_calcSplitCell: function () {
+
+		if (!this.sheetGeometry || !this._splitPanesContext) {
+			return;
+		}
+
+		this._splitPanesContext._splitCell =
+			this.sheetGeometry.getCellFromPos(this._splitPanesContext.getSplitPos(), 'csspixels');
+	},
+
+	_switchSplitPanesContext: function () {
+
+		if (!this.hasSplitPanesSupport()) {
+			return;
+		}
+
+		if (!this._splitPaneCache) {
+			this._splitPaneCache = {};
+		}
+
+		var spContext = this._splitPaneCache[this._selectedPart];
+		if (!spContext) {
+			spContext = new L.SplitPanesContext(this);
+		}
+
+		this._splitPanesContext = spContext;
+		this._map._splitPanesContext = spContext;
+	},
+
 	_onCommandValuesMsg: function (textMsg) {
 		var jsonIdx = textMsg.indexOf('{');
 		if (jsonIdx === -1)
@@ -881,6 +931,69 @@ L.CalcTileLayer = L.TileLayer.extend({
 		return this._twipsToPixels(this._cellCursorTwips.getTopLeft());
 	},
 
+	_calculateScrollForNewCursor: function () {
+
+		var scroll = new L.LatLng(0, 0);
+
+		if (!this._cellCursor || this._isEmptyRectangle(this._cellCursor)) {
+			return scroll;
+		}
+
+		var map = this._map;
+		var paneRects = this._splitPanesContext ?
+			this._splitPanesContext.getPxBoundList() : undefined;
+
+		console.assert(paneRects === undefined || paneRects.length, 'number of panes cannot be zero!');
+
+		var paneRectsInLatLng = paneRects ? paneRects.map(function (pxBound) {
+			return new L.LatLngBounds(
+				map.unproject(pxBound.getTopLeft()),
+				map.unproject(pxBound.getBottomRight())
+			);
+		}) : [ map.getBounds() ];
+
+		var scrollNeeded = true;
+		for (var i = 0; i < paneRectsInLatLng.length; ++i) {
+			if (paneRectsInLatLng[i].contains(this._cellCursor)) {
+				scrollNeeded = false;
+				break;
+			}
+		}
+
+		if (!scrollNeeded) {
+			return scroll; // zero scroll.
+		}
+
+		var freePaneBounds = paneRectsInLatLng[paneRectsInLatLng.length - 1];
+		var splitPoint = map.unproject(this._splitPanesContext ? this._splitPanesContext.getSplitPos() : new L.Point(0, 0));
+
+		if (this._cellCursor.getEast() > splitPoint.lng) {
+
+			var freePaneWidth = Math.abs(freePaneBounds.getEast() - freePaneBounds.getWest());
+			var cursorWidth = Math.abs(this._cellCursor.getEast() - this._cellCursor.getWest());
+			var spacingX = cursorWidth / 4.0;
+
+			if (this._cellCursor.getWest() < freePaneBounds.getWest()) {
+				scroll.lng = this._cellCursor.getWest() - freePaneBounds.getWest() - spacingX;
+			}
+			else if (cursorWidth < freePaneWidth && this._cellCursor.getEast() > freePaneBounds.getEast()) {
+				scroll.lng = this._cellCursor.getEast() - freePaneBounds.getEast() + spacingX;
+			}
+		}
+
+		if (this._cellCursor.getSouth() < splitPoint.lat) {
+
+			var spacingY = Math.abs((this._cellCursor.getSouth() - this._cellCursor.getNorth())) / 4.0;
+			if (this._cellCursor.getNorth() > freePaneBounds.getNorth()) {
+				scroll.lat = this._cellCursor.getNorth() - freePaneBounds.getNorth() + spacingY;
+			}
+			else if (this._cellCursor.getSouth() < freePaneBounds.getSouth()) {
+				scroll.lat = this._cellCursor.getSouth() - freePaneBounds.getSouth() - spacingY;
+			}
+		}
+
+		return scroll;
+	},
 });
 
 L.MessageStore = L.Class.extend({
diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 73d2da8a5..e5f73a10c 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -2962,40 +2962,13 @@ L.TileLayer = L.GridLayer.extend({
 				this._map.dialog._updateTextSelection(inputBarId);
 			}
 			var mapBounds = this._map.getBounds();
-			if (!mapBounds.contains(this._cellCursor) && !this._cellCursorXY.equals(this._prevCellCursorXY)) {
-				var scrollX = 0, scrollY = 0;
-				if (onPgUpDn) {
-					var mapHalfHeight = (mapBounds.getNorth() - mapBounds.getSouth()) / 2;
-					var cellCursorOnPgUpDn = (this._cellCursorOnPgUp) ? this._cellCursorOnPgUp : this._cellCursorOnPgDn;
-
-					scrollY = this._cellCursor.getNorth() - cellCursorOnPgUpDn.getNorth();
-					if (this._cellCursor.getNorth() > mapBounds.getNorth() + scrollY) {
-						scrollY = (this._cellCursor.getNorth() - mapBounds.getNorth()) + mapHalfHeight;
-					} else if (this._cellCursor.getSouth() < mapBounds.getSouth() + scrollY) {
-						scrollY = (this._cellCursor.getNorth() - mapBounds.getNorth()) + mapHalfHeight;
-					}
-				}
-				else if (horizontalDirection !== 0 || verticalDirection != 0) {
-					var mapX = Math.abs(mapBounds.getEast() - mapBounds.getWest());
-					var cursorX = Math.abs(this._cellCursor.getEast() - this._cellCursor.getWest());
-					var spacingX = cursorX / 4.0;
-					var spacingY = Math.abs((this._cellCursor.getSouth() - this._cellCursor.getNorth())) / 4.0;
-
-					if (this._cellCursor.getWest() < mapBounds.getWest()) {
-						scrollX = this._cellCursor.getWest() - mapBounds.getWest() - spacingX;
-					} else if (cursorX < mapX && this._cellCursor.getEast() > mapBounds.getEast()) {
-						scrollX = this._cellCursor.getEast() - mapBounds.getEast() + spacingX;
-					}
-					if (this._cellCursor.getNorth() > mapBounds.getNorth()) {
-						scrollY = this._cellCursor.getNorth() - mapBounds.getNorth() + spacingY;
-					} else if (this._cellCursor.getSouth() < mapBounds.getSouth()) {
-						scrollY = this._cellCursor.getSouth() - mapBounds.getSouth() - spacingY;
-					}
-				}
-				if (scrollX !== 0 || scrollY !== 0) {
+			if (!this._cellCursorXY.equals(this._prevCellCursorXY)) {
+				var scroll = this._calculateScrollForNewCursor();
+				console.assert(scroll instanceof L.LatLng, '_calculateScrollForNewCursor returned wrong type');
+				if (scroll.lng !== 0 || scroll.lat !== 0) {
 					var newCenter = mapBounds.getCenter();
-					newCenter.lng += scrollX;
-					newCenter.lat += scrollY;
+					newCenter.lng += scroll.lng;
+					newCenter.lat += scroll.lat;
 					var center = this._map.project(newCenter);
 					center = center.subtract(this._map.getSize().divideBy(2));
 					center.x = Math.round(center.x < 0 ? 0 : center.x);


More information about the Libreoffice-commits mailing list