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

Henry Castro hcastro at collabora.com
Fri Mar 10 03:00:39 UTC 2017


 loleaflet/build/deps.js                            |    6 
 loleaflet/dist/loleaflet.css                       |   60 +++++++++
 loleaflet/src/control/Control.Scroll.Annotation.js |   62 +++++++++
 loleaflet/src/layer/marker/Annotation.js           |    5 
 loleaflet/src/layer/tile/ImpressTileLayer.js       |  139 +++++++++++++++++++--
 loleaflet/src/layer/tile/TileLayer.js              |    4 
 6 files changed, 265 insertions(+), 11 deletions(-)

New commits:
commit bd911ff9d55d3945e9d10c02aacc77b1b7c5e59b
Author: Henry Castro <hcastro at collabora.com>
Date:   Thu Mar 9 22:39:48 2017 -0400

    loleaflet: rework Impress annotations
    
    LO Impress does not have an anchor position of the annotation object
    
    Change-Id: Ifaa08bb3f62f442f3ee58242e835b6377901a592

diff --git a/loleaflet/build/deps.js b/loleaflet/build/deps.js
index e1b2786..6cce092 100644
--- a/loleaflet/build/deps.js
+++ b/loleaflet/build/deps.js
@@ -435,6 +435,12 @@ var deps = {
 		desc: 'Group Annotations to put on the map.'
 	},
 
+	AnnotationScroll: {
+		src: ['control/Control.js',
+		      'control/Control.Scroll.Annotation.js'],
+		desc: 'Basic scroll control'
+	},
+
 	Annotation: {
 		src: ['layer/marker/Annotation.js'],
 		desc: 'Annotation to put on the map.'
diff --git a/loleaflet/dist/loleaflet.css b/loleaflet/dist/loleaflet.css
index 8225027..fbecbf7 100644
--- a/loleaflet/dist/loleaflet.css
+++ b/loleaflet/dist/loleaflet.css
@@ -247,3 +247,63 @@ body {
 .loleaflet-annotation-caption {
         font-weight: bold;
 }
+
+.loleaflet-bar {
+	box-shadow: 0 1px 5px rgba(0,0,0,0.65);
+	border-radius: 4px;
+	display: inline-block;
+	margin: 3px;
+	vertical-align: middle;
+}
+
+.loleaflet-bar a,
+.loleaflet-bar a:hover {
+	background-color: #fff;
+	border-bottom: 1px solid #ccc;
+	width: 30px;
+	height: 30px;
+	line-height: 30px;
+	display: block;
+	text-align: center;
+	text-decoration: none;
+	color: black;
+}
+
+.loleaflet-bar a {
+	background-position: 50% 50%;
+	background-repeat: no-repeat;
+	display: block;
+}
+
+.loleaflet-bar a:hover {
+	background-color: #f4f4f4;
+}
+
+.loleaflet-bar a:first-child {
+	border-top-left-radius: 4px;
+	border-top-right-radius: 4px;
+}
+
+.loleaflet-bar a:last-child {
+	border-bottom-left-radius: 4px;
+	border-bottom-right-radius: 4px;
+	border-bottom: none;
+}
+
+.loleaflet-bar a.leaflet-disabled {
+	cursor: default;
+	background-color: #f4f4f4;
+	color: #bbb;
+}
+
+.loleaflet-bar a {
+	width: 30px;
+	height: 30px;
+	line-height: 30px;
+}
+
+.loleaflet-control-scroll-up,
+.loleaflet-control-scroll-down {
+	font: bold 18px 'Lucida Console', Monaco, monospace;
+	text-indent: 1px;
+}
diff --git a/loleaflet/src/control/Control.Scroll.Annotation.js b/loleaflet/src/control/Control.Scroll.Annotation.js
new file mode 100644
index 0000000..0eb3b2c
--- /dev/null
+++ b/loleaflet/src/control/Control.Scroll.Annotation.js
@@ -0,0 +1,62 @@
+/*
+ * L.Control.Scroll.Annotation
+ */
+
+L.Control.Scroll.Annotation = L.Control.extend({
+	options: {
+		position: 'topright',
+		arrowUp: '0x25b2',
+		arrowUpTitle: _('Scroll up annotations'),
+		arrowDown: '0x25bc',
+		arrowDownTitle: _('Scroll down annotations')
+	},
+
+	onAdd: function (map) {
+		var scrollName = 'leaflet-control-scroll',
+		    container = L.DomUtil.create('div', 'loleaflet-bar');
+
+		this._map = map;
+
+		this._buttonUp  = this._createButton(
+		        this.options.arrowUp, this.options.arrowUpTitle,
+		        scrollName + '-up',  container, this._onScrollUp,  this);
+		this._buttonDown = this._createButton(
+		        this.options.arrowDown, this.options.arrowDownTitle,
+		        scrollName + '-down', container, this._onScrollDown, this);
+
+		return container;
+	},
+
+	onRemove: function (map) {
+	},
+
+	_onScrollUp: function (e) {
+		this._map.fire('AnnotationScrollUp');
+	},
+
+	_onScrollDown: function (e) {
+		this._map.fire('AnnotationScrollDown');
+	},
+
+	_createButton: function (html, title, className, container, fn, context) {
+		var link = L.DomUtil.create('a', className, container);
+		link.innerHTML = String.fromCharCode(html);
+		link.href = '#';
+		link.title = title;
+
+		var stop = L.DomEvent.stopPropagation;
+
+		L.DomEvent
+		    .on(link, 'click', stop)
+		    .on(link, 'mousedown', stop)
+		    .on(link, 'dblclick', stop)
+		    .on(link, 'click', L.DomEvent.preventDefault)
+		    .on(link, 'click', fn, context);
+
+		return link;
+	}
+});
+
+L.control.scroll.annotation = function (options) {
+	return new L.Control.Scroll.Annotation(options);
+};
diff --git a/loleaflet/src/layer/marker/Annotation.js b/loleaflet/src/layer/marker/Annotation.js
index 774dd3c..4482837 100644
--- a/loleaflet/src/layer/marker/Annotation.js
+++ b/loleaflet/src/layer/marker/Annotation.js
@@ -61,6 +61,11 @@ L.Annotation = L.Layer.extend({
 		this._editNode.style.display = 'none';
 	},
 
+	hide: function () {
+		this._container.style.visibility = 'hidden';
+		this._editNode.style.display = 'none';
+	},
+
 	edit: function () {
 		this._container.style.visibility = '';
 		this._contentNode.style.display = 'none';
diff --git a/loleaflet/src/layer/tile/ImpressTileLayer.js b/loleaflet/src/layer/tile/ImpressTileLayer.js
index 0c6f0ed..8afd5c7 100644
--- a/loleaflet/src/layer/tile/ImpressTileLayer.js
+++ b/loleaflet/src/layer/tile/ImpressTileLayer.js
@@ -6,25 +6,124 @@
 L.ImpressTileLayer = L.TileLayer.extend({
 
 	newAnnotation: function (comment) {
-		if (!comment.anchorPos && this._isCursorVisible) {
-			comment.anchorPos = this._latLngToTwips(this._visibleCursor.getNorthWest());
-		}
-		if (comment.anchorPos) {
-			this._annotations.add(comment, true);
+		var annotation = L.annotation(this._map.getCenter(), comment).addTo(this._map);
+		annotation.edit();
+		annotation.focus();
+	},
+
+	beforeAdd: function (map) {
+		map.on('AnnotationCancel', this.onAnnotationCancel, this);
+		map.on('AnnotationSave', this.onAnnotationSave, this);
+		map.on('AnnotationScrollUp', this.onAnnotationScrollUp, this);
+		map.on('AnnotationScrollDown', this.onAnnotationScrollDown, this);
+	},
+
+	getAnnotation: function (id) {
+		for (var index in this._annotations) {
+			if (this._annotations[index]._data.id === id) {
+				return this._annotations[index];
+			}
 		}
+		return null;
 	},
 
 	onAdd: function (map) {
 		L.TileLayer.prototype.onAdd.call(this, map);
-		this._annotations = L.annotationManager(map);
+		this._annotations = [];
+	},
+
+	onAnnotationCancel: function (e) {
+		this._map.removeLayer(e.annotation);
+		this._map.focus();
 	},
 
 	onAnnotationModify: function (annotation) {
-		this._annotations.modify(annotation);
+		var draft = L.annotation(this._map.getCenter(), annotation._data).addTo(this._map);
+		draft.edit();
+		draft.focus();
 	},
 
 	onAnnotationRemove: function (id) {
-		this._annotations.remove(id);
+		var comment = {
+			Id: {
+				type: 'string',
+				value: id
+			}
+		};
+		this._map.sendUnoCommand('.uno:DeleteAnnotation', comment);
+		this._map.focus();
+	},
+
+	onAnnotationSave: function (e) {
+		var comment;
+		if (e.annotation._data.id === 'new') {
+			comment = {
+				Text: {
+					type: 'string',
+					value: e.annotation._data.text
+				}
+			};
+			this._map.sendUnoCommand('.uno:InsertAnnotation', comment);
+		} else {
+			comment = {
+				Id: {
+					type: 'string',
+					value: e.annotation._data.id
+				},
+				Text: {
+					type: 'string',
+					value: e.annotation._data.text
+				}
+			};
+			this._map.sendUnoCommand('.uno:EditAnnotation', comment);
+		}
+		this._map.removeLayer(e.annotation);
+		this._map.focus();
+	},
+
+	onAnnotationScrollDown: function (e) {
+		this._topAnnotation = Math.min(++this._topAnnotation, this._annotations.length - 1);
+		this.layoutAnnotations();
+	},
+
+	onAnnotationScrollUp: function (e) {
+		this._topAnnotation = Math.max(--this._topAnnotation, 0);
+		this.layoutAnnotations();
+	},
+
+	removeAnnotation: function (id) {
+		for (var index in this._annotations) {
+			if (this._annotations[index]._data.id == id) {
+				this._map.removeLayer(this._annotations[index]);
+				this._annotations.splice(index, 1);
+				break;
+			}
+		}
+	},
+
+	layoutAnnotations: function () {
+		var topRight = this._map.latLngToLayerPoint(this._map.options.maxBounds.getNorthEast()).add(L.point(this.options.marginX, this.options.marginY));
+		var bounds, annotation;
+		for (var index in this._annotations) {
+			annotation = this._annotations[index];
+			if (index >= this._topAnnotation) {
+				annotation.setLatLng(bounds ? this._map.layerPointToLatLng(bounds.getBottomLeft()) : this._map.layerPointToLatLng(topRight));
+				bounds = annotation.getBounds();
+				bounds.extend(L.point(bounds.max.x, bounds.max.y + this.options.marginY));
+				annotation.show();
+			} else {
+				annotation.hide();
+			}
+		}
+		if (bounds) {
+			if (!this._scrollAnnotation) {
+				this._scrollAnnotation = L.control.scroll.annotation();
+				this._scrollAnnotation.addTo(this._map);
+			}
+		} else if (this._scrollAnnotation) {
+			this._map.removeControl(this._scrollAnnotation);
+			this._scrollAnnotation = null;
+		}
 	},
 
 	_onCommandValuesMsg: function (textMsg) {
@@ -34,7 +133,12 @@ L.ImpressTileLayer = L.TileLayer.extend({
 		}
 
 		if (values.comments) {
-			this._annotations.fill(values.comments);
+			for (var index in values.comments) {
+				comment = values.comments[index];
+				this._annotations.push(L.annotation(this._map.options.maxBounds.getSouthEast(), comment).addTo(this._map));
+			}
+			this._topAnnotation = 0;
+			this.layoutAnnotations();
 		} else {
 			L.TileLayer.prototype._onCommandValuesMsg.call(this, textMsg);
 		}
@@ -42,7 +146,22 @@ L.ImpressTileLayer = L.TileLayer.extend({
 
 	_onMessage: function (textMsg, img) {
 		if (textMsg.startsWith('comment:')) {
-			this._annotations.onACKComment(textMsg);
+			var obj = JSON.parse(textMsg.substring('comment:'.length + 1));
+			if (obj.comment.action === 'Add') {
+				this._annotations.push(L.annotation(this._map.options.maxBounds.getSouthEast(), obj.comment).addTo(this._map));
+				this._topAnnotation = Math.min(this._topAnnotation, this._annotations.length - 1);
+				this.layoutAnnotations();
+			} else if (obj.comment.action === 'Remove') {
+				this.removeAnnotation(obj.comment.id);
+				this._topAnnotation = Math.min(this._topAnnotation, this._annotations.length - 1);
+				this.layoutAnnotations();
+			} else if (obj.comment.action === 'Modify') {
+				var modified = this.getAnnotation(obj.comment.id);
+				if (modified) {
+					modified._data = obj.comment;
+					modified.update();
+				}
+			}
 		} else {
 			L.TileLayer.prototype._onMessage.call(this, textMsg, img);
 		}
diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 8fae7f9..901e753 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -48,7 +48,9 @@ L.TileLayer = L.GridLayer.extend({
 		zoomReverse: false,
 		detectRetina: true,
 		crossOrigin: false,
-		previewInvalidationTimeout: 1000
+		previewInvalidationTimeout: 1000,
+		marginX: 50,
+		marginY: 10
 	},
 
 	initialize: function (url, options) {


More information about the Libreoffice-commits mailing list