loleaflet/README | 3 + loleaflet/reference.html | 20 ++++++++++ loleaflet/src/control/Parts.js | 19 +++++++++ loleaflet/src/core/Socket.js | 1 loleaflet/src/layer/tile/GridLayer.js | 13 ++++++ loleaflet/src/layer/tile/TileLayer.js | 68 ++++++++++++++++++++++++++++++++++ loolwsd/LOOLSession.cpp | 4 ++ loolwsd/TileCache.cpp | 2 - 8 files changed, 128 insertions(+), 2 deletions(-)
New commits: commit a0e74cb5c4c746e540566b3742229658aca4dbda Author: Mihai Varga <[email protected]> Date: Wed Sep 30 17:22:00 2015 +0300 loolwsd: update page sizes when the doc size changes diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp index 313e76f..5f5d12e 100644 --- a/loolwsd/LOOLSession.cpp +++ b/loolwsd/LOOLSession.cpp @@ -825,6 +825,7 @@ extern "C" break; case LOK_CALLBACK_DOCUMENT_SIZE_CHANGED: srv->getStatus("", 0); + srv->getPartPageRectangles("", 0); break; case LOK_CALLBACK_SET_PART: srv->sendTextFrame("setpart: " + std::string(pPayload)); commit 34401c94f66f5b66469dc9257e130ca304279cf4 Author: Mihai Varga <[email protected]> Date: Wed Sep 30 17:17:03 2015 +0300 loolwsd: switch to editing dir when invalidating the cursor diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp index 4b00dea..313e76f 100644 --- a/loolwsd/LOOLSession.cpp +++ b/loolwsd/LOOLSession.cpp @@ -218,6 +218,9 @@ bool MasterProcessSession::handleInput(const char *buffer, int length) { peer->_tileCache->saveTextFile(std::string(buffer, length), "partpagerectangles.txt"); } + else if (tokens[0] == "invalidatecursor:") { + peer->_tileCache->setEditing(true); + } else if (tokens[0] == "invalidatetiles:") { // FIXME temporarily, set the editing on the 1st invalidate, TODO extend diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp index 76ca730..cbd0278 100644 --- a/loolwsd/TileCache.cpp +++ b/loolwsd/TileCache.cpp @@ -172,7 +172,7 @@ void TileCache::setEditing(bool editing) void TileCache::saveTextFile(const std::string& text, std::string fileName) { - std::string dirName = cacheDirName(_hasUnsavedChanges); + std::string dirName = cacheDirName(_isEditing); File(dirName).createDirectories(); commit a5757736e98706dcc18e70a816d5f1dd3876cb19 Author: Mihai Varga <[email protected]> Date: Wed Sep 30 13:43:12 2015 +0300 loleaflet: goToPage without having a LOK instance Knowing the page dimension, we can scroll to the desired page without requesting sending the 'setpage' command to the server diff --git a/loleaflet/src/control/Parts.js b/loleaflet/src/control/Parts.js index 1ae0825..d710d47 100644 --- a/loleaflet/src/control/Parts.js +++ b/loleaflet/src/control/Parts.js @@ -122,7 +122,19 @@ L.Map.include({ else if (typeof (page) === 'number' && page >= 0 && page < docLayer._pages) { docLayer._currentPage = page; } - L.Socket.sendMessage('setpage page=' + docLayer._currentPage); + if (docLayer._permission !== 'edit' && docLayer._partPageRectanglesPixels.length > docLayer._currentPage) { + // we can scroll to the desired page without having a LOK instance + var pageBounds = docLayer._partPageRectanglesPixels[docLayer._currentPage]; + var pos = new L.Point( + pageBounds.min.x + (pageBounds.max.x - pageBounds.min.x) / 2, + pageBounds.min.y); + pos.y -= this.getSize().y / 4; // offset by a quater of the viewing area so that the previous page is visible + this.scrollTop(pos.y, {update: true}); + this.scrollLeft(pos.x, {update: true}); + } + else { + L.Socket.sendMessage('setpage page=' + docLayer._currentPage); + } this.fire('pagenumberchanged', { currentPage: docLayer._currentPage, pages: docLayer._pages, commit 07a305df8081e96ff0111077b706ffd7a111bd63 Author: Mihai Varga <[email protected]> Date: Wed Sep 30 13:17:43 2015 +0300 loleaflet: partpagerectangles command integration An event is fired with the page dimensions. Also the current page number is updated based on which page contains the current view's center diff --git a/loleaflet/README b/loleaflet/README index 4a32d13..8cc2739 100644 --- a/loleaflet/README +++ b/loleaflet/README @@ -193,6 +193,9 @@ Writer pages: + e.docType = document type, should be 'text' map.on('invalidatepreview', function (e) {}) + e.id = the preview's id + map.on('partpagerectangles', function (e) {}) where: + + e.pixelRectangles = An array of bounds representing each page's dimension in pixels on the current zoom level + + e.twipsRectangles = An array of bounds representing each page's dimension in twips. Error: - events diff --git a/loleaflet/reference.html b/loleaflet/reference.html index 595dd62..d45f019 100644 --- a/loleaflet/reference.html +++ b/loleaflet/reference.html @@ -6825,6 +6825,26 @@ map.addControl(new MyControl()); </tr> </table> +<h3 id="partpagerectangles-event">PartPageRectangles</h3> + +<table data-id='events'> + <tr> + <th class="width100">property</th> + <th>type</th> + <th>description</th> + </tr> + <tr> + <td><code><b>pixelRectangles</b></code></td> + <td><code><a href="#bounds">Bounds[]</a></code></td> + <td>An array of bounds representing each page's dimension in pixels on the current zoom level.</td> + </tr> + <tr> + <td><code><b>twipsRectangles</b></code></td> + <td><code><a href="#bounds">Bounds[]</a></code></td> + <td>An array of bounds representing each page's dimension in twips.</td> + </tr> +</table> + <h3 id="permission-event">PermissionEvent</h3> <table data-id='events'> diff --git a/loleaflet/src/control/Parts.js b/loleaflet/src/control/Parts.js index 55d4c9b..1ae0825 100644 --- a/loleaflet/src/control/Parts.js +++ b/loleaflet/src/control/Parts.js @@ -123,6 +123,11 @@ L.Map.include({ docLayer._currentPage = page; } L.Socket.sendMessage('setpage page=' + docLayer._currentPage); + this.fire('pagenumberchanged', { + currentPage: docLayer._currentPage, + pages: docLayer._pages, + docType: docLayer._docType + }); }, getNumberOfPages: function () { diff --git a/loleaflet/src/core/Socket.js b/loleaflet/src/core/Socket.js index ba93c2b..99a8c19 100644 --- a/loleaflet/src/core/Socket.js +++ b/loleaflet/src/core/Socket.js @@ -52,6 +52,7 @@ L.Socket = { } this.socket.send(msg); this.socket.send('status'); + this.socket.send('partpagerectangles'); for (var i = 0; i < this._msgQueue.length; i++) { this.socket.send(this._msgQueue[i].msg); L.Log.log(this._msgQueue[i].msg, this._msgQueue[i].coords); diff --git a/loleaflet/src/layer/tile/GridLayer.js b/loleaflet/src/layer/tile/GridLayer.js index 2922d7e..9c89f7c 100644 --- a/loleaflet/src/layer/tile/GridLayer.js +++ b/loleaflet/src/layer/tile/GridLayer.js @@ -444,6 +444,7 @@ L.GridLayer = L.Layer.extend({ _move: function () { this._update(); this._resetPreFetching(true); + this._onCurrentPageUpdate(); }, _update: function (center, zoom) { diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js index 0bf5474..86d7f2b 100644 --- a/loleaflet/src/layer/tile/TileLayer.js +++ b/loleaflet/src/layer/tile/TileLayer.js @@ -102,6 +102,7 @@ L.TileLayer = L.GridLayer.extend({ map.on('drag resize zoomend', this._updateScrollOffset, this); map.on('copy', this._onCopy, this); map.on('zoomend', this._onUpdateCursor, this); + map.on('zoomend', this._onUpdatePartPageRectangles, this); map.on('dragstart', this._onDragStart, this); map.on('requestloksession', this._onRequestLOKSession, this); map.on('error', this._mapOnError, this); @@ -204,6 +205,9 @@ L.TileLayer = L.GridLayer.extend({ msg += 'height=' + this._docHeightTwips; this._onInvalidateTilesMsg(msg); } + else if (textMsg.startsWith('partpagerectangles:')) { + this._onPartPageRectanglesMsg(textMsg); + } else if (textMsg.startsWith('searchnotfound:')) { this._onSearchNotFoundMsg(textMsg); } @@ -288,6 +292,34 @@ L.TileLayer = L.GridLayer.extend({ this._onUpdateCursor(); }, + _onPartPageRectanglesMsg: function (textMsg) { + textMsg = textMsg.substring(19); + var pages = textMsg.split(';'); + this._partPageRectanglesTwips = []; + this._partPageRectanglesPixels = []; + for (var i = 0; i < pages.length; i++) { + var strTwips = pages[i].match(/\d+/g); + if (!strTwips) { + // probably not a text file + return; + } + var topLeftTwips = new L.Point(parseInt(strTwips[0]), parseInt(strTwips[1])); + var offset = new L.Point(parseInt(strTwips[2]), parseInt(strTwips[3])); + var bottomRightTwips = topLeftTwips.add(offset); + var pageBoundsTwips = new L.Bounds(topLeftTwips, bottomRightTwips); + this._partPageRectanglesTwips.push(pageBoundsTwips); + var pageBoundsPixels = new L.Bounds( + this._twipsToPixels(topLeftTwips), + this._twipsToPixels(bottomRightTwips)); + this._partPageRectanglesPixels.push(pageBoundsPixels); + } + this._map.fire('partpagerectangles', { + pixelRectangles: this._partPageRectanglesPixels, + twipsRectangles: this._partPageRectanglesTwips + }); + this._onCurrentPageUpdate(); + }, + _onSearchNotFoundMsg: function (textMsg) { var originalPhrase = textMsg.substring(16); this._map.fire('search', {originalPhrase: originalPhrase, count: 0}); @@ -689,6 +721,42 @@ L.TileLayer = L.GridLayer.extend({ this._map.setZoom(Math.min(10, this._map.getZoom() + zoomDelta), {animate: false}); } } + }, + + _onCurrentPageUpdate: function () { + var mapCenter = this._map.project(this._map.getCenter()); + if (!this._partPageRectanglesPixels || !(this._currentPage >= 0) || + this._partPageRectanglesPixels[this._currentPage].contains(mapCenter)) { + // page number has not changed + return; + } + for (var i = 0; i < this._partPageRectanglesPixels.length; i++) { + if (this._partPageRectanglesPixels[i].contains(mapCenter)) { + this._currentPage = i; + this._map.fire('pagenumberchanged', { + currentPage: this._currentPage, + pages: this._pages, + docType: this._docType + }); + return; + } + } + }, + + _onUpdatePartPageRectangles: function () { + if (this._partPageRectanglesPixels.length > 0) { + this._partPageRectanglesPixels = []; + for (var i = 0; i < this._partPageRectanglesTwips.length; i++) { + var pageBounds = new L.Bounds( + this._twipsToPixels(this._partPageRectanglesTwips[i].min), + this._twipsToPixels(this._partPageRectanglesTwips[i].max)); + this._partPageRectanglesPixels.push(pageBounds); + } + this._map.fire('partpagerectangles', { + pixelRectangles: this._partPageRectanglesPixels, + twipsRectangles: this._partPageRectanglesTwips + }); + } } }); commit 1c9d9bb94dde621b590ffc692887224b1c2f167e Author: Mihai Varga <[email protected]> Date: Wed Sep 30 13:10:48 2015 +0300 loleaflet: twipsToPixels and back methods diff --git a/loleaflet/src/layer/tile/GridLayer.js b/loleaflet/src/layer/tile/GridLayer.js index e010aa3..2922d7e 100644 --- a/loleaflet/src/layer/tile/GridLayer.js +++ b/loleaflet/src/layer/tile/GridLayer.js @@ -745,6 +745,18 @@ L.GridLayer = L.Layer.extend({ Math.round(pixels.y / this._tileSize * this._tileHeightTwips)); }, + _twipsToPixels: function (twips) { + return new L.Point( + twips.x / this._tileWidthTwips * this._tileSize, + twips.y / this._tileHeightTwips * this._tileSize); + }, + + _pixelsToTwips: function (pixels) { + return new L.Point( + pixels.x * this._tileWidthTwips / this._tileSize, + pixels.y * this._tileHeightTwips / this._tileSize); + }, + _noTilesToLoad: function () { for (var key in this._tiles) { if (!this._tiles[key].loaded) { return false; } _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
