You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
7.2 KiB
215 lines
7.2 KiB
/* Copyright 2017 Mozilla Foundation |
|
* |
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
* you may not use this file except in compliance with the License. |
|
* You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
*/ |
|
'use strict'; |
|
|
|
Object.defineProperty(exports, "__esModule", { |
|
value: true |
|
}); |
|
exports.PDFThumbnailViewer = undefined; |
|
|
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); |
|
|
|
var _ui_utils = require('./ui_utils'); |
|
|
|
var _pdf_thumbnail_view = require('./pdf_thumbnail_view'); |
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } |
|
|
|
var THUMBNAIL_SCROLL_MARGIN = -19; |
|
|
|
var PDFThumbnailViewer = function () { |
|
function PDFThumbnailViewer(_ref) { |
|
var container = _ref.container, |
|
linkService = _ref.linkService, |
|
renderingQueue = _ref.renderingQueue, |
|
_ref$l10n = _ref.l10n, |
|
l10n = _ref$l10n === undefined ? _ui_utils.NullL10n : _ref$l10n; |
|
|
|
_classCallCheck(this, PDFThumbnailViewer); |
|
|
|
this.container = container; |
|
this.linkService = linkService; |
|
this.renderingQueue = renderingQueue; |
|
this.l10n = l10n; |
|
this.scroll = (0, _ui_utils.watchScroll)(this.container, this._scrollUpdated.bind(this)); |
|
this._resetView(); |
|
} |
|
|
|
_createClass(PDFThumbnailViewer, [{ |
|
key: '_scrollUpdated', |
|
value: function _scrollUpdated() { |
|
this.renderingQueue.renderHighestPriority(); |
|
} |
|
}, { |
|
key: 'getThumbnail', |
|
value: function getThumbnail(index) { |
|
return this._thumbnails[index]; |
|
} |
|
}, { |
|
key: '_getVisibleThumbs', |
|
value: function _getVisibleThumbs() { |
|
return (0, _ui_utils.getVisibleElements)(this.container, this._thumbnails); |
|
} |
|
}, { |
|
key: 'scrollThumbnailIntoView', |
|
value: function scrollThumbnailIntoView(page) { |
|
var selected = document.querySelector('.thumbnail.selected'); |
|
if (selected) { |
|
selected.classList.remove('selected'); |
|
} |
|
var thumbnail = document.querySelector('div.thumbnail[data-page-number="' + page + '"]'); |
|
if (thumbnail) { |
|
thumbnail.classList.add('selected'); |
|
} |
|
var visibleThumbs = this._getVisibleThumbs(); |
|
var numVisibleThumbs = visibleThumbs.views.length; |
|
if (numVisibleThumbs > 0) { |
|
var first = visibleThumbs.first.id; |
|
var last = numVisibleThumbs > 1 ? visibleThumbs.last.id : first; |
|
if (page <= first || page >= last) { |
|
(0, _ui_utils.scrollIntoView)(thumbnail, { top: THUMBNAIL_SCROLL_MARGIN }); |
|
} |
|
} |
|
} |
|
}, { |
|
key: 'cleanup', |
|
value: function cleanup() { |
|
_pdf_thumbnail_view.PDFThumbnailView.cleanup(); |
|
} |
|
}, { |
|
key: '_resetView', |
|
value: function _resetView() { |
|
this._thumbnails = []; |
|
this._pageLabels = null; |
|
this._pagesRotation = 0; |
|
this._pagesRequests = []; |
|
this.container.textContent = ''; |
|
} |
|
}, { |
|
key: 'setDocument', |
|
value: function setDocument(pdfDocument) { |
|
var _this = this; |
|
|
|
if (this.pdfDocument) { |
|
this._cancelRendering(); |
|
this._resetView(); |
|
} |
|
this.pdfDocument = pdfDocument; |
|
if (!pdfDocument) { |
|
return Promise.resolve(); |
|
} |
|
return pdfDocument.getPage(1).then(function (firstPage) { |
|
var pagesCount = pdfDocument.numPages; |
|
var viewport = firstPage.getViewport(1.0); |
|
for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) { |
|
var thumbnail = new _pdf_thumbnail_view.PDFThumbnailView({ |
|
container: _this.container, |
|
id: pageNum, |
|
defaultViewport: viewport.clone(), |
|
linkService: _this.linkService, |
|
renderingQueue: _this.renderingQueue, |
|
disableCanvasToImageConversion: false, |
|
l10n: _this.l10n |
|
}); |
|
_this._thumbnails.push(thumbnail); |
|
} |
|
}); |
|
} |
|
}, { |
|
key: '_cancelRendering', |
|
value: function _cancelRendering() { |
|
for (var i = 0, ii = this._thumbnails.length; i < ii; i++) { |
|
if (this._thumbnails[i]) { |
|
this._thumbnails[i].cancelRendering(); |
|
} |
|
} |
|
} |
|
}, { |
|
key: 'setPageLabels', |
|
value: function setPageLabels(labels) { |
|
if (!this.pdfDocument) { |
|
return; |
|
} |
|
if (!labels) { |
|
this._pageLabels = null; |
|
} else if (!(labels instanceof Array && this.pdfDocument.numPages === labels.length)) { |
|
this._pageLabels = null; |
|
console.error('PDFThumbnailViewer_setPageLabels: Invalid page labels.'); |
|
} else { |
|
this._pageLabels = labels; |
|
} |
|
for (var i = 0, ii = this._thumbnails.length; i < ii; i++) { |
|
var label = this._pageLabels && this._pageLabels[i]; |
|
this._thumbnails[i].setPageLabel(label); |
|
} |
|
} |
|
}, { |
|
key: '_ensurePdfPageLoaded', |
|
value: function _ensurePdfPageLoaded(thumbView) { |
|
var _this2 = this; |
|
|
|
if (thumbView.pdfPage) { |
|
return Promise.resolve(thumbView.pdfPage); |
|
} |
|
var pageNumber = thumbView.id; |
|
if (this._pagesRequests[pageNumber]) { |
|
return this._pagesRequests[pageNumber]; |
|
} |
|
var promise = this.pdfDocument.getPage(pageNumber).then(function (pdfPage) { |
|
thumbView.setPdfPage(pdfPage); |
|
_this2._pagesRequests[pageNumber] = null; |
|
return pdfPage; |
|
}); |
|
this._pagesRequests[pageNumber] = promise; |
|
return promise; |
|
} |
|
}, { |
|
key: 'forceRendering', |
|
value: function forceRendering() { |
|
var _this3 = this; |
|
|
|
var visibleThumbs = this._getVisibleThumbs(); |
|
var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs, this._thumbnails, this.scroll.down); |
|
if (thumbView) { |
|
this._ensurePdfPageLoaded(thumbView).then(function () { |
|
_this3.renderingQueue.renderView(thumbView); |
|
}); |
|
return true; |
|
} |
|
return false; |
|
} |
|
}, { |
|
key: 'pagesRotation', |
|
get: function get() { |
|
return this._pagesRotation; |
|
}, |
|
set: function set(rotation) { |
|
if (!(typeof rotation === 'number' && rotation % 90 === 0)) { |
|
throw new Error('Invalid thumbnails rotation angle.'); |
|
} |
|
if (!this.pdfDocument) { |
|
return; |
|
} |
|
this._pagesRotation = rotation; |
|
for (var i = 0, ii = this._thumbnails.length; i < ii; i++) { |
|
this._thumbnails[i].update(rotation); |
|
} |
|
} |
|
}]); |
|
|
|
return PDFThumbnailViewer; |
|
}(); |
|
|
|
exports.PDFThumbnailViewer = PDFThumbnailViewer; |