loleaflet/css/leaflet.css | 33 ++++ loleaflet/images/indentation_marker_down.svg | 3 loleaflet/images/indentation_marker_up.svg | 3 loleaflet/src/control/Ruler.js | 217 ++++++++++++++++++++++++++- 4 files changed, 255 insertions(+), 1 deletion(-)
New commits: commit 221d666822d8f010e629761456ff30ad8bb8fe24 Author: gokaysatir <gokaysa...@gmail.com> AuthorDate: Fri May 1 13:18:23 2020 +0300 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Tue May 12 13:28:08 2020 +0200 tdf#111535 Add First-line indent, paragraph indent, and tab spaces/Online part. Change-Id: I7b0b6e205aa9af40b8331044b99c44df0bd4cced Reviewed-on: https://gerrit.libreoffice.org/c/online/+/93250 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/loleaflet/css/leaflet.css b/loleaflet/css/leaflet.css index f8f5eb95c..ec6a3d3de 100644 --- a/loleaflet/css/leaflet.css +++ b/loleaflet/css/leaflet.css @@ -842,6 +842,39 @@ input.clipboard { position: absolute; } +.loleaflet-ruler-indentation-marker-down { + width: 17px; + height: 11px; + background: url(images/indentation_marker_down.svg); + position: absolute; + left: 0; + top: 0; + z-index: 12; + background-repeat: no-repeat; +} + +.loleaflet-ruler-indentation-marker-up { + width: 17px; + height: 11px; + background: url(images/indentation_marker_up.svg); + position: absolute; + left: 0; + bottom: 0; + z-index: 12; + background-repeat: no-repeat; +} + +.loleaflet-ruler-indentation-marker-center{ + position: fixed; + display: none; + height: 100vh; + top: 0; + bottom: 0; + left: 0; + border-right: 2px dotted grey; + z-index: 12; +} + .loleaflet-ruler-marginwrapper { height: 100%; position: absolute; diff --git a/loleaflet/images/indentation_marker_down.svg b/loleaflet/images/indentation_marker_down.svg new file mode 100644 index 000000000..41e73bbeb --- /dev/null +++ b/loleaflet/images/indentation_marker_down.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 140 110" > + <polygon points="10,10 130,10 130,50 70,100 10,50" /> +</svg> \ No newline at end of file diff --git a/loleaflet/images/indentation_marker_up.svg b/loleaflet/images/indentation_marker_up.svg new file mode 100644 index 000000000..88f90c049 --- /dev/null +++ b/loleaflet/images/indentation_marker_up.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 140 110" > + <polygon points="10,100 130,100 130,60 70,10 10,60" /> +</svg> \ No newline at end of file diff --git a/loleaflet/src/control/Ruler.js b/loleaflet/src/control/Ruler.js index 3c849aaad..98b65370e 100644 --- a/loleaflet/src/control/Ruler.js +++ b/loleaflet/src/control/Ruler.js @@ -64,6 +64,89 @@ L.Control.Ruler = L.Control.extend({ } }, + _initiateIndentationMarkers: function() { + // First line indentation.. + this._firstLineMarker = document.createElement('div'); + this._firstLineMarker.id = 'lo-fline-marker'; + this._firstLineMarker.classList.add('loleaflet-ruler-indentation-marker-down'); + this._rFace.appendChild(this._firstLineMarker); + + // Paragraph indentation.. + this._pStartMarker = document.createElement('div'); + this._pStartMarker.id = 'lo-pstart-marker'; + this._pStartMarker.classList.add('loleaflet-ruler-indentation-marker-up'); + this._rFace.appendChild(this._pStartMarker); + + // Paragraph end.. + this._pEndMarker = document.createElement('div'); + this._pEndMarker.id = 'lo-pend-marker'; + this._pEndMarker.classList.add('loleaflet-ruler-indentation-marker-up'); + this._rFace.appendChild(this._pEndMarker); + + // While one of the markers is being dragged, a vertical line should be visible in order to indicate the new position of the marker.. + this._markerVerticalLine = L.DomUtil.create('div', 'loleaflet-ruler-indentation-marker-center'); + this._rFace.appendChild(this._markerVerticalLine); + + var self = this; + + // Now we have indentation markers. Next we should bind drag initializers to them.. + // We will use 3 hammers. 1 hammer is not usable for this case. + if (L.Browser.touch) { + // Hammer for first line indentation.. + this._firstLineHammer = new Hammer(this._firstLineMarker); + this._firstLineHammer.add(new Hammer.Pan({ threshold: 0, pointers: 0 })); + this._firstLineHammer.get('press').set({ + time: 500 + }); + this._firstLineHammer.on('panstart', function (event) { + self._initiateIndentationDrag(event); + }); + this._firstLineHammer.on('panmove', function (event) { + self._moveIndentation(event); + }); + this._firstLineHammer.on('panend', function (event) { + self._moveIndentationEnd(event); + }); + + // Hammer for paragraph start indentation.. + this._pStartHammer = new Hammer(this._pStartMarker); + this._pStartHammer.add(new Hammer.Pan({ threshold: 0, pointers: 0 })); + this._pStartHammer.get('press').set({ + time: 500 + }); + this._pStartHammer.on('panstart', function (event) { + self._initiateIndentationDrag(event); + }); + this._pStartHammer.on('panmove', function (event) { + self._moveIndentation(event); + }); + this._pStartHammer.on('panend', function (event) { + self._moveIndentationEnd(event); + }); + + // Hammer for paragraph end indentation.. + this._pEndHammer = new Hammer(this._pEndMarker); + this._pEndHammer.add(new Hammer.Pan({ threshold: 0, pointers: 0 })); + this._pEndHammer.get('press').set({ + time: 500 + }); + this._pEndHammer.on('panstart', function (event) { + self._initiateIndentationDrag(event); + }); + this._pEndHammer.on('panmove', function (event) { + self._moveIndentation(event); + }); + this._pEndHammer.on('panend', function (event) { + self._moveIndentationEnd(event); + }); + } + else { + L.DomEvent.on(this._firstLineMarker, 'mousedown', this._initiateIndentationDrag, this); + L.DomEvent.on(this._pStartMarker, 'mousedown', this._initiateIndentationDrag, this); + L.DomEvent.on(this._pEndMarker, 'mousedown', this._initiateIndentationDrag, this); + } + }, + _initLayout: function() { this._rWrapper = L.DomUtil.create('div', 'loleaflet-ruler leaflet-bar leaflet-control leaflet-control-custom'); this._rFace = L.DomUtil.create('div', 'loleaflet-ruler-face', this._rWrapper); @@ -97,12 +180,15 @@ L.Control.Ruler = L.Control.extend({ self._onTabstopContainerLongPress(event); }); } + + this._initiateIndentationMarkers(); + return this._rWrapper; }, _updateOptions: function(obj) { // console.log('===> _updateOptions'); - // Note that the values for margin1, margin2, and leftOffset are not in any sane + // Note that the values for margin1, margin2 and leftOffset are not in any sane // units. See the comment in SwCommentRuler::CreateJsonNotification(). The values // are pixels for some virtual device in core, not related to the actual device this // is running on at all, passed through convertTwipToMm100(), i.e. multiplied by @@ -121,6 +207,42 @@ L.Control.Ruler = L.Control.extend({ this._updateBreakPoints(); }, + _updateParagraphIndentations: function() { + var items = this._map['stateChangeHandler']; + var state = items.getItemValue('.uno:LeftRightParaMargin'); + + this.options.firstLineIndent = parseFloat(state.firstline.replace(',', '.')); + this.options.leftParagraphIndent = parseFloat(state.left.replace(',', '.')); + this.options.rightParagraphIndent = parseFloat(state.right.replace(',', '.')); + this.options.indentUnit = state.unit; + + var pxPerMm100 = this._map._docLayer._docPixelSize.x / (this._map._docLayer._docWidthTwips * 2540/1440); + + // Conversion to mm100. + if (this.options.indentUnit === 'inch') { + this.options.firstLineIndent = (this.options.firstLineIndent) * 2540; + this.options.leftParagraphIndent = (this.options.leftParagraphIndent) * 2540; + this.options.rightParagraphIndent = (this.options.rightParagraphIndent) * 2540; + } + + this.options.firstLineIndent *= pxPerMm100; + this.options.leftParagraphIndent *= pxPerMm100; + this.options.rightParagraphIndent *= pxPerMm100; + + // rTSContainer is the reference element. + var pStartPosition = this._rTSContainer.getBoundingClientRect().left + this.options.leftParagraphIndent; + var fLinePosition = pStartPosition + this.options.firstLineIndent; + var pEndPosition = this._rTSContainer.getBoundingClientRect().right - this.options.rightParagraphIndent; + + // We calculated the positions. Now we should move them to left in order to make their sharp edge point to the right direction.. + var halfWidth = (this._firstLineMarker.getBoundingClientRect().right - this._firstLineMarker.getBoundingClientRect().left) * 0.5; + this._firstLineMarker.style.left = (fLinePosition - halfWidth) + 'px'; + this._pStartMarker.style.left = (pStartPosition - halfWidth) + 'px'; + this._pEndMarker.style.left = (pEndPosition - halfWidth) + 'px'; + + this._markerVerticalLine.style.top = this._rTSContainer.getBoundingClientRect().bottom + 'px'; + }, + _updateTabStops: function(obj) { this.options.tabs = []; var jsonTabstops = obj['tabstops']; @@ -141,6 +263,8 @@ L.Control.Ruler = L.Control.extend({ if (this.options.margin1 == null || this.options.margin2 == null) return; + this._updateParagraphIndentations(); + if (this._map._docLayer._annotations._items.length === 0 || this._map._docLayer._annotations._items.length === this._map._docLayer._annotations._hiddenItems @@ -293,6 +417,97 @@ L.Control.Ruler = L.Control.extend({ var rulerOffset = mapPaneXTranslate + firstTileXTranslate + tileContainerXTranslate + (this.options.tileMargin * scale); this._rFace.style.marginLeft = rulerOffset + 'px'; + + this.rulerOffset = rulerOffset; // Needed on different parts too.. + }, + + _moveIndentation: function(e) { + if (e.type === 'panmove') { + e.clientX = e.center.x; + } + + var element = document.getElementById(this._indentationElementId); + + // User is moving the cursor / their finger on the screen and we are moving the marker. + var newLeft = parseInt(element.style.left.replace('px', '')) + e.clientX - this._lastposition; + element.style.left = String(newLeft) + 'px'; + this._lastposition = e.clientX; + // halfWidth.. + var halfWidth = (element.getBoundingClientRect().right - element.getBoundingClientRect().left) * 0.5; + this._markerVerticalLine.style.left = String(newLeft + halfWidth) + 'px'; + }, + + _moveIndentationEnd: function(e) { + this._map.rulerActive = false; + + if (e.type !== 'panend') { // The screen may support touch and click at the same time, so we do not use L.Browser.touch while checking the event type in order to support both. + L.DomEvent.off(this._rFace, 'mousemove', this._moveIndentation, this); + L.DomEvent.off(this._map, 'mouseup', this._moveIndentationEnd, this); + } + + var unoObj = {}, indentType = ''; + + // Calculation step.. + // The new coordinate of element subject to indentation is sent as a percentage of the page width.. + // We need to calculate the percentage. Left margin (nullOffset) is not being added to the indentation (on the core part).. + // We can use TabStopContainer's position as the reference point, as they share the same reference point.. + var element = document.getElementById(this._indentationElementId); + + var leftValue; + // The halfWidth of the shape.. + var halfWidth = (element.getBoundingClientRect().right - element.getBoundingClientRect().left) * 0.5; + + // We need the pageWidth in pixels, so we can not use "this.options.pageWidth" here, since that's in mm.. + var pageWidth = parseFloat(this._rFace.style.width.replace('px', '')); + + if (element.id === 'lo-fline-marker') { + indentType = 'FirstLineIndent'; + // FirstLine indentation is always positioned according to the left indent.. + // We don't need to add halfWidth here.. + leftValue = (parseFloat(this._firstLineMarker.style.left.replace('px', '')) - parseFloat(this._pStartMarker.style.left.replace('px', ''))); + } + else if (element.id === 'lo-pstart-marker') { + indentType = 'LeftParaIndent'; + leftValue = element.getBoundingClientRect().left - this._rTSContainer.getBoundingClientRect().left + halfWidth; + } + else if (element.id === 'lo-pend-marker') { + indentType = 'RightParaIndent'; + // Right marker is positioned from right, this is rightValue.. + leftValue = this._rTSContainer.getBoundingClientRect().right - element.getBoundingClientRect().right + halfWidth; + } + + leftValue = leftValue / pageWidth; // Now it's a percentage.. + + if (indentType !== '') { + unoObj[indentType] = {}; + unoObj[indentType]['type'] = 'string'; + unoObj[indentType]['value'] = leftValue; + this._map._socket.sendMessage('uno .uno:ParagraphChangeState ' + JSON.stringify(unoObj)); + } + + this._indentationElementId = ''; + this._markerVerticalLine.style.display = 'none'; + }, + + _initiateIndentationDrag: function(e) { + if (window.ThisIsTheiOSApp && this._map._permission !== 'edit') + return; + + this._map.rulerActive = true; + + this._indentationElementId = e.target.id.trim() === '' ? e.target.parentNode.id: e.target.id; + + if (e.type !== 'panstart') { + L.DomEvent.on(this._rFace, 'mousemove', this._moveIndentation, this); + L.DomEvent.on(this._map, 'mouseup', this._moveIndentationEnd, this); + } + else { + e.clientX = e.center.x; + } + + this._initialposition = this._lastposition = e.clientX; + this._markerVerticalLine.style.display = 'block'; + this._markerVerticalLine.style.left = this._lastposition + 'px'; }, _initiateDrag: function(e) { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits