loleaflet/src/layer/tile/CalcTileLayer.js | 125 ++++++++++++++++++++++++++++++ loleaflet/src/layer/tile/TileLayer.js | 14 ++- 2 files changed, 135 insertions(+), 4 deletions(-)
New commits: commit e0eca220541fcd8d9ab236e6a274f00e256cc2e7 Author: Dennis Francis <dennis.fran...@collabora.com> AuthorDate: Thu May 28 06:41:23 2020 +0530 Commit: Dennis Francis <dennis.fran...@collabora.com> CommitDate: Sun Jul 5 16:39:53 2020 +0200 Replay print-twips messages for a couple of reasons... If L.CalcTileLayer.options.printTwipsMsgsEnabled is set, we will not get some messages (with coordinates) from core when zoom changes because print-twips coordinates are zoom-invariant. So we need to remember the last version of each of them and replay, when zoom is changed. We also need to replay the messages, when sheet-geometry changes. This is because it is possible for the updated print-twips messages to arrive before the sheet-geometry update message arrives. Change-Id: Icd77ad77c7642aae24e68fb0b7f229c7ec62484a Reviewed-on: https://gerrit.libreoffice.org/c/online/+/98114 Tested-by: Jenkins Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Dennis Francis <dennis.fran...@collabora.com> diff --git a/loleaflet/src/layer/tile/CalcTileLayer.js b/loleaflet/src/layer/tile/CalcTileLayer.js index db08b2019..f37caa6c5 100644 --- a/loleaflet/src/layer/tile/CalcTileLayer.js +++ b/loleaflet/src/layer/tile/CalcTileLayer.js @@ -238,7 +238,60 @@ L.CalcTileLayer = L.TileLayer.extend({ } }, + _saveMessageForReplay: function (textMsg, viewId) { + // If this.options.printTwipsMsgsEnabled is set, we will not get some messages (with coordinates) + // from core when zoom changes because print-twips coordinates are zoom-invariant. So we need to + // remember the last version of them and replay, when zoom is changed. + // We also need to replay the messages, when sheet-geometry changes. This is because it is possible for + // the updated print-twips messages to arrive before the sheet-geometry update message arrives. + if (!this.options.printTwipsMsgsEnabled) { + return; + } + + if (!this._printTwipsMessagesForReplay) { + var ownViewTypes = [ + 'cellcursor', + 'referencemarks', + 'cellselectionarea', + 'textselection', + ]; + + var otherViewTypes = [ + 'cellviewcursor', + 'textviewselection', + ]; + + this._printTwipsMessagesForReplay = new L.MessageStore(ownViewTypes, otherViewTypes); + } + + var colonIndex = textMsg.indexOf(':'); + if (colonIndex === -1) { + return; + } + + var msgType = textMsg.substring(0, colonIndex); + this._printTwipsMessagesForReplay.save(msgType, textMsg, viewId); + }, + + _clearMsgReplayStore: function () { + if (!this.options.printTwipsMsgsEnabled || !this._printTwipsMessagesForReplay) { + return; + } + + this._printTwipsMessagesForReplay.clear(); + }, + + // See _saveMessageForReplay. + _replayPrintTwipsMsgs: function () { + if (!this.options.printTwipsMsgsEnabled || !this._printTwipsMessagesForReplay) { + return; + } + + this._printTwipsMessagesForReplay.forEach(this._onMessage.bind(this)); + }, + _onMessage: function (textMsg, img) { + this._saveMessageForReplay(textMsg); if (textMsg.startsWith('comment:')) { var obj = JSON.parse(textMsg.substring('comment:'.length + 1)); obj.comment.tab = parseInt(obj.comment.tab); @@ -377,6 +430,7 @@ L.CalcTileLayer = L.TileLayer.extend({ _onSetPartMsg: function (textMsg) { var part = parseInt(textMsg.match(/\d+/g)[0]); if (!this.isHiddenPart(part)) { + this._clearMsgReplayStore(); this.refreshViewData(undefined, false /* compatDataSrcOnly */, true /* sheetGeometryChanged */); } }, @@ -387,6 +441,7 @@ L.CalcTileLayer = L.TileLayer.extend({ this.sheetGeometry.setTileGeometryData(this._tileWidthTwips, this._tileHeightTwips, this._tileSize, this._tilePixelScale); } + this._replayPrintTwipsMsgs(); this.refreshViewData(); this._map._socket.sendMessage('commandvalues command=.uno:ViewAnnotationsPosition'); }, @@ -621,6 +676,8 @@ L.CalcTileLayer = L.TileLayer.extend({ this.sheetGeometry.update(jsonMsgObj); } + this._replayPrintTwipsMsgs(); + this.sheetGeometry.setViewArea(this._pixelsToTwips(this._map._getTopLeftPoint()), this._pixelsToTwips(this._map.getSize())); this._updateHeadersGridLines(undefined, true /* updateCols */, @@ -691,6 +748,74 @@ L.CalcTileLayer = L.TileLayer.extend({ } }); +L.MessageStore = L.Class.extend({ + + // ownViewTypes : The types of messages related to own view. + // otherViewTypes: The types of messages related to other views. + initialize: function (ownViewTypes, otherViewTypes) { + + if (!Array.isArray(ownViewTypes) || !Array.isArray(otherViewTypes)) { + console.error('Unexpected argument types'); + return; + } + + var ownMessages = {}; + ownViewTypes.forEach(function (msgType) { + ownMessages[msgType] = ''; + }); + this._ownMessages = ownMessages; + + var othersMessages = {}; + otherViewTypes.forEach(function (msgType) { + othersMessages[msgType] = []; + }); + this._othersMessages = othersMessages; + }, + + clear: function () { + var msgs = this._ownMessages; + Object.keys(msgs).forEach(function (msgType) { + msgs[msgType] = ''; + }); + + msgs = this._othersMessages; + Object.keys(msgs).forEach(function (msgType) { + msgs[msgType] = []; + }); + }, + + save: function (msgType, textMsg, viewId) { + + var othersMessage = (typeof viewId === 'number'); + + if (!othersMessage && this._ownMessages.hasOwnProperty(msgType)) { + this._ownMessages[msgType] = textMsg; + return; + } + + if (othersMessage && this._othersMessages.hasOwnProperty(msgType)) { + this._othersMessages[msgType][viewId] = textMsg; + } + }, + + forEach: function (callback) { + if (typeof callback !== 'function') { + console.error('Invalid callback type'); + return; + } + + var ownMessages = this._ownMessages; + Object.keys(this._ownMessages).forEach(function (msgType) { + callback(ownMessages[msgType]); + }); + + var othersMessages = this._othersMessages; + Object.keys(othersMessages).forEach(function (msgType) { + othersMessages[msgType].forEach(callback); + }); + } +}); + // TODO: Move these somewhere more appropriate. diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js index f2268776c..cc9cc8287 100644 --- a/loleaflet/src/layer/tile/TileLayer.js +++ b/loleaflet/src/layer/tile/TileLayer.js @@ -1344,8 +1344,7 @@ L.TileLayer = L.GridLayer.extend({ }, _onCellViewCursorMsg: function (textMsg) { - textMsg = textMsg.substring('cellviewcursor:'.length + 1); - var obj = JSON.parse(textMsg); + var obj = JSON.parse(textMsg.substring('cellviewcursor:'.length + 1)); var viewId = parseInt(obj.viewId); // Ignore if viewid is same as ours @@ -1374,6 +1373,10 @@ L.TileLayer = L.GridLayer.extend({ this._cellViewCursors[viewId].part = parseInt(obj.part); this._onUpdateCellViewCursor(viewId); + + if (this.isCalc()) { + this._saveMessageForReplay(textMsg, viewId); + } }, _onUpdateCellViewCursor: function (viewId) { @@ -1694,8 +1697,7 @@ L.TileLayer = L.GridLayer.extend({ }, _onTextViewSelectionMsg: function (textMsg) { - textMsg = textMsg.substring('textviewselection:'.length + 1); - var obj = JSON.parse(textMsg); + var obj = JSON.parse(textMsg.substring('textviewselection:'.length + 1)); var viewId = parseInt(obj.viewId); var viewPart = parseInt(obj.part); @@ -1725,6 +1727,10 @@ L.TileLayer = L.GridLayer.extend({ } this._onUpdateTextViewSelection(viewId); + + if (this.isCalc()) { + this._saveMessageForReplay(textMsg, viewId); + } }, _updateReferenceMarks: function() { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits