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

Reply via email to