loleaflet/src/control/Parts.js | 1 loleaflet/src/control/Search.js | 23 ++++++++++++ loleaflet/src/layer/tile/TileLayer.js | 65 +++++++++++++++++++++++++++++++++- 3 files changed, 88 insertions(+), 1 deletion(-)
New commits: commit 16ecef517679a903bbedcd42ff935d4e693fa2cf Author: Ozcan Esen <[email protected]> Date: Thu Jan 14 22:11:12 2016 +0200 loleaflet: new searchAll for presentation does not affect regular searches since it caches results only if (this._docType === 'presentation' && count > 1) and clears cache on mousedown Change-Id: I5569424df6e463da0c63166eef36842fa7d32f0e diff --git a/loleaflet/src/control/Parts.js b/loleaflet/src/control/Parts.js index 0183196..8d41779 100644 --- a/loleaflet/src/control/Parts.js +++ b/loleaflet/src/control/Parts.js @@ -41,6 +41,7 @@ L.Map.include({ if (docLayer._docType === 'spreadsheet') { this._socket.sendMessage('commandvalues command=.uno:ViewRowColumnHeaders'); } + docLayer._drawSearchResuls(); }, getPreview: function (id, index, maxWidth, maxHeight, options) { diff --git a/loleaflet/src/control/Search.js b/loleaflet/src/control/Search.js index bf14a13..136f97b 100644 --- a/loleaflet/src/control/Search.js +++ b/loleaflet/src/control/Search.js @@ -7,6 +7,28 @@ L.Map.include({ all = 0; } + // check if there is a cached searchAll result for this phrase + // if there is update index for next/prev iteration + if (this._docLayer._searchResults && text === this._docLayer._searchTerm) { + if (backward) { + if (this._docLayer._searchIndex > 0) { + this._docLayer._searchIndex--; + } + else { + this._docLayer._searchIndex = this._docLayer._searchResults.length - 1; + } + } else { + if (this._docLayer._searchIndex < this._docLayer._searchResults.length - 1) { + this._docLayer._searchIndex++; + } + else { + this._docLayer._searchIndex = 0; + } + } + this.setPart(this._docLayer._searchResults[this._docLayer._searchIndex].part); + return; + } + var searchCmd = { 'SearchItem.SearchString': { 'type': 'string' @@ -43,6 +65,7 @@ L.Map.include({ }, resetSelection: function () { + this._docLayer._clearSearchResults(); this._socket.sendMessage('resetselection'); } }); diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js index 0f0d2eb..9f6a673 100644 --- a/loleaflet/src/layer/tile/TileLayer.js +++ b/loleaflet/src/layer/tile/TileLayer.js @@ -111,6 +111,9 @@ L.TileLayer = L.GridLayer.extend({ this._selections = new L.LayerGroup(); map.addLayer(this._selections); + this._searchResultsLayer = new L.LayerGroup(); + map.addLayer(this._searchResultsLayer); + this._levels = {}; this._tiles = {}; this._tileCache = {}; @@ -472,11 +475,13 @@ L.TileLayer = L.GridLayer.extend({ }, _onSearchNotFoundMsg: function (textMsg) { + this._clearSearchResults(); var originalPhrase = textMsg.substring(16); this._map.fire('search', {originalPhrase: originalPhrase, count: 0}); }, _onSearchResultSelection: function (textMsg) { + this._clearSearchResults(); textMsg = textMsg.substring(23); var obj = JSON.parse(textMsg); var originalPhrase = obj.searchString; @@ -485,12 +490,66 @@ L.TileLayer = L.GridLayer.extend({ for (var i = 0; i < obj.searchResultSelection.length; i++) { results.push({ part: parseInt(obj.searchResultSelection[i].part), - rectangles: this._twipsRectanglesToPixelBounds(obj.searchResultSelection[i].rectangles) + rectangles: this._twipsRectanglesToPixelBounds(obj.searchResultSelection[i].rectangles), + twipsRectangles: obj.searchResultSelection[i].rectangles }); } + // do not cache search results if there is only one result. + // this way regular searches works fine + if (this._docType === 'presentation' && count > 1) + { + this._map._socket.sendMessage('resetselection'); + this._searchResults = results; + this._searchTerm = originalPhrase; + this._searchIndex = 0; + + this._map.setPart(results[0].part); // go to first result. + } this._map.fire('search', {originalPhrase: originalPhrase, count: count, results: results}); }, + _clearSearchResults: function() { + this._searchResults = null; + this._searchTerm = null; + this._searchIndex = null; + this._searchResultsLayer.clearLayers(); + }, + + _drawSearchResuls: function() { + if (!this._searchResults) { + return; + } + this._searchResultsLayer.clearLayers(); + for (var k=0; k < this._searchResults.length; k++) + { + var result = this._searchResults[k]; + if (result.part === this._selectedPart) + { + var _fillColor = (k === this._searchIndex) ? '#43ACE8' : '#CCCCCC'; + var strTwips = result.twipsRectangles.match(/\d+/g); + var rectangles = []; + for (var i = 0; i < strTwips.length; i += 4) { + var topLeftTwips = new L.Point(parseInt(strTwips[i]), parseInt(strTwips[i + 1])); + var offset = new L.Point(parseInt(strTwips[i + 2]), parseInt(strTwips[i + 3])); + var topRightTwips = topLeftTwips.add(new L.Point(offset.x, 0)); + var bottomLeftTwips = topLeftTwips.add(new L.Point(0, offset.y)); + var bottomRightTwips = topLeftTwips.add(offset); + rectangles.push([bottomLeftTwips, bottomRightTwips, topLeftTwips, topRightTwips]); + } + var polygons = L.PolyUtil.rectanglesToPolygons(rectangles, this); + for (var j = 0; j < polygons.length; j++) { + var selection = new L.Polygon(polygons[j], { + pointerEvents: 'none', + fillColor: _fillColor, + fillOpacity: 0.25, + weight: 2, + opacity: 0.25}); + this._searchResultsLayer.addLayer(selection); + } + } + } + }, + _onStateChangedMsg: function (textMsg) { var unoMsg = textMsg.substr(14).split('='); var commandName = '', @@ -685,6 +744,10 @@ L.TileLayer = L.GridLayer.extend({ this._map._socket.sendMessage('mouse type=' + type + ' x=' + x + ' y=' + y + ' count=' + count + ' buttons=' + buttons + ' modifier=' + modifier); + + if (type === 'buttondown') { + this._clearSearchResults(); + } }, _postKeyboardEvent: function(type, charcode, keycode) { _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
