[Libreoffice-commits] online.git: loleaflet/css loleaflet/images loleaflet/src
Tomaž Vajngerl (via logerrit)
logerrit at kemper.freedesktop.org
Tue Apr 14 18:36:29 UTC 2020
loleaflet/css/leaflet.css | 47 +++---
loleaflet/images/tabstop-center.svg | 68 ++++++++
loleaflet/images/tabstop-decimal.svg | 76 +++++++++
loleaflet/images/tabstop-left.svg | 68 ++++++++
loleaflet/images/tabstop-right.svg | 68 ++++++++
loleaflet/src/control/Ruler.js | 263 ++++++++++++++++++++++------------
loleaflet/src/layer/tile/TileLayer.js | 9 +
7 files changed, 494 insertions(+), 105 deletions(-)
New commits:
commit 63b423b004d11b268f220edf8ac94e9f23d5cec4
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Tue Apr 14 08:02:22 2020 +0200
Commit: Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Tue Apr 14 20:36:11 2020 +0200
change tabstop handling on the ruler, add markers, use Hammer.js
This changes handling of tabstops on the ruler:
* Tabstops are now updated from the 'tabstoplistupdate'.
* For touch handling we now use Hammer.js so it is easier to handle
with.
* Markers for different types are added as SVG's.
* Rework handling and calculating positions to be much simpler and
logical (no additions of positions, which can cause rounding
errors).
* Use .uno:ChangeTabStop to send tabstop changes.
Change-Id: I966dfa2c17652ab74e3fd8912622cf6c951e514d
Reviewed-on: https://gerrit.libreoffice.org/c/online/+/92142
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>
diff --git a/loleaflet/css/leaflet.css b/loleaflet/css/leaflet.css
index 7caea9340..10b892599 100644
--- a/loleaflet/css/leaflet.css
+++ b/loleaflet/css/leaflet.css
@@ -874,23 +874,36 @@ input.clipboard {
line-height: 7px;
}
-/* A triangle pointing up */
-.loleaflet-ruler-tabstop {
- width: 0;
- height: 0;
- vertical-align: bottom;
- display: inline-block;
- /* So that we hardcode this in just one place */
- --loleaflet-ruler-tabstop-border: 8;
- border-top: calc(var(--loleaflet-ruler-tabstop-border) * 1px) solid transparent;
- border-left: calc(var(--loleaflet-ruler-tabstop-border) * 1px) solid transparent;
- /* Offset the left border with left margin to make this really take zero horizontal space until the JS code bumps the marginLeft */
- margin-left: calc(-1 * var(--loleaflet-ruler-tabstop-border) * 1px);
- border-right: calc(var(--loleaflet-ruler-tabstop-border) * 1px) solid transparent;
- /* Ditto for the right border, this is left as is */
- margin-right: calc(-1 * var(--loleaflet-ruler-tabstop-border) * 1px);
- border-bottom: calc(var(--loleaflet-ruler-tabstop-border) * 1px) solid black;
- margin-bottom: calc(-1 * var(--loleaflet-ruler-tabstop-border) * 1px / 2);
+.loleaflet-ruler-tabstop-left {
+ width: 20px;
+ height: 20px;
+ background: url(images/tabstop-left.svg);
+ position: absolute;
+ pointer-events: none;
+}
+
+.loleaflet-ruler-tabstop-right {
+ width: 20px;
+ height: 20px;
+ background: url(images/tabstop-right.svg);
+ position: absolute;
+ pointer-events: none;
+}
+
+.loleaflet-ruler-tabstop-center {
+ width: 20px;
+ height: 20px;
+ background: url(images/tabstop-center.svg);
+ position: absolute;
+ pointer-events: none;
+}
+
+.loleaflet-ruler-tabstop-decimal {
+ width: 20px;
+ height: 20px;
+ background: url(images/tabstop-decimal.svg);
+ position: absolute;
+ pointer-events: none;
}
.loleaflet-ruler-margin {
diff --git a/loleaflet/images/tabstop-center.svg b/loleaflet/images/tabstop-center.svg
new file mode 100644
index 000000000..5f1589dd3
--- /dev/null
+++ b/loleaflet/images/tabstop-center.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0beta2 (unknown)"
+ sodipodi:docname="tabstop-center.svg"
+ viewBox="0 0 20 20"
+ id="svg2"
+ version="1.1"
+ width="20"
+ height="20">
+ <sodipodi:namedview
+ inkscape:current-layer="svg2"
+ inkscape:window-maximized="1"
+ inkscape:window-y="0"
+ inkscape:window-x="0"
+ inkscape:cy="12"
+ inkscape:cx="-0.91636364"
+ inkscape:zoom="11.458333"
+ showgrid="false"
+ id="namedview7"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ inkscape:document-rotation="0"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+ <metadata
+ id="metadata14">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs12" />
+ <rect
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2.27089;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect832"
+ width="0.72911173"
+ height="5.7291126"
+ x="-10.364556"
+ y="-18.864557"
+ transform="scale(-1)" />
+ <rect
+ transform="scale(-1)"
+ y="-18.743774"
+ x="-15.243774"
+ height="0.48754406"
+ width="10.487544"
+ id="rect832-3"
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2.51246;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+</svg>
diff --git a/loleaflet/images/tabstop-decimal.svg b/loleaflet/images/tabstop-decimal.svg
new file mode 100644
index 000000000..5d33d5f32
--- /dev/null
+++ b/loleaflet/images/tabstop-decimal.svg
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0beta2 (unknown)"
+ sodipodi:docname="tabstop-decimal.svg"
+ viewBox="0 0 20 20"
+ id="svg2"
+ version="1.1"
+ width="20"
+ height="20">
+ <sodipodi:namedview
+ inkscape:current-layer="svg2"
+ inkscape:window-maximized="1"
+ inkscape:window-y="0"
+ inkscape:window-x="0"
+ inkscape:cy="80.18446"
+ inkscape:cx="248.90804"
+ inkscape:zoom="1.7047764"
+ showgrid="false"
+ id="namedview7"
+ inkscape:window-height="1016"
+ inkscape:window-width="1920"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ inkscape:document-rotation="0"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+ <metadata
+ id="metadata14">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs12" />
+ <rect
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2.27089;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect832"
+ width="0.72911173"
+ height="5.7291126"
+ x="-10.364556"
+ y="-18.864557"
+ transform="scale(-1)" />
+ <rect
+ transform="scale(-1)"
+ y="-18.743774"
+ x="-15.243774"
+ height="0.48754406"
+ width="10.487544"
+ id="rect832-3"
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2.51246;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ transform="scale(-1)"
+ y="-14.210526"
+ x="-15.210529"
+ height="1.4210552"
+ width="1.4210594"
+ id="rect832-36"
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1.57894;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+</svg>
diff --git a/loleaflet/images/tabstop-left.svg b/loleaflet/images/tabstop-left.svg
new file mode 100644
index 000000000..af68e7910
--- /dev/null
+++ b/loleaflet/images/tabstop-left.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="20"
+ width="20"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 20 20"
+ sodipodi:docname="tabstop-left.svg"
+ inkscape:version="1.0beta2 (unknown)">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ inkscape:document-rotation="0"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="14.921205"
+ inkscape:cx="1.9068354"
+ inkscape:cy="10.267514"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" />
+ <metadata
+ id="metadata14">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs12" />
+ <rect
+ transform="scale(-1)"
+ y="-18.864557"
+ x="-11.864556"
+ height="5.7291126"
+ width="0.72911173"
+ id="rect832"
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2.27089;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2.27089;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect832-3"
+ width="5.7291102"
+ height="0.72911251"
+ x="-16.864555"
+ y="-18.864557"
+ transform="scale(-1)" />
+</svg>
diff --git a/loleaflet/images/tabstop-right.svg b/loleaflet/images/tabstop-right.svg
new file mode 100644
index 000000000..aa97e816c
--- /dev/null
+++ b/loleaflet/images/tabstop-right.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ height="20"
+ width="20"
+ version="1.1"
+ id="svg2"
+ viewBox="0 0 20 20"
+ sodipodi:docname="tabstop-right.svg"
+ inkscape:version="1.0beta2 (unknown)">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ inkscape:document-rotation="0"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="1016"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="19.899592"
+ inkscape:cx="6.1936276"
+ inkscape:cy="12.830904"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" />
+ <metadata
+ id="metadata14">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs12" />
+ <rect
+ transform="scale(-1)"
+ y="-18.864557"
+ x="-8.8645563"
+ height="5.7291126"
+ width="0.72911173"
+ id="rect832"
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2.27089;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <rect
+ style="opacity:1;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:2.27089;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ id="rect832-3"
+ width="5.7291102"
+ height="0.72911251"
+ x="-8.8645554"
+ y="-18.864557"
+ transform="scale(-1)" />
+</svg>
diff --git a/loleaflet/src/control/Ruler.js b/loleaflet/src/control/Ruler.js
index 292e4d2b2..73dbcb8ac 100644
--- a/loleaflet/src/control/Ruler.js
+++ b/loleaflet/src/control/Ruler.js
@@ -3,7 +3,7 @@
* Ruler Handler
*/
-/* global $ L _ */
+/* global $ L _ Hammer */
L.Control.Ruler = L.Control.extend({
options: {
interactive: true,
@@ -24,6 +24,7 @@ L.Control.Ruler = L.Control.extend({
onAdd: function(map) {
map.on('rulerupdate', this._updateOptions, this);
+ map.on('tabstoplistupdate', this._updateTabStops, this);
map.on('docsize', this._updatePaintTimer, this);
map.on('scrolloffset resize', this._fixOffset, this);
map.on('updatepermission', this._changeInteractions, this);
@@ -73,12 +74,23 @@ L.Control.Ruler = L.Control.extend({
// Tab stops
this._rTSContainer = L.DomUtil.create('div', 'loleaflet-ruler-tabstopcontainer', this._rMarginWrapper);
- if (window.ThisIsTheiOSApp)
- L.DomEvent.on(this._rTSContainer, 'touchstart', this._initiateTabstopDrag, this);
- else
- L.DomEvent.on(this._rTSContainer, 'mousedown', this._initiateTabstopDrag, this);
-
-
+ L.DomEvent.on(this._rTSContainer, 'mousedown', this._initiateTabstopDrag, this);
+
+ var self = this;
+
+ if (L.Browser.touch) {
+ this._hammer = new Hammer(this._rTSContainer);
+ this._hammer.add(new Hammer.Pan({ threshold: 0, pointers: 0 }));
+ this._hammer.on('panstart', function (event) {
+ self._initiateTabstopDrag(event);
+ });
+ this._hammer.on('panmove', function (event) {
+ self._moveTabstop(event);
+ });
+ this._hammer.on('panend', function (event) {
+ self._endTabstopDrag(event);
+ });
+ }
return this._rWrapper;
},
@@ -96,17 +108,28 @@ L.Control.Ruler = L.Control.extend({
// pageWidth on the other hand *is* really in mm100.
this.options.pageWidth = parseInt(obj['pageWidth']);
- this.options.tabs = [];
- // As are the position values of the elements in the tabs array.
- for (var i in obj['tabs']) {
- this.options.tabs[i] = { position: parseInt(obj['tabs'][i].position), style: parseInt(obj['tabs'][i].style) };
- }
+
// to be enabled only after adding support for other length units as well
// this.options.unit = obj['unit'].trim();
this._updateBreakPoints();
},
+ _updateTabStops: function(obj) {
+ this.options.tabs = [];
+ var jsonTabstops = obj['tabstops'];
+ if (jsonTabstops === '')
+ return;
+ for (var i in jsonTabstops) {
+ var jsonTabstop = jsonTabstops[i];
+ this.options.tabs[i] = {
+ position: parseInt(jsonTabstop.position),
+ style: parseInt(jsonTabstop.type)
+ };
+ }
+ this._updateBreakPoints();
+ },
+
_updateBreakPoints: function() {
if (this.options.margin1 == null || this.options.margin2 == null)
@@ -167,22 +190,41 @@ L.Control.Ruler = L.Control.extend({
// The tabstops. Only draw user-created ones, with style RULER_TAB_LEFT,
// RULER_TAB_RIGHT, RULER_TAB_CENTER, and RULER_TAB_DECIMAL. See <svtools/ruler.hxx>.
- $('.loleaflet-ruler-tabstop').remove();
+ $('.loleaflet-ruler-tabstop-left').remove();
+ $('.loleaflet-ruler-tabstop-right').remove();
+ $('.loleaflet-ruler-tabstop-center').remove();
+ $('.loleaflet-ruler-tabstop-decimal').remove();
var pxPerMm100 = this._map._docLayer._docPixelSize.x / (this._map._docLayer._docWidthTwips * 2540/1440);
- var tabStopWidthAccum = 0;
this._rTSContainer.tabStops = [];
- for (num = 0; num < this.options.tabs.length; num++) {
- if (this.options.tabs[num].style >= 4)
+ for (var tabstopIndex = 0; tabstopIndex < this.options.tabs.length; tabstopIndex++) {
+ var markerClass = null;
+ var currentTabstop = this.options.tabs[tabstopIndex];
+ switch (currentTabstop.style) {
+ case 0:
+ markerClass = 'loleaflet-ruler-tabstop-left';
+ break;
+ case 1:
+ markerClass = 'loleaflet-ruler-tabstop-right';
+ break;
+ case 2:
+ markerClass = 'loleaflet-ruler-tabstop-center';
break;
- marker = L.DomUtil.create('div', 'loleaflet-ruler-tabstop', this._rTSContainer);
- var thisWidth = this.options.tabs[num].position - tabStopWidthAccum;
- var tabstopBorder = getComputedStyle(marker, null).getPropertyValue('--loleaflet-ruler-tabstop-border');
- marker.style.marginLeft = (pxPerMm100 * thisWidth - tabstopBorder) + 'px';
- marker.tabStopNumber = num;
- marker.tabStopLocation = { left: pxPerMm100 * tabStopWidthAccum, right: pxPerMm100 * (tabStopWidthAccum + thisWidth) };
- this._rTSContainer.tabStops[num] = marker;
- tabStopWidthAccum += thisWidth;
+ case 3:
+ markerClass = 'loleaflet-ruler-tabstop-decimal';
+ break;
+ }
+ if (markerClass != null) {
+ marker = L.DomUtil.create('div', markerClass, this._rTSContainer);
+ var positionPixel = currentTabstop.position * pxPerMm100;
+ var markerWidth = marker.offsetWidth;
+ var markerHalfWidth = markerWidth / 2.0;
+ marker.tabStopLocation = { left: positionPixel - markerHalfWidth, center: positionPixel, right: positionPixel + markerHalfWidth };
+ marker.style.left = marker.tabStopLocation.left + 'px';
+ marker.tabStopNumber = tabstopIndex;
+ this._rTSContainer.tabStops[tabstopIndex] = marker;
+ marker.style.cursor = 'move';
+ }
}
if (!this.options.marginSet) {
@@ -281,48 +323,6 @@ L.Control.Ruler = L.Control.extend({
}
},
- _initiateTabstopDrag: function(e) {
- // console.log('===> _initiateTabstopDrag');
- if (e.type === 'touchstart') {
- if (e.touches.length !== 1)
- return;
- }
-
- // Are there any tab stops?
- // e.currentTarget == this._rTSContainer, so yeah, we could use that, too.
- if (!e.currentTarget || e.currentTarget.tabStops.length === 0)
- return;
-
- // Check if "close enough" to one unambiguous tab stop
- var closestIndex = -1;
- var closestDistance = 1000000;
- var nextClosestDistance;
- for (var i = 0; i < e.currentTarget.tabStops.length; i++) {
- var distance = Math.abs(e.layerX - e.currentTarget.tabStops[i].tabStopLocation.right);
- if (distance < closestDistance) {
- nextClosestDistance = closestDistance;
- closestDistance = distance;
- closestIndex = i;
- }
- }
- if (nextClosestDistance - closestDistance <= 10) {
- // Nope, not clear which one it was closest to
- return;
- }
-
- e.currentTarget.tabStopBeingDragged = closestIndex;
- e.currentTarget.tabStopPrevPos = e.layerX;
-
- if (window.ThisIsTheiOSApp) {
- L.DomEvent.on(e.currentTarget, 'touchmove', this._moveTabstop, this);
- L.DomEvent.on(e.currentTarget, 'touchend', this._endTabstopDrag, this);
- }
- else {
- L.DomEvent.on(e.currentTarget, 'mousemove', this._moveTabstop, this);
- L.DomEvent.on(e.currentTarget, 'mouseup', this._endTabstopDrag, this);
- }
- },
-
_moveMargin: function(e) {
if (e.type === 'touchmove')
e.clientX = e.touches[0].clientX;
@@ -347,20 +347,6 @@ L.Control.Ruler = L.Control.extend({
}
},
- _moveTabstop: function(e) {
- if (!e.currentTarget)
- return;
-
- var pixelDiff = e.layerX - e.currentTarget.tabStopPrevPos;
- var diff = this._map._docLayer._pixelsToTwips({x: pixelDiff, y:0}).x;
- if (diff === 0)
- return;
-
- // console.log('===> _moveTabstop ' + e.currentTarget.tabStopBeingDragged + ' pixels:' + pixelDiff + ', twips:' + diff);
- this._map.sendUnoCommand('.uno:MoveTabstop?Tabstop=' + e.currentTarget.tabStopBeingDragged + '&Amount=' + diff);
- e.currentTarget.tabStopPrevPos = e.layerX;
- },
-
_endDrag: function(e) {
this._map.rulerActive = false;
@@ -400,19 +386,120 @@ L.Control.Ruler = L.Control.extend({
this._map._socket.sendMessage('uno .uno:RulerChangeState ' + JSON.stringify(unoObj));
},
- _endTabstopDrag: function(e) {
- if (!e.currentTarget)
+ _initiateTabstopDrag: function(event) {
+ // console.log('===> _initiateTabstopDrag ' + event.type);
+
+ var tabstopContainer = null;
+ var pointX = null;
+
+ if (event.type === 'panstart') {
+ tabstopContainer = event.target;
+ pointX = event.center.x - event.target.getBoundingClientRect().left;
+ }
+ else {
+ tabstopContainer = event.currentTarget;
+ pointX = event.layerX;
+ }
+
+ // check if we hit any tabstop
+ var tabstop = null;
+ var margin = 10;
+ var tabstopDiffFromCenter = 100000000; // just a big initial condition
+
+ for (var i = 0; i < tabstopContainer.tabStops.length; i++) {
+ var current = tabstopContainer.tabStops[i];
+ var location = current.tabStopLocation;
+ if (pointX >= location.left - margin && pointX <= location.right + margin) {
+ var diff = Math.abs(pointX - location.center);
+ if (diff < tabstopDiffFromCenter) {
+ tabstop = current;
+ tabstopDiffFromCenter = diff;
+ }
+ }
+ }
+
+ if (tabstop == null) {
+ var positionTwip = this._map._docLayer._pixelsToTwips({x: pointX, y:0}).x;
+ var params = {
+ Index: {
+ type : 'int32',
+ value : -1
+ },
+ Position: {
+ type : 'int32',
+ value : positionTwip
+ }
+ };
+ this._map.sendUnoCommand('.uno:ChangeTabStop', params);
return;
+ }
- // console.log('===> _endTabstopDrag ' + e.type);
- if (window.ThisIsTheiOSApp) {
- L.DomEvent.off(e.currentTarget, 'touchmove', this._moveTabstop, this);
- L.DomEvent.off(e.currentTarget, 'touchend', this._endTabstopDrag, this);
+ tabstopContainer.tabStopMarkerBeingDragged = tabstop;
+ tabstopContainer.tabStopInitialPosiiton = pointX;
+
+ if (event.pointerType !== 'touch') {
+ L.DomEvent.on(this._rTSContainer, 'mousemove', this._moveTabstop, this);
+ L.DomEvent.on(this._rTSContainer, 'mouseup', this._endTabstopDrag, this);
+ L.DomEvent.on(this._rTSContainer, 'mouseout', this._endTabstopDrag, this);
+ }
+ },
+
+ _moveTabstop: function(event) {
+ var tabstopContainer = null;
+ var pointX = null;
+
+ if (event.type === 'panmove') {
+ tabstopContainer = event.target;
+ pointX = event.center.x - event.target.getBoundingClientRect().left;
+ }
+ else {
+ tabstopContainer = event.currentTarget;
+ pointX = event.layerX;
+ }
+
+ //console.log('===> _moveTabstop ' + event.type);
+
+ var pixelDiff = pointX - tabstopContainer.tabStopInitialPosiiton;
+ var marker = tabstopContainer.tabStopMarkerBeingDragged;
+ marker.style.left = (marker.tabStopLocation.left + pixelDiff) + 'px';
+ },
+
+ _endTabstopDrag: function(event) {
+ //console.log('===> _endTabstopDrag ' + event.type);
+
+ var tabstopContainer = null;
+ var pointX = null;
+ if (event.type === 'panend') {
+ tabstopContainer = event.target;
+ pointX = event.center.x - event.target.getBoundingClientRect().left;
}
else {
- L.DomEvent.off(e.currentTarget, 'mousemove', this._moveTabstop, this);
- L.DomEvent.off(e.currentTarget, 'mouseup', this._endTabstopDrag, this);
+ tabstopContainer = event.currentTarget;
+ pointX = event.layerX;
+ }
+
+ var marker = tabstopContainer.tabStopMarkerBeingDragged;
+
+ if (event.type == 'mouseout') {
+ marker.style.left = (marker.tabStopLocation.left) + 'px';
+ }
+ else {
+ var positionTwip = this._map._docLayer._pixelsToTwips({x: pointX, y: 0}).x;
+ var params = {
+ Index: {
+ type : 'int32',
+ value : marker.tabStopNumber
+ },
+ Position: {
+ type : 'int32',
+ value : positionTwip
+ }
+ };
+ this._map.sendUnoCommand('.uno:ChangeTabStop', params);
}
+ L.DomEvent.off(this._rTSContainer, 'mousemove', this._moveTabstop, this);
+ L.DomEvent.off(this._rTSContainer, 'mouseup', this._endTabstopDrag, this);
+ L.DomEvent.off(this._rTSContainer, 'mouseout', this._endTabstopDrag, this);
},
});
diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 6041f845a..9bd68f421 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -709,6 +709,15 @@ L.TileLayer = L.GridLayer.extend({
else if (textMsg.startsWith('calcfunctionlist:')) {
this._onCalcFunctionListMsg(textMsg.substring('calcfunctionlist:'.length + 1));
}
+ else if (textMsg.startsWith('tabstoplistupdate:')) {
+ this._onTabStopListUpdate(textMsg);
+ }
+ },
+
+ _onTabStopListUpdate: function (textMsg) {
+ textMsg = textMsg.substring('tabstoplistupdate:'.length + 1);
+ var json = JSON.parse(textMsg);
+ this._map.fire('tabstoplistupdate', json);
},
toggleTileDebugModeImpl: function() {
More information about the Libreoffice-commits
mailing list