| /** |
| * @licstart The following is the entire license notice for the |
| * Javascript code in this page |
| * |
| * Copyright 2020 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. |
| * |
| * @licend The above is the entire license notice for the |
| * Javascript code in this page |
| */ |
| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.PDFSidebar = exports.SidebarView = void 0; |
| |
| var _ui_utils = require("./ui_utils.js"); |
| |
| var _pdf_rendering_queue = require("./pdf_rendering_queue.js"); |
| |
| const UI_NOTIFICATION_CLASS = "pdfSidebarNotification"; |
| const SidebarView = { |
| UNKNOWN: -1, |
| NONE: 0, |
| THUMBS: 1, |
| OUTLINE: 2, |
| ATTACHMENTS: 3, |
| LAYERS: 4 |
| }; |
| exports.SidebarView = SidebarView; |
| |
| class PDFSidebar { |
| constructor({ |
| elements, |
| pdfViewer, |
| pdfThumbnailViewer, |
| eventBus, |
| l10n = _ui_utils.NullL10n, |
| disableNotification = false |
| }) { |
| this.isOpen = false; |
| this.active = SidebarView.THUMBS; |
| this.isInitialViewSet = false; |
| this.onToggled = null; |
| this.pdfViewer = pdfViewer; |
| this.pdfThumbnailViewer = pdfThumbnailViewer; |
| this.outerContainer = elements.outerContainer; |
| this.viewerContainer = elements.viewerContainer; |
| this.toggleButton = elements.toggleButton; |
| this.thumbnailButton = elements.thumbnailButton; |
| this.outlineButton = elements.outlineButton; |
| this.attachmentsButton = elements.attachmentsButton; |
| this.layersButton = elements.layersButton; |
| this.thumbnailView = elements.thumbnailView; |
| this.outlineView = elements.outlineView; |
| this.attachmentsView = elements.attachmentsView; |
| this.layersView = elements.layersView; |
| this.eventBus = eventBus; |
| this.l10n = l10n; |
| this._disableNotification = disableNotification; |
| |
| this._addEventListeners(); |
| } |
| |
| reset() { |
| this.isInitialViewSet = false; |
| |
| this._hideUINotification(null); |
| |
| this.switchView(SidebarView.THUMBS); |
| this.outlineButton.disabled = false; |
| this.attachmentsButton.disabled = false; |
| this.layersButton.disabled = false; |
| } |
| |
| get visibleView() { |
| return this.isOpen ? this.active : SidebarView.NONE; |
| } |
| |
| get isThumbnailViewVisible() { |
| return this.isOpen && this.active === SidebarView.THUMBS; |
| } |
| |
| get isOutlineViewVisible() { |
| return this.isOpen && this.active === SidebarView.OUTLINE; |
| } |
| |
| get isAttachmentsViewVisible() { |
| return this.isOpen && this.active === SidebarView.ATTACHMENTS; |
| } |
| |
| get isLayersViewVisible() { |
| return this.isOpen && this.active === SidebarView.LAYERS; |
| } |
| |
| setInitialView(view = SidebarView.NONE) { |
| if (this.isInitialViewSet) { |
| return; |
| } |
| |
| this.isInitialViewSet = true; |
| |
| if (view === SidebarView.NONE || view === SidebarView.UNKNOWN) { |
| this._dispatchEvent(); |
| |
| return; |
| } |
| |
| if (!this._switchView(view, true)) { |
| this._dispatchEvent(); |
| } |
| } |
| |
| switchView(view, forceOpen = false) { |
| this._switchView(view, forceOpen); |
| } |
| |
| _switchView(view, forceOpen = false) { |
| const isViewChanged = view !== this.active; |
| let shouldForceRendering = false; |
| |
| switch (view) { |
| case SidebarView.NONE: |
| if (this.isOpen) { |
| this.close(); |
| return true; |
| } |
| |
| return false; |
| |
| case SidebarView.THUMBS: |
| if (this.isOpen && isViewChanged) { |
| shouldForceRendering = true; |
| } |
| |
| break; |
| |
| case SidebarView.OUTLINE: |
| if (this.outlineButton.disabled) { |
| return false; |
| } |
| |
| break; |
| |
| case SidebarView.ATTACHMENTS: |
| if (this.attachmentsButton.disabled) { |
| return false; |
| } |
| |
| break; |
| |
| case SidebarView.LAYERS: |
| if (this.layersButton.disabled) { |
| return false; |
| } |
| |
| break; |
| |
| default: |
| console.error(`PDFSidebar._switchView: "${view}" is not a valid view.`); |
| return false; |
| } |
| |
| this.active = view; |
| this.thumbnailButton.classList.toggle("toggled", view === SidebarView.THUMBS); |
| this.outlineButton.classList.toggle("toggled", view === SidebarView.OUTLINE); |
| this.attachmentsButton.classList.toggle("toggled", view === SidebarView.ATTACHMENTS); |
| this.layersButton.classList.toggle("toggled", view === SidebarView.LAYERS); |
| this.thumbnailView.classList.toggle("hidden", view !== SidebarView.THUMBS); |
| this.outlineView.classList.toggle("hidden", view !== SidebarView.OUTLINE); |
| this.attachmentsView.classList.toggle("hidden", view !== SidebarView.ATTACHMENTS); |
| this.layersView.classList.toggle("hidden", view !== SidebarView.LAYERS); |
| |
| if (forceOpen && !this.isOpen) { |
| this.open(); |
| return true; |
| } |
| |
| if (shouldForceRendering) { |
| this._updateThumbnailViewer(); |
| |
| this._forceRendering(); |
| } |
| |
| if (isViewChanged) { |
| this._dispatchEvent(); |
| } |
| |
| this._hideUINotification(this.active); |
| |
| return isViewChanged; |
| } |
| |
| open() { |
| if (this.isOpen) { |
| return; |
| } |
| |
| this.isOpen = true; |
| this.toggleButton.classList.add("toggled"); |
| this.outerContainer.classList.add("sidebarMoving", "sidebarOpen"); |
| |
| if (this.active === SidebarView.THUMBS) { |
| this._updateThumbnailViewer(); |
| } |
| |
| this._forceRendering(); |
| |
| this._dispatchEvent(); |
| |
| this._hideUINotification(this.active); |
| } |
| |
| close() { |
| if (!this.isOpen) { |
| return; |
| } |
| |
| this.isOpen = false; |
| this.toggleButton.classList.remove("toggled"); |
| this.outerContainer.classList.add("sidebarMoving"); |
| this.outerContainer.classList.remove("sidebarOpen"); |
| |
| this._forceRendering(); |
| |
| this._dispatchEvent(); |
| } |
| |
| toggle() { |
| if (this.isOpen) { |
| this.close(); |
| } else { |
| this.open(); |
| } |
| } |
| |
| _dispatchEvent() { |
| this.eventBus.dispatch("sidebarviewchanged", { |
| source: this, |
| view: this.visibleView |
| }); |
| } |
| |
| _forceRendering() { |
| if (this.onToggled) { |
| this.onToggled(); |
| } else { |
| this.pdfViewer.forceRendering(); |
| this.pdfThumbnailViewer.forceRendering(); |
| } |
| } |
| |
| _updateThumbnailViewer() { |
| const { |
| pdfViewer, |
| pdfThumbnailViewer |
| } = this; |
| const pagesCount = pdfViewer.pagesCount; |
| |
| for (let pageIndex = 0; pageIndex < pagesCount; pageIndex++) { |
| const pageView = pdfViewer.getPageView(pageIndex); |
| |
| if (pageView && pageView.renderingState === _pdf_rendering_queue.RenderingStates.FINISHED) { |
| const thumbnailView = pdfThumbnailViewer.getThumbnail(pageIndex); |
| thumbnailView.setImage(pageView); |
| } |
| } |
| |
| pdfThumbnailViewer.scrollThumbnailIntoView(pdfViewer.currentPageNumber); |
| } |
| |
| _showUINotification(view) { |
| if (this._disableNotification) { |
| return; |
| } |
| |
| this.l10n.get("toggle_sidebar_notification2.title", null, "Toggle Sidebar (document contains outline/attachments/layers)").then(msg => { |
| this.toggleButton.title = msg; |
| }); |
| |
| if (!this.isOpen) { |
| this.toggleButton.classList.add(UI_NOTIFICATION_CLASS); |
| } else if (view === this.active) { |
| return; |
| } |
| |
| switch (view) { |
| case SidebarView.OUTLINE: |
| this.outlineButton.classList.add(UI_NOTIFICATION_CLASS); |
| break; |
| |
| case SidebarView.ATTACHMENTS: |
| this.attachmentsButton.classList.add(UI_NOTIFICATION_CLASS); |
| break; |
| |
| case SidebarView.LAYERS: |
| this.layersButton.classList.add(UI_NOTIFICATION_CLASS); |
| break; |
| } |
| } |
| |
| _hideUINotification(view) { |
| if (this._disableNotification) { |
| return; |
| } |
| |
| const removeNotification = sidebarView => { |
| switch (sidebarView) { |
| case SidebarView.OUTLINE: |
| this.outlineButton.classList.remove(UI_NOTIFICATION_CLASS); |
| break; |
| |
| case SidebarView.ATTACHMENTS: |
| this.attachmentsButton.classList.remove(UI_NOTIFICATION_CLASS); |
| break; |
| |
| case SidebarView.LAYERS: |
| this.layersButton.classList.remove(UI_NOTIFICATION_CLASS); |
| break; |
| } |
| }; |
| |
| if (!this.isOpen && view !== null) { |
| return; |
| } |
| |
| this.toggleButton.classList.remove(UI_NOTIFICATION_CLASS); |
| |
| if (view !== null) { |
| removeNotification(view); |
| return; |
| } |
| |
| for (view in SidebarView) { |
| removeNotification(SidebarView[view]); |
| } |
| |
| this.l10n.get("toggle_sidebar.title", null, "Toggle Sidebar").then(msg => { |
| this.toggleButton.title = msg; |
| }); |
| } |
| |
| _addEventListeners() { |
| this.viewerContainer.addEventListener("transitionend", evt => { |
| if (evt.target === this.viewerContainer) { |
| this.outerContainer.classList.remove("sidebarMoving"); |
| } |
| }); |
| this.toggleButton.addEventListener("click", () => { |
| this.toggle(); |
| }); |
| this.thumbnailButton.addEventListener("click", () => { |
| this.switchView(SidebarView.THUMBS); |
| }); |
| this.outlineButton.addEventListener("click", () => { |
| this.switchView(SidebarView.OUTLINE); |
| }); |
| this.outlineButton.addEventListener("dblclick", () => { |
| this.eventBus.dispatch("toggleoutlinetree", { |
| source: this |
| }); |
| }); |
| this.attachmentsButton.addEventListener("click", () => { |
| this.switchView(SidebarView.ATTACHMENTS); |
| }); |
| this.layersButton.addEventListener("click", () => { |
| this.switchView(SidebarView.LAYERS); |
| }); |
| this.layersButton.addEventListener("dblclick", () => { |
| this.eventBus.dispatch("resetlayers", { |
| source: this |
| }); |
| }); |
| |
| const onTreeLoaded = (count, button, view) => { |
| button.disabled = !count; |
| |
| if (count) { |
| this._showUINotification(view); |
| } else if (this.active === view) { |
| this.switchView(SidebarView.THUMBS); |
| } |
| }; |
| |
| this.eventBus._on("outlineloaded", evt => { |
| onTreeLoaded(evt.outlineCount, this.outlineButton, SidebarView.OUTLINE); |
| }); |
| |
| this.eventBus._on("attachmentsloaded", evt => { |
| onTreeLoaded(evt.attachmentsCount, this.attachmentsButton, SidebarView.ATTACHMENTS); |
| }); |
| |
| this.eventBus._on("layersloaded", evt => { |
| onTreeLoaded(evt.layersCount, this.layersButton, SidebarView.LAYERS); |
| }); |
| |
| this.eventBus._on("presentationmodechanged", evt => { |
| if (!evt.active && !evt.switchInProgress && this.isThumbnailViewVisible) { |
| this._updateThumbnailViewer(); |
| } |
| }); |
| } |
| |
| } |
| |
| exports.PDFSidebar = PDFSidebar; |