From bfc66626a06f5896a4bb9222dfd1363b89191f19 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 1 Oct 2013 23:11:46 +0200 Subject: [PATCH] Move Presentation Mode related code from viewer.js to its own file --- web/page_view.js | 10 +- web/pdf_history.js | 4 +- web/presentation_mode.js | 157 ++++++++++++++++++++++++++++++++ web/secondary_toolbar.js | 4 +- web/viewer.html | 1 + web/viewer.js | 192 +++++++-------------------------------- 6 files changed, 198 insertions(+), 170 deletions(-) create mode 100644 web/presentation_mode.js diff --git a/web/page_view.js b/web/page_view.js index b39b870f3..4540f4275 100644 --- a/web/page_view.js +++ b/web/page_view.js @@ -15,9 +15,9 @@ * limitations under the License. */ /* globals RenderingStates, PDFView, PDFHistory, PDFFindBar, PDFJS, mozL10n, - CustomStyle, scrollIntoView, SCROLLBAR_PADDING, CSS_UNITS, - UNKNOWN_SCALE, DEFAULT_SCALE, getOutputScale, TextLayerBuilder, - cache, Stats */ + CustomStyle, PresentationMode, scrollIntoView, SCROLLBAR_PADDING, + CSS_UNITS, UNKNOWN_SCALE, DEFAULT_SCALE, getOutputScale, + TextLayerBuilder, cache, Stats */ 'use strict'; @@ -238,7 +238,7 @@ var PageView = function pageView(container, id, scale, }; this.scrollIntoView = function pageViewScrollIntoView(dest) { - if (PDFView.isPresentationMode) { // Avoid breaking presentation mode. + if (PresentationMode.active) { // Avoid breaking presentation mode. dest = null; } if (!dest) { @@ -379,7 +379,7 @@ var PageView = function pageView(container, id, scale, pageIndex: this.id - 1, lastScrollSource: PDFView, viewport: this.viewport, - isViewerInPresentationMode: PDFView.isPresentationMode + isViewerInPresentationMode: PresentationMode.active }) : null; // TODO(mack): use data attributes to store these ctx._scaleX = outputScale.sx; diff --git a/web/pdf_history.js b/web/pdf_history.js index 47c73a309..c9c84ecc1 100644 --- a/web/pdf_history.js +++ b/web/pdf_history.js @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals PDFJS, PDFView */ +/* globals PDFJS, PDFView, PresentationMode */ 'use strict'; @@ -264,7 +264,7 @@ var PDFHistory = { return null; } var params = { hash: this.currentBookmark, page: this.currentPage }; - if (PDFView.isPresentationMode) { + if (PresentationMode.active) { params.hash = null; } return params; diff --git a/web/presentation_mode.js b/web/presentation_mode.js new file mode 100644 index 000000000..7621d546c --- /dev/null +++ b/web/presentation_mode.js @@ -0,0 +1,157 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ +/* Copyright 2012 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. + */ +/* globals PDFView, scrollIntoView */ + +'use strict'; + +var PresentationMode = { + active: false, + args: null, + + request: function presentationModeRequest() { + if (!PDFView.supportsFullscreen) { + return false; + } + var isPresentationMode = document.fullscreenElement || + document.mozFullScreen || + document.webkitIsFullScreen || + document.msFullscreenElement; + + if (isPresentationMode) { + return false; + } + + var wrapper = document.getElementById('viewerContainer'); + if (document.documentElement.requestFullscreen) { + wrapper.requestFullscreen(); + } else if (document.documentElement.mozRequestFullScreen) { + wrapper.mozRequestFullScreen(); + } else if (document.documentElement.webkitRequestFullScreen) { + wrapper.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT); + } else if (document.documentElement.msRequestFullscreen) { + wrapper.msRequestFullscreen(); + } else { + return false; + } + + this.args = { + page: PDFView.page, + previousScale: PDFView.currentScaleValue + }; + + return true; + }, + + enter: function presentationModeEnter() { + this.active = true; + + PDFView.page = this.args.page; + PDFView.parseScale('page-fit', true); + + this.showControls(); + + var viewer = document.getElementById('viewer'); + viewer.setAttribute('contextmenu', 'viewerContextMenu'); + }, + + exit: function presentationModeExit() { + this.active = false; + + var page = PDFView.page; + PDFView.parseScale(this.args.previousScale); + PDFView.page = page; + + this.hideControls(); + this.args = null; + PDFView.clearMouseScrollState(); + + var viewer = document.getElementById('viewer'); + viewer.removeAttribute('contextmenu'); + + // Ensure that the thumbnail of the current page is visible + // when exiting presentation mode. + scrollIntoView(document.getElementById('thumbnailContainer' + page)); + }, + + showControls: function presentationModeShowControls() { + var DELAY_BEFORE_HIDING_CONTROLS = 3000; + var wrapper = document.getElementById('viewerContainer'); + if (this.controlsTimeout) { + clearTimeout(this.controlsTimeout); + } else { + wrapper.classList.add('presentationControls'); + } + this.controlsTimeout = setTimeout(function hideControlsTimeout() { + wrapper.classList.remove('presentationControls'); + delete this.controlsTimeout; + }.bind(this), DELAY_BEFORE_HIDING_CONTROLS); + }, + + hideControls: function presentationModeHideControls() { + if (!this.controlsTimeout) { + return; + } + clearTimeout(this.controlsTimeout); + delete this.controlsTimeout; + + var wrapper = document.getElementById('viewerContainer'); + wrapper.classList.remove('presentationControls'); + } +}; + +window.addEventListener('mousemove', function mousemove(evt) { + if (PresentationMode.active) { + PresentationMode.showControls(); + } +}, false); + +window.addEventListener('mousedown', function mousedown(evt) { + if (PresentationMode.active && evt.button === 0) { + // Enable clicking of links in presentation mode. + // Note: Only links that point to the currently loaded PDF document works. + var targetHref = evt.target.href; + var internalLink = targetHref && (targetHref.replace(/#.*$/, '') === + window.location.href.replace(/#.*$/, '')); + if (!internalLink) { + // Unless an internal link was clicked, advance a page in presentation + // mode. + evt.preventDefault(); + PDFView.page++; + } + } +}, false); + +(function presentationModeClosure() { + function presentationModeChange(e) { + var isPresentationMode = document.fullscreenElement || + document.mozFullScreen || + document.webkitIsFullScreen || + document.msFullscreenElement; + + if (isPresentationMode) { + PresentationMode.enter(); + } else { + PresentationMode.exit(); + } + } + + window.addEventListener('fullscreenchange', presentationModeChange, false); + window.addEventListener('mozfullscreenchange', presentationModeChange, false); + window.addEventListener('webkitfullscreenchange', presentationModeChange, + false); + window.addEventListener('MSFullscreenChange', presentationModeChange, false); +})(); diff --git a/web/secondary_toolbar.js b/web/secondary_toolbar.js index 6c31a4e17..242d2decf 100644 --- a/web/secondary_toolbar.js +++ b/web/secondary_toolbar.js @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/* globals PDFView, SCROLLBAR_PADDING */ +/* globals PDFView, PresentationMode, SCROLLBAR_PADDING */ 'use strict'; @@ -59,7 +59,7 @@ var SecondaryToolbar = { // Event handling functions. presentationModeClick: function secondaryToolbarPresentationModeClick(evt) { - PDFView.presentationMode(); + PresentationMode.request(); this.close(); }, diff --git a/web/viewer.html b/web/viewer.html index 2b578091a..eb9fe60cf 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -68,6 +68,7 @@ limitations under the License. + diff --git a/web/viewer.js b/web/viewer.js index 5d71b069a..fe58e9170 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -18,7 +18,7 @@ PDFFindController, ProgressBar, TextLayerBuilder, DownloadManager, getFileName, getOutputScale, scrollIntoView, getPDFFileNameFromURL, PDFHistory, PageView, ThumbnailView, noContextMenuHandler, - SecondaryToolbar, PasswordPrompt */ + SecondaryToolbar, PasswordPrompt, PresentationMode */ 'use strict'; @@ -168,6 +168,7 @@ var currentPageNumber = 1; //#include pdf_history.js //#include secondary_toolbar.js //#include password_prompt.js +//#include presentation_mode.js var PDFView = { pages: [], @@ -183,8 +184,6 @@ var PDFView = { sidebarOpen: false, pageViewScroll: null, thumbnailViewScroll: null, - isPresentationMode: false, - presentationModeArgs: null, pageRotation: 0, mouseScrollTimeStamp: 0, mouseScrollDelta: 0, @@ -205,6 +204,23 @@ var PDFView = { this.watchScroll(thumbnailContainer, this.thumbnailViewScroll, this.renderHighestPriority.bind(this)); + PDFFindBar.initialize({ + bar: document.getElementById('findbar'), + toggleButton: document.getElementById('viewFind'), + findField: document.getElementById('findInput'), + highlightAllCheckbox: document.getElementById('findHighlightAll'), + caseSensitiveCheckbox: document.getElementById('findMatchCase'), + findMsg: document.getElementById('findMsg'), + findStatusIcon: document.getElementById('findStatusIcon'), + findPreviousButton: document.getElementById('findPrevious'), + findNextButton: document.getElementById('findNext') + }); + + PDFFindController.initialize({ + pdfPageSource: this, + integratedFind: this.supportsIntegratedFind + }); + SecondaryToolbar.initialize({ toolbar: document.getElementById('secondaryToolbar'), toggleButton: document.getElementById('secondaryToolbarToggle'), @@ -226,23 +242,6 @@ var PDFView = { passwordCancel: document.getElementById('passwordCancel') }); - PDFFindBar.initialize({ - bar: document.getElementById('findbar'), - toggleButton: document.getElementById('viewFind'), - findField: document.getElementById('findInput'), - highlightAllCheckbox: document.getElementById('findHighlightAll'), - caseSensitiveCheckbox: document.getElementById('findMatchCase'), - findMsg: document.getElementById('findMsg'), - findStatusIcon: document.getElementById('findStatusIcon'), - findPreviousButton: document.getElementById('findPrevious'), - findNextButton: document.getElementById('findNext') - }); - - PDFFindController.initialize({ - pdfPageSource: this, - integratedFind: this.supportsIntegratedFind - }); - this.initialized = true; container.addEventListener('scroll', function() { self.lastScroll = Date.now(); @@ -1283,7 +1282,7 @@ var PDFView = { getVisiblePages: function pdfViewGetVisiblePages() { return this.getVisibleElements(this.container, this.pages, - !this.isPresentationMode); + !PresentationMode.active); }, getVisibleThumbs: function pdfViewGetVisibleThumbs() { @@ -1389,91 +1388,6 @@ var PDFView = { div.removeChild(div.lastChild); }, - presentationMode: function pdfViewPresentationMode() { - if (!this.supportsFullscreen) { - return false; - } - var isPresentationMode = document.fullscreenElement || - document.mozFullScreen || - document.webkitIsFullScreen || - document.msFullscreenElement; - - if (isPresentationMode) { - return false; - } - - var wrapper = document.getElementById('viewerContainer'); - if (document.documentElement.requestFullscreen) { - wrapper.requestFullscreen(); - } else if (document.documentElement.mozRequestFullScreen) { - wrapper.mozRequestFullScreen(); - } else if (document.documentElement.webkitRequestFullScreen) { - wrapper.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT); - } else if (document.documentElement.msRequestFullscreen) { - wrapper.msRequestFullscreen(); - } else { - return false; - } - - this.presentationModeArgs = { - page: this.page, - previousScale: this.currentScaleValue - }; - - return true; - }, - - enterPresentationMode: function pdfViewEnterPresentationMode() { - this.isPresentationMode = true; - this.page = this.presentationModeArgs.page; - this.parseScale('page-fit', true); - this.showPresentationControls(); - - var viewer = document.getElementById('viewer'); - viewer.setAttribute('contextmenu', 'viewerContextMenu'); - }, - - exitPresentationMode: function pdfViewExitPresentationMode() { - this.isPresentationMode = false; - this.parseScale(this.presentationModeArgs.previousScale); - this.page = this.page; - this.clearMouseScrollState(); - this.hidePresentationControls(); - this.presentationModeArgs = null; - - var viewer = document.getElementById('viewer'); - viewer.removeAttribute('contextmenu'); - - // Ensure that the thumbnail of the current page is visible - // when exiting presentation mode. - scrollIntoView(document.getElementById('thumbnailContainer' + this.page)); - }, - - showPresentationControls: function pdfViewShowPresentationControls() { - var DELAY_BEFORE_HIDING_CONTROLS = 3000; - var wrapper = document.getElementById('viewerContainer'); - if (this.presentationControlsTimeout) { - clearTimeout(this.presentationControlsTimeout); - } else { - wrapper.classList.add('presentationControls'); - } - this.presentationControlsTimeout = setTimeout(function hideControls() { - wrapper.classList.remove('presentationControls'); - delete PDFView.presentationControlsTimeout; - }, DELAY_BEFORE_HIDING_CONTROLS); - }, - - hidePresentationControls: function pdfViewShowPresentationControls() { - if (!this.presentationControlsTimeout) { - return; - } - clearTimeout(this.presentationControlsTimeout); - delete this.presentationControlsTimeout; - - var wrapper = document.getElementById('viewerContainer'); - wrapper.classList.remove('presentationControls'); - }, - rotatePages: function pdfViewPageRotation(delta) { this.pageRotation = (this.pageRotation + 360 + delta) % 360; @@ -2051,36 +1965,14 @@ window.addEventListener('DOMMouseScroll', function(evt) { var ticks = evt.detail; var direction = (ticks > 0) ? 'zoomOut' : 'zoomIn'; PDFView[direction](Math.abs(ticks)); - } else if (PDFView.isPresentationMode) { + } else if (PresentationMode.active) { var FIREFOX_DELTA_FACTOR = -40; PDFView.mouseScroll(evt.detail * FIREFOX_DELTA_FACTOR); } }, false); -window.addEventListener('mousemove', function mousemove(evt) { - if (PDFView.isPresentationMode) { - PDFView.showPresentationControls(); - } -}, false); - -window.addEventListener('mousedown', function mousedown(evt) { - if (PDFView.isPresentationMode && evt.button === 0) { - // Enable clicking of links in presentation mode. - // Note: Only links that point to the currently loaded PDF document works. - var targetHref = evt.target.href; - var internalLink = targetHref && (targetHref.replace(/#.*$/, '') === - window.location.href.replace(/#.*$/, '')); - if (!internalLink) { - // Unless an internal link was clicked, advance a page in presentation - // mode. - evt.preventDefault(); - PDFView.page++; - } - } -}, false); - window.addEventListener('click', function click(evt) { - if (!PDFView.isPresentationMode) { + if (!PresentationMode.active) { if (SecondaryToolbar.isOpen && PDFView.container.contains(evt.target)) { SecondaryToolbar.close(); } @@ -2148,8 +2040,7 @@ window.addEventListener('keydown', function keydown(evt) { if (cmd === 3 || cmd === 10) { switch (evt.keyCode) { case 80: // p - PDFView.presentationMode(); - SecondaryToolbar.close(); + SecondaryToolbar.presentationModeClick(); handled = true; break; } @@ -2173,7 +2064,7 @@ window.addEventListener('keydown', function keydown(evt) { } var controlsElement = document.getElementById('toolbar'); while (curElement) { - if (curElement === controlsElement && !PDFView.isPresentationMode) + if (curElement === controlsElement && !PresentationMode.active) return; // ignoring if the 'toolbar' element is focused curElement = curElement.parentNode; } @@ -2183,7 +2074,7 @@ window.addEventListener('keydown', function keydown(evt) { case 38: // up arrow case 33: // pg up case 8: // backspace - if (!PDFView.isPresentationMode && + if (!PresentationMode.active && PDFView.currentScaleValue !== 'page-fit') { break; } @@ -2213,7 +2104,7 @@ window.addEventListener('keydown', function keydown(evt) { case 40: // down arrow case 34: // pg down case 32: // spacebar - if (!PDFView.isPresentationMode && + if (!PresentationMode.active && PDFView.currentScaleValue !== 'page-fit') { break; } @@ -2231,13 +2122,13 @@ window.addEventListener('keydown', function keydown(evt) { break; case 36: // home - if (PDFView.isPresentationMode) { + if (PresentationMode.active) { PDFView.page = 1; handled = true; } break; case 35: // end - if (PDFView.isPresentationMode) { + if (PresentationMode.active) { PDFView.page = PDFView.pdfDocument.numPages; handled = true; } @@ -2252,7 +2143,7 @@ window.addEventListener('keydown', function keydown(evt) { if (cmd === 4) { // shift-key switch (evt.keyCode) { case 32: // spacebar - if (!PDFView.isPresentationMode && + if (!PresentationMode.active && PDFView.currentScaleValue !== 'page-fit') { break; } @@ -2269,13 +2160,13 @@ window.addEventListener('keydown', function keydown(evt) { if (cmd === 2) { // alt-key switch (evt.keyCode) { case 37: // left arrow - if (PDFView.isPresentationMode) { + if (PresentationMode.active) { PDFHistory.back(); handled = true; } break; case 39: // right arrow - if (PDFView.isPresentationMode) { + if (PresentationMode.active) { PDFHistory.forward(); handled = true; } @@ -2297,27 +2188,6 @@ window.addEventListener('afterprint', function afterPrint(evt) { PDFView.afterPrint(); }); -(function presentationModeClosure() { - function presentationModeChange(e) { - var isPresentationMode = document.fullscreenElement || - document.mozFullScreen || - document.webkitIsFullScreen || - document.msFullscreenElement; - - if (isPresentationMode) { - PDFView.enterPresentationMode(); - } else { - PDFView.exitPresentationMode(); - } - } - - window.addEventListener('fullscreenchange', presentationModeChange, false); - window.addEventListener('mozfullscreenchange', presentationModeChange, false); - window.addEventListener('webkitfullscreenchange', presentationModeChange, - false); - window.addEventListener('MSFullscreenChange', presentationModeChange, false); -})(); - (function animationStartedClosure() { // The offsetParent is not set until the pdf.js iframe or object is visible. // Waiting for first animation.