|
|
@ -629,6 +629,8 @@ var PDFView = { |
|
|
|
isFullscreen: false, |
|
|
|
isFullscreen: false, |
|
|
|
previousScale: null, |
|
|
|
previousScale: null, |
|
|
|
pageRotation: 0, |
|
|
|
pageRotation: 0, |
|
|
|
|
|
|
|
mouseScrollTimeStamp: 0, |
|
|
|
|
|
|
|
mouseScrollDelta: 0, |
|
|
|
lastScroll: 0, |
|
|
|
lastScroll: 0, |
|
|
|
|
|
|
|
|
|
|
|
// called once when the document is loaded
|
|
|
|
// called once when the document is loaded
|
|
|
@ -1507,6 +1509,7 @@ var PDFView = { |
|
|
|
this.isFullscreen = false; |
|
|
|
this.isFullscreen = false; |
|
|
|
this.parseScale(this.previousScale); |
|
|
|
this.parseScale(this.previousScale); |
|
|
|
this.page = this.page; |
|
|
|
this.page = this.page; |
|
|
|
|
|
|
|
this.clearMouseScrollState(); |
|
|
|
}, |
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
rotatePages: function pdfViewPageRotation(delta) { |
|
|
|
rotatePages: function pdfViewPageRotation(delta) { |
|
|
@ -1533,6 +1536,71 @@ var PDFView = { |
|
|
|
setTimeout(function() { |
|
|
|
setTimeout(function() { |
|
|
|
currentPage.scrollIntoView(); |
|
|
|
currentPage.scrollIntoView(); |
|
|
|
}, 0); |
|
|
|
}, 0); |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* This function flips the page in presentation mode if the user scrolls up |
|
|
|
|
|
|
|
* or down with large enough motion and prevents page flipping too often. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @this {PDFView} |
|
|
|
|
|
|
|
* @param {number} mouseScrollDelta The delta value from the mouse event. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
mouseScroll: function pdfViewMouseScroll(mouseScrollDelta) { |
|
|
|
|
|
|
|
var MOUSE_SCROLL_COOLDOWN_TIME = 50; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var currentTime = (new Date()).getTime(); |
|
|
|
|
|
|
|
var storedTime = this.mouseScrollTimeStamp; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// In case one page has already been flipped there is a cooldown time
|
|
|
|
|
|
|
|
// which has to expire before next page can be scrolled on to.
|
|
|
|
|
|
|
|
if (currentTime > storedTime && |
|
|
|
|
|
|
|
currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// In case the user decides to scroll to the opposite direction than before
|
|
|
|
|
|
|
|
// clear the accumulated delta.
|
|
|
|
|
|
|
|
if ((this.mouseScrollDelta > 0 && mouseScrollDelta < 0) || |
|
|
|
|
|
|
|
(this.mouseScrollDelta < 0 && mouseScrollDelta > 0)) |
|
|
|
|
|
|
|
this.clearMouseScrollState(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.mouseScrollDelta += mouseScrollDelta; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var PAGE_FLIP_THRESHOLD = 120; |
|
|
|
|
|
|
|
if (Math.abs(this.mouseScrollDelta) >= PAGE_FLIP_THRESHOLD) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
var PageFlipDirection = { |
|
|
|
|
|
|
|
UP: -1, |
|
|
|
|
|
|
|
DOWN: 1 |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// In fullscreen mode scroll one page at a time.
|
|
|
|
|
|
|
|
var pageFlipDirection = (this.mouseScrollDelta > 0) ? |
|
|
|
|
|
|
|
PageFlipDirection.UP : |
|
|
|
|
|
|
|
PageFlipDirection.DOWN; |
|
|
|
|
|
|
|
this.clearMouseScrollState(); |
|
|
|
|
|
|
|
var currentPage = this.page; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// In case we are already on the first or the last page there is no need
|
|
|
|
|
|
|
|
// to do anything.
|
|
|
|
|
|
|
|
if ((currentPage == 1 && pageFlipDirection == PageFlipDirection.UP) || |
|
|
|
|
|
|
|
(currentPage == this.pages.length && |
|
|
|
|
|
|
|
pageFlipDirection == PageFlipDirection.DOWN)) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.page += pageFlipDirection; |
|
|
|
|
|
|
|
this.mouseScrollTimeStamp = currentTime; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* This function clears the member attributes used with mouse scrolling in |
|
|
|
|
|
|
|
* presentation mode. |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @this {PDFView} |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
clearMouseScrollState: function pdfViewClearMouseScrollState() { |
|
|
|
|
|
|
|
this.mouseScrollTimeStamp = 0; |
|
|
|
|
|
|
|
this.mouseScrollDelta = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
@ -2828,6 +2896,9 @@ window.addEventListener('DOMMouseScroll', function(evt) { |
|
|
|
var direction = (ticks > 0) ? 'zoomOut' : 'zoomIn'; |
|
|
|
var direction = (ticks > 0) ? 'zoomOut' : 'zoomIn'; |
|
|
|
for (var i = 0, length = Math.abs(ticks); i < length; i++) |
|
|
|
for (var i = 0, length = Math.abs(ticks); i < length; i++) |
|
|
|
PDFView[direction](); |
|
|
|
PDFView[direction](); |
|
|
|
|
|
|
|
} else if (PDFView.isFullscreen) { |
|
|
|
|
|
|
|
var FIREFOX_DELTA_FACTOR = -40; |
|
|
|
|
|
|
|
PDFView.mouseScroll(evt.detail * FIREFOX_DELTA_FACTOR); |
|
|
|
} |
|
|
|
} |
|
|
|
}, false); |
|
|
|
}, false); |
|
|
|
|
|
|
|
|
|
|
@ -2936,6 +3007,7 @@ window.addEventListener('keydown', function keydown(evt) { |
|
|
|
|
|
|
|
|
|
|
|
if (handled) { |
|
|
|
if (handled) { |
|
|
|
evt.preventDefault(); |
|
|
|
evt.preventDefault(); |
|
|
|
|
|
|
|
PDFView.clearMouseScrollState(); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|