Subversion-Projekte lars-tiefland.ci

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
776 lars 1
// CodeMirror, copyright (c) by Marijn Haverbeke and others
2
// Distributed under an MIT license: http://codemirror.net/LICENSE
3
 
4
(function(mod) {
5
  if (typeof exports == "object" && typeof module == "object") // CommonJS
6
    mod(require("../../lib/codemirror"));
7
  else if (typeof define == "function" && define.amd) // AMD
8
    define(["../../lib/codemirror"], mod);
9
  else // Plain browser env
10
    mod(CodeMirror);
11
})(function(CodeMirror) {
12
  CodeMirror.defineExtension("addPanel", function(node, options) {
13
    options = options || {};
14
 
15
    if (!this.state.panels) initPanels(this);
16
 
17
    var info = this.state.panels;
18
    var wrapper = info.wrapper;
19
    var cmWrapper = this.getWrapperElement();
20
 
21
    if (options.after instanceof Panel && !options.after.cleared) {
22
      wrapper.insertBefore(node, options.before.node.nextSibling);
23
    } else if (options.before instanceof Panel && !options.before.cleared) {
24
      wrapper.insertBefore(node, options.before.node);
25
    } else if (options.replace instanceof Panel && !options.replace.cleared) {
26
      wrapper.insertBefore(node, options.replace.node);
27
      options.replace.clear();
28
    } else if (options.position == "bottom") {
29
      wrapper.appendChild(node);
30
    } else if (options.position == "before-bottom") {
31
      wrapper.insertBefore(node, cmWrapper.nextSibling);
32
    } else if (options.position == "after-top") {
33
      wrapper.insertBefore(node, cmWrapper);
34
    } else {
35
      wrapper.insertBefore(node, wrapper.firstChild);
36
    }
37
 
38
    var height = (options && options.height) || node.offsetHeight;
39
    this._setSize(null, info.heightLeft -= height);
40
    info.panels++;
41
    return new Panel(this, node, options, height);
42
  });
43
 
44
  function Panel(cm, node, options, height) {
45
    this.cm = cm;
46
    this.node = node;
47
    this.options = options;
48
    this.height = height;
49
    this.cleared = false;
50
  }
51
 
52
  Panel.prototype.clear = function() {
53
    if (this.cleared) return;
54
    this.cleared = true;
55
    var info = this.cm.state.panels;
56
    this.cm._setSize(null, info.heightLeft += this.height);
57
    info.wrapper.removeChild(this.node);
58
    if (--info.panels == 0) removePanels(this.cm);
59
  };
60
 
61
  Panel.prototype.changed = function(height) {
62
    var newHeight = height == null ? this.node.offsetHeight : height;
63
    var info = this.cm.state.panels;
64
    this.cm._setSize(null, info.height += (newHeight - this.height));
65
    this.height = newHeight;
66
  };
67
 
68
  function initPanels(cm) {
69
    var wrap = cm.getWrapperElement();
70
    var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle;
71
    var height = parseInt(style.height);
72
    var info = cm.state.panels = {
73
      setHeight: wrap.style.height,
74
      heightLeft: height,
75
      panels: 0,
76
      wrapper: document.createElement("div")
77
    };
78
    wrap.parentNode.insertBefore(info.wrapper, wrap);
79
    var hasFocus = cm.hasFocus();
80
    info.wrapper.appendChild(wrap);
81
    if (hasFocus) cm.focus();
82
 
83
    cm._setSize = cm.setSize;
84
    if (height != null) cm.setSize = function(width, newHeight) {
85
      if (newHeight == null) return this._setSize(width, newHeight);
86
      info.setHeight = newHeight;
87
      if (typeof newHeight != "number") {
88
        var px = /^(\d+\.?\d*)px$/.exec(newHeight);
89
        if (px) {
90
          newHeight = Number(px[1]);
91
        } else {
92
          info.wrapper.style.height = newHeight;
93
          newHeight = info.wrapper.offsetHeight;
94
          info.wrapper.style.height = "";
95
        }
96
      }
97
      cm._setSize(width, info.heightLeft += (newHeight - height));
98
      height = newHeight;
99
    };
100
  }
101
 
102
  function removePanels(cm) {
103
    var info = cm.state.panels;
104
    cm.state.panels = null;
105
 
106
    var wrap = cm.getWrapperElement();
107
    info.wrapper.parentNode.replaceChild(wrap, info.wrapper);
108
    wrap.style.height = info.setHeight;
109
    cm.setSize = cm._setSize;
110
    cm.setSize();
111
  }
112
});