jam/js/web/codemirror/codemirror.js

107 lines
2.5 KiB
JavaScript

webix.protoUI({
name:"codemirror-editor",
defaults:{
mode:"javascript",
lineNumbers:true,
matchBrackets:true,
theme:"default"
},
$init:function(config){
this.$view.innerHTML = "<textarea style='width:100%;height:100%;'></textarea>";
this.$ready.push(this._render_cm_editor);
},
_render_cm_editor:function(){
webix.require("codemirror/lib/codemirror.css");
var deps = [
"codemirror/lib/codemirror.js"
];
if (this.config.mode == "htmlmixed"){
deps.push("codemirror/mode/xml/xml.js");
deps.push("codemirror/mode/css/css.js");
deps.push("codemirror/mode/javascript/javascript.js");
}
deps.push("codemirror/mode/"+this.config.mode+"/"+this.config.mode+".js");
webix.require(deps, this._render_when_ready, this);
},
_render_when_ready:function(){
this.editor = CodeMirror.fromTextArea(this.$view.firstChild, {
mode: this.config.mode,
lineNumbers: this.config.lineNumbers,
matchBrackets: this.config.matchBrackets,
theme: this.config.theme
});
this.setValue(this.config.value);
if (this._focus_await)
this.focus();
},
_set_inner_size:function(){
if (!this.editor || !this.$width) return;
this._updateScrollSize();
this.editor.scrollTo(0,0); //force repaint, mandatory for IE
},
_updateScrollSize:function(){
var box = this.editor.getWrapperElement();
var height = (this.$height || 0) + "px";
box.style.height = height;
box.style.width = (this.$width || 0) + "px";
var scroll = this.editor.getScrollerElement();
if (scroll.style.height != height){
scroll.style.height = height;
this.editor.refresh();
}
},
$setSize:function(x,y){
if (webix.ui.view.prototype.$setSize.call(this, x, y)){
this._set_inner_size();
}
},
setValue:function(value){
if(!value && value !== 0)
value = "";
this.config.value = value;
if(this.editor){
this.editor.setValue(value);
//by default - clear editor's undo history when setting new value
if(!this.config.preserveUndoHistory)
this.editor.clearHistory();
this._updateScrollSize();
}
},
getValue:function(){
return this.editor?this.editor.getValue():this.config.value;
},
focus:function(){
this._focus_await = true;
if (this.editor)
this.editor.focus();
},
getEditor:function(){
return this.editor;
},
//undo, redo, etc
undo:function(){
this.editor.undo();
},
redo:function(){
this.editor.redo();
},
undoLength:function(){
return this.editor.historySize().undo;
}
}, webix.ui.view);