annotate .cms/lib/codemirror/addon/display/panel.js @ 1:1d486627aa1e draft default tip

24.10
author Coffee CMS <info@coffee-cms.ru>
date Sat, 12 Oct 2024 02:51:39 +0000
parents 78edf6b517a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
1 // CodeMirror, copyright (c) by Marijn Haverbeke and others
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
2 // Distributed under an MIT license: https://codemirror.net/5/LICENSE
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
3
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
4 (function (mod) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
5 if (typeof exports == "object" && typeof module == "object") // CommonJS
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
6 mod(require("../../lib/codemirror"));
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
7 else if (typeof define == "function" && define.amd) // AMD
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
8 define(["../../lib/codemirror"], mod);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
9 else // Plain browser env
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
10 mod(CodeMirror);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
11 })(function (CodeMirror) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
12 CodeMirror.defineExtension("addPanel", function (node, options) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
13 options = options || {};
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
14
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
15 if (!this.state.panels) initPanels(this);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
16
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
17 var info = this.state.panels;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
18 var wrapper = info.wrapper;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
19 var cmWrapper = this.getWrapperElement();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
20 var replace = options.replace instanceof Panel && !options.replace.cleared;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
21
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
22 if (options.after instanceof Panel && !options.after.cleared) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
23 wrapper.insertBefore(node, options.before.node.nextSibling);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
24 } else if (options.before instanceof Panel && !options.before.cleared) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
25 wrapper.insertBefore(node, options.before.node);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
26 } else if (replace) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
27 wrapper.insertBefore(node, options.replace.node);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
28 options.replace.clear(true);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
29 } else if (options.position == "bottom") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
30 wrapper.appendChild(node);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
31 } else if (options.position == "before-bottom") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
32 wrapper.insertBefore(node, cmWrapper.nextSibling);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
33 } else if (options.position == "after-top") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
34 wrapper.insertBefore(node, cmWrapper);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
35 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
36 wrapper.insertBefore(node, wrapper.firstChild);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
37 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
38
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
39 var height = (options && options.height) || node.offsetHeight;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
40
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
41 var panel = new Panel(this, node, options, height);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
42 info.panels.push(panel);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
43
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
44 this.setSize();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
45 if (options.stable && isAtTop(this, node))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
46 this.scrollTo(null, this.getScrollInfo().top + height);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
47
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
48 return panel;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
49 });
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
50
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
51 function Panel(cm, node, options, height) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
52 this.cm = cm;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
53 this.node = node;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
54 this.options = options;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
55 this.height = height;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
56 this.cleared = false;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
57 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
58
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
59 /* when skipRemove is true, clear() was called from addPanel().
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
60 * Thus removePanels() should not be called (issue 5518) */
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
61 Panel.prototype.clear = function (skipRemove) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
62 if (this.cleared) return;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
63 this.cleared = true;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
64 var info = this.cm.state.panels;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
65 info.panels.splice(info.panels.indexOf(this), 1);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
66 this.cm.setSize();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
67 if (this.options.stable && isAtTop(this.cm, this.node))
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
68 this.cm.scrollTo(null, this.cm.getScrollInfo().top - this.height)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
69 info.wrapper.removeChild(this.node);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
70 if (info.panels.length == 0 && !skipRemove) removePanels(this.cm);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
71 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
72
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
73 Panel.prototype.changed = function () {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
74 this.height = this.node.getBoundingClientRect().height;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
75 this.cm.setSize();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
76 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
77
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
78 function initPanels(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
79 var wrap = cm.getWrapperElement()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
80 var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
81 var height = parseInt(style.height);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
82 var info = cm.state.panels = {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
83 setHeight: wrap.style.height,
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
84 panels: [],
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
85 wrapper: document.createElement("div")
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
86 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
87 var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
88 wrap.parentNode.insertBefore(info.wrapper, wrap);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
89 info.wrapper.appendChild(wrap);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
90 cm.scrollTo(scrollPos.left, scrollPos.top)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
91 if (hasFocus) cm.focus();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
92
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
93 cm._setSize = cm.setSize;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
94 if (height != null) cm.setSize = function (width, newHeight) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
95 if (!newHeight) newHeight = info.wrapper.offsetHeight;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
96 info.setHeight = newHeight;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
97 if (typeof newHeight != "number") {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
98 var px = /^(\d+\.?\d*)px$/.exec(newHeight);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
99 if (px) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
100 newHeight = Number(px[1]);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
101 } else {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
102 info.wrapper.style.height = newHeight;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
103 newHeight = info.wrapper.offsetHeight;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
104 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
105 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
106 var editorheight = newHeight - info.panels
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
107 .map(function (p) { return p.node.getBoundingClientRect().height; })
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
108 .reduce(function (a, b) { return a + b; }, 0);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
109 cm._setSize(width, editorheight);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
110 height = newHeight;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
111 };
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
112 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
113
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
114 function removePanels(cm) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
115 var info = cm.state.panels;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
116 cm.state.panels = null;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
117
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
118 var wrap = cm.getWrapperElement()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
119 var hasFocus = cm.hasFocus(), scrollPos = cm.getScrollInfo()
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
120 info.wrapper.parentNode.replaceChild(wrap, info.wrapper);
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
121 cm.scrollTo(scrollPos.left, scrollPos.top)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
122 if (hasFocus) cm.focus();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
123 wrap.style.height = info.setHeight;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
124 cm.setSize = cm._setSize;
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
125 cm.setSize();
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
126 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
127
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
128 function isAtTop(cm, dom) {
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
129 for (var sibling = dom.nextSibling; sibling; sibling = sibling.nextSibling)
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
130 if (sibling == cm.getWrapperElement()) return true
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
131 return false
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
132 }
Coffee CMS <info@coffee-cms.ru>
parents:
diff changeset
133 });