[Libreoffice-commits] online.git: Branch 'distro/collabora/milestone-4' - 17 commits - loleaflet/debug loleaflet/README loleaflet/src loolwsd/LOOLSession.cpp loolwsd/LOOLSession.hpp loolwsd/loolwsd.spec.in loolwsd/TileCache.cpp

Mihai Varga mihai.varga at collabora.com
Tue Aug 4 07:23:17 PDT 2015


 loleaflet/README                                      |   15 +++
 loleaflet/debug/document/document_simple_example.html |    2 
 loleaflet/src/control/Control.Parts.js                |   38 +++++++
 loleaflet/src/control/Parts.js                        |   13 ++
 loleaflet/src/control/Scroll.js                       |   19 +++
 loleaflet/src/layer/tile/TileLayer.js                 |   87 ++++++++++--------
 loleaflet/src/map/Map.js                              |    3 
 loolwsd/LOOLSession.cpp                               |   42 ++++++++
 loolwsd/LOOLSession.hpp                               |    2 
 loolwsd/TileCache.cpp                                 |   13 --
 loolwsd/loolwsd.spec.in                               |    6 +
 11 files changed, 188 insertions(+), 52 deletions(-)

New commits:
commit 7eb8922c783857ac2b169007dd2fb917e0bfd270
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Tue Aug 4 14:14:14 2015 +0300

    loleaflet: don't scroll to cursor on zoom
    
    Also, scroll to cursor in viewing mode too when changing pages

diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 21aebe0..fe6e776 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -107,9 +107,9 @@ L.TileLayer = L.GridLayer.extend({
 			this.sendMessage('status');
 		}
 		this._map.on('drag resize zoomend', this._updateScrollOffset, this);
-		this._map.on('zoomstart zoomend', this._onZoom, this);
 		this._map.on('clearselection', this._clearSelections, this);
 		this._map.on('copy', this._onCopy, this);
+		this._map.on('zoomend', this._onUpdateCursor, this);
 		this._startMarker.on('drag dragend', this._onSelectionHandleDrag, this);
 		this._endMarker.on('drag dragend', this._onSelectionHandleDrag, this);
 		this._textArea = this._map._textArea;
@@ -610,29 +610,29 @@ L.TileLayer = L.GridLayer.extend({
 	},
 
 	// Update cursor layer (blinking cursor).
-	_onUpdateCursor: function () {
+	_onUpdateCursor: function (e) {
+		var pixBounds = L.bounds(this._map.latLngToLayerPoint(this._visibleCursor.getSouthWest()),
+						 this._map.latLngToLayerPoint(this._visibleCursor.getNorthEast()));
+		var cursorPos = this._visibleCursor.getNorthWest();
+
+		if (!e && !this._map.getBounds().contains(cursorPos)) {
+			var center = this._map.project(cursorPos);
+			center = center.subtract(this._map.getSize().divideBy(2));
+			center.x = center.x < 0 ? 0 : center.x;
+			center.y = center.y < 0 ? 0 : center.y;
+			this._map.fire('scrollto', {x: center.x, y: center.y});
+		}
+
 		if (this._permission === 'edit' && this._isCursorVisible && this._isCursorOverlayVisible
 				&& !this._isEmptyRectangle(this._visibleCursor)) {
 			if (this._cursorMarker) {
 				this._map.removeLayer(this._cursorMarker);
 			}
 
-			var pixBounds = L.bounds(this._map.latLngToLayerPoint(this._visibleCursor.getSouthWest()),
-						 this._map.latLngToLayerPoint(this._visibleCursor.getNorthEast()));
-
-			var cursorPos = this._visibleCursor.getNorthWest();
 			this._cursorMarker = L.cursor(cursorPos);
 			this._map.addLayer(this._cursorMarker);
 			this._cursorMarker.setSize(pixBounds.getSize().multiplyBy(
 						this._map.getZoomScale(this._map.getZoom())));
-
-			if (!this._map.getBounds().contains(cursorPos)) {
-				var center = this._map.project(cursorPos);
-				center = center.subtract(this._map.getSize().divideBy(2));
-				center.x = center.x < 0 ? 0 : center.x;
-				center.y = center.y < 0 ? 0 : center.y;
-				this._map.fire('scrollto', {x: center.x, y: center.y});
-			}
 		}
 		else if (this._cursorMarker) {
 			this._map.removeLayer(this._cursorMarker);
@@ -726,14 +726,6 @@ L.TileLayer = L.GridLayer.extend({
 		else {
 			e.clipboardData.setData('text/plain', this._selectionTextContent);
 		}
-	},
-
-	_onZoom: function (e) {
-		if (e.type === 'zoomstart') {
-		}
-		else if (e.type === 'zoomend') {
-			this._onUpdateCursor();
-		}
 	}
 });
 
commit dfe9cb753682fef637c978051586a620a18edc94
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Tue Aug 4 13:59:33 2015 +0300

    loleaflet: enable page switching in toolbar

diff --git a/loleaflet/src/control/Control.Parts.js b/loleaflet/src/control/Control.Parts.js
index c789340..d32650a 100644
--- a/loleaflet/src/control/Control.Parts.js
+++ b/loleaflet/src/control/Control.Parts.js
@@ -30,15 +30,26 @@ L.Control.Parts = L.Control.extend({
 
 		map.on('updateparts', this._updateDisabled, this);
 		map.on('tilepreview', this._updatePreview, this);
+		map.on('pagenumberchanged', this._updateDisabledText, this);
 		return container;
 	},
 
 	_prevPart: function () {
-		this._map.setPart('prev');
+		if (this._docType === 'text' && this._currentPage > 0) {
+			this._map.goToPage(this._currentPage - 1);
+		}
+		else {
+			this._map.setPart('prev');
+		}
 	},
 
 	_nextPart: function () {
-		this._map.setPart('next');
+		if (this._docType === 'text' && this._currentPage < this._pages - 1) {
+			this._map.goToPage(this._currentPage + 1);
+		}
+		else {
+			this._map.setPart('next');
+		}
 	},
 
 	_createButton: function (html, title, className, container, fn) {
@@ -62,6 +73,9 @@ L.Control.Parts = L.Control.extend({
 		var currentPart = e.currentPart;
 		var docType = e.docType;
 		var partNames = e.partNames;
+		if (docType === 'text') {
+			return;
+		}
 		if (currentPart === 0) {
 			L.DomUtil.addClass(this._prevPartButton, className);
 		} else {
@@ -129,6 +143,26 @@ L.Control.Parts = L.Control.extend({
 		}
 	},
 
+
+	_updateDisabledText: function (e) {
+		if (e) {
+			this._currentPage = e.currentPage;
+			this._pages = e.pages;
+			this._docType = e.docType;
+		}
+		var className = 'leaflet-disabled';
+		if (this._currentPage === 0) {
+			L.DomUtil.addClass(this._prevPartButton, className);
+		} else {
+			L.DomUtil.removeClass(this._prevPartButton, className);
+		}
+		if (this._currentPage === this._pages - 1) {
+			L.DomUtil.addClass(this._nextPartButton, className);
+		} else {
+			L.DomUtil.removeClass(this._nextPartButton, className);
+		}
+	},
+
 	_setPart: function (e) {
 		var part =  e.target.id.match(/\d+/g)[0];
 		if (part !== null) {
commit 66badd36ad08112df54d22bcaaf5d2cb32325e78
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Tue Aug 4 13:59:16 2015 +0300

    loleaflet: don't emit the updateparts event for text docs

diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 6f3326f..21aebe0 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -346,7 +346,7 @@ L.TileLayer = L.GridLayer.extend({
 				if (this._docType === 'text') {
 					this._currentPart = 0;
 					this._parts = 1;
-					this._currentPage = command.part;
+					this._currentPage = command.currentPart;
 					this._pages = command.parts;
 					map.fire('pagenumberchanged', {
 						currentPage: this._currentPage,
@@ -354,16 +354,18 @@ L.TileLayer = L.GridLayer.extend({
 						docType: this._docType
 					});
 				}
-				this.sendMessage('setclientpart part=' + this._currentPart);
-				var partNames = textMsg.match(/[^\r\n]+/g);
-				// only get the last matches
-				partNames = partNames.slice(partNames.length - this._parts);
-				this._map.fire('updateparts', {
-					currentPart: this._currentPart,
-					parts: this._parts,
-					docType: this._docType,
-					partNames: partNames
-				});
+				else {
+					this.sendMessage('setclientpart part=' + this._currentPart);
+					var partNames = textMsg.match(/[^\r\n]+/g);
+					// only get the last matches
+					partNames = partNames.slice(partNames.length - this._parts);
+					this._map.fire('updateparts', {
+						currentPart: this._currentPart,
+						parts: this._parts,
+						docType: this._docType,
+						partNames: partNames
+					});
+				}
 				this._update();
 				if (this._preFetchPart !== this._currentPart) {
 					this._preFetchPart = this._currentPart;
commit 09132224b650c4c92429b7b1f318c8ae4c59689d
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Tue Aug 4 13:37:18 2015 +0300

    loleaflet: only send the timestamp when provided

diff --git a/loleaflet/debug/document/document_simple_example.html b/loleaflet/debug/document/document_simple_example.html
index ec279af..4f2fbb5 100644
--- a/loleaflet/debug/document/document_simple_example.html
+++ b/loleaflet/debug/document/document_simple_example.html
@@ -49,6 +49,7 @@
     var filePath = getParameterByName('file_path');
     var host = getParameterByName('host');
     var edit = getParameterByName('edit') === 'true';
+    var timeStamp = getParameterByName('timestamp');
     if (filePath === '') {
         vex.dialog.alert('Wrong file_path, usage: file_path=/path/to/doc/');
     }
@@ -80,6 +81,7 @@
         doc: filePath,
         useSocket : true,
         edit: edit,
+        timeStamp: timeStamp,
         readOnly: false
     });
     map.addLayer(docLayer);
diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index bc248b4..6f3326f 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -99,8 +99,11 @@ L.TileLayer = L.GridLayer.extend({
 			return;
 		}
 		if (this.options.doc) {
-		        var timestamp = Math.round(+new Date()/1000);
-			this.sendMessage('load url=' + this.options.doc + ( this.options.doc.indexOf('?') !== -1 ? '&' : '?' ) + 'timestamp=' + timestamp);
+			var msg = 'load url=' + this.options.doc;
+			if (this.options.timeStamp) {
+				msg += '?timestamp=' + this.options.timeStamp;
+			}
+			this.sendMessage(msg);
 			this.sendMessage('status');
 		}
 		this._map.on('drag resize zoomend', this._updateScrollOffset, this);
commit 28c94eb340c8405c6c6e7b846800180d41a948ac
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Tue Aug 4 11:22:17 2015 +0300

    loleaflet: allow specifying the imagePath in the map init
    
    imagePath is used to load images

diff --git a/loleaflet/src/map/Map.js b/loleaflet/src/map/Map.js
index 1cf4091..3420044 100644
--- a/loleaflet/src/map/Map.js
+++ b/loleaflet/src/map/Map.js
@@ -53,6 +53,9 @@ L.Map = L.Evented.extend({
 
 		this.callInitHooks();
 
+		if (this.options.imagePath) {
+			L.Icon.Default.imagePath = this.options.imagePath;
+		}
 		this._addLayers(this.options.layers);
 	},
 
commit 70a832b13642b083c9c9da43e2ad03f114070223
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Tue Aug 4 11:09:10 2015 +0300

    lolealfet: scrollOffset, scrollLeft, scrollTop methods
    
    That scroll to an absolute value, and scrollOffset returns the
    absloute offset relative to the beginning of the document

diff --git a/loleaflet/README b/loleaflet/README
index 1e36a95..c2f0531 100644
--- a/loleaflet/README
+++ b/loleaflet/README
@@ -117,6 +117,12 @@ Scroll (the following are measured in pixels):
             + scroll down by 'y' (or up if negative)
         map.scrollRight(x)
             + scroll right by 'x' (or left if nevative)
+        map.scrollTop(y)
+            + scroll to 'y' offset relative to the beginning of the document
+        map.scrollLeft(x)
+            + scroll to 'x' offset relative to the beginning of the document
+        map.scrollOffset()
+            + returns the scroll offset relative to the beginning of the document
     - events
         map.on('docsize', function (e) {}) where:
             + e.x = document width
diff --git a/loleaflet/src/control/Scroll.js b/loleaflet/src/control/Scroll.js
index ba0b2de..e20b3e1 100644
--- a/loleaflet/src/control/Scroll.js
+++ b/loleaflet/src/control/Scroll.js
@@ -15,5 +15,24 @@ L.Map.include({
 
 	scrollRight: function (x) {
 		this.scroll(x, 0);
+	},
+
+	scrollOffset: function () {
+		var center = this.project(this.getCenter());
+		var centerOffset = center.subtract(this.getSize().divideBy(2));
+		var offset = {};
+		offset.x = centerOffset.x < 0 ? 0 : Math.round(centerOffset.x);
+		offset.y = centerOffset.y < 0 ? 0 : Math.round(centerOffset.y);
+		return offset;
+	},
+
+	scrollTop: function (y) {
+		var offset = this.scrollOffset();
+		this.panBy(new L.Point(0, y - offset.y), {animate: false});
+	},
+
+	scrollLeft: function (x) {
+		var offset = this.scrollOffset();
+		this.panBy(new L.Point(x - offset.x, 0), {animate: false});
 	}
 });
commit b013c079b6e387cf597e2bc5ea7428a426ede29d
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Tue Aug 4 10:09:47 2015 +0300

    loolwsd: remove cron job when uninstalling the rpm package

diff --git a/loolwsd/loolwsd.spec.in b/loolwsd/loolwsd.spec.in
index 8a6bbcc..18dfbb0 100644
--- a/loolwsd/loolwsd.spec.in
+++ b/loolwsd/loolwsd.spec.in
@@ -58,6 +58,7 @@ echo "0 0 */1 * * root find /var/cache/loolwsd -name \"*.png\" -a -atime +10 -ex
 /usr/bin/loolwsd-systemplate-setup
 %{_unitdir}/loolwsd.service
 /var/adm/fillup-templates/sysconfig.loolwsd
+/etc/cron.d/loolwsd.cron
 
 %doc README
 
commit e230842d9f0b4c794ade252fb0ebde754cc72bdb
Author: Henry Castro <hcastro at collabora.com>
Date:   Mon Aug 3 21:33:47 2015 -0400

    loolwsd: remove time stamp query parameter
    
    The original URI request with query parameters is processed by loKit.

diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp
index fe1096a..d6fa5aa 100644
--- a/loolwsd/LOOLSession.cpp
+++ b/loolwsd/LOOLSession.cpp
@@ -743,9 +743,17 @@ bool ChildProcessSession::loadDocument(const char *buffer, int length, StringTok
         _docURL = tokens[1];
 
     URI aUri;
+    URI::QueryParameters params;
     try
     {
         aUri = URI(_docURL);
+        params = aUri.getQueryParameters();
+        if ( !params.empty() && params.back().first == "timestamp" )
+        {
+            aUri.setQuery("");
+            params.pop_back();
+            aUri.setQueryParameters(params);
+        }
     }
     catch(Poco::SyntaxException&)
     {
commit ff0705c83ca937a60553b988dd6494b444db7c15
Author: Henry Castro <hcastro at collabora.com>
Date:   Mon Aug 3 21:25:34 2015 -0400

    loleaflet: add time stamp query parameter

diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 6ce236e..bc248b4 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -99,7 +99,8 @@ L.TileLayer = L.GridLayer.extend({
 			return;
 		}
 		if (this.options.doc) {
-			this.sendMessage('load url=' + this.options.doc);
+		        var timestamp = Math.round(+new Date()/1000);
+			this.sendMessage('load url=' + this.options.doc + ( this.options.doc.indexOf('?') !== -1 ? '&' : '?' ) + 'timestamp=' + timestamp);
 			this.sendMessage('status');
 		}
 		this._map.on('drag resize zoomend', this._updateScrollOffset, this);
commit fea8766376a8cae0a42b538f209399b4be8cf261
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Mon Aug 3 22:01:11 2015 +0300

    loolwsd: fixed poorly placed cronjob

diff --git a/loolwsd/loolwsd.spec.in b/loolwsd/loolwsd.spec.in
index a4ccc28..8a6bbcc 100644
--- a/loolwsd/loolwsd.spec.in
+++ b/loolwsd/loolwsd.spec.in
@@ -49,15 +49,15 @@ env BUILDING_FROM_RPMBUILD=yes make install DESTDIR=%{buildroot}
 %__install -D -m 444 loolwsd.service %{buildroot}%{_unitdir}/loolwsd.service
 install -d -m 755 %{buildroot}/var/adm/fillup-templates
 install -D -m 644 sysconfig.loolwsd %{buildroot}/var/adm/fillup-templates
+mkdir -p %{buildroot}/etc/cron.d
+echo "#Remove old tiles once every 10 days at midnight" > %{buildroot}/etc/cron.d/loolwsd.cron
+echo "0 0 */1 * * root find /var/cache/loolwsd -name \"*.png\" -a -atime +10 -exec rm {} \;" >> %{buildroot}/etc/cron.d/loolwsd.cron
 
 %files
 /usr/bin/loolwsd
 /usr/bin/loolwsd-systemplate-setup
 %{_unitdir}/loolwsd.service
 /var/adm/fillup-templates/sysconfig.loolwsd
-mkdir -p %{buildroot}/etc/cron.d
-echo "#Remove old tiles once every 10 days at midnight" > %{buildroot}/etc/cron.d/loolwsd.cron
-echo "0 0 */10 * * root find /var/cache/loolwsd -name \"*.png\" -a -atime +10 -exec rm {} \;" >> %{buildroot}/etc/cron.d/loolwsd.cron
 
 %doc README
 
@@ -95,6 +95,8 @@ su %{owner} -c "loolwsd-systemplate-setup ${loolparent}/lool/systemplate ${loroo
 %service_del_postun loolwsd.service
 
 %changelog
+* Mon Aug 03 2015 Mihai Varga
+- added the cronjob
 * Tue May 19 2015 Tor Lillqvist
 - Initial RPM release
 
commit 102dee733fb55f43ed4696fb6ecfe8e7b73cdef1
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Mon Aug 3 21:51:55 2015 +0300

    Revert "loolwsd: LRU expiry persistent cache"
    
    This reverts commit 74dcec1d3fe28fcb47f9424c505d97c04c6e973b.
    The cronjob replaces this

diff --git a/loolwsd/TileCache.cpp b/loolwsd/TileCache.cpp
index 2203653..2ee9da7 100644
--- a/loolwsd/TileCache.cpp
+++ b/loolwsd/TileCache.cpp
@@ -31,9 +31,6 @@
 #include "LOOLProtocol.hpp"
 #include "TileCache.hpp"
 
-// 1 hour tile cache expired
-#define  TILE_EXPIRED 3600000000
-
 using Poco::DigestEngine;
 using Poco::DirectoryIterator;
 using Poco::File;
@@ -96,16 +93,6 @@ std::unique_ptr<std::fstream> TileCache::lookupTile(int part, int width, int hei
         return nullptr;
 
     std::string fileName = dirName + "/" + cachedName;
-    File fileTile(fileName);
-
-    if ( fileTile.exists() )
-    {
-        Poco::Timestamp timeNow;
-        if ( timeNow - fileTile.getLastModified() > TILE_EXPIRED )
-            fileTile.remove();
-        else
-            fileTile.setLastModified(timeNow);
-    }
 
     std::unique_ptr<std::fstream> result(new std::fstream(fileName, std::ios::in));
 
commit 1da26714ad357924d18d5c4c008463a4e03c7bab
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Mon Aug 3 21:48:19 2015 +0300

    loolwsd: cron job to delete old tiles from rpm packages
    
    place a cronjob file in /etc/cron.d/ which is removed when
    the loolwsd rpm packages is uninstalled

diff --git a/loolwsd/loolwsd.spec.in b/loolwsd/loolwsd.spec.in
index 9c579d4..a4ccc28 100644
--- a/loolwsd/loolwsd.spec.in
+++ b/loolwsd/loolwsd.spec.in
@@ -55,6 +55,9 @@ install -D -m 644 sysconfig.loolwsd %{buildroot}/var/adm/fillup-templates
 /usr/bin/loolwsd-systemplate-setup
 %{_unitdir}/loolwsd.service
 /var/adm/fillup-templates/sysconfig.loolwsd
+mkdir -p %{buildroot}/etc/cron.d
+echo "#Remove old tiles once every 10 days at midnight" > %{buildroot}/etc/cron.d/loolwsd.cron
+echo "0 0 */10 * * root find /var/cache/loolwsd -name \"*.png\" -a -atime +10 -exec rm {} \;" >> %{buildroot}/etc/cron.d/loolwsd.cron
 
 %doc README
 
commit a266d966ec14373ff39b8ba44348cc54326061c0
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Mon Aug 3 19:19:38 2015 +0300

    loleaflet: updated README to reflect new API

diff --git a/loleaflet/README b/loleaflet/README
index c91c0d4..1e36a95 100644
--- a/loleaflet/README
+++ b/loleaflet/README
@@ -135,6 +135,15 @@ Scroll (the following are measured in pixels):
             + e.x = the amount scrolled to the right (or left if negative)
             + e.y = the amount scrolled to the bottom (or top if negative)
 
+Writer pages:
+    - API:
+        map.goToPage(page)
+        map.getNumberOfPages()
+    - events
+        map.on('pagenumberchanged', function (e) {}) where:
+            + e.currentPage = the page on which the cursor lies
+            + e.pages = number of pages
+            + e.docType = document type, should be 'text'
 Contributing
 ------------
 
commit 1b7d58b2a24c281318a64621eeddcc7316394f05
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Mon Aug 3 19:08:06 2015 +0300

    loleaflet: send the updateparts message too

diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 5703147..6ce236e 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -344,24 +344,22 @@ L.TileLayer = L.GridLayer.extend({
 					this._parts = 1;
 					this._currentPage = command.part;
 					this._pages = command.parts;
-					map.fire('updatepages', {
+					map.fire('pagenumberchanged', {
 						currentPage: this._currentPage,
 						pages: this._pages,
 						docType: this._docType
 					});
 				}
-				else {
-					this.sendMessage('setclientpart part=' + this._currentPart);
-					var partNames = textMsg.match(/[^\r\n]+/g);
-					// only get the last matches
-					partNames = partNames.slice(partNames.length - this._parts);
-					this._map.fire('updateparts', {
-						currentPart: this._currentPart,
-						parts: this._parts,
-						docType: this._docType,
-						partNames: partNames
-					});
-				}
+				this.sendMessage('setclientpart part=' + this._currentPart);
+				var partNames = textMsg.match(/[^\r\n]+/g);
+				// only get the last matches
+				partNames = partNames.slice(partNames.length - this._parts);
+				this._map.fire('updateparts', {
+					currentPart: this._currentPart,
+					parts: this._parts,
+					docType: this._docType,
+					partNames: partNames
+				});
 				this._update();
 				if (this._preFetchPart !== this._currentPart) {
 					this._preFetchPart = this._currentPart;
@@ -480,7 +478,7 @@ L.TileLayer = L.GridLayer.extend({
 				this._map.fire('setpart', {currentPart: this._currentPart});
 			}
 			else if (this._docType === 'text') {
-				map.fire('updatepages', {
+				map.fire('pagenumberchanged', {
 					currentPage: part,
 					pages: this._pages,
 					docType: this._docType
commit 072a1ccb4c7b4e312a355bf129c92f22d8d65f5c
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Mon Aug 3 19:07:02 2015 +0300

    goToPage API
    
    in loleaflet, this is achived by invalidating the cursor and centering
    the viewing area around it

diff --git a/loleaflet/src/control/Parts.js b/loleaflet/src/control/Parts.js
index 1041604..689ec4a 100644
--- a/loleaflet/src/control/Parts.js
+++ b/loleaflet/src/control/Parts.js
@@ -50,5 +50,18 @@ L.Map.include({
 							'tilewidth=' + docLayer._docWidthTwips + ' ' +
 							'tileheight=' + docLayer._docHeightTwips + ' ' +
 							'id=' + id);
+	},
+
+	goToPage: function (page) {
+		var docLayer = this._docLayer;
+		if (page < 0 || page >= docLayer._pages) {
+			return;
+		}
+		docLayer._currentPage = page;
+		docLayer.sendMessage('setpage page=' + page);
+	},
+
+	getNumberOfPages: function () {
+		return this._docLayer._pages;
 	}
 });
diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp
index 10171bf..fe1096a 100644
--- a/loolwsd/LOOLSession.cpp
+++ b/loolwsd/LOOLSession.cpp
@@ -264,6 +264,7 @@ bool MasterProcessSession::handleInput(const char *buffer, int length)
              tokens[0] != "selectgraphic" &&
              tokens[0] != "selecttext" &&
              tokens[0] != "setclientpart" &&
+             tokens[0] != "setpage" &&
              tokens[0] != "status" &&
              tokens[0] != "tile" &&
              tokens[0] != "uno")
@@ -577,6 +578,10 @@ bool ChildProcessSession::handleInput(const char *buffer, int length)
     {
         return setClientPart(buffer, length, tokens);
     }
+    else if (tokens[0] == "setpage")
+    {
+        return setPage(buffer, length, tokens);
+    }
     else if (tokens[0] == "status")
     {
         return getStatus(buffer, length);
@@ -1016,4 +1021,17 @@ bool ChildProcessSession::setClientPart(const char *buffer, int length, StringTo
     return true;
 }
 
+bool ChildProcessSession::setPage(const char *buffer, int length, StringTokenizer& tokens)
+{
+    int page;
+    if (tokens.count() < 2 ||
+        !getTokenInteger(tokens[1], "page", page))
+    {
+        sendTextFrame("error: cmd=setpage kind=invalid");
+        return false;
+    }
+    _loKitDocument->pClass->setPart(_loKitDocument, page);
+    return true;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/loolwsd/LOOLSession.hpp b/loolwsd/LOOLSession.hpp
index d4007fb..0030f28 100644
--- a/loolwsd/LOOLSession.hpp
+++ b/loolwsd/LOOLSession.hpp
@@ -171,6 +171,7 @@ public:
     bool resetSelection(const char *buffer, int length, Poco::StringTokenizer& tokens);
     bool saveAs(const char *buffer, int length, Poco::StringTokenizer& tokens);
     bool setClientPart(const char *buffer, int length, Poco::StringTokenizer& tokens);
+    bool setPage(const char *buffer, int length, Poco::StringTokenizer& tokens);
 
     std::string _jail;
     std::string _loSubPath;
commit c3682e87f057bba6dfa6d1a1a23ee333589999ba
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Mon Aug 3 17:39:45 2015 +0300

    loleaflet: handle parts in Writer
    
    In Writer a part is a page and we only get notified about the
    current page in which the cursor is. Internally (invalidation and
    caching) we work with a single part (0)

diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index e537922..5703147 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -261,6 +261,9 @@ L.TileLayer = L.GridLayer.extend({
 				command.height = parseInt(strTwips[3]);
 				command.part = this._currentPart;
 			}
+			if (this._docType === 'text') {
+				command.part = 0;
+			}
 			topLeftTwips = new L.Point(command.x, command.y);
 			offset = new L.Point(command.width, command.height);
 			bottomRightTwips = topLeftTwips.add(offset);
@@ -336,16 +339,29 @@ L.TileLayer = L.GridLayer.extend({
 				this._documentInfo = textMsg;
 				this._parts = command.parts;
 				this._currentPart = command.currentPart;
-				this.sendMessage('setclientpart part=' + this._currentPart);
-				var partNames = textMsg.match(/[^\r\n]+/g);
-				// only get the last matches
-				partNames = partNames.slice(partNames.length - this._parts);
-				this._map.fire('updateparts', {
-					currentPart: this._currentPart,
-					parts: this._parts,
-					docType: this._docType,
-					partNames: partNames
-				});
+				if (this._docType === 'text') {
+					this._currentPart = 0;
+					this._parts = 1;
+					this._currentPage = command.part;
+					this._pages = command.parts;
+					map.fire('updatepages', {
+						currentPage: this._currentPage,
+						pages: this._pages,
+						docType: this._docType
+					});
+				}
+				else {
+					this.sendMessage('setclientpart part=' + this._currentPart);
+					var partNames = textMsg.match(/[^\r\n]+/g);
+					// only get the last matches
+					partNames = partNames.slice(partNames.length - this._parts);
+					this._map.fire('updateparts', {
+						currentPart: this._currentPart,
+						parts: this._parts,
+						docType: this._docType,
+						partNames: partNames
+					});
+				}
 				this._update();
 				if (this._preFetchPart !== this._currentPart) {
 					this._preFetchPart = this._currentPart;
@@ -457,12 +473,19 @@ L.TileLayer = L.GridLayer.extend({
 		}
 		else if (textMsg.startsWith('setpart:')) {
 			var part = parseInt(textMsg.match(/\d+/g)[0]);
-			if (part !== this._currentPart) {
+			if (part !== this._currentPart && this._docType !== 'text') {
 				this._currentPart = part;
 				this._update();
 				this._clearSelections();
 				this._map.fire('setpart', {currentPart: this._currentPart});
 			}
+			else if (this._docType === 'text') {
+				map.fire('updatepages', {
+					currentPage: part,
+					pages: this._pages,
+					docType: this._docType
+				});
+			}
 		}
 		else if (textMsg.startsWith('searchnotfound:')) {
 			this._map.fire('searchnotfound');
commit c04bf2701a2f4ab69949456f4e58761643e49fa1
Author: Mihai Varga <mihai.varga at collabora.com>
Date:   Mon Aug 3 17:29:23 2015 +0300

    loolwsd: handle parts in Writer
    
    In Writer a part is a page and we only notify the client about the
    current page in which the cursor is. Internally (invalidation and
    caching) we work with a single part (0)

diff --git a/loolwsd/LOOLSession.cpp b/loolwsd/LOOLSession.cpp
index cae2804..10171bf 100644
--- a/loolwsd/LOOLSession.cpp
+++ b/loolwsd/LOOLSession.cpp
@@ -599,7 +599,7 @@ bool ChildProcessSession::handleInput(const char *buffer, int length)
                tokens[0] == "resetselection" ||
                tokens[0] == "saveas");
 
-        if (_loKitDocument->pClass->getPart(_loKitDocument) != _clientPart)
+        if (_docType != "text" && _loKitDocument->pClass->getPart(_loKitDocument) != _clientPart)
         {
             _loKitDocument->pClass->setPart(_loKitDocument, _clientPart);
         }
@@ -655,6 +655,10 @@ extern "C"
             {
                 int curPart = srv->_loKitDocument->pClass->getPart(srv->_loKitDocument);
                 srv->sendTextFrame("curpart: part=" + std::to_string(curPart));
+                if (srv->_docType == "text")
+                {
+                    curPart = 0;
+                }
                 StringTokenizer tokens(std::string(pPayload), " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
                 if (tokens.count() == 4)
                 {
@@ -777,7 +781,11 @@ bool ChildProcessSession::loadDocument(const char *buffer, int length, StringTok
 bool ChildProcessSession::getStatus(const char *buffer, int length)
 {
     std::string status = "status: " + LOKitHelper::documentStatus(_loKitDocument);
-
+    StringTokenizer tokens(status, " ", StringTokenizer::TOK_IGNORE_EMPTY | StringTokenizer::TOK_TRIM);
+    if (!getTokenString(tokens[1], "type", _docType))
+    {
+        Application::instance().logger().information(Util::logPrefix() + "failed to get document type from" + status);
+    }
     sendTextFrame(status);
 
     return true;
@@ -820,7 +828,9 @@ void ChildProcessSession::sendTile(const char *buffer, int length, StringTokeniz
     std::memcpy(output.data(), response.data(), response.size());
 
     unsigned char *pixmap = new unsigned char[4 * width * height];
-    _loKitDocument->pClass->setPart(_loKitDocument, part);
+    if (_docType != "text" && part != _loKitDocument->pClass->getPart(_loKitDocument)) {
+        _loKitDocument->pClass->setPart(_loKitDocument, part);
+    }
     _loKitDocument->pClass->paintTile(_loKitDocument, pixmap, width, height, tilePosX, tilePosY, tileWidth, tileHeight);
 
     if (!Util::encodePNGAndAppendToBuffer(pixmap, width, height, output))
diff --git a/loolwsd/LOOLSession.hpp b/loolwsd/LOOLSession.hpp
index d6b7b60..d4007fb 100644
--- a/loolwsd/LOOLSession.hpp
+++ b/loolwsd/LOOLSession.hpp
@@ -155,6 +155,7 @@ public:
     virtual bool getStatus(const char *buffer, int length);
 
     LibreOfficeKitDocument *_loKitDocument;
+    std::string _docType;
 
  protected:
     virtual bool loadDocument(const char *buffer, int length, Poco::StringTokenizer& tokens) override;


More information about the Libreoffice-commits mailing list