pdfjs-dist
Version:
Generic build of Mozilla's PDF.js library.
121 lines (120 loc) • 3.83 kB
JavaScript
/**
* @licstart The following is the entire license notice for the
* JavaScript code in this page
*
* Copyright 2022 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.PDFSidebarResizer = void 0;
var _ui_utils = require("./ui_utils.js");
const SIDEBAR_WIDTH_VAR = "--sidebar-width";
const SIDEBAR_MIN_WIDTH = 200;
const SIDEBAR_RESIZING_CLASS = "sidebarResizing";
class PDFSidebarResizer {
constructor(options, eventBus, l10n) {
this.isRTL = false;
this.sidebarOpen = false;
this._width = null;
this._outerContainerWidth = null;
this._boundEvents = Object.create(null);
this.outerContainer = options.outerContainer;
this.resizer = options.resizer;
this.eventBus = eventBus;
l10n.getDirection().then(dir => {
this.isRTL = dir === "rtl";
});
this._addEventListeners();
}
get outerContainerWidth() {
return this._outerContainerWidth ||= this.outerContainer.clientWidth;
}
_updateWidth(width = 0) {
const maxWidth = Math.floor(this.outerContainerWidth / 2);
if (width > maxWidth) {
width = maxWidth;
}
if (width < SIDEBAR_MIN_WIDTH) {
width = SIDEBAR_MIN_WIDTH;
}
if (width === this._width) {
return false;
}
this._width = width;
_ui_utils.docStyle.setProperty(SIDEBAR_WIDTH_VAR, `${width}px`);
return true;
}
_mouseMove(evt) {
let width = evt.clientX;
if (this.isRTL) {
width = this.outerContainerWidth - width;
}
this._updateWidth(width);
}
_mouseUp(evt) {
this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);
this.eventBus.dispatch("resize", {
source: this
});
const _boundEvents = this._boundEvents;
window.removeEventListener("mousemove", _boundEvents.mouseMove);
window.removeEventListener("mouseup", _boundEvents.mouseUp);
}
_addEventListeners() {
const _boundEvents = this._boundEvents;
_boundEvents.mouseMove = this._mouseMove.bind(this);
_boundEvents.mouseUp = this._mouseUp.bind(this);
this.resizer.addEventListener("mousedown", evt => {
if (evt.button !== 0) {
return;
}
this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);
window.addEventListener("mousemove", _boundEvents.mouseMove);
window.addEventListener("mouseup", _boundEvents.mouseUp);
});
this.eventBus._on("sidebarviewchanged", evt => {
this.sidebarOpen = !!evt?.view;
});
this.eventBus._on("resize", evt => {
if (evt?.source !== window) {
return;
}
this._outerContainerWidth = null;
if (!this._width) {
return;
}
if (!this.sidebarOpen) {
this._updateWidth(this._width);
return;
}
this.outerContainer.classList.add(SIDEBAR_RESIZING_CLASS);
const updated = this._updateWidth(this._width);
Promise.resolve().then(() => {
this.outerContainer.classList.remove(SIDEBAR_RESIZING_CLASS);
if (updated) {
this.eventBus.dispatch("resize", {
source: this
});
}
});
});
}
}
exports.PDFSidebarResizer = PDFSidebarResizer;