/* * Beamer Viewer, a web-based PDF presentation viewer * Copyright 2018-2024 Pacien TRAN-GIRARD * SPDX-License-Identifier: EUPL-1.2 */ "use strict"; class Stage { constructor(onReady, onNext, onPrevious) { this.audienceScreen = null; this.presenterScreen = null; this.onReady = onReady; this.eventHandlers = [ new KeyboardEventHandler(onNext, onPrevious), new MouseClickEventHandler(onNext, onPrevious), new TouchSwipeEventHandler(onNext, onPrevious) ]; } start() { this.projector = window.open(window.location.href, "_blank", "toolbar=0,location=0,menubar=0"); if (this.projector == null) alert("Please allow pop-ups, then refresh this page."); this.projector.addEventListener("load", () => { this.audienceScreen = new Screen(this.projector, false, false); this.presenterScreen = new Screen(window, true, true); this._watchDetach(); this.onReady(); }); this._registerEventHandler(window); this._registerEventHandler(this.projector); } setPage(page) { this.audienceScreen.setPage(page); this.presenterScreen.setPage(page); } _registerEventHandler(window) { if (window == null) return; this.eventHandlers .forEach(eventHandler => eventHandler.register(window)); } _watchDetach() { window.addEventListener("beforeunload", () => this._setMessage(this.projector, "Controller detached") ); this.projector.addEventListener("beforeunload", () => this._setMessage(window, "Viewer detached") ); } _setMessage(window, message) { const messageBar = window.document.getElementById("message"); messageBar.textContent = message; } }