base_tree_viewer.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /**
  2. * @licstart The following is the entire license notice for the
  3. * Javascript code in this page
  4. *
  5. * Copyright 2021 Mozilla Foundation
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. *
  19. * @licend The above is the entire license notice for the
  20. * Javascript code in this page
  21. */
  22. "use strict";
  23. Object.defineProperty(exports, "__esModule", {
  24. value: true
  25. });
  26. exports.BaseTreeViewer = void 0;
  27. var _pdf = require("../pdf");
  28. const TREEITEM_OFFSET_TOP = -100;
  29. const TREEITEM_SELECTED_CLASS = "selected";
  30. class BaseTreeViewer {
  31. constructor(options) {
  32. if (this.constructor === BaseTreeViewer) {
  33. throw new Error("Cannot initialize BaseTreeViewer.");
  34. }
  35. this.container = options.container;
  36. this.eventBus = options.eventBus;
  37. this.reset();
  38. }
  39. reset() {
  40. this._pdfDocument = null;
  41. this._lastToggleIsShow = true;
  42. this._currentTreeItem = null;
  43. this.container.textContent = "";
  44. this.container.classList.remove("treeWithDeepNesting");
  45. }
  46. _dispatchEvent(count) {
  47. throw new Error("Not implemented: _dispatchEvent");
  48. }
  49. _bindLink(element, params) {
  50. throw new Error("Not implemented: _bindLink");
  51. }
  52. _normalizeTextContent(str) {
  53. return (0, _pdf.removeNullCharacters)(str) || "\u2013";
  54. }
  55. _addToggleButton(div, hidden = false) {
  56. const toggler = document.createElement("div");
  57. toggler.className = "treeItemToggler";
  58. if (hidden) {
  59. toggler.classList.add("treeItemsHidden");
  60. }
  61. toggler.onclick = evt => {
  62. evt.stopPropagation();
  63. toggler.classList.toggle("treeItemsHidden");
  64. if (evt.shiftKey) {
  65. const shouldShowAll = !toggler.classList.contains("treeItemsHidden");
  66. this._toggleTreeItem(div, shouldShowAll);
  67. }
  68. };
  69. div.insertBefore(toggler, div.firstChild);
  70. }
  71. _toggleTreeItem(root, show = false) {
  72. this._lastToggleIsShow = show;
  73. for (const toggler of root.querySelectorAll(".treeItemToggler")) {
  74. toggler.classList.toggle("treeItemsHidden", !show);
  75. }
  76. }
  77. _toggleAllTreeItems() {
  78. this._toggleTreeItem(this.container, !this._lastToggleIsShow);
  79. }
  80. _finishRendering(fragment, count, hasAnyNesting = false) {
  81. if (hasAnyNesting) {
  82. this.container.classList.add("treeWithDeepNesting");
  83. this._lastToggleIsShow = !fragment.querySelector(".treeItemsHidden");
  84. }
  85. this.container.appendChild(fragment);
  86. this._dispatchEvent(count);
  87. }
  88. render(params) {
  89. throw new Error("Not implemented: render");
  90. }
  91. _updateCurrentTreeItem(treeItem = null) {
  92. if (this._currentTreeItem) {
  93. this._currentTreeItem.classList.remove(TREEITEM_SELECTED_CLASS);
  94. this._currentTreeItem = null;
  95. }
  96. if (treeItem) {
  97. treeItem.classList.add(TREEITEM_SELECTED_CLASS);
  98. this._currentTreeItem = treeItem;
  99. }
  100. }
  101. _scrollToCurrentTreeItem(treeItem) {
  102. if (!treeItem) {
  103. return;
  104. }
  105. let currentNode = treeItem.parentNode;
  106. while (currentNode && currentNode !== this.container) {
  107. if (currentNode.classList.contains("treeItem")) {
  108. const toggler = currentNode.firstElementChild;
  109. toggler?.classList.remove("treeItemsHidden");
  110. }
  111. currentNode = currentNode.parentNode;
  112. }
  113. this._updateCurrentTreeItem(treeItem);
  114. this.container.scrollTo(treeItem.offsetLeft, treeItem.offsetTop + TREEITEM_OFFSET_TOP);
  115. }
  116. }
  117. exports.BaseTreeViewer = BaseTreeViewer;