loleaflet/src/layer/tile/CalcTileLayer.js |   50 +++++++++++++++++++++++++++---
 loleaflet/src/layer/tile/TileLayer.js     |   33 ++++++++++++++++---
 2 files changed, 73 insertions(+), 10 deletions(-)

New commits:
commit 46cfff2418e10671c264504eba137ebde8cd98a6
Author:     Dennis Francis <dennis.fran...@collabora.com>
AuthorDate: Sun Jun 21 17:19:30 2020 +0530
Commit:     Dennis Francis <dennis.fran...@collabora.com>
CommitDate: Mon Jul 6 19:04:53 2020 +0200

    print-twips messaging for graphics
    
    All graphic-selection messages from core are in print-twips if
    sc_print_twips_msgs is set in SAL_LOK_OPTIONS. So do all the necessary
    conversions on intercepting the message.
    
    In addition, in this mode the core expects the parameters of the command
    '.uno:TransformDialog' to be in print-twips. This is also done in this
    patch.
    
    Change-Id: Ief8a0d4677f83f26b135ce47b68c27bff5aaf5c9
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/98157
    Tested-by: Jenkins
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Dennis Francis <dennis.fran...@collabora.com>

diff --git a/loleaflet/src/layer/tile/CalcTileLayer.js 
b/loleaflet/src/layer/tile/CalcTileLayer.js
index 62d8b6072..f2bfcd4eb 100644
--- a/loleaflet/src/layer/tile/CalcTileLayer.js
+++ b/loleaflet/src/layer/tile/CalcTileLayer.js
@@ -1075,6 +1075,18 @@ L.SheetGeometry = L.Class.extend({
                                this._rows.getTileTwipsPosFromPrint(point.y));
        },
 
+       // accepts a point in tile-twips coordinates and returns the equivalent 
point
+       // in print-twips.
+       getPrintTwipsPointFromTile: function (point) { // (L.Point) -> L.Point
+               if (!(point instanceof L.Point)) {
+                       console.error('Bad argument type, expected L.Point');
+                       return point;
+               }
+
+               return new 
L.Point(this._columns.getPrintTwipsPosFromTile(point.x),
+                               this._rows.getPrintTwipsPosFromTile(point.y));
+       },
+
        // accepts a rectangle in print twips coordinates and returns the 
equivalent rectangle
        // in tile-twips aligned to the cells.
        getTileTwipsSheetAreaFromPrint: function (rectangle) { // (L.Bounds) -> 
L.Bounds
@@ -1370,12 +1382,17 @@ L.SheetDimension = L.Class.extend({
                });
        },
 
-       // computes element index from tile-twips position.
-       _getIndexFromTileTwipsPos: function (pos) {
+       // computes element index from tile-twips position and returns
+       // an object with this index and the span data.
+       _getSpanAndIndexFromTileTwipsPos: function (pos) {
+               var result = {};
                var span = this._visibleSizes.getSpanDataByCustomDataField(pos, 
'postiletwips');
+               result.span = span;
                if (span === undefined) {
                        // enforce limits.
-                       return (pos >= 0) ? this._maxIndex : 0;
+                       result.index = (pos >= 0) ? this._maxIndex : 0;
+                       result.span = 
this._visibleSizes.getSpanDataByIndex(result.index);
+                       return result;
                }
                var elementCount = span.end - span.start + 1;
                var posStart = ((span.data.posdevpx - span.data.sizedev * 
elementCount) /
@@ -1386,7 +1403,13 @@ L.SheetDimension = L.Class.extend({
                // always round down as relativeIndex is zero-based.
                var relativeIndex = Math.floor((pos - posStart) / sizeOne);
 
-               return span.start + relativeIndex;
+               result.index = span.start + relativeIndex;
+               return result;
+       },
+
+       // computes element index from tile-twips position.
+       _getIndexFromTileTwipsPos: function (pos) {
+               return this._getSpanAndIndexFromTileTwipsPos(pos).index;
        },
 
        // computes element index from print twips position and returns
@@ -1477,6 +1500,25 @@ L.SheetDimension = L.Class.extend({
                return elementDataTT.startpos + offset;
        },
 
+       // Accepts a position in tile twips and returns the corresponding 
position in print twips.
+       getPrintTwipsPosFromTile: function (posTT) {
+
+               if (typeof posTT !== 'number') {
+                       console.error('Wrong argument type');
+                       return;
+               }
+
+               var element = this._getSpanAndIndexFromTileTwipsPos(posTT);
+               var elementDataTT = 
this._getElementDataAnyFromSpanByIndex(element.index, element.span, 
'tiletwips');
+               var elementDataPT = 
this._getElementDataAnyFromSpanByIndex(element.index, element.span, 
'printtwips');
+
+               var offset = posTT - elementDataTT.startpos;
+               console.assert(offset >= 0, 'offset should not be negative');
+
+               // Preserve any offset from the matching column/row start 
position.
+               return elementDataPT.startpos + offset;
+       },
+
        // Accepts a start and end positions in print twips, and returns the
        // corresponding positions in tile twips, by first computing the 
element range.
        getTileTwipsRangeFromPrint: function (posStartPT, posEndPT) {
diff --git a/loleaflet/src/layer/tile/TileLayer.js 
b/loleaflet/src/layer/tile/TileLayer.js
index 92a3e6805..e48406405 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -1044,10 +1044,11 @@ L.TileLayer = L.GridLayer.extend({
                        var topLeftTwips = new L.Point(msgData[0], msgData[1]);
                        var offset = new L.Point(msgData[2], msgData[3]);
                        var bottomRightTwips = topLeftTwips.add(offset);
-                       this._graphicSelectionTwips = new 
L.Bounds(topLeftTwips, bottomRightTwips);
+                       this._graphicSelectionTwips = 
this._getGraphicSelectionRectangle(
+                               new L.Bounds(topLeftTwips, bottomRightTwips));
                        this._graphicSelection = new L.LatLngBounds(
-                               this._twipsToLatLng(topLeftTwips, 
this._map.getZoom()),
-                               this._twipsToLatLng(bottomRightTwips, 
this._map.getZoom()));
+                               
this._twipsToLatLng(this._graphicSelectionTwips.getTopLeft(), 
this._map.getZoom()),
+                               
this._twipsToLatLng(this._graphicSelectionTwips.getBottomRight(), 
this._map.getZoom()));
 
                        this._graphicSelectionAngle = (msgData.length > 4) ? 
msgData[4] : 0;
 
@@ -1110,9 +1111,11 @@ L.TileLayer = L.GridLayer.extend({
                        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 boundRectTwips = this._getGraphicSelectionRectangle(
+                               new L.Bounds(topLeftTwips, bottomRightTwips));
                        this._graphicViewMarkers[viewId].bounds = new 
L.LatLngBounds(
-                               this._twipsToLatLng(topLeftTwips, 
this._map.getZoom()),
-                               this._twipsToLatLng(bottomRightTwips, 
this._map.getZoom()));
+                               
this._twipsToLatLng(boundRectTwips.getTopLeft(), this._map.getZoom()),
+                               
this._twipsToLatLng(boundRectTwips.getBottomRight(), this._map.getZoom()));
                }
                else {
                        this._graphicViewMarkers[viewId].bounds = 
L.LatLngBounds.createDefault();
@@ -2503,6 +2506,10 @@ L.TileLayer = L.GridLayer.extend({
                                if (newPos.y < 0)
                                        newPos.y = 0;
 
+                               if (this.isCalc() && 
this.options.printTwipsMsgsEnabled) {
+                                       newPos = 
this.sheetGeometry.getPrintTwipsPointFromTile(newPos);
+                               }
+
                                param = {
                                        TransformPosX: {
                                                type: 'long',
@@ -2635,6 +2642,10 @@ L.TileLayer = L.GridLayer.extend({
                                }
                        }
 
+                       if (this.isCalc() && 
this.options.printTwipsMsgsEnabled) {
+                               newPos = 
this.sheetGeometry.getPrintTwipsPointFromTile(newPos);
+                       }
+
                        // fill params for uno command
                        var param = {
                                TransformPosX: {
@@ -3386,7 +3397,7 @@ L.TileLayer = L.GridLayer.extend({
                }
        },
 
-       // convert the area in print-twips to tile-twips by computing the 
involved cell-range.
+       // converts rectangle in print-twips to tile-twips rectangle of the 
smallest cell-range that encloses it.
        _convertToTileTwipsSheetArea: function (rectangle) {
                if (!(rectangle instanceof L.Bounds) || 
!this.options.printTwipsMsgsEnabled) {
                        return rectangle;
@@ -3395,6 +3406,16 @@ L.TileLayer = L.GridLayer.extend({
                return 
this.sheetGeometry.getTileTwipsSheetAreaFromPrint(rectangle);
        },
 
+       _getGraphicSelectionRectangle: function (rectangle) {
+               if (!(rectangle instanceof L.Bounds) || 
!this.options.printTwipsMsgsEnabled) {
+                       return rectangle;
+               }
+
+               var rectSize = rectangle.getSize();
+               var newTopLeft = 
this.sheetGeometry.getTileTwipsPointFromPrint(rectangle.getTopLeft());
+               return new L.Bounds(newTopLeft, newTopLeft.add(rectSize));
+       },
+
        _getEditCursorRectangle: function (msgObj) {
 
                if (typeof msgObj !== 'object' || 
!msgObj.hasOwnProperty('rectangle')) {
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to