loleaflet/src/layer/AnnotationManager.js | 143 ++++++++++++++++--------------- 1 file changed, 77 insertions(+), 66 deletions(-)
New commits: commit 94cdb2750f1aa08f9baf4d58a419bfff113b36c5 Author: Henry Castro <hcas...@collabora.com> Date: Wed Mar 29 14:45:21 2017 -0400 loleaflet: re-work the arrangement of annotation objects Change-Id: Idce433835bed16b943306e6ad1bb888f5e9e1ee5 diff --git a/loleaflet/src/layer/AnnotationManager.js b/loleaflet/src/layer/AnnotationManager.js index b4ff1614..256dd070 100644 --- a/loleaflet/src/layer/AnnotationManager.js +++ b/loleaflet/src/layer/AnnotationManager.js @@ -47,6 +47,7 @@ L.AnnotationManager = L.Class.extend({ for (var index in comments) { comment = comments[index]; comment.anchorPos = L.LOUtil.stringToBounds(comment.anchorPos); + comment.anchorPix = this._map._docLayer._twipsToPixels(comment.anchorPos.min); comment.dateTime = new Date(comment.dateTime.replace(/,.*/, 'Z')).toDateString(); comment.trackchange = false; this._items.push(L.annotation(this._map.options.maxBounds.getSouthEast(), comment).addTo(this._map)); @@ -61,6 +62,7 @@ L.AnnotationManager = L.Class.extend({ changecomment = redlines[idx]; changecomment.id = 'change-' + changecomment.index; changecomment.anchorPos = L.LOUtil.stringToBounds(changecomment.textRange); + changecomment.anchorPix = this._map._docLayer._twipsToPixels(changecomment.anchorPos.min); changecomment.trackchange = true; changecomment.text = changecomment.comment; this._items.push(L.annotation(this._map.options.maxBounds.getSouthEast(), changecomment).addTo(this._map)); @@ -77,6 +79,15 @@ L.AnnotationManager = L.Class.extend({ return null; }, + getIndexOf: function (id) { + for (var index = 0; index < this._items.length; index++) { + if (this._items[index]._data.id === id) { + return index; + } + } + return -1; + }, + removeItem: function (id) { var annotation; for (var iterator in this._items) { @@ -89,27 +100,23 @@ L.AnnotationManager = L.Class.extend({ }, unselect: function () { - this._selected = {}; + this._selected = -1; this._map._docLayer._selections.clearLayers(); this.update(); }, - select: function (obj) { - var annotation = obj instanceof L.Annotation ? obj : this.getItem(obj); + select: function (annotation) { if (annotation) { - this._selected.annotation = annotation; + this._selected = this.getIndexOf(annotation._data.id); this.update(); } }, update: function () { - var topRight = this._map.project(this._map.options.maxBounds.getNorthEast()); - var point, rectangles; - if (this._selected.annotation) { - this.layout(); - point = this._map._docLayer._twipsToPixels(this._selected.annotation._data.anchorPos.min); - this._map._docLayer._selections.clearLayers(); - rectangles = L.PolyUtil.rectanglesToPolygons(L.LOUtil.stringToRectangles(this._selected.annotation._data.textRange), this._map._docLayer); + this.layout(); + this._map._docLayer._selections.clearLayers(); + if (this._selected >= 0) { + var rectangles = L.PolyUtil.rectanglesToPolygons(L.LOUtil.stringToRectangles(this._items[this._selected]._data.textRange), this._map._docLayer); if (rectangles.length > 0) { this._map._docLayer._selections.addLayer(L.polygon(rectangles, { pointerEvents: 'none', @@ -119,70 +126,70 @@ L.AnnotationManager = L.Class.extend({ opacity: 0.25 })); } - this._selected.annotation.setLatLng(this._map.unproject(L.point(topRight.x, point.y))); } }, - layout: function () { - var topRight = this._map.project(this._map.options.maxBounds.getNorthEast()).add(L.point(this.options.marginX, this.options.marginY)); - var annotation, bounds, layoutBounds, foundBounds,point, latlng; - var layouts = []; + layoutUp: function (annotation, latLng, layoutBounds) { + annotation.setLatLng(latLng); + var bounds = annotation.getBounds(); + if (layoutBounds.intersects(bounds)) { + layoutBounds.extend(layoutBounds.min.subtract([0, bounds.getSize().y])); + latLng = this._map.layerPointToLatLng(layoutBounds.min); + } else { + latLng = this._map.layerPointToLatLng(bounds.min); + layoutBounds.extend(bounds.min); + } + layoutBounds.extend(layoutBounds.min.subtract([0, this.options.marginY])); + annotation.setLatLng(latLng); + annotation.show(); + }, - if (this._selected.annotation) { - point = L.point(topRight.x, this._map._docLayer._twipsToPixels(this._selected.annotation._data.anchorPos.min).y); - this._selected.annotation.setLatLng(this._map.unproject(point)); - bounds = this._selected.annotation.getBounds(); - bounds.extend(bounds.min.subtract([0, this.options.marginY])); - bounds.extend(bounds.getBottomLeft().add([0, this.options.marginY])); - this._selected.bounds = bounds; + layoutDown: function (annotation, latLng, layoutBounds) { + annotation.setLatLng(latLng); + var bounds = annotation.getBounds(); + if (layoutBounds.intersects(bounds)) { + latLng = this._map.layerPointToLatLng(layoutBounds.getBottomLeft()); + layoutBounds.extend(layoutBounds.max.add([0, bounds.getSize().y])); + } else { + latLng = this._map.layerPointToLatLng(bounds.min); + layoutBounds.extend(bounds.max); } + layoutBounds.extend(layoutBounds.max.add([0, this.options.marginY])); + annotation.setLatLng(latLng); + annotation.show(); + }, - for (var iterator in this._items) { - annotation = this._items[iterator]; - if (annotation === this._selected.annotation) { - continue; + layout: function () { + var docRight = this._map.project(this._map.options.maxBounds.getNorthEast()); + var topRight = docRight.add(L.point(this.options.marginX, this.options.marginY)); + var annotation, selected, layoutBounds, point, index; + if (this._selected >= 0) { + selected = this._items[this._selected]; + selected.setLatLng(this._map.unproject(L.point(topRight.x, selected._data.anchorPix.y))); + layoutBounds = selected.getBounds(); + layoutBounds.extend(layoutBounds.min.subtract([0, this.options.marginY])); + layoutBounds.extend(layoutBounds.max.add([0, this.options.marginY])); + for (index = this._selected - 1; index >= 0; index--) { + annotation = this._items[index]; + this.layoutUp(annotation, this._map.unproject(L.point(topRight.x, annotation._data.anchorPix.y)), layoutBounds); } - point = L.point(topRight.x, this._map._docLayer._twipsToPixels(annotation._data.anchorPos.min).y); - latlng = this._map.unproject(point); - annotation.setLatLng(latlng); - bounds = annotation.getBounds(); - foundBounds = null; - for (var itBounds in layouts) { - layoutBounds = layouts[itBounds]; - if (layoutBounds.intersects(bounds)) { - if (foundBounds) { - foundBounds = layoutBounds.max.y > foundBounds.max.y ? layoutBounds : foundBounds; - } else { - foundBounds = layoutBounds; - } - } + for (index = this._selected + 1; index < this._items.length; index++) { + annotation = this._items[index]; + this.layoutDown(annotation, this._map.unproject(L.point(topRight.x, annotation._data.anchorPix.y)), layoutBounds); } - - if (foundBounds) { - if (foundBounds.contains(bounds.getTopRight())) { - point = foundBounds.getBottomLeft().add([0, bounds.getSize().y + this.options.marginY]); - latlng = this._map.layerPointToLatLng(foundBounds.getBottomLeft()); - } else { - point = foundBounds.min.subtract([0, bounds.getSize().y + this.options.marginY]); - latlng = this._map.layerPointToLatLng(point); - } - foundBounds.extend(point); + if (selected._data.trackchange) { + selected.setLatLng(this._map.unproject(L.point(docRight.x, selected._data.anchorPix.y))); } else { - foundBounds = L.bounds(bounds.min, bounds.max); - foundBounds.extend(L.point(bounds.min.x, bounds.min.y - this.options.marginY)); - foundBounds.extend(L.point(bounds.min.x, bounds.max.y + this.options.marginY)); - layouts.push(foundBounds); + selected.setLatLng(this._map.unproject(selected._data.anchorPix)); } - - if (this._selected.annotation && this._selected.bounds && this._selected.bounds.intersects(foundBounds)) { - foundBounds.extend(this._selected.bounds.min); - latlng = this._map.layerPointToLatLng(this._selected.bounds.getBottomLeft()); - foundBounds.extend(this._selected.bounds.getBottomLeft().add([0, bounds.getSize().y + this.options.marginY])); - this._selected.bounds = null; + selected.show(); + } else { + point = this._map.latLngToLayerPoint(this._map.unproject(topRight)); + layoutBounds = L.bounds(point, point); + for (index in this._items) { + annotation = this._items[index]; + this.layoutDown(annotation, this._map.unproject(L.point(topRight.x, annotation._data.anchorPix.y)), layoutBounds); } - - annotation.setLatLng(latlng); - annotation.show(); } }, @@ -202,14 +209,14 @@ L.AnnotationManager = L.Class.extend({ }, modify: function (annotation) { - annotation.edit(); this.select(annotation); + annotation.edit(); annotation.focus(); }, reply: function (annotation) { - annotation.reply(); this.select(annotation); + annotation.reply(); annotation.focus(); }, @@ -257,12 +264,14 @@ L.AnnotationManager = L.Class.extend({ // transform change tracking index into an id obj.redline.id = 'change-' + obj.redline.index; obj.redline.anchorPos = L.LOUtil.stringToBounds(obj.redline.textRange); + obj.redline.anchorPix = this._map._docLayer._twipsToPixels(obj.redline.anchorPos.min); obj.redline.trackchange = true; obj.redline.text = obj.redline.comment; this.add(obj.redline); this._map.focus(); } else { obj.comment.anchorPos = L.LOUtil.stringToBounds(obj.comment.anchorPos); + obj.comment.anchorPix = this._map._docLayer._twipsToPixels(obj.comment.anchorPos.min); obj.comment.dateTime = new Date(obj.comment.dateTime.replace(/,.*/, 'Z')).toDateString(); this.add(obj.comment); this._map.focus(); @@ -281,12 +290,14 @@ L.AnnotationManager = L.Class.extend({ var modifiedObj; if (changetrack) { obj.redline.anchorPos = L.LOUtil.stringToBounds(obj.redline.textRange); + obj.redline.anchorPix = this._map._docLayer._twipsToPixels(obj.redline.anchorPos.min); obj.redline.text = obj.redline.comment; obj.redline.id = id; obj.redline.trackchange = true; modifiedObj = obj.redline; } else { obj.comment.anchorPos = L.LOUtil.stringToBounds(obj.comment.anchorPos); + obj.comment.anchorPix = this._map._docLayer._twipsToPixels(obj.comment.anchorPos.min); obj.comment.dateTime = new Date(obj.comment.dateTime.replace(/,.*/, 'Z')).toDateString(); modifiedObj = obj.comment; } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits